Commit abdd2edc69ec5c81804e4addd917a8b6e9be245d
Exists in
colab
and in
4 other branches
Merge pull request #234 from mezuro/js_tests
Js tests
Showing
5 changed files
with
242 additions
and
42 deletions
Show diff stats
Gemfile
@@ -103,7 +103,7 @@ group :development, :test do | @@ -103,7 +103,7 @@ group :development, :test do | ||
103 | gem 'capistrano-rvm', "~>0.1.0" | 103 | gem 'capistrano-rvm', "~>0.1.0" |
104 | 104 | ||
105 | # JavaScript unit tests | 105 | # JavaScript unit tests |
106 | - gem "konacha", "~> 3.3.0" | 106 | + gem "konacha" |
107 | 107 | ||
108 | # Better error interface | 108 | # Better error interface |
109 | gem 'better_errors' | 109 | gem 'better_errors' |
@@ -112,7 +112,7 @@ group :development, :test do | @@ -112,7 +112,7 @@ group :development, :test do | ||
112 | # Localization assistance | 112 | # Localization assistance |
113 | gem 'i18n_generators' | 113 | gem 'i18n_generators' |
114 | 114 | ||
115 | - gem 'sprockets', '~>2.12.3' # spckets 3.0.3 breaks konacha | 115 | + gem 'sprockets' |
116 | 116 | ||
117 | # Mocks and stubs for javascript tests | 117 | # Mocks and stubs for javascript tests |
118 | gem 'sinon-rails' | 118 | gem 'sinon-rails' |
Gemfile.lock
@@ -139,7 +139,6 @@ GEM | @@ -139,7 +139,6 @@ GEM | ||
139 | globalid (0.3.5) | 139 | globalid (0.3.5) |
140 | activesupport (>= 4.1.0) | 140 | activesupport (>= 4.1.0) |
141 | google-analytics-rails (0.0.6) | 141 | google-analytics-rails (0.0.6) |
142 | - hike (1.2.3) | ||
143 | http-cookie (1.0.2) | 142 | http-cookie (1.0.2) |
144 | domain_name (~> 0.5) | 143 | domain_name (~> 0.5) |
145 | http_accept_language (2.0.5) | 144 | http_accept_language (2.0.5) |
@@ -160,12 +159,13 @@ GEM | @@ -160,12 +159,13 @@ GEM | ||
160 | kalibro_client (0.3.0) | 159 | kalibro_client (0.3.0) |
161 | activesupport (>= 2.2.1) | 160 | activesupport (>= 2.2.1) |
162 | faraday_middleware (~> 0.9.0) | 161 | faraday_middleware (~> 0.9.0) |
163 | - konacha (3.3.0) | 162 | + konacha (3.5.1) |
164 | actionpack (>= 3.1, < 5) | 163 | actionpack (>= 3.1, < 5) |
165 | capybara | 164 | capybara |
166 | colorize | 165 | colorize |
167 | railties (>= 3.1, < 5) | 166 | railties (>= 3.1, < 5) |
168 | - sprockets | 167 | + sprockets (>= 2, < 4) |
168 | + tilt | ||
169 | less (2.6.0) | 169 | less (2.6.0) |
170 | commonjs (~> 0.2.7) | 170 | commonjs (~> 0.2.7) |
171 | less-rails (2.7.0) | 171 | less-rails (2.7.0) |
@@ -188,12 +188,12 @@ GEM | @@ -188,12 +188,12 @@ GEM | ||
188 | ntlm-http (~> 0.1, >= 0.1.1) | 188 | ntlm-http (~> 0.1, >= 0.1.1) |
189 | webrobots (>= 0.0.9, < 0.2) | 189 | webrobots (>= 0.0.9, < 0.2) |
190 | metaclass (0.0.4) | 190 | metaclass (0.0.4) |
191 | - mime-types (2.5) | 191 | + mime-types (2.6.1) |
192 | mini_portile (0.6.2) | 192 | mini_portile (0.6.2) |
193 | minitest (5.7.0) | 193 | minitest (5.7.0) |
194 | mocha (1.1.0) | 194 | mocha (1.1.0) |
195 | metaclass (~> 0.0.1) | 195 | metaclass (~> 0.0.1) |
196 | - multi_json (1.11.0) | 196 | + multi_json (1.11.1) |
197 | multi_test (0.1.2) | 197 | multi_test (0.1.2) |
198 | multipart-post (2.0.0) | 198 | multipart-post (2.0.0) |
199 | net-http-digest_auth (1.4) | 199 | net-http-digest_auth (1.4) |
@@ -211,7 +211,7 @@ GEM | @@ -211,7 +211,7 @@ GEM | ||
211 | cliver (~> 0.3.1) | 211 | cliver (~> 0.3.1) |
212 | multi_json (~> 1.0) | 212 | multi_json (~> 1.0) |
213 | websocket-driver (>= 0.2.0) | 213 | websocket-driver (>= 0.2.0) |
214 | - rack (1.6.1) | 214 | + rack (1.6.4) |
215 | rack-test (0.6.3) | 215 | rack-test (0.6.3) |
216 | rack (>= 1.0) | 216 | rack (>= 1.0) |
217 | rails (4.2.1) | 217 | rails (4.2.1) |
@@ -280,11 +280,8 @@ GEM | @@ -280,11 +280,8 @@ GEM | ||
280 | sinon-rails (1.15.0) | 280 | sinon-rails (1.15.0) |
281 | railties (>= 3.1) | 281 | railties (>= 3.1) |
282 | spring (1.3.6) | 282 | spring (1.3.6) |
283 | - sprockets (2.12.3) | ||
284 | - hike (~> 1.2) | ||
285 | - multi_json (~> 1.0) | 283 | + sprockets (3.2.0) |
286 | rack (~> 1.0) | 284 | rack (~> 1.0) |
287 | - tilt (~> 1.1, != 1.3.0) | ||
288 | sprockets-rails (2.3.0) | 285 | sprockets-rails (2.3.0) |
289 | actionpack (>= 3.0) | 286 | actionpack (>= 3.0) |
290 | activesupport (>= 3.0) | 287 | activesupport (>= 3.0) |
@@ -352,7 +349,7 @@ DEPENDENCIES | @@ -352,7 +349,7 @@ DEPENDENCIES | ||
352 | jquery-rails | 349 | jquery-rails |
353 | jquery-ui-rails (~> 5.0.0) | 350 | jquery-ui-rails (~> 5.0.0) |
354 | kalibro_client (~> 0.3.0) | 351 | kalibro_client (~> 0.3.0) |
355 | - konacha (~> 3.3.0) | 352 | + konacha |
356 | mocha | 353 | mocha |
357 | pg (~> 0.18.1) | 354 | pg (~> 0.18.1) |
358 | poltergeist (~> 1.6.0) | 355 | poltergeist (~> 1.6.0) |
@@ -365,7 +362,7 @@ DEPENDENCIES | @@ -365,7 +362,7 @@ DEPENDENCIES | ||
365 | simplecov | 362 | simplecov |
366 | sinon-rails | 363 | sinon-rails |
367 | spring | 364 | spring |
368 | - sprockets (~> 2.12.3) | 365 | + sprockets |
369 | sqlite3 | 366 | sqlite3 |
370 | therubyracer | 367 | therubyracer |
371 | turbolinks | 368 | turbolinks |
@@ -0,0 +1,109 @@ | @@ -0,0 +1,109 @@ | ||
1 | +#= require spec_helper | ||
2 | +#= require Chart | ||
3 | +#= require module/graphic | ||
4 | + | ||
5 | +describe "Module.Graphic", -> | ||
6 | + before -> | ||
7 | + @container = 'container404829' | ||
8 | + @metric_name = 'Pain' | ||
9 | + @module_id = '54405' | ||
10 | + | ||
11 | + sinon.stub(window, "$") | ||
12 | + | ||
13 | + @drawer = sinon.stub() | ||
14 | + @drawer.is = sinon.stub().withArgs(':hidden').returns(false) | ||
15 | + @drawer.slideUp = sinon.stub() | ||
16 | + $.withArgs("tr#"+@container).returns(@drawer) | ||
17 | + | ||
18 | + describe "constructor", -> | ||
19 | + context 'when the drawer is hidden', -> | ||
20 | + before -> | ||
21 | + @drawer.is = sinon.stub().withArgs(':hidden').returns(true) | ||
22 | + @drawer.slideDown = sinon.stub() | ||
23 | + sinon.stub(Module.Graphic.prototype, 'load') | ||
24 | + | ||
25 | + it "should show the drawer and start to load a graphic", -> | ||
26 | + @graphic = new Module.Graphic(@container, @metric_name, @module_id) | ||
27 | + | ||
28 | + sinon.assert.calledOnce(@drawer.slideDown) | ||
29 | + sinon.assert.calledOnce(@graphic.load) | ||
30 | + | ||
31 | + after -> | ||
32 | + @drawer.is = sinon.stub().withArgs(':hidden').returns(false) | ||
33 | + @drawer.slideDown = undefined | ||
34 | + Module.Graphic.prototype.load.restore() | ||
35 | + | ||
36 | + context 'when the drawer is visible', -> | ||
37 | + it 'should hide the drawer', -> | ||
38 | + @graphic = new Module.Graphic(@container, @metric_name, @module_id) | ||
39 | + | ||
40 | + sinon.assert.calledOnce(@drawer.slideUp) | ||
41 | + | ||
42 | + describe 'load', -> | ||
43 | + before -> | ||
44 | + @graphic = new Module.Graphic(@container, @metric_name, @module_id) | ||
45 | + | ||
46 | + it 'should make a POST request', -> | ||
47 | + $.post = sinon.stub().withArgs('/modules/' + @module_id + '/metric_history', {metric_name: @metric_name, container: @container}) | ||
48 | + | ||
49 | + @graphic.load() | ||
50 | + | ||
51 | + sinon.assert.calledOnce($.post, '/modules/' + @module_id + '/metric_history', {metric_name: @metric_name, container: @container}) | ||
52 | + | ||
53 | + describe 'display', -> | ||
54 | + beforeEach -> | ||
55 | + canvas_context = sinon.stub() | ||
56 | + @canvas = sinon.stub() | ||
57 | + @canvas.getContext = sinon.stub().withArgs('2d').returns(canvas_context) | ||
58 | + | ||
59 | + elements = sinon.stub() | ||
60 | + elements.get = sinon.stub().withArgs(0).returns(@canvas) | ||
61 | + $.withArgs('canvas#'+@container).returns(elements) | ||
62 | + | ||
63 | + @dates = ["2015-06-17", "2015-06-18", "2015-06-19"] | ||
64 | + @values = [1.2, 2.3, 3.4] | ||
65 | + | ||
66 | + opts = { | ||
67 | + bezierCurve: false, | ||
68 | + responsive: true, | ||
69 | + maintainAspectRatio: false | ||
70 | + } | ||
71 | + | ||
72 | + data = { | ||
73 | + labels : @dates, | ||
74 | + datasets : [ | ||
75 | + { | ||
76 | + fillColor : "rgba(220,220,220,0.5)", | ||
77 | + strokeColor : "rgba(220,220,220,1)", | ||
78 | + pointColor : "rgba(220,220,220,1)", | ||
79 | + pointStrokeColor : "#000", | ||
80 | + data : @values | ||
81 | + } | ||
82 | + ] | ||
83 | + } | ||
84 | + | ||
85 | + @line = sinon.stub().withArgs(data, opts) | ||
86 | + sinon.stub(window, 'Chart').withArgs(canvas_context).returns({Line: @line}) | ||
87 | + | ||
88 | + context 'when the graphic exists', -> | ||
89 | + it 'should render the chart', -> | ||
90 | + Module.Graphic.display(@dates, @values, @container) | ||
91 | + sinon.assert.calledOnce(@line) | ||
92 | + | ||
93 | + context 'when the graphic does not exists', -> | ||
94 | + beforeEach -> | ||
95 | + @chart = sinon.stub() | ||
96 | + @chart.destroy = sinon.stub() | ||
97 | + @canvas.chart = @chart | ||
98 | + @canvas.hasOwnProperty = sinon.stub().withArgs("chart").returns(true) | ||
99 | + | ||
100 | + it 'should destroy the previous chart and render a new one', -> | ||
101 | + Module.Graphic.display(@dates, @values, @container) | ||
102 | + sinon.assert.calledOnce(@chart.destroy) | ||
103 | + sinon.assert.calledOnce(@line) | ||
104 | + | ||
105 | + afterEach -> | ||
106 | + Chart.restore() | ||
107 | + | ||
108 | + after -> | ||
109 | + $.restore() |
spec/javascripts/repository/branch_spec.js.coffee
1 | -#= require jquery | ||
2 | -#= require repository | 1 | +#= require spec_helper |
3 | #= require repository/branch | 2 | #= require repository/branch |
4 | -#= require sinon | ||
5 | 3 | ||
6 | -describe "Branch#constructor", -> | ||
7 | - it "should construct a branch", -> | ||
8 | - subject = new Repository.Branch() | ||
9 | - subject.names.should.deep.equal({}) | ||
10 | - assert.isNull(subject.request) | ||
11 | - | ||
12 | -describe "toggle", -> | ||
13 | - before -> | 4 | +describe "Repository.Branch", -> |
5 | + beforeEach -> | ||
14 | @subject = new Repository.Branch() | 6 | @subject = new Repository.Branch() |
15 | 7 | ||
16 | - @combo_box = sinon.stub() | ||
17 | - $ = sinon.stub(window, "$") | ||
18 | - $.withArgs("#branches").returns(@combo_box) | 8 | + describe "constructor", -> |
9 | + it "should construct a branch", -> | ||
10 | + @subject.names.should.deep.equal({}) | ||
11 | + assert.isNull(@subject.request) | ||
19 | 12 | ||
20 | - context "scm_type = SVN", -> | 13 | + describe "#toggle", -> |
21 | before -> | 14 | before -> |
22 | - @combo_box.hide = sinon.spy() | ||
23 | - $.withArgs("#repository_scm_type").returns({val: -> "SVN"}) | 15 | + @combo_box = sinon.stub() |
16 | + sinon.stub(window, "$") | ||
17 | + $.withArgs("#branches").returns(@combo_box) | ||
24 | 18 | ||
25 | - it "should hide the branches combo box", -> | ||
26 | - @subject.toggle() | ||
27 | - assert.isTrue(@combo_box.hide.calledOnce) | 19 | + after -> |
20 | + window.$.restore() | ||
28 | 21 | ||
29 | - context "scm_type != SVN", -> | ||
30 | - before -> | ||
31 | - @combo_box.show = sinon.spy() | ||
32 | - $.withArgs("#repository_address").returns({val: -> "https://github.com/mezuro/prezento.git"}) | 22 | + context "scm_type = SVN", -> |
23 | + beforeEach -> | ||
24 | + @combo_box.hide = sinon.spy() | ||
25 | + $.withArgs("#repository_scm_type").returns({val: -> "SVN"}) | ||
26 | + | ||
27 | + it "should hide the branches combo box", -> | ||
28 | + @subject.toggle() | ||
29 | + sinon.assert.calledOnce(@combo_box.hide) | ||
30 | + | ||
31 | + context "scm_type != SVN", -> | ||
32 | + beforeEach -> | ||
33 | + @combo_box.show = sinon.spy() | ||
34 | + $.withArgs("#repository_address").returns({val: -> "https://github.com/mezuro/prezento.git"}) | ||
35 | + $.withArgs("#repository_scm_type").returns({val: -> "GIT"}) | ||
36 | + sinon.stub(@subject, "fetch").withArgs("https://github.com/mezuro/prezento.git") | ||
37 | + | ||
38 | + it "should show the branches combo box", -> | ||
39 | + @subject.toggle() | ||
40 | + sinon.assert.calledOnce(@combo_box.show) | ||
41 | + | ||
42 | + describe "#cancel_request", -> | ||
43 | + context 'request is not null', -> | ||
44 | + beforeEach -> | ||
45 | + @request = sinon.stub() | ||
46 | + @request.abort = sinon.spy() | ||
47 | + @subject.request = @request | ||
48 | + | ||
49 | + it 'should abort the request', -> | ||
50 | + @subject.cancel_request() | ||
51 | + sinon.assert.calledOnce(@request.abort) | ||
52 | + assert.isNull(@subject.request) | ||
53 | + | ||
54 | + describe "#fill_options", -> | ||
55 | + beforeEach -> | ||
56 | + @el = jQuery("<select></select>") | ||
57 | + | ||
58 | + context 'with branches that contain master', -> | ||
59 | + it 'should place master first', -> | ||
60 | + @subject.fill_options(['dev', 'stable', 'master'], @el) | ||
61 | + | ||
62 | + option_values = [] | ||
63 | + for option in @el.get(0).options | ||
64 | + option_values.push(option.value) | ||
65 | + | ||
66 | + assert.deepEqual(option_values, ['master', 'dev', 'stable']) | ||
67 | + | ||
68 | + context "with branches that don't contain master", -> | ||
69 | + it "shouldn't change anything", -> | ||
70 | + @subject.fill_options(['dev', 'stable', 'branch_do_daniel'], @el) | ||
71 | + | ||
72 | + option_values = [] | ||
73 | + for option in @el.get(0).options | ||
74 | + option_values.push(option.value) | ||
75 | + | ||
76 | + assert.deepEqual(option_values, ['dev', 'stable', 'branch_do_daniel']) | ||
77 | + | ||
78 | + describe '#fetch', -> | ||
79 | + beforeEach -> | ||
80 | + @subject.names = {} | ||
81 | + @address = 'https://github.com/mezuro/kalibro_processor.git' | ||
82 | + @subject.cancel_request = sinon.stub() | ||
83 | + sinon.stub(@subject, "fill_options") | ||
84 | + | ||
85 | + @select = {empty: sinon.stub()} | ||
86 | + # $ is a global jQuery variable. That is why we don't need to declare it as @$ | ||
87 | + $ = sinon.stub(window, "$") | ||
88 | + $.withArgs("#repository_branch").returns(@select) | ||
33 | $.withArgs("#repository_scm_type").returns({val: -> "GIT"}) | 89 | $.withArgs("#repository_scm_type").returns({val: -> "GIT"}) |
34 | - sinon.stub(@subject, "fetch").withArgs("https://github.com/mezuro/prezento.git") | ||
35 | 90 | ||
36 | - it "should show the branches combo box", -> | ||
37 | - @subject.toggle() | ||
38 | - assert.isTrue(@combo_box.show.calledOnce) | 91 | + afterEach -> |
92 | + @subject.fill_options.restore() | ||
93 | + $.restore() | ||
94 | + | ||
95 | + context 'with valid address', -> | ||
96 | + context 'with an address that is not cached', -> | ||
97 | + beforeEach -> | ||
98 | + $.get = sinon.stub().withArgs('/repository_branches', {'url': @address, 'scm_type': 'GIT'}).returns().yields({ | ||
99 | + 'branches': ['stable', 'dev', 'master'] | ||
100 | + }) | ||
101 | + | ||
102 | + it 'should fetch the branches and fill the options', -> | ||
103 | + @subject.fetch(@address) | ||
104 | + sinon.assert.calledWith(@select.empty) | ||
105 | + sinon.assert.calledWith(@subject.fill_options, ['stable', 'dev', 'master'], @select) | ||
106 | + | ||
107 | + context 'with an address that is cached', -> | ||
108 | + beforeEach -> | ||
109 | + @subject.names[@address] = ['stable', 'dev', 'master'] | ||
110 | + $.get = sinon.stub() | ||
111 | + | ||
112 | + it 'should not request the branches but fill the select with the cached values', -> | ||
113 | + @subject.fetch(@address) | ||
114 | + sinon.assert.calledWith(@select.empty) | ||
115 | + sinon.assert.calledWith(@subject.fill_options, ['stable', 'dev', 'master'], @select) | ||
116 | + sinon.assert.notCalled($.get) | ||
117 | + | ||
118 | + context 'with an invalid address', -> | ||
119 | + beforeEach -> | ||
120 | + $.get = sinon.stub().withArgs('/repository_branches', {'url': @address, 'scm_type': 'GIT'}).returns().yields({ | ||
121 | + 'errors': ['InvalidUrl'] | ||
122 | + }) | ||
123 | + | ||
124 | + it 'should not fill the options', -> | ||
125 | + @subject.fetch(@address) | ||
126 | + sinon.assert.calledWith(@select.empty) | ||
127 | + sinon.assert.notCalled(@subject.fill_options) |