ci_in_a_can 0.2.4 → 0.2.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8cc7b9a3c96269cab17933b73e3c25f8bf640fb9
4
- data.tar.gz: a0f059a4b8ffeb8d3c7adbd5e4ee8caf5c8ac5ba
3
+ metadata.gz: ec408de18d9c47e09339a8c2ed0bc8453a42a039
4
+ data.tar.gz: cb23d747865712a372931f1a558fee78f618bf95
5
5
  SHA512:
6
- metadata.gz: d66137bb18e8252c226c3ba61bf5f437d62b701ea8a8a4c98d8b59d67a4f85aa676621ca9185db49653a8ec6d7d4d6bf179a361cde2778c4fba0847eb71885bc
7
- data.tar.gz: 5a44a7b4a1f3e92452c0aa410b9f84829014cf72708dcd1cfed779ea1bdee29925946a79211ca03652e53dc222c790d034dc5718f3b9c036f3b75c9250d7cbe3
6
+ metadata.gz: 8475a583069b024c3460c151fdbc30b0f404072936784378a9be2076eb19a25b6acfbf03601b551497914adc154085c00afbbf2744140113beaf5304c31d2d4d
7
+ data.tar.gz: fe8538c757f0d30cb4da661c083e06285a031d0a5a9563c891c63f0060d7dc582797fe85fcc800f921676b7190b9f24bb2c0d6e90f5c28950aa8f9090fdebe7f
@@ -15,93 +15,51 @@ module CiInACan
15
15
  end
16
16
 
17
17
  get '/login' do
18
- CiInACan::WebContent.full_page_of(
19
- <<EOF
20
- <form action="/login" method="post">
21
- Passphrase
22
- <input type="password" name="passphrase">
23
- <button type="submit">Submit</button>
24
- </form>
25
- EOF
26
- )
18
+ CiInACan::Web.new.login_page
27
19
  end
28
20
 
29
21
  post '/login' do
30
- session[:passphrase] = params[:passphrase]
22
+ web = CiInACan::Web.new(params: params, session: session)
23
+ web.submit_a_passphrase
31
24
  redirect '/'
32
25
  end
33
26
 
34
27
  get '/test_result/:id.json' do
35
- CiInACan::TestResult.find(params[:id]).to_json
28
+ CiInACan::Web.new(params: params).show_the_test_result_in_json
36
29
  end
37
30
 
38
31
  post %r{/repo/(.+)} do
39
32
 
40
- unless session[:authenticated]
33
+ web = CiInACan::Web.new(params: params, session: session)
34
+ unless web.logged_in?
41
35
  redirect '/login'
42
36
  return
43
37
  end
44
-
45
- params[:id] = params[:captures].first
46
- commands = params[:commands].gsub("\r\n", "\n").split("\n")
47
- commands = commands.map { |x| x.strip }.select { |x| x != '' }
48
- repo = CiInACan::Repo.find params[:id]
49
- repo = CiInACan::Repo.create(id: params[:id]) unless repo
50
- repo.build_commands = commands
51
- repo.save
52
- redirect "/repo/#{params[:id]}"
38
+ repo = web.update_repo_details
39
+ redirect "/repo/#{repo.id}"
53
40
  end
54
41
 
55
42
  get %r{/repo/(.+)} do
43
+ web = CiInACan::Web.new(params: params, session: session)
56
44
 
57
- unless session[:authenticated]
45
+ unless web.logged_in?
58
46
  redirect '/login'
59
47
  return
60
48
  end
61
49
 
62
- params[:id] = params[:captures].first
63
- repo = CiInACan::Repo.find(params[:id])
64
- url = repo ? repo.url : nil
65
- commands = repo ? repo.build_commands.join("\n") : ''
66
- CiInACan::WebContent.full_page_of(
67
- <<EOF
68
- <form action="/repo/#{params[:id]}" method="post">
69
- <div>#{url}</div>
70
- <textarea name="commands">
71
- #{commands}
72
- </textarea>
73
- <input type="submit">Submit</input>
74
- </form>
75
- EOF
76
- )
50
+ web.show_the_repo_edit_form
77
51
  end
78
52
 
79
53
  get '/test_result/:id' do
80
- test_result = CiInACan::TestResult.find(params[:id])
81
- CiInACan::WebContent.full_page_of test_result.to_html
54
+ CiInACan::Web.new(params: params).show_the_test_result
82
55
  end
83
56
 
84
57
  get '/' do
85
- runs = CiInACan::Run.all.to_a
86
- ::CiInACan::ViewModels::AListOfRuns.new(runs).to_html
58
+ CiInACan::Web.new.show_a_list_of_the_runs
87
59
  end
88
60
 
89
61
  post %r{/push/(.+)} do
90
- capture = params[:captures].first.split('/')
91
- api_key = capture.pop
92
- id = capture.join('/')
93
-
94
- repo = CiInACan::Repo.find id
95
- raise 'Could not find this repo' unless repo
96
- raise 'Invalid API Key' unless repo.api_key == api_key
97
-
98
- write_a_file_with params
99
- end
100
-
101
- def write_a_file_with params
102
- data = params.to_json
103
- File.open("#{self.class.jobs_location}/#{UUID.new.generate}.json", 'w') { |f| f.write data }
104
- data
62
+ CiInACan::Web.new(params: params).start_a_new_build
105
63
  end
106
64
 
107
65
  end
@@ -1,3 +1,3 @@
1
1
  module CiInACan
2
- VERSION = "0.2.4"
2
+ VERSION = "0.2.5"
3
3
  end
@@ -0,0 +1,24 @@
1
+ module CiInACan
2
+
3
+ module ViewModels
4
+
5
+ class LoginForm < ViewModel
6
+
7
+ def to_html
8
+ CiInACan::WebContent.full_page_of(
9
+ <<EOF
10
+ <form action="/login" method="post">
11
+ Passphrase
12
+ <input type="password" name="passphrase">
13
+ <button type="submit">Submit</button>
14
+ </form>
15
+ EOF
16
+ )
17
+ end
18
+
19
+ end
20
+
21
+ end
22
+
23
+ end
24
+
@@ -0,0 +1,25 @@
1
+ module CiInACan
2
+
3
+ module ViewModels
4
+
5
+ class RepoForm < ViewModel
6
+
7
+ def to_html
8
+ CiInACan::WebContent.full_page_of(
9
+ <<EOF
10
+ <form action="/repo/#{id}" method="post">
11
+ <div>#{url}</div>
12
+ <textarea name="commands">
13
+ #{build_commands.join("\n")}
14
+ </textarea>
15
+ <input type="submit">Submit</input>
16
+ </form>
17
+ EOF
18
+ )
19
+ end
20
+
21
+ end
22
+
23
+ end
24
+
25
+ end
@@ -4,7 +4,7 @@ module CiInACan
4
4
 
5
5
  class ViewModel
6
6
 
7
- def initialize value
7
+ def initialize value = nil
8
8
  @value = value
9
9
  end
10
10
 
@@ -0,0 +1,78 @@
1
+ module CiInACan
2
+
3
+ class Web
4
+
5
+ params_constructor
6
+
7
+ attr_accessor :params, :session
8
+
9
+ class << self
10
+ attr_accessor :jobs_location
11
+ end
12
+
13
+ def login_page
14
+ CiInACan::ViewModels::LoginForm.new.to_html
15
+ end
16
+
17
+ def submit_a_passphrase
18
+ session[:passphrase] = params[:passphrase]
19
+ end
20
+
21
+ def show_the_test_result_in_json
22
+ CiInACan::TestResult.find(params[:id]).to_json
23
+ end
24
+
25
+ def logged_in?
26
+ return false if session[:passphrase].to_s == ''
27
+ session[:passphrase] == ENV['PASSPHRASE']
28
+ end
29
+
30
+ def show_the_repo_edit_form
31
+ id = params[:captures].first
32
+ repo = CiInACan::Repo.find(id) || CiInACan::Repo.new(id: id)
33
+ CiInACan::ViewModels::RepoForm.new(repo).to_html
34
+ end
35
+
36
+ def start_a_new_build
37
+ assert_that_the_new_build_is_valid
38
+
39
+ write_a_file_with params
40
+ params.to_json
41
+ end
42
+
43
+ def show_a_list_of_the_runs
44
+ CiInACan::ViewModels::AListOfRuns.new(CiInACan::Run.all.to_a).to_html
45
+ end
46
+
47
+ def show_the_test_result
48
+ test_result = CiInACan::TestResult.find(params[:id])
49
+ CiInACan::WebContent.full_page_of test_result.to_html
50
+ end
51
+
52
+ def update_repo_details
53
+ CiInACan::Repo.create(id: params[:captures].first,
54
+ build_commands: params[:commands].gsub("\r\n", "\n")
55
+ .split("\n")
56
+ .map { |x| x.strip }
57
+ .select { |x| x != '' } )
58
+ end
59
+
60
+ def write_a_file_with params
61
+ data = params.to_json
62
+ file = "#{self.class.jobs_location}/#{UUID.new.generate}.json"
63
+ CiInACan::FileSystem.create_file file, data
64
+ end
65
+
66
+ def assert_that_the_new_build_is_valid
67
+ capture = params[:captures].first.split('/')
68
+ api_key = capture.pop
69
+ id = capture.join('/')
70
+
71
+ repo = CiInACan::Repo.find id
72
+ raise 'Could not find this repo' unless repo
73
+ raise 'Invalid API Key' unless repo.api_key == api_key
74
+ end
75
+
76
+ end
77
+
78
+ end
@@ -0,0 +1,426 @@
1
+ require_relative '../spec_helper'
2
+
3
+ describe CiInACan::Web do
4
+
5
+ let(:params) { {} }
6
+ let(:session) { {} }
7
+
8
+ let(:web) do
9
+ CiInACan::Web.new(params: params,
10
+ session: session)
11
+ end
12
+
13
+ describe "login page" do
14
+
15
+ it "should return the login form html" do
16
+
17
+ html = Object.new
18
+ login_form = Object.new
19
+
20
+ login_form.stubs(:to_html).returns html
21
+ CiInACan::ViewModels::LoginForm.stubs(:new).returns login_form
22
+
23
+ web.login_page.must_be_same_as html
24
+
25
+ end
26
+
27
+ end
28
+
29
+ describe "submit a passphrase" do
30
+
31
+ it "should set the passphrase in session" do
32
+
33
+ passphrase = Object.new
34
+ params[:passphrase] = passphrase
35
+
36
+ web.submit_a_passphrase
37
+
38
+ session[:passphrase].must_be_same_as passphrase
39
+
40
+ end
41
+
42
+ end
43
+
44
+ describe "showing the test result in html" do
45
+
46
+ it "should return the html results" do
47
+
48
+ params[:id] = Object.new
49
+ test_result = Object.new
50
+ web_content = Object.new
51
+ html = Object.new
52
+
53
+ test_result.stubs(:to_html).returns html
54
+
55
+ CiInACan::TestResult.stubs(:find)
56
+ .with(params[:id])
57
+ .returns test_result
58
+
59
+ CiInACan::WebContent.stubs(:full_page_of)
60
+ .with(html)
61
+ .returns web_content
62
+
63
+ result = web.show_the_test_result
64
+
65
+ result.must_be_same_as web_content
66
+
67
+ end
68
+
69
+ end
70
+
71
+ describe "showing the test result in json" do
72
+
73
+ it "should return the json results" do
74
+
75
+ params[:id] = Object.new
76
+ test_result = Object.new
77
+ json = Object.new
78
+
79
+ test_result.stubs(:to_json).returns json
80
+
81
+ CiInACan::TestResult.stubs(:find)
82
+ .with(params[:id])
83
+ .returns test_result
84
+
85
+ result = web.show_the_test_result_in_json
86
+
87
+ result.must_be_same_as json
88
+
89
+ end
90
+
91
+ end
92
+
93
+ describe "determining if the user is logged in" do
94
+
95
+ it "should return true if the passphrase in session and ENV match" do
96
+
97
+ passphrase = Object.new
98
+
99
+ ENV.stubs(:[]).with('PASSPHRASE').returns passphrase
100
+ session[:passphrase] = passphrase
101
+
102
+ web.logged_in?.must_equal true
103
+
104
+ end
105
+
106
+ it "should return false if the passphrases do not match" do
107
+
108
+ ENV.stubs(:[]).with('PASSPHRASE').returns Object.new
109
+ session[:passphrase] = Object.new
110
+
111
+ web.logged_in?.must_equal false
112
+
113
+ end
114
+
115
+ it "should return false if the passphrases are nil" do
116
+
117
+ ENV.stubs(:[]).with('PASSPHRASE').returns nil
118
+ session[:passphrase] = nil
119
+
120
+ web.logged_in?.must_equal false
121
+
122
+ end
123
+
124
+ it "should return false if the passphrases are empty strings" do
125
+
126
+ ENV.stubs(:[]).with('PASSPHRASE').returns ""
127
+ session[:passphrase] = ""
128
+
129
+ web.logged_in?.must_equal false
130
+
131
+ end
132
+
133
+ end
134
+
135
+ describe "showing the repo edit form" do
136
+
137
+ describe "when the id matches an existing repo" do
138
+
139
+ it "should return the html for the repo form" do
140
+
141
+ id = Object.new
142
+ params[:captures] = [id]
143
+ repo = Object.new
144
+ repo_form = Object.new
145
+ html = Object.new
146
+
147
+ repo_form.stubs(:to_html).returns html
148
+
149
+ CiInACan::Repo.stubs(:find).with(id).returns repo
150
+ CiInACan::ViewModels::RepoForm.stubs(:new).with(repo).returns repo_form
151
+
152
+ web.show_the_repo_edit_form.must_be_same_as html
153
+
154
+ end
155
+
156
+ end
157
+
158
+ describe "when the id has never been used" do
159
+
160
+ it "should return the html for a new repo form" do
161
+
162
+ id = Object.new
163
+ params[:captures] = [id]
164
+ repo = Object.new
165
+ repo_form = Object.new
166
+ html = Object.new
167
+
168
+ repo_form.stubs(:to_html).returns html
169
+
170
+ CiInACan::Repo.stubs(:find).with(id).returns nil
171
+ CiInACan::Repo.stubs(:new).with(id: id).returns repo
172
+ CiInACan::ViewModels::RepoForm.stubs(:new).with(repo).returns repo_form
173
+
174
+ web.show_the_repo_edit_form.must_be_same_as html
175
+
176
+ end
177
+
178
+ end
179
+
180
+ end
181
+
182
+ [:captures, :commands, :expected_id, :expected_commands].to_objects {[
183
+ [['one/two'], "\na\r\nb\nc\r\nd\n\n", 'one/two', ['a', 'b', 'c', 'd']],
184
+ [['two/three'], "w\nx\ny\r\nz", 'two/three', ['w', 'x', 'y', 'z']]
185
+ ]}.each do |test|
186
+
187
+ describe "updating the repo details" do
188
+
189
+ before do
190
+ clear_all_persisted_data
191
+ end
192
+
193
+ describe "a repo that has never been saved before" do
194
+
195
+ before do
196
+ params[:captures] = test.captures
197
+ params[:commands] = test.commands
198
+ end
199
+
200
+ it "should create a repo" do
201
+ web.update_repo_details
202
+ CiInACan::Repo.all.count.must_equal 1
203
+ end
204
+
205
+ it "should set the id" do
206
+ web.update_repo_details
207
+ CiInACan::Repo.all.first.id.must_equal test.expected_id
208
+ end
209
+
210
+ it "should set the build commands" do
211
+ web.update_repo_details
212
+ CiInACan::Repo.all.first.build_commands.must_equal test.expected_commands
213
+ end
214
+
215
+ end
216
+
217
+ describe "a repo that been saved before" do
218
+
219
+ before do
220
+ CiInACan::Repo.create(id: test.expected_id)
221
+ params[:captures] = test.captures
222
+ params[:commands] = test.commands
223
+ end
224
+
225
+ it "should create a repo" do
226
+ web.update_repo_details
227
+ CiInACan::Repo.all.count.must_equal 1
228
+ end
229
+
230
+ it "should set the build commands" do
231
+ web.update_repo_details
232
+ CiInACan::Repo.all.first.build_commands.must_equal test.expected_commands
233
+ end
234
+
235
+ it "should return the repo" do
236
+ result = web.update_repo_details
237
+ result.is_a? CiInACan::Repo
238
+ result.id.must_equal test.expected_id
239
+ end
240
+
241
+ end
242
+
243
+ end
244
+
245
+ end
246
+
247
+ describe "showing a list of the runs" do
248
+
249
+ it "should return the html for all of the runs" do
250
+
251
+ runs = Object.new
252
+ array_of_runs = Object.new
253
+ html = Object.new
254
+ list_of_runs = Object.new
255
+
256
+
257
+ CiInACan::Run.stubs(:all).returns runs
258
+ runs.stubs(:to_a).returns array_of_runs
259
+ CiInACan::ViewModels::AListOfRuns.stubs(:new)
260
+ .with(array_of_runs)
261
+ .returns list_of_runs
262
+ list_of_runs.stubs(:to_html).returns html
263
+
264
+ result = web.show_a_list_of_the_runs
265
+
266
+ result.must_be_same_as html
267
+
268
+ end
269
+
270
+ end
271
+
272
+ describe "starting a new build" do
273
+
274
+ [:url, :repo, :api_key, :jobs_location, :uuid].to_objects {[
275
+ ['account/name/api_key', 'account/name', 'api_key', 'the job', 'the uuid'],
276
+ ['one/two/three', 'one/two', 'three', 'A', 'B']
277
+ ]}.each do |test|
278
+
279
+ describe "when the api key is valid" do
280
+
281
+ let(:repo) do
282
+ r = Object.new
283
+ r.stubs(:api_key).returns test.api_key
284
+ r
285
+ end
286
+
287
+ let(:json) { Object.new }
288
+
289
+ before do
290
+ params[:captures] = [test.url]
291
+
292
+ params.stubs(:to_json).returns json
293
+
294
+ CiInACan::Repo.stubs(:find)
295
+ .with(test.repo)
296
+ .returns repo
297
+
298
+ CiInACan::Web.stubs(:jobs_location).returns test.jobs_location
299
+
300
+ CiInACan::FileSystem.stubs(:create_file)
301
+
302
+ uuid = Object.new
303
+ uuid.stubs(:generate).returns test.uuid
304
+ UUID.stubs(:new).returns uuid
305
+ end
306
+
307
+ it "should not fail when we call it" do
308
+ web.start_a_new_build
309
+ end
310
+
311
+ it "should write a file" do
312
+ CiInACan::FileSystem.expects(:create_file)
313
+ .with("#{test.jobs_location}/#{test.uuid}.json", json)
314
+ web.start_a_new_build
315
+ end
316
+
317
+ it "should return the json back" do
318
+ web.start_a_new_build.must_be_same_as json
319
+ end
320
+
321
+ end
322
+
323
+ end
324
+
325
+ [:url, :repo, :api_key, :jobs_location, :uuid].to_objects {[
326
+ ['account/name/api_key', 'account/name', 'api_key', 'the job', 'the uuid'],
327
+ ]}.each do |test|
328
+
329
+ describe "when the repo does not exist" do
330
+
331
+ let(:repo) do
332
+ r = Object.new
333
+ r.stubs(:api_key).returns test.api_key
334
+ r
335
+ end
336
+
337
+ before do
338
+ params[:captures] = [test.url]
339
+
340
+ CiInACan::Repo.stubs(:find)
341
+ .with(test.repo)
342
+ .returns nil
343
+
344
+ CiInACan::FileSystem.stubs(:create_file)
345
+
346
+ uuid = Object.new
347
+ uuid.stubs(:generate).returns test.uuid
348
+ UUID.stubs(:new).returns uuid
349
+ end
350
+
351
+ it "should throw an error" do
352
+ error_hit = false
353
+ begin
354
+ web.start_a_new_build
355
+ rescue
356
+ error_hit = true
357
+ end
358
+
359
+ error_hit.must_equal true
360
+ end
361
+
362
+ it "should not write any files" do
363
+ called = false
364
+ # having some issue with never?
365
+ CiInACan::FileSystem.stubs(:create_file).with { |a, b| [a, b].inspect; called = true; true }
366
+ -> { web.start_a_new_build }.call_safely
367
+ called.must_equal false
368
+ end
369
+
370
+ end
371
+
372
+ end
373
+
374
+ [:url, :repo, :api_key, :jobs_location, :uuid, :the_other_api_key].to_objects {[
375
+ ['account/name/api_key', 'account/name', 'api_key', 'the job', 'the uuid', 'sdf'],
376
+ ['account/name/api_key', 'account/name', 'api_key', 'the job', 'the uuid', 'abc'],
377
+ ]}.each do |test|
378
+
379
+ describe "when the repo api key does not match the request" do
380
+
381
+ let(:repo) do
382
+ r = Object.new
383
+ r.stubs(:api_key).returns test.the_other_api_key
384
+ r
385
+ end
386
+
387
+ before do
388
+ params[:captures] = [test.url]
389
+
390
+ CiInACan::Repo.stubs(:find)
391
+ .with(test.repo)
392
+ .returns repo
393
+
394
+ CiInACan::FileSystem.stubs(:create_file)
395
+
396
+ uuid = Object.new
397
+ uuid.stubs(:generate).returns test.uuid
398
+ UUID.stubs(:new).returns uuid
399
+ end
400
+
401
+ it "should throw an error" do
402
+ error_hit = false
403
+ begin
404
+ web.start_a_new_build
405
+ rescue
406
+ error_hit = true
407
+ end
408
+
409
+ error_hit.must_equal true
410
+ end
411
+
412
+ it "should not write any files" do
413
+ called = false
414
+ # having some issue with never?
415
+ CiInACan::FileSystem.stubs(:create_file).with { |a, b| [a, b].inspect; called = true; true }
416
+ -> { web.start_a_new_build }.call_safely
417
+ called.must_equal false
418
+ end
419
+
420
+ end
421
+
422
+ end
423
+
424
+ end
425
+
426
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ci_in_a_can
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.2.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Darren Cauthon
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-08 00:00:00.000000000 Z
11
+ date: 2014-03-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -248,10 +248,13 @@ files:
248
248
  - lib/ci_in_a_can/test_runner.rb
249
249
  - lib/ci_in_a_can/version.rb
250
250
  - lib/ci_in_a_can/view_models/a_list_of_runs.rb
251
+ - lib/ci_in_a_can/view_models/login_form.rb
252
+ - lib/ci_in_a_can/view_models/repo_form.rb
251
253
  - lib/ci_in_a_can/view_models/run_view_model.rb
252
254
  - lib/ci_in_a_can/view_models/test_result_view_model.rb
253
255
  - lib/ci_in_a_can/view_models/view_model.rb
254
256
  - lib/ci_in_a_can/watcher.rb
257
+ - lib/ci_in_a_can/web.rb
255
258
  - lib/ci_in_a_can/web_content.rb
256
259
  - sample.json
257
260
  - spec/ci_in_a_can/bash_result_spec.rb
@@ -270,6 +273,7 @@ files:
270
273
  - spec/ci_in_a_can/test_runner_spec.rb
271
274
  - spec/ci_in_a_can/view_models/view_model_spec.rb
272
275
  - spec/ci_in_a_can/watcher_spec.rb
276
+ - spec/ci_in_a_can/web_spec.rb
273
277
  - spec/spec_helper.rb
274
278
  - spec/temp/.gitkeep
275
279
  homepage: ''
@@ -313,5 +317,6 @@ test_files:
313
317
  - spec/ci_in_a_can/test_runner_spec.rb
314
318
  - spec/ci_in_a_can/view_models/view_model_spec.rb
315
319
  - spec/ci_in_a_can/watcher_spec.rb
320
+ - spec/ci_in_a_can/web_spec.rb
316
321
  - spec/spec_helper.rb
317
322
  - spec/temp/.gitkeep