tddium-preview 0.0.5 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/tddium.rb +31 -8
- data/lib/tddium/constant.rb +1 -0
- data/lib/tddium/version.rb +1 -1
- data/spec/tddium_spec.rb +96 -39
- metadata +4 -30
data/lib/tddium.rb
CHANGED
@@ -7,6 +7,7 @@ require "thor"
|
|
7
7
|
require "highline/import"
|
8
8
|
require "json"
|
9
9
|
require "tddium_client"
|
10
|
+
require "base64"
|
10
11
|
require File.expand_path("../tddium/constant", __FILE__)
|
11
12
|
|
12
13
|
# Usage:
|
@@ -99,18 +100,33 @@ class Tddium < Thor
|
|
99
100
|
|
100
101
|
desc "spec", "Run the test suite"
|
101
102
|
method_option :environment, :type => :string, :default => nil
|
103
|
+
method_option :user_data_file, :type => :string, :default => nil
|
102
104
|
def spec
|
103
105
|
set_default_environment(options[:environment])
|
104
106
|
return unless git_repo? && tddium_settings && suite_for_current_branch?
|
105
107
|
|
106
|
-
|
108
|
+
test_execution_params = {}
|
109
|
+
if user_data_file_path = options[:user_data_file]
|
110
|
+
if File.exists?(user_data_file_path)
|
111
|
+
user_data = File.open(user_data_file_path) { |file| file.read }
|
112
|
+
test_execution_params[:user_data_text] = Base64.encode64(user_data)
|
113
|
+
test_execution_params[:user_data_filename] = File.basename(user_data_file_path)
|
114
|
+
else
|
115
|
+
say Text::Error::NO_USER_DATA_FILE % user_data_file_path
|
116
|
+
return
|
117
|
+
end
|
118
|
+
end
|
107
119
|
|
108
|
-
|
109
|
-
return unless git_push
|
120
|
+
start_time = Time.now
|
110
121
|
|
111
122
|
# Call the API to get the suite and its tests
|
112
123
|
begin
|
113
124
|
suite_details = call_api(:get, current_suite_path)
|
125
|
+
|
126
|
+
# Push the latest code to git
|
127
|
+
return unless update_git_remote_and_push(suite_details)
|
128
|
+
|
129
|
+
# Get a list of files to be tested
|
114
130
|
test_pattern = suite_details["suite"]["test_pattern"]
|
115
131
|
test_files = Dir.glob(test_pattern).collect {|file_path| {:test_name => file_path}}
|
116
132
|
|
@@ -122,7 +138,7 @@ class Tddium < Thor
|
|
122
138
|
call_api(:post, "#{Api::Path::SESSIONS}/#{session_id}/#{Api::Path::REGISTER_TEST_EXECUTIONS}", {:suite_id => current_suite_id, :tests => test_files})
|
123
139
|
|
124
140
|
# Start the tests
|
125
|
-
start_test_executions = call_api(:post, "#{Api::Path::SESSIONS}/#{session_id}/#{Api::Path::START_TEST_EXECUTIONS}")
|
141
|
+
start_test_executions = call_api(:post, "#{Api::Path::SESSIONS}/#{session_id}/#{Api::Path::START_TEST_EXECUTIONS}", test_execution_params)
|
126
142
|
tests_not_finished_yet = true
|
127
143
|
finished_tests = {}
|
128
144
|
test_statuses = Hash.new(0)
|
@@ -162,7 +178,7 @@ class Tddium < Thor
|
|
162
178
|
end
|
163
179
|
|
164
180
|
# Print out the result
|
165
|
-
say "
|
181
|
+
say ""
|
166
182
|
say Text::Process::FINISHED_TEST % (Time.now - start_time)
|
167
183
|
say "#{finished_tests.size} examples, #{test_statuses["failed"]} failures, #{test_statuses["error"]} errors, #{test_statuses["pending"]} pending"
|
168
184
|
rescue TddiumClient::Error::Base
|
@@ -269,9 +285,7 @@ class Tddium < Thor
|
|
269
285
|
write_suite(new_suite["suite"]["id"])
|
270
286
|
|
271
287
|
# Manage git
|
272
|
-
|
273
|
-
`git remote add #{Git::REMOTE_NAME} #{new_suite["suite"]["git_repo_uri"]}`
|
274
|
-
git_push
|
288
|
+
update_git_remote_and_push(new_suite)
|
275
289
|
end
|
276
290
|
rescue TddiumClient::Error::Base
|
277
291
|
end
|
@@ -430,6 +444,15 @@ class Tddium < Thor
|
|
430
444
|
@tddium_settings
|
431
445
|
end
|
432
446
|
|
447
|
+
def update_git_remote_and_push(suite_details)
|
448
|
+
git_repo_uri = suite_details["suite"]["git_repo_uri"]
|
449
|
+
unless `git remote show -n #{Git::REMOTE_NAME}` =~ /#{git_repo_uri}/
|
450
|
+
`git remote rm #{Git::REMOTE_NAME}`
|
451
|
+
`git remote add #{Git::REMOTE_NAME} #{git_repo_uri}`
|
452
|
+
end
|
453
|
+
git_push
|
454
|
+
end
|
455
|
+
|
433
456
|
def user_logged_in?(active = true)
|
434
457
|
result = tddium_settings(:fail_with_message => false) && tddium_settings["api_key"]
|
435
458
|
(result && active) ? get_user : result
|
data/lib/tddium/constant.rb
CHANGED
data/lib/tddium/version.rb
CHANGED
data/spec/tddium_spec.rb
CHANGED
@@ -15,6 +15,7 @@ describe Tddium do
|
|
15
15
|
SAMPLE_BUNDLER_VERSION = "1.10.10"
|
16
16
|
SAMPLE_DATE_TIME = "2011-03-11T08:43:02Z"
|
17
17
|
SAMPLE_EMAIL = "someone@example.com"
|
18
|
+
SAMPLE_FILE_PATH = "./my_user_file.png"
|
18
19
|
SAMPLE_INVITATION_TOKEN = "TZce3NueiXp2lMTmaeRr"
|
19
20
|
SAMPLE_GIT_REPO_URI = "ssh://git@api.tddium.com/home/git/repo/#{SAMPLE_APP_NAME}"
|
20
21
|
SAMPLE_LICENSE_TEXT = "LICENSE"
|
@@ -25,10 +26,11 @@ describe Tddium do
|
|
25
26
|
SAMPLE_RECURLY_URL = "https://tddium.recurly.com/account/1"
|
26
27
|
SAMPLE_SESSION_ID = 1
|
27
28
|
SAMPLE_SUITE_ID = 1
|
28
|
-
|
29
|
+
SAMPLE_TEST_PATTERN = "**/*_spec.rb"
|
30
|
+
SAMPLE_SUITE_RESPONSE = {"repo_name" => SAMPLE_APP_NAME, "branch" => SAMPLE_BRANCH_NAME, "id" => SAMPLE_SUITE_ID, "test_pattern"=>SAMPLE_TEST_PATTERN, "ruby_version"=>SAMPLE_RUBY_VERSION, "git_repo_uri" => SAMPLE_GIT_REPO_URI}
|
31
|
+
SAMPLE_SUITES_RESPONSE = {"suites" => [SAMPLE_SUITE_RESPONSE]}
|
29
32
|
SAMPLE_TDDIUM_CONFIG_FILE = ".tddium.test"
|
30
33
|
SAMPLE_TEST_EXECUTION_STATS = "total 1, notstarted 0, started 1, passed 0, failed 0, pending 0, error 0", "start_time"
|
31
|
-
SAMPLE_TEST_PATTERN = "**/*_spec.rb"
|
32
34
|
SAMPLE_USER_RESPONSE = {"user"=> {"api_key" => SAMPLE_API_KEY, "email" => SAMPLE_EMAIL, "created_at" => SAMPLE_DATE_TIME, "recurly_url" => SAMPLE_RECURLY_URL}}
|
33
35
|
|
34
36
|
def call_api_should_receive(options = {})
|
@@ -114,6 +116,11 @@ describe Tddium do
|
|
114
116
|
tddium.stub(:system).with(/^git push/).and_return(success)
|
115
117
|
end
|
116
118
|
|
119
|
+
def stub_git_remote(tddium, action = :show, success = true)
|
120
|
+
git_response = success ? "some text that contains #{SAMPLE_GIT_REPO_URI}" : "some text that does not contain the git repo uri" if action == :show
|
121
|
+
tddium.stub(:`).with(/^git remote #{action}/).and_return(git_response)
|
122
|
+
end
|
123
|
+
|
117
124
|
def stub_ruby_version(tddium, version = SAMPLE_RUBY_VERSION)
|
118
125
|
tddium.stub(:`).with("ruby -v").and_return("ruby #{version} (2010-08-16 patchlevel 302) [i686-darwin10.5.0]")
|
119
126
|
end
|
@@ -253,6 +260,48 @@ describe Tddium do
|
|
253
260
|
end
|
254
261
|
end
|
255
262
|
|
263
|
+
shared_examples_for "update the git remote and push" do
|
264
|
+
context "git remote has changed" do
|
265
|
+
before do
|
266
|
+
stub_git_remote(tddium, :show, false)
|
267
|
+
stub_git_remote(tddium, :add)
|
268
|
+
stub_git_remote(tddium, :rm)
|
269
|
+
end
|
270
|
+
|
271
|
+
it "should remove all existing remotes called '#{Tddium::Git::REMOTE_NAME}'" do
|
272
|
+
tddium.should_receive(:`).with("git remote rm #{Tddium::Git::REMOTE_NAME}")
|
273
|
+
run(tddium)
|
274
|
+
end
|
275
|
+
|
276
|
+
it "should add a new remote called '#{Tddium::Git::REMOTE_NAME}' to '#{SAMPLE_GIT_REPO_URI}'" do
|
277
|
+
tddium.should_receive(:`).with("git remote add #{Tddium::Git::REMOTE_NAME} #{SAMPLE_GIT_REPO_URI}")
|
278
|
+
run(tddium)
|
279
|
+
end
|
280
|
+
|
281
|
+
end
|
282
|
+
|
283
|
+
context "git remote has not changed" do
|
284
|
+
before do
|
285
|
+
stub_git_remote(tddium)
|
286
|
+
end
|
287
|
+
|
288
|
+
it "should not remove any existing remotes" do
|
289
|
+
tddium.should_not_receive(:`).with(/git remote rm/)
|
290
|
+
run(tddium)
|
291
|
+
end
|
292
|
+
|
293
|
+
it "should not add any new remotes" do
|
294
|
+
tddium.should_not_receive(:`).with(/git remote add/)
|
295
|
+
run(tddium)
|
296
|
+
end
|
297
|
+
end
|
298
|
+
|
299
|
+
it "should push the latest code to '#{Tddium::Git::REMOTE_NAME}'" do
|
300
|
+
tddium.should_receive(:system).with("git push #{Tddium::Git::REMOTE_NAME} #{SAMPLE_BRANCH_NAME}")
|
301
|
+
run(tddium)
|
302
|
+
end
|
303
|
+
end
|
304
|
+
|
256
305
|
shared_examples_for "with the correct environment extension" do
|
257
306
|
it "should write the api key to the .tddium file with the relevent environment extension" do
|
258
307
|
run(tddium)
|
@@ -505,7 +554,6 @@ describe Tddium do
|
|
505
554
|
before do
|
506
555
|
stub_defaults
|
507
556
|
stub_config_file(:api_key => true, :branches => true)
|
508
|
-
stub_git_push(tddium)
|
509
557
|
end
|
510
558
|
|
511
559
|
it_should_behave_like "set the default environment"
|
@@ -513,16 +561,22 @@ describe Tddium do
|
|
513
561
|
it_should_behave_like ".tddium file is missing or corrupt"
|
514
562
|
it_should_behave_like "suite has not been initialized"
|
515
563
|
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
564
|
+
context "--user-data-file=#{SAMPLE_FILE_PATH}" do
|
565
|
+
context "does not exist" do
|
566
|
+
it "should show the user: #{Tddium::Text::Error::NO_USER_DATA_FILE % SAMPLE_FILE_PATH}" do
|
567
|
+
tddium.should_receive(:say).with(Tddium::Text::Error::NO_USER_DATA_FILE % SAMPLE_FILE_PATH)
|
568
|
+
run_spec(tddium, :user_data_file => SAMPLE_FILE_PATH)
|
569
|
+
end
|
520
570
|
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
571
|
+
it "should not try to git push" do
|
572
|
+
tddium.should_not_receive(:system).with(/^git push/)
|
573
|
+
run_spec(tddium, :user_data_file => SAMPLE_FILE_PATH)
|
574
|
+
end
|
575
|
+
|
576
|
+
it "should not call the api" do
|
577
|
+
tddium_client.should_not_receive(:call_api)
|
578
|
+
run_spec(tddium, :user_data_file => SAMPLE_FILE_PATH)
|
579
|
+
end
|
526
580
|
end
|
527
581
|
end
|
528
582
|
|
@@ -531,13 +585,24 @@ describe Tddium do
|
|
531
585
|
|
532
586
|
context "'GET #{Tddium::Api::Path::SUITES}/#{SAMPLE_SUITE_ID}' is successful" do
|
533
587
|
before do
|
534
|
-
|
535
|
-
|
588
|
+
stub_call_api_response(:get, "#{Tddium::Api::Path::SUITES}/#{SAMPLE_SUITE_ID}", {"suite"=>SAMPLE_SUITE_RESPONSE})
|
589
|
+
stub_git_push(tddium)
|
590
|
+
stub_git_remote(tddium)
|
536
591
|
create_file("spec/mouse_spec.rb")
|
537
592
|
create_file("spec/cat_spec.rb")
|
538
593
|
create_file("spec/dog_spec.rb")
|
539
594
|
end
|
540
595
|
|
596
|
+
it_should_behave_like "update the git remote and push"
|
597
|
+
|
598
|
+
context "git push was unsuccessful" do
|
599
|
+
before { stub_git_push(tddium, false) }
|
600
|
+
it "should not try to create a new session" do
|
601
|
+
tddium_client.should_not_receive(:call_api).with(:post, Tddium::Api::Path::SESSIONS)
|
602
|
+
run_spec(tddium)
|
603
|
+
end
|
604
|
+
end
|
605
|
+
|
541
606
|
it "should send a 'POST' request to '#{Tddium::Api::Path::SESSIONS}'" do
|
542
607
|
call_api_should_receive(:method => :post, :path => Tddium::Api::Path::SESSIONS)
|
543
608
|
run_spec(tddium)
|
@@ -578,6 +643,19 @@ describe Tddium do
|
|
578
643
|
run_spec(tddium)
|
579
644
|
end
|
580
645
|
|
646
|
+
context "--user-data-file=#{SAMPLE_FILE_PATH}" do
|
647
|
+
before { create_file(SAMPLE_FILE_PATH, SAMPLE_PASSWORD) }
|
648
|
+
it "should send 'user_data_filename=#{File.basename(SAMPLE_FILE_PATH)}' to '#{Tddium::Api::Path::START_TEST_EXECUTIONS}'" do
|
649
|
+
call_api_should_receive(:method => :post, :path => /#{Tddium::Api::Path::START_TEST_EXECUTIONS}$/, :params => hash_including(:user_data_filename => File.basename(SAMPLE_FILE_PATH)))
|
650
|
+
run_spec(tddium, :user_data_file => SAMPLE_FILE_PATH)
|
651
|
+
end
|
652
|
+
|
653
|
+
it "should send 'user_data-text=#{Base64.encode64(SAMPLE_PASSWORD)}' (Base64 encoded file content)" do
|
654
|
+
call_api_should_receive(:method => :post, :path => /#{Tddium::Api::Path::START_TEST_EXECUTIONS}$/, :params => hash_including(:user_data_text => Base64.encode64(SAMPLE_PASSWORD)))
|
655
|
+
run_spec(tddium, :user_data_file => SAMPLE_FILE_PATH)
|
656
|
+
end
|
657
|
+
end
|
658
|
+
|
581
659
|
it_should_behave_like "sending the api key"
|
582
660
|
|
583
661
|
context "'POST #{Tddium::Api::Path::START_TEST_EXECUTIONS}' is successful" do
|
@@ -608,7 +686,7 @@ describe Tddium do
|
|
608
686
|
|
609
687
|
shared_examples_for("test output summary") do
|
610
688
|
it "should put a new line before displaying the summary" do
|
611
|
-
tddium.should_receive(:say).with("
|
689
|
+
tddium.should_receive(:say).with("")
|
612
690
|
run_spec(tddium)
|
613
691
|
end
|
614
692
|
|
@@ -1005,34 +1083,13 @@ describe Tddium do
|
|
1005
1083
|
|
1006
1084
|
context "API response successful" do
|
1007
1085
|
before do
|
1008
|
-
stub_call_api_response(:post, Tddium::Api::Path::SUITES, {"suite"=>
|
1009
|
-
tddium
|
1086
|
+
stub_call_api_response(:post, Tddium::Api::Path::SUITES, {"suite"=>SAMPLE_SUITE_RESPONSE})
|
1087
|
+
stub_git_remote(tddium)
|
1010
1088
|
stub_git_push(tddium)
|
1011
1089
|
end
|
1012
1090
|
|
1013
1091
|
it_should_behave_like("writing the suite to file")
|
1014
|
-
|
1015
|
-
it "should remove any existing remotes named 'tddium'" do
|
1016
|
-
tddium.should_receive(:`).with("git remote rm tddium")
|
1017
|
-
run_suite(tddium)
|
1018
|
-
end
|
1019
|
-
|
1020
|
-
it "should add a new remote called '#{Tddium::Git::REMOTE_NAME}'" do
|
1021
|
-
stub_default_suite_name
|
1022
|
-
tddium.should_receive(:`).with("git remote add #{Tddium::Git::REMOTE_NAME} #{SAMPLE_GIT_REPO_URI}")
|
1023
|
-
run_suite(tddium)
|
1024
|
-
end
|
1025
|
-
|
1026
|
-
context "in the branch 'oaktree'" do
|
1027
|
-
before do
|
1028
|
-
tddium.stub(:current_git_branch).and_return("oaktree")
|
1029
|
-
end
|
1030
|
-
|
1031
|
-
it "should push the current git branch to tddium oaktree" do
|
1032
|
-
tddium.should_receive(:system).with("git push tddium oaktree")
|
1033
|
-
run_suite(tddium)
|
1034
|
-
end
|
1035
|
-
end
|
1092
|
+
it_should_behave_like("update the git remote and push")
|
1036
1093
|
end
|
1037
1094
|
it_should_behave_like "an unsuccessful api call"
|
1038
1095
|
end
|
metadata
CHANGED
@@ -1,12 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tddium-preview
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
prerelease:
|
5
|
-
|
6
|
-
- 0
|
7
|
-
- 0
|
8
|
-
- 5
|
9
|
-
version: 0.0.5
|
4
|
+
prerelease:
|
5
|
+
version: 0.0.6
|
10
6
|
platform: ruby
|
11
7
|
authors:
|
12
8
|
- Jay Moorthi
|
@@ -14,7 +10,7 @@ autorequire:
|
|
14
10
|
bindir: bin
|
15
11
|
cert_chain: []
|
16
12
|
|
17
|
-
date: 2011-04-
|
13
|
+
date: 2011-04-12 00:00:00 -07:00
|
18
14
|
default_executable:
|
19
15
|
dependencies:
|
20
16
|
- !ruby/object:Gem::Dependency
|
@@ -25,8 +21,6 @@ dependencies:
|
|
25
21
|
requirements:
|
26
22
|
- - ">="
|
27
23
|
- !ruby/object:Gem::Version
|
28
|
-
segments:
|
29
|
-
- 0
|
30
24
|
version: "0"
|
31
25
|
type: :runtime
|
32
26
|
version_requirements: *id001
|
@@ -38,8 +32,6 @@ dependencies:
|
|
38
32
|
requirements:
|
39
33
|
- - ">="
|
40
34
|
- !ruby/object:Gem::Version
|
41
|
-
segments:
|
42
|
-
- 0
|
43
35
|
version: "0"
|
44
36
|
type: :runtime
|
45
37
|
version_requirements: *id002
|
@@ -51,8 +43,6 @@ dependencies:
|
|
51
43
|
requirements:
|
52
44
|
- - ">="
|
53
45
|
- !ruby/object:Gem::Version
|
54
|
-
segments:
|
55
|
-
- 0
|
56
46
|
version: "0"
|
57
47
|
type: :runtime
|
58
48
|
version_requirements: *id003
|
@@ -64,10 +54,6 @@ dependencies:
|
|
64
54
|
requirements:
|
65
55
|
- - ">="
|
66
56
|
- !ruby/object:Gem::Version
|
67
|
-
segments:
|
68
|
-
- 0
|
69
|
-
- 0
|
70
|
-
- 6
|
71
57
|
version: 0.0.6
|
72
58
|
type: :runtime
|
73
59
|
version_requirements: *id004
|
@@ -79,8 +65,6 @@ dependencies:
|
|
79
65
|
requirements:
|
80
66
|
- - ">="
|
81
67
|
- !ruby/object:Gem::Version
|
82
|
-
segments:
|
83
|
-
- 0
|
84
68
|
version: "0"
|
85
69
|
type: :development
|
86
70
|
version_requirements: *id005
|
@@ -92,8 +76,6 @@ dependencies:
|
|
92
76
|
requirements:
|
93
77
|
- - ">="
|
94
78
|
- !ruby/object:Gem::Version
|
95
|
-
segments:
|
96
|
-
- 0
|
97
79
|
version: "0"
|
98
80
|
type: :development
|
99
81
|
version_requirements: *id006
|
@@ -105,8 +87,6 @@ dependencies:
|
|
105
87
|
requirements:
|
106
88
|
- - ">="
|
107
89
|
- !ruby/object:Gem::Version
|
108
|
-
segments:
|
109
|
-
- 0
|
110
90
|
version: "0"
|
111
91
|
type: :development
|
112
92
|
version_requirements: *id007
|
@@ -118,8 +98,6 @@ dependencies:
|
|
118
98
|
requirements:
|
119
99
|
- - ">="
|
120
100
|
- !ruby/object:Gem::Version
|
121
|
-
segments:
|
122
|
-
- 0
|
123
101
|
version: "0"
|
124
102
|
type: :development
|
125
103
|
version_requirements: *id008
|
@@ -162,21 +140,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
162
140
|
requirements:
|
163
141
|
- - ">="
|
164
142
|
- !ruby/object:Gem::Version
|
165
|
-
segments:
|
166
|
-
- 0
|
167
143
|
version: "0"
|
168
144
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
169
145
|
none: false
|
170
146
|
requirements:
|
171
147
|
- - ">="
|
172
148
|
- !ruby/object:Gem::Version
|
173
|
-
segments:
|
174
|
-
- 0
|
175
149
|
version: "0"
|
176
150
|
requirements: []
|
177
151
|
|
178
152
|
rubyforge_project: tddium
|
179
|
-
rubygems_version: 1.
|
153
|
+
rubygems_version: 1.5.2
|
180
154
|
signing_key:
|
181
155
|
specification_version: 3
|
182
156
|
summary: tddium Hosted Testing
|