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 | 103 | gem 'capistrano-rvm', "~>0.1.0" |
104 | 104 | |
105 | 105 | # JavaScript unit tests |
106 | - gem "konacha", "~> 3.3.0" | |
106 | + gem "konacha" | |
107 | 107 | |
108 | 108 | # Better error interface |
109 | 109 | gem 'better_errors' |
... | ... | @@ -112,7 +112,7 @@ group :development, :test do |
112 | 112 | # Localization assistance |
113 | 113 | gem 'i18n_generators' |
114 | 114 | |
115 | - gem 'sprockets', '~>2.12.3' # spckets 3.0.3 breaks konacha | |
115 | + gem 'sprockets' | |
116 | 116 | |
117 | 117 | # Mocks and stubs for javascript tests |
118 | 118 | gem 'sinon-rails' | ... | ... |
Gemfile.lock
... | ... | @@ -139,7 +139,6 @@ GEM |
139 | 139 | globalid (0.3.5) |
140 | 140 | activesupport (>= 4.1.0) |
141 | 141 | google-analytics-rails (0.0.6) |
142 | - hike (1.2.3) | |
143 | 142 | http-cookie (1.0.2) |
144 | 143 | domain_name (~> 0.5) |
145 | 144 | http_accept_language (2.0.5) |
... | ... | @@ -160,12 +159,13 @@ GEM |
160 | 159 | kalibro_client (0.3.0) |
161 | 160 | activesupport (>= 2.2.1) |
162 | 161 | faraday_middleware (~> 0.9.0) |
163 | - konacha (3.3.0) | |
162 | + konacha (3.5.1) | |
164 | 163 | actionpack (>= 3.1, < 5) |
165 | 164 | capybara |
166 | 165 | colorize |
167 | 166 | railties (>= 3.1, < 5) |
168 | - sprockets | |
167 | + sprockets (>= 2, < 4) | |
168 | + tilt | |
169 | 169 | less (2.6.0) |
170 | 170 | commonjs (~> 0.2.7) |
171 | 171 | less-rails (2.7.0) |
... | ... | @@ -188,12 +188,12 @@ GEM |
188 | 188 | ntlm-http (~> 0.1, >= 0.1.1) |
189 | 189 | webrobots (>= 0.0.9, < 0.2) |
190 | 190 | metaclass (0.0.4) |
191 | - mime-types (2.5) | |
191 | + mime-types (2.6.1) | |
192 | 192 | mini_portile (0.6.2) |
193 | 193 | minitest (5.7.0) |
194 | 194 | mocha (1.1.0) |
195 | 195 | metaclass (~> 0.0.1) |
196 | - multi_json (1.11.0) | |
196 | + multi_json (1.11.1) | |
197 | 197 | multi_test (0.1.2) |
198 | 198 | multipart-post (2.0.0) |
199 | 199 | net-http-digest_auth (1.4) |
... | ... | @@ -211,7 +211,7 @@ GEM |
211 | 211 | cliver (~> 0.3.1) |
212 | 212 | multi_json (~> 1.0) |
213 | 213 | websocket-driver (>= 0.2.0) |
214 | - rack (1.6.1) | |
214 | + rack (1.6.4) | |
215 | 215 | rack-test (0.6.3) |
216 | 216 | rack (>= 1.0) |
217 | 217 | rails (4.2.1) |
... | ... | @@ -280,11 +280,8 @@ GEM |
280 | 280 | sinon-rails (1.15.0) |
281 | 281 | railties (>= 3.1) |
282 | 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 | 284 | rack (~> 1.0) |
287 | - tilt (~> 1.1, != 1.3.0) | |
288 | 285 | sprockets-rails (2.3.0) |
289 | 286 | actionpack (>= 3.0) |
290 | 287 | activesupport (>= 3.0) |
... | ... | @@ -352,7 +349,7 @@ DEPENDENCIES |
352 | 349 | jquery-rails |
353 | 350 | jquery-ui-rails (~> 5.0.0) |
354 | 351 | kalibro_client (~> 0.3.0) |
355 | - konacha (~> 3.3.0) | |
352 | + konacha | |
356 | 353 | mocha |
357 | 354 | pg (~> 0.18.1) |
358 | 355 | poltergeist (~> 1.6.0) |
... | ... | @@ -365,7 +362,7 @@ DEPENDENCIES |
365 | 362 | simplecov |
366 | 363 | sinon-rails |
367 | 364 | spring |
368 | - sprockets (~> 2.12.3) | |
365 | + sprockets | |
369 | 366 | sqlite3 |
370 | 367 | therubyracer |
371 | 368 | turbolinks | ... | ... |
... | ... | @@ -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 | 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 | 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 | 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 | 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) | ... | ... |