tddium-preview 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +3 -3
- data/lib/tddium.rb +121 -131
- data/lib/tddium/version.rb +1 -1
- data/spec/tddium_spec.rb +130 -90
- data/tddium.gemspec +3 -3
- metadata +10 -21
data/Gemfile.lock
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
tddium-preview (0.0.
|
4
|
+
tddium-preview (0.0.5)
|
5
5
|
highline
|
6
6
|
json
|
7
|
-
tddium_client (
|
7
|
+
tddium_client (>= 0.0.6)
|
8
8
|
thor
|
9
9
|
|
10
10
|
GEM
|
@@ -29,7 +29,7 @@ GEM
|
|
29
29
|
simplecov (0.4.1)
|
30
30
|
simplecov-html (~> 0.4.3)
|
31
31
|
simplecov-html (0.4.3)
|
32
|
-
tddium_client (0.0.
|
32
|
+
tddium_client (0.0.6)
|
33
33
|
httparty
|
34
34
|
json
|
35
35
|
thor (0.14.6)
|
data/lib/tddium.rb
CHANGED
@@ -37,10 +37,9 @@ class Tddium < Thor
|
|
37
37
|
method_option :ssh_key_file, :type => :string, :default => nil
|
38
38
|
def account
|
39
39
|
set_default_environment(options[:environment])
|
40
|
-
if user_logged_in?
|
41
|
-
|
42
|
-
|
43
|
-
end
|
40
|
+
if user_details = user_logged_in?
|
41
|
+
# User is already logged in, so just display the info
|
42
|
+
show_user_details(user_details)
|
44
43
|
else
|
45
44
|
params = get_user_credentials(options.merge(:invited => true))
|
46
45
|
|
@@ -65,11 +64,15 @@ class Tddium < Thor
|
|
65
64
|
license_accepted = ask(Text::Prompt::LICENSE_AGREEMENT)
|
66
65
|
return unless license_accepted.downcase == Text::Prompt::Response::AGREE_TO_LICENSE.downcase
|
67
66
|
|
68
|
-
|
69
|
-
|
70
|
-
|
67
|
+
begin
|
68
|
+
new_user = call_api(:post, Api::Path::USERS, {:user => params}, false, false)
|
69
|
+
write_api_key(new_user["user"]["api_key"])
|
70
|
+
say Text::Process::ACCOUNT_CREATED % [new_user["user"]["email"], new_user["user"]["recurly_url"]]
|
71
|
+
rescue TddiumClient::Error::API => e
|
72
|
+
say((e.status == Api::ErrorCode::INVALID_INVITATION) ? Text::Error::INVALID_INVITATION : e.message)
|
73
|
+
rescue TddiumClient::Error::Base => e
|
74
|
+
say e.message
|
71
75
|
end
|
72
|
-
say((api_result.api_status == Api::ErrorCode::INVALID_INVITATION) ? Text::Error::INVALID_INVITATION : api_result.message) unless api_result.success?
|
73
76
|
end
|
74
77
|
end
|
75
78
|
|
@@ -82,9 +85,7 @@ class Tddium < Thor
|
|
82
85
|
if user_logged_in?
|
83
86
|
say Text::Process::ALREADY_LOGGED_IN
|
84
87
|
else
|
85
|
-
login_user(:params => get_user_credentials(options), :show_error => true)
|
86
|
-
say Text::Process::LOGGED_IN_SUCCESSFULLY
|
87
|
-
end
|
88
|
+
say Text::Process::LOGGED_IN_SUCCESSFULLY if login_user(:params => get_user_credentials(options), :show_error => true)
|
88
89
|
end
|
89
90
|
end
|
90
91
|
|
@@ -108,72 +109,63 @@ class Tddium < Thor
|
|
108
109
|
return unless git_push
|
109
110
|
|
110
111
|
# Call the API to get the suite and its tests
|
111
|
-
|
112
|
-
|
112
|
+
begin
|
113
|
+
suite_details = call_api(:get, current_suite_path)
|
114
|
+
test_pattern = suite_details["suite"]["test_pattern"]
|
113
115
|
test_files = Dir.glob(test_pattern).collect {|file_path| {:test_name => file_path}}
|
114
116
|
|
115
117
|
# Create a session
|
116
|
-
call_api(:post, Api::Path::SESSIONS)
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
# Print out the progress of running tests
|
142
|
-
api_response["tests"].each do |test_name, result_params|
|
143
|
-
test_status = result_params["status"]
|
144
|
-
if result_params["end_time"] && !finished_tests[test_name]
|
145
|
-
message = case test_status
|
146
|
-
when "passed" then [".", :green, false]
|
147
|
-
when "failed" then ["F", :red, false]
|
148
|
-
when "error" then ["E", nil, false]
|
149
|
-
when "pending" then ["*", :yellow, false]
|
150
|
-
end
|
151
|
-
finished_tests[test_name] = test_status
|
152
|
-
test_statuses[test_status] += 1
|
153
|
-
say *message
|
154
|
-
end
|
155
|
-
end
|
156
|
-
|
157
|
-
# save response for later use
|
158
|
-
get_test_executions_response = api_response
|
159
|
-
|
160
|
-
# If all tests finished, exit the loop else sleep
|
161
|
-
if finished_tests.size == api_response["tests"].size
|
162
|
-
tests_not_finished_yet = false
|
163
|
-
else
|
164
|
-
sleep(Default::SLEEP_TIME_BETWEEN_POLLS)
|
165
|
-
end
|
166
|
-
end
|
167
|
-
api_call_successful = call_api_result.success?
|
168
|
-
end
|
118
|
+
new_session = call_api(:post, Api::Path::SESSIONS)
|
119
|
+
session_id = new_session["session"]["id"]
|
120
|
+
|
121
|
+
# Register the tests
|
122
|
+
call_api(:post, "#{Api::Path::SESSIONS}/#{session_id}/#{Api::Path::REGISTER_TEST_EXECUTIONS}", {:suite_id => current_suite_id, :tests => test_files})
|
123
|
+
|
124
|
+
# Start the tests
|
125
|
+
start_test_executions = call_api(:post, "#{Api::Path::SESSIONS}/#{session_id}/#{Api::Path::START_TEST_EXECUTIONS}")
|
126
|
+
tests_not_finished_yet = true
|
127
|
+
finished_tests = {}
|
128
|
+
test_statuses = Hash.new(0)
|
129
|
+
|
130
|
+
say Text::Process::STARTING_TEST % test_files.size
|
131
|
+
say Text::Process::CHECK_TEST_REPORT % start_test_executions["report"]
|
132
|
+
say Text::Process::TERMINATE_INSTRUCTION
|
133
|
+
while tests_not_finished_yet do
|
134
|
+
# Poll the API to check the status
|
135
|
+
current_test_executions = call_api(:get, "#{Api::Path::SESSIONS}/#{session_id}/#{Api::Path::TEST_EXECUTIONS}")
|
136
|
+
|
137
|
+
# Catch Ctrl-C to interrupt the test
|
138
|
+
Signal.trap(:INT) do
|
139
|
+
say Text::Process::INTERRUPT
|
140
|
+
say Text::Process::CHECK_TEST_STATUS
|
141
|
+
tests_not_finished_yet = false
|
142
|
+
end
|
169
143
|
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
144
|
+
# Print out the progress of running tests
|
145
|
+
current_test_executions["tests"].each do |test_name, result_params|
|
146
|
+
test_status = result_params["status"]
|
147
|
+
if result_params["end_time"] && !finished_tests[test_name]
|
148
|
+
message = case test_status
|
149
|
+
when "passed" then [".", :green, false]
|
150
|
+
when "failed" then ["F", :red, false]
|
151
|
+
when "error" then ["E", nil, false]
|
152
|
+
when "pending" then ["*", :yellow, false]
|
153
|
+
end
|
154
|
+
finished_tests[test_name] = test_status
|
155
|
+
test_statuses[test_status] += 1
|
156
|
+
say *message
|
174
157
|
end
|
175
158
|
end
|
159
|
+
|
160
|
+
# If all tests finished, exit the loop else sleep
|
161
|
+
finished_tests.size == current_test_executions["tests"].size ? tests_not_finished_yet = false : sleep(Default::SLEEP_TIME_BETWEEN_POLLS)
|
176
162
|
end
|
163
|
+
|
164
|
+
# Print out the result
|
165
|
+
say " "
|
166
|
+
say Text::Process::FINISHED_TEST % (Time.now - start_time)
|
167
|
+
say "#{finished_tests.size} examples, #{test_statuses["failed"]} failures, #{test_statuses["error"]} errors, #{test_statuses["pending"]} pending"
|
168
|
+
rescue TddiumClient::Error::Base
|
177
169
|
end
|
178
170
|
end
|
179
171
|
|
@@ -183,13 +175,14 @@ class Tddium < Thor
|
|
183
175
|
set_default_environment(options[:environment])
|
184
176
|
return unless git_repo? && tddium_settings && suite_for_current_branch?
|
185
177
|
|
186
|
-
|
187
|
-
|
178
|
+
begin
|
179
|
+
current_suites = call_api(:get, Api::Path::SUITES)
|
180
|
+
if current_suites["suites"].size == 0
|
188
181
|
say Text::Status::NO_SUITE
|
189
182
|
else
|
190
|
-
say Text::Status::ALL_SUITES %
|
183
|
+
say Text::Status::ALL_SUITES % current_suites["suites"].collect {|suite| suite["repo_name"]}.join(", ")
|
191
184
|
|
192
|
-
if current_suite =
|
185
|
+
if current_suite = current_suites["suites"].detect {|suite| suite["id"] == current_suite_id}
|
193
186
|
say Text::Status::SEPARATOR
|
194
187
|
say Text::Status::CURRENT_SUITE % current_suite["repo_name"]
|
195
188
|
|
@@ -201,6 +194,7 @@ class Tddium < Thor
|
|
201
194
|
say Text::Status::CURRENT_SUITE_UNAVAILABLE
|
202
195
|
end
|
203
196
|
end
|
197
|
+
rescue TddiumClient::Error::Base
|
204
198
|
end
|
205
199
|
end
|
206
200
|
|
@@ -213,29 +207,27 @@ class Tddium < Thor
|
|
213
207
|
return unless git_repo? && tddium_settings
|
214
208
|
|
215
209
|
params = {}
|
216
|
-
|
217
|
-
|
210
|
+
begin
|
211
|
+
if current_suite_id
|
212
|
+
current_suite = call_api(:get, current_suite_path)
|
218
213
|
# Get the current test pattern and prompt for updates
|
219
|
-
params[:test_pattern] = prompt(Text::Prompt::TEST_PATTERN, options[:test_pattern],
|
214
|
+
params[:test_pattern] = prompt(Text::Prompt::TEST_PATTERN, options[:test_pattern], current_suite["suite"]["test_pattern"])
|
220
215
|
|
221
216
|
# Update the current suite if it exists already
|
222
|
-
call_api(:put, current_suite_path, {:suite => params})
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
# Check to see if there is an existing suite
|
237
|
-
api_call_successful = call_api(:get, Api::Path::SUITES, params) do |api_response|
|
238
|
-
existing_suite = api_response["suites"].first
|
217
|
+
call_api(:put, current_suite_path, {:suite => params})
|
218
|
+
say Text::Process::UPDATE_SUITE
|
219
|
+
else
|
220
|
+
params[:branch] = current_git_branch
|
221
|
+
default_suite_name = File.basename(Dir.pwd)
|
222
|
+
params[:repo_name] = options[:name] || default_suite_name
|
223
|
+
|
224
|
+
existing_suite = nil
|
225
|
+
use_existing_suite = false
|
226
|
+
suite_name_resolved = false
|
227
|
+
while !suite_name_resolved
|
228
|
+
# Check to see if there is an existing suite
|
229
|
+
current_suites = call_api(:get, Api::Path::SUITES, params)
|
230
|
+
existing_suite = current_suites["suites"].first
|
239
231
|
|
240
232
|
# Get the suite name
|
241
233
|
current_suite_name = params[:repo_name]
|
@@ -256,10 +248,8 @@ class Tddium < Thor
|
|
256
248
|
# Suite name does not exist yet and already prompted
|
257
249
|
suite_name_resolved = true
|
258
250
|
end
|
259
|
-
end
|
260
|
-
end
|
251
|
+
end
|
261
252
|
|
262
|
-
if api_call_successful
|
263
253
|
if use_existing_suite
|
264
254
|
# Write to file and exit when using the existing suite
|
265
255
|
write_suite(existing_suite["id"])
|
@@ -274,31 +264,30 @@ class Tddium < Thor
|
|
274
264
|
params[:test_pattern] = prompt(Text::Prompt::TEST_PATTERN, options[:test_pattern], Default::TEST_PATTERN)
|
275
265
|
|
276
266
|
# Create new suite if it does not exist yet
|
277
|
-
call_api(:post, Api::Path::SUITES, {:suite => params})
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
end
|
267
|
+
new_suite = call_api(:post, Api::Path::SUITES, {:suite => params})
|
268
|
+
# Save the created suite
|
269
|
+
write_suite(new_suite["suite"]["id"])
|
270
|
+
|
271
|
+
# Manage git
|
272
|
+
`git remote rm #{Git::REMOTE_NAME}`
|
273
|
+
`git remote add #{Git::REMOTE_NAME} #{new_suite["suite"]["git_repo_uri"]}`
|
274
|
+
git_push
|
286
275
|
end
|
276
|
+
rescue TddiumClient::Error::Base
|
287
277
|
end
|
288
278
|
end
|
289
279
|
|
290
280
|
private
|
291
281
|
|
292
|
-
def call_api(method, api_path, params = {}, api_key = nil, show_error = true
|
282
|
+
def call_api(method, api_path, params = {}, api_key = nil, show_error = true)
|
293
283
|
api_key = tddium_settings(:fail_with_message => false)["api_key"] if tddium_settings(:fail_with_message => false) && api_key != false
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
end
|
284
|
+
begin
|
285
|
+
result = tddium_client.call_api(method, api_path, params, api_key)
|
286
|
+
rescue TddiumClient::Error::Base => e
|
287
|
+
say e.message if show_error
|
288
|
+
raise e
|
300
289
|
end
|
301
|
-
|
290
|
+
result
|
302
291
|
end
|
303
292
|
|
304
293
|
def current_git_branch
|
@@ -324,11 +313,11 @@ class Tddium < Thor
|
|
324
313
|
end
|
325
314
|
|
326
315
|
def environment
|
327
|
-
tddium_client.environment
|
316
|
+
tddium_client.environment.to_sym
|
328
317
|
end
|
329
318
|
|
330
|
-
def get_user
|
331
|
-
call_api(:get, Api::Path::USERS, {}, nil, false
|
319
|
+
def get_user
|
320
|
+
call_api(:get, Api::Path::USERS, {}, nil, false) rescue nil
|
332
321
|
end
|
333
322
|
|
334
323
|
def get_user_credentials(options = {})
|
@@ -355,12 +344,13 @@ class Tddium < Thor
|
|
355
344
|
message.nil?
|
356
345
|
end
|
357
346
|
|
358
|
-
def login_user(options = {}
|
347
|
+
def login_user(options = {})
|
359
348
|
# POST (email, password) to /users/sign_in to retrieve an API key
|
360
|
-
|
349
|
+
begin
|
350
|
+
login_result = call_api(:post, Api::Path::SIGN_IN, {:user => options[:params]}, false, options[:show_error])
|
361
351
|
# On success, write the API key to "~/.tddium.<environment>"
|
362
|
-
write_api_key(
|
363
|
-
|
352
|
+
write_api_key(login_result["api_key"])
|
353
|
+
rescue TddiumClient::Error::Base
|
364
354
|
end
|
365
355
|
login_result
|
366
356
|
end
|
@@ -380,20 +370,21 @@ class Tddium < Thor
|
|
380
370
|
end
|
381
371
|
|
382
372
|
def show_session_details(params, no_session_prompt, all_session_prompt)
|
383
|
-
|
373
|
+
begin
|
374
|
+
current_sessions = call_api(:get, Api::Path::SESSIONS, params)
|
384
375
|
say Text::Status::SEPARATOR
|
385
|
-
if
|
376
|
+
if current_sessions["sessions"].size == 0
|
386
377
|
say no_session_prompt
|
387
378
|
else
|
388
379
|
say all_session_prompt
|
389
|
-
|
380
|
+
current_sessions["sessions"].each do |session|
|
390
381
|
session_id = session["id"]
|
391
382
|
say Text::Status::SESSION_TITLE % session_id
|
392
|
-
call_api(:get, "#{Api::Path::SESSIONS}/#{session_id}/#{Api::Path::TEST_EXECUTIONS}")
|
393
|
-
|
394
|
-
end
|
383
|
+
current_test_executions = call_api(:get, "#{Api::Path::SESSIONS}/#{session_id}/#{Api::Path::TEST_EXECUTIONS}")
|
384
|
+
display_attributes(DisplayedAttributes::TEST_EXECUTION, current_test_executions)
|
395
385
|
end
|
396
386
|
end
|
387
|
+
rescue TddiumClient::Error::Base
|
397
388
|
end
|
398
389
|
end
|
399
390
|
|
@@ -415,7 +406,7 @@ class Tddium < Thor
|
|
415
406
|
end
|
416
407
|
|
417
408
|
def tddium_client
|
418
|
-
@tddium_client ||= TddiumClient.new
|
409
|
+
@tddium_client ||= TddiumClient::Client.new
|
419
410
|
end
|
420
411
|
|
421
412
|
def tddium_file_name
|
@@ -439,9 +430,9 @@ class Tddium < Thor
|
|
439
430
|
@tddium_settings
|
440
431
|
end
|
441
432
|
|
442
|
-
def user_logged_in?(active = true
|
433
|
+
def user_logged_in?(active = true)
|
443
434
|
result = tddium_settings(:fail_with_message => false) && tddium_settings["api_key"]
|
444
|
-
(result && active) ? get_user
|
435
|
+
(result && active) ? get_user : result
|
445
436
|
end
|
446
437
|
|
447
438
|
def write_api_key(api_key)
|
@@ -458,5 +449,4 @@ class Tddium < Thor
|
|
458
449
|
file.write(tddium_settings.merge({"branches" => branches}).to_json)
|
459
450
|
end
|
460
451
|
end
|
461
|
-
|
462
452
|
end
|
data/lib/tddium/version.rb
CHANGED
data/spec/tddium_spec.rb
CHANGED
@@ -13,8 +13,6 @@ describe Tddium do
|
|
13
13
|
SAMPLE_APP_NAME = "tddelicious"
|
14
14
|
SAMPLE_BRANCH_NAME = "test"
|
15
15
|
SAMPLE_BUNDLER_VERSION = "1.10.10"
|
16
|
-
SAMPLE_CALL_API_RESPONSE = [0, 200, nil]
|
17
|
-
SAMPLE_CALL_API_ERROR = [1, 501, "an error"]
|
18
16
|
SAMPLE_DATE_TIME = "2011-03-11T08:43:02Z"
|
19
17
|
SAMPLE_EMAIL = "someone@example.com"
|
20
18
|
SAMPLE_INVITATION_TOKEN = "TZce3NueiXp2lMTmaeRr"
|
@@ -29,13 +27,14 @@ describe Tddium do
|
|
29
27
|
SAMPLE_SUITE_ID = 1
|
30
28
|
SAMPLE_SUITES_RESPONSE = {"suites" => [{"repo_name" => SAMPLE_APP_NAME, "branch" => SAMPLE_BRANCH_NAME, "id" => SAMPLE_SUITE_ID}]}
|
31
29
|
SAMPLE_TDDIUM_CONFIG_FILE = ".tddium.test"
|
30
|
+
SAMPLE_TEST_EXECUTION_STATS = "total 1, notstarted 0, started 1, passed 0, failed 0, pending 0, error 0", "start_time"
|
32
31
|
SAMPLE_TEST_PATTERN = "**/*_spec.rb"
|
33
32
|
SAMPLE_USER_RESPONSE = {"user"=> {"api_key" => SAMPLE_API_KEY, "email" => SAMPLE_EMAIL, "created_at" => SAMPLE_DATE_TIME, "recurly_url" => SAMPLE_RECURLY_URL}}
|
34
33
|
|
35
34
|
def call_api_should_receive(options = {})
|
36
35
|
params = [options[:method] || anything, options[:path] || anything, options[:params] || anything, (options[:api_key] || options[:api_key] == false) ? options[:api_key] : anything]
|
37
|
-
tddium_client.stub(:call_api).with(*params)
|
38
|
-
tddium_client.should_receive(:call_api).with(*params)
|
36
|
+
tddium_client.stub(:call_api).with(*params).and_raise(TddiumClient::Error::Base)
|
37
|
+
tddium_client.should_receive(:call_api).with(*params)
|
39
38
|
end
|
40
39
|
|
41
40
|
def extract_options!(array, *option_keys)
|
@@ -64,14 +63,24 @@ describe Tddium do
|
|
64
63
|
end
|
65
64
|
|
66
65
|
def stub_call_api_response(method, path, *response)
|
67
|
-
options = extract_options!(response, :and_return, :and_yield)
|
68
|
-
options[:and_yield] = true unless options[:and_yield] == false
|
69
66
|
result = tddium_client.stub(:call_api).with(method, path, anything, anything)
|
70
|
-
|
71
|
-
|
72
|
-
response.
|
73
|
-
|
67
|
+
response = [{}] if response.empty?
|
68
|
+
response_mocks = []
|
69
|
+
response.each do |current_response|
|
70
|
+
current_response["status"] ||= 0
|
71
|
+
status = current_response["status"]
|
72
|
+
if status == 0
|
73
|
+
tddium_client_result = mock(TddiumClient::Result::API)
|
74
|
+
response_mocks << tddium_client_result
|
75
|
+
else
|
76
|
+
tddium_client_result = mock(TddiumClient::Error::API, :body => current_response.to_json)
|
77
|
+
result.and_raise(TddiumClient::Error::API.new(tddium_client_result))
|
78
|
+
end
|
79
|
+
current_response.each do |k, v|
|
80
|
+
tddium_client_result.stub(:[]).with(k).and_return(v)
|
81
|
+
end
|
74
82
|
end
|
83
|
+
result.and_return(*response_mocks) unless response_mocks.empty?
|
75
84
|
end
|
76
85
|
|
77
86
|
def stub_cli_options(tddium, options = {})
|
@@ -118,15 +127,14 @@ describe Tddium do
|
|
118
127
|
end
|
119
128
|
|
120
129
|
def stub_tddium_client
|
121
|
-
TddiumClient.stub(:new).and_return(tddium_client)
|
122
|
-
tddium_client.stub(:environment).and_return(
|
123
|
-
tddium_client.stub(:call_api).
|
130
|
+
TddiumClient::Client.stub(:new).and_return(tddium_client)
|
131
|
+
tddium_client.stub(:environment).and_return("test")
|
132
|
+
tddium_client.stub(:call_api).and_raise(TddiumClient::Error::Base)
|
124
133
|
end
|
125
134
|
|
126
135
|
let(:tddium) { Tddium.new }
|
127
136
|
let(:tddium_client) { mock(TddiumClient).as_null_object }
|
128
137
|
|
129
|
-
|
130
138
|
shared_examples_for "a password prompt" do
|
131
139
|
context "--password was not passed in" do
|
132
140
|
it "should prompt for a password or confirmation" do
|
@@ -146,8 +154,8 @@ describe Tddium do
|
|
146
154
|
|
147
155
|
shared_examples_for "an unsuccessful api call" do
|
148
156
|
it "should show the error" do
|
149
|
-
tddium_client.stub(:call_api).
|
150
|
-
tddium.should_receive(:say).with(
|
157
|
+
tddium_client.stub(:call_api).and_raise(TddiumClient::Error::Base)
|
158
|
+
tddium.should_receive(:say).with(TddiumClient::Error::Base.new.message)
|
151
159
|
run(tddium)
|
152
160
|
end
|
153
161
|
end
|
@@ -172,49 +180,6 @@ describe Tddium do
|
|
172
180
|
end
|
173
181
|
end
|
174
182
|
|
175
|
-
shared_examples_for "logging in a user" do
|
176
|
-
context "there is a tddium config file with an api key" do
|
177
|
-
before {stub_config_file(:api_key => "some api key")}
|
178
|
-
|
179
|
-
it "should send a 'GET' request to '#{Tddium::Api::Path::USERS}'" do
|
180
|
-
call_api_should_receive(:method => :get, :path => /#{Tddium::Api::Path::USERS}$/)
|
181
|
-
run(tddium)
|
182
|
-
end
|
183
|
-
end
|
184
|
-
|
185
|
-
context "the tddium config file is missing or corrupt or the api key is invalid" do
|
186
|
-
context "--email was not passed in" do
|
187
|
-
it "should prompt for the user's email address" do
|
188
|
-
tddium.should_receive(:ask).with(Tddium::Text::Prompt::EMAIL)
|
189
|
-
run(tddium)
|
190
|
-
end
|
191
|
-
end
|
192
|
-
|
193
|
-
context "--email was passed in" do
|
194
|
-
it "should not prompt for the user's email address" do
|
195
|
-
tddium.should_not_receive(:ask).with(Tddium::Text::Prompt::EMAIL)
|
196
|
-
run(tddium, :email => SAMPLE_EMAIL)
|
197
|
-
end
|
198
|
-
end
|
199
|
-
|
200
|
-
it_should_behave_like "a password prompt" do
|
201
|
-
let(:password_prompt) {Tddium::Text::Prompt::PASSWORD}
|
202
|
-
end
|
203
|
-
|
204
|
-
it "should try to sign in the user with their email & password" do
|
205
|
-
tddium.stub(:ask).with(Tddium::Text::Prompt::EMAIL).and_return(SAMPLE_EMAIL)
|
206
|
-
HighLine.stub(:ask).with(Tddium::Text::Prompt::PASSWORD).and_return(SAMPLE_PASSWORD)
|
207
|
-
call_api_should_receive(:method => :post, :path => /#{Tddium::Api::Path::SIGN_IN}$/, :params => {:user => {:email => SAMPLE_EMAIL, :password => SAMPLE_PASSWORD}}, :api_key => false)
|
208
|
-
run(tddium)
|
209
|
-
end
|
210
|
-
end
|
211
|
-
|
212
|
-
context "the user logs in successfully with their email and password" do
|
213
|
-
before{stub_call_api_response(:post, Tddium::Api::Path::SIGN_IN, {"api_key" => SAMPLE_API_KEY})}
|
214
|
-
it_should_behave_like "writing the api key to the .tddium file"
|
215
|
-
end
|
216
|
-
end
|
217
|
-
|
218
183
|
shared_examples_for "sending the api key" do
|
219
184
|
it "should call the api with the api key" do
|
220
185
|
call_api_should_receive(:api_key => SAMPLE_API_KEY)
|
@@ -288,14 +253,37 @@ describe Tddium do
|
|
288
253
|
end
|
289
254
|
end
|
290
255
|
|
291
|
-
shared_examples_for "
|
292
|
-
it "should write the api key to the .tddium file" do
|
256
|
+
shared_examples_for "with the correct environment extension" do
|
257
|
+
it "should write the api key to the .tddium file with the relevent environment extension" do
|
293
258
|
run(tddium)
|
294
|
-
tddium_file = File.open(
|
259
|
+
tddium_file = File.open(".tddium#{environment_extension}") { |file| file.read }
|
295
260
|
JSON.parse(tddium_file)["api_key"].should == SAMPLE_API_KEY
|
296
261
|
end
|
297
262
|
end
|
298
263
|
|
264
|
+
shared_examples_for "writing the api key to the .tddium file" do
|
265
|
+
context "production environment" do
|
266
|
+
before { tddium_client.stub(:environment).and_return("production") }
|
267
|
+
it_should_behave_like "with the correct environment extension" do
|
268
|
+
let(:environment_extension) {""}
|
269
|
+
end
|
270
|
+
end
|
271
|
+
|
272
|
+
context "development environment" do
|
273
|
+
before { tddium_client.stub(:environment).and_return("development") }
|
274
|
+
it_should_behave_like "with the correct environment extension" do
|
275
|
+
let(:environment_extension) {".development"}
|
276
|
+
end
|
277
|
+
end
|
278
|
+
|
279
|
+
context "test environment" do
|
280
|
+
before { tddium_client.stub(:environment).and_return("test") }
|
281
|
+
it_should_behave_like "with the correct environment extension" do
|
282
|
+
let(:environment_extension) {".test"}
|
283
|
+
end
|
284
|
+
end
|
285
|
+
end
|
286
|
+
|
299
287
|
describe "#account" do
|
300
288
|
before do
|
301
289
|
stub_defaults
|
@@ -402,7 +390,7 @@ describe Tddium do
|
|
402
390
|
it_should_behave_like "an unsuccessful api call"
|
403
391
|
|
404
392
|
context "because the invitation is invalid" do
|
405
|
-
before { stub_call_api_response(:post, Tddium::Api::Path::USERS,
|
393
|
+
before { stub_call_api_response(:post, Tddium::Api::Path::USERS, {"status" => Tddium::Api::ErrorCode::INVALID_INVITATION}) }
|
406
394
|
it "should show the user: '#{Tddium::Text::Error::INVALID_INVITATION}'" do
|
407
395
|
tddium.should_receive(:say).with(Tddium::Text::Error::INVALID_INVITATION)
|
408
396
|
run_account(tddium)
|
@@ -422,12 +410,52 @@ describe Tddium do
|
|
422
410
|
end
|
423
411
|
|
424
412
|
it_should_behave_like "set the default environment"
|
425
|
-
|
413
|
+
|
414
|
+
context "there is a tddium config file with an api key" do
|
415
|
+
before {stub_config_file(:api_key => "some api key")}
|
416
|
+
|
417
|
+
it "should send a 'GET' request to '#{Tddium::Api::Path::USERS}'" do
|
418
|
+
call_api_should_receive(:method => :get, :path => /#{Tddium::Api::Path::USERS}$/)
|
419
|
+
run(tddium)
|
420
|
+
end
|
421
|
+
end
|
422
|
+
|
423
|
+
context "the tddium config file is missing or corrupt or the api key is invalid" do
|
424
|
+
context "--email was not passed in" do
|
425
|
+
it "should prompt for the user's email address" do
|
426
|
+
tddium.should_receive(:ask).with(Tddium::Text::Prompt::EMAIL)
|
427
|
+
run(tddium)
|
428
|
+
end
|
429
|
+
end
|
430
|
+
|
431
|
+
context "--email was passed in" do
|
432
|
+
it "should not prompt for the user's email address" do
|
433
|
+
tddium.should_not_receive(:ask).with(Tddium::Text::Prompt::EMAIL)
|
434
|
+
run(tddium, :email => SAMPLE_EMAIL)
|
435
|
+
end
|
436
|
+
end
|
437
|
+
|
438
|
+
it_should_behave_like "a password prompt" do
|
439
|
+
let(:password_prompt) {Tddium::Text::Prompt::PASSWORD}
|
440
|
+
end
|
441
|
+
|
442
|
+
it "should try to sign in the user with their email & password" do
|
443
|
+
tddium.stub(:ask).with(Tddium::Text::Prompt::EMAIL).and_return(SAMPLE_EMAIL)
|
444
|
+
HighLine.stub(:ask).with(Tddium::Text::Prompt::PASSWORD).and_return(SAMPLE_PASSWORD)
|
445
|
+
call_api_should_receive(:method => :post, :path => /#{Tddium::Api::Path::SIGN_IN}$/, :params => {:user => {:email => SAMPLE_EMAIL, :password => SAMPLE_PASSWORD}}, :api_key => false)
|
446
|
+
run(tddium)
|
447
|
+
end
|
448
|
+
|
449
|
+
context "the user logs in successfully with their email and password" do
|
450
|
+
before{stub_call_api_response(:post, Tddium::Api::Path::SIGN_IN, {"api_key" => SAMPLE_API_KEY})}
|
451
|
+
it_should_behave_like "writing the api key to the .tddium file"
|
452
|
+
end
|
453
|
+
end
|
426
454
|
|
427
455
|
context "user is already logged in" do
|
428
456
|
before do
|
429
457
|
stub_config_file(:api_key => SAMPLE_API_KEY)
|
430
|
-
stub_call_api_response(:get, Tddium::Api::Path::USERS
|
458
|
+
stub_call_api_response(:get, Tddium::Api::Path::USERS)
|
431
459
|
end
|
432
460
|
|
433
461
|
it "should show the user: '#{Tddium::Text::Process::ALREADY_LOGGED_IN}'" do
|
@@ -437,7 +465,7 @@ describe Tddium do
|
|
437
465
|
end
|
438
466
|
|
439
467
|
context "the user logs in successfully" do
|
440
|
-
before{stub_call_api_response(:post, Tddium::Api::Path::SIGN_IN, {})}
|
468
|
+
before{ stub_call_api_response(:post, Tddium::Api::Path::SIGN_IN, {"api_key" => SAMPLE_API_KEY})}
|
441
469
|
it "should show the user: '#{Tddium::Text::Process::LOGGED_IN_SUCCESSFULLY}'" do
|
442
470
|
tddium.should_receive(:say).with(Tddium::Text::Process::LOGGED_IN_SUCCESSFULLY)
|
443
471
|
run_login(tddium)
|
@@ -450,7 +478,7 @@ describe Tddium do
|
|
450
478
|
end
|
451
479
|
|
452
480
|
describe "#logout" do
|
453
|
-
before {
|
481
|
+
before { stub_defaults }
|
454
482
|
|
455
483
|
context ".tddium file exists" do
|
456
484
|
before { stub_config_file }
|
@@ -554,9 +582,11 @@ describe Tddium do
|
|
554
582
|
|
555
583
|
context "'POST #{Tddium::Api::Path::START_TEST_EXECUTIONS}' is successful" do
|
556
584
|
let(:get_test_executions_response) { {"report"=>SAMPLE_REPORT_URL, "tests"=>{"spec/mouse_spec.rb"=>{"end_time"=>SAMPLE_DATE_TIME, "status"=>"pending"}, "spec/pig_spec.rb"=>{"end_time"=>nil, "status"=>"started"}, "spec/dog_spec.rb"=>{"end_time"=>SAMPLE_DATE_TIME, "status"=>"failed"}, "spec/cat_spec.rb"=>{"end_time"=>SAMPLE_DATE_TIME, "status"=>"passed"}}} }
|
557
|
-
before
|
558
|
-
|
559
|
-
|
585
|
+
before {stub_call_api_response(:post, "#{Tddium::Api::Path::SESSIONS}/#{SAMPLE_SESSION_ID}/#{Tddium::Api::Path::START_TEST_EXECUTIONS}", {"started"=>1, "status"=>0, "report" => SAMPLE_REPORT_URL})}
|
586
|
+
|
587
|
+
it "should show the user: '#{Tddium::Text::Process::CHECK_TEST_REPORT % SAMPLE_REPORT_URL}'" do
|
588
|
+
tddium.should_receive(:say).with(Tddium::Text::Process::CHECK_TEST_REPORT % SAMPLE_REPORT_URL)
|
589
|
+
run_spec(tddium)
|
560
590
|
end
|
561
591
|
|
562
592
|
it "should tell the user to '#{Tddium::Text::Process::TERMINATE_INSTRUCTION}'" do
|
@@ -577,8 +607,8 @@ describe Tddium do
|
|
577
607
|
it_should_behave_like "sending the api key"
|
578
608
|
|
579
609
|
shared_examples_for("test output summary") do
|
580
|
-
it "should
|
581
|
-
tddium.should_receive(:say).with(
|
610
|
+
it "should put a new line before displaying the summary" do
|
611
|
+
tddium.should_receive(:say).with(" ")
|
582
612
|
run_spec(tddium)
|
583
613
|
end
|
584
614
|
|
@@ -679,8 +709,13 @@ describe Tddium do
|
|
679
709
|
it_should_behave_like ".tddium file is missing or corrupt"
|
680
710
|
it_should_behave_like "suite has not been initialized"
|
681
711
|
|
712
|
+
it "should send a 'GET' request to '#{Tddium::Api::Path::SUITES}'" do
|
713
|
+
call_api_should_receive(:method => :get, :path => Tddium::Api::Path::SUITES)
|
714
|
+
run_status(tddium)
|
715
|
+
end
|
716
|
+
|
682
717
|
context "'GET #{Tddium::Api::Path::SUITES}' is successful" do
|
683
|
-
context "returns no suites" do
|
718
|
+
context "but returns no suites" do
|
684
719
|
before { stub_call_api_response(:get, Tddium::Api::Path::SUITES, {"suites" => []}) }
|
685
720
|
|
686
721
|
it "should show the user '#{Tddium::Text::Status::NO_SUITE}'" do
|
@@ -689,11 +724,10 @@ describe Tddium do
|
|
689
724
|
end
|
690
725
|
end
|
691
726
|
|
692
|
-
context "returns some suites" do
|
727
|
+
context "and returns some suites" do
|
693
728
|
let(:suite_attributes) { {"id"=>SAMPLE_SUITE_ID, "repo_name"=>SAMPLE_APP_NAME, "ruby_version"=>SAMPLE_RUBY_VERSION, "branch" => SAMPLE_BRANCH_NAME, "test_pattern" => SAMPLE_TEST_PATTERN, "bundler_version" => SAMPLE_BUNDLER_VERSION, "rubygems_version" => SAMPLE_RUBYGEMS_VERSION}}
|
694
729
|
before do
|
695
|
-
|
696
|
-
stub_call_api_response(:get, Tddium::Api::Path::SUITES, suites_response)
|
730
|
+
stub_call_api_response(:get, Tddium::Api::Path::SUITES, {"suites"=>[suite_attributes]})
|
697
731
|
end
|
698
732
|
|
699
733
|
it "should show all suites" do
|
@@ -749,8 +783,7 @@ describe Tddium do
|
|
749
783
|
context "show active sessions" do
|
750
784
|
context "without any session" do
|
751
785
|
before do
|
752
|
-
|
753
|
-
stub_call_api_response(:get, Tddium::Api::Path::SESSIONS, sessions_response)
|
786
|
+
stub_call_api_response(:get, Tddium::Api::Path::SESSIONS, {"sessions"=>[]})
|
754
787
|
end
|
755
788
|
|
756
789
|
it "should display no active session message" do
|
@@ -762,26 +795,33 @@ describe Tddium do
|
|
762
795
|
context "with some sessions" do
|
763
796
|
let(:session_attributes) { {"id"=>SAMPLE_SESSION_ID, "user_id"=>3} }
|
764
797
|
before do
|
765
|
-
|
766
|
-
stub_call_api_response(:get, Tddium::Api::Path::SESSIONS, sessions_response)
|
798
|
+
stub_call_api_response(:get, Tddium::Api::Path::SESSIONS, {"sessions"=>[session_attributes]})
|
767
799
|
end
|
768
800
|
|
769
|
-
it "should
|
801
|
+
it "should show the user: '#{Tddium::Text::Status::ACTIVE_SESSIONS}'" do
|
770
802
|
tddium.should_receive(:say).with(Tddium::Text::Status::ACTIVE_SESSIONS)
|
771
803
|
run_status(tddium)
|
772
804
|
end
|
773
805
|
|
774
|
-
|
775
|
-
|
776
|
-
|
777
|
-
|
806
|
+
it "should send a 'GET' request to '#{Tddium::Api::Path::TEST_EXECUTIONS}'" do
|
807
|
+
call_api_should_receive(:method => :get, :path => /#{Tddium::Api::Path::TEST_EXECUTIONS}$/)
|
808
|
+
run_status(tddium)
|
809
|
+
end
|
810
|
+
|
811
|
+
context "'GET #{Tddium::Api::Path::TEST_EXECUTIONS}' is successful" do
|
812
|
+
let(:test_execution_attributes) { {"report" => SAMPLE_REPORT_URL, "test_execution_stats" => SAMPLE_TEST_EXECUTION_STATS, "start_time" => SAMPLE_DATE_TIME, "end_time" => SAMPLE_DATE_TIME} }
|
813
|
+
before { stub_call_api_response(:get, /#{Tddium::Api::Path::TEST_EXECUTIONS}$/, test_execution_attributes) }
|
814
|
+
it_should_behave_like "attribute details" do
|
815
|
+
let(:attributes_to_display) {Tddium::DisplayedAttributes::TEST_EXECUTION}
|
816
|
+
let(:attributes_to_hide) { [] }
|
817
|
+
let(:attributes) { test_execution_attributes }
|
818
|
+
end
|
778
819
|
end
|
779
820
|
end
|
780
821
|
end
|
781
822
|
end
|
782
823
|
end
|
783
824
|
end
|
784
|
-
|
785
825
|
it_should_behave_like "an unsuccessful api call"
|
786
826
|
end
|
787
827
|
|
@@ -803,7 +843,7 @@ describe Tddium do
|
|
803
843
|
context ".tddium file contains no suites" do
|
804
844
|
before do
|
805
845
|
stub_default_suite_name
|
806
|
-
stub_call_api_response(:get, Tddium::Api::Path::SUITES, {"suites" => []}
|
846
|
+
stub_call_api_response(:get, Tddium::Api::Path::SUITES, {"suites" => []})
|
807
847
|
end
|
808
848
|
|
809
849
|
context "using defaults" do
|
@@ -850,7 +890,7 @@ describe Tddium do
|
|
850
890
|
|
851
891
|
context "but this user has already registered some suites" do
|
852
892
|
before do
|
853
|
-
stub_call_api_response(:get, Tddium::Api::Path::SUITES, SAMPLE_SUITES_RESPONSE, {"suites" => []}
|
893
|
+
stub_call_api_response(:get, Tddium::Api::Path::SUITES, SAMPLE_SUITES_RESPONSE, {"suites" => []})
|
854
894
|
tddium.stub(:ask).with(Tddium::Text::Prompt::USE_EXISTING_SUITE % SAMPLE_APP_NAME).and_return(Tddium::Text::Prompt::Response::YES)
|
855
895
|
end
|
856
896
|
|
@@ -871,7 +911,7 @@ describe Tddium do
|
|
871
911
|
|
872
912
|
context "passing --name=my_suite" do
|
873
913
|
before do
|
874
|
-
stub_call_api_response(:get, Tddium::Api::Path::SUITES, SAMPLE_SUITES_RESPONSE
|
914
|
+
stub_call_api_response(:get, Tddium::Api::Path::SUITES, SAMPLE_SUITES_RESPONSE)
|
875
915
|
end
|
876
916
|
|
877
917
|
it "should not ask the user if they want to use the existing suite" do
|
@@ -890,7 +930,7 @@ describe Tddium do
|
|
890
930
|
|
891
931
|
context "the user wants to use the existing suite" do
|
892
932
|
before do
|
893
|
-
stub_call_api_response(:get, Tddium::Api::Path::SUITES, SAMPLE_SUITES_RESPONSE
|
933
|
+
stub_call_api_response(:get, Tddium::Api::Path::SUITES, SAMPLE_SUITES_RESPONSE)
|
894
934
|
end
|
895
935
|
|
896
936
|
it "should not send a 'POST' request to '#{Tddium::Api::Path::SUITES}'" do
|
data/tddium.gemspec
CHANGED
@@ -13,8 +13,8 @@ Gem::Specification.new do |s|
|
|
13
13
|
s.authors = ["Jay Moorthi"]
|
14
14
|
s.email = ["info@tddium.com"]
|
15
15
|
s.homepage = "http://www.tddium.com/"
|
16
|
-
s.summary = %q{tddium
|
17
|
-
s.description = %q{tddium
|
16
|
+
s.summary = %q{tddium Hosted Testing}
|
17
|
+
s.description = %q{tddium runs your rspec (and Selenium) tests in the cloud, in parallel!}
|
18
18
|
|
19
19
|
s.rubyforge_project = "tddium"
|
20
20
|
|
@@ -26,7 +26,7 @@ Gem::Specification.new do |s|
|
|
26
26
|
s.add_runtime_dependency("thor")
|
27
27
|
s.add_runtime_dependency("highline")
|
28
28
|
s.add_runtime_dependency("json")
|
29
|
-
s.add_runtime_dependency("tddium_client", "
|
29
|
+
s.add_runtime_dependency("tddium_client", ">=0.0.6")
|
30
30
|
|
31
31
|
s.add_development_dependency("rspec")
|
32
32
|
s.add_development_dependency("fakefs")
|
metadata
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tddium-preview
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
4
|
+
prerelease: false
|
6
5
|
segments:
|
7
6
|
- 0
|
8
7
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
8
|
+
- 5
|
9
|
+
version: 0.0.5
|
11
10
|
platform: ruby
|
12
11
|
authors:
|
13
12
|
- Jay Moorthi
|
@@ -15,7 +14,7 @@ autorequire:
|
|
15
14
|
bindir: bin
|
16
15
|
cert_chain: []
|
17
16
|
|
18
|
-
date: 2011-
|
17
|
+
date: 2011-04-04 00:00:00 -07:00
|
19
18
|
default_executable:
|
20
19
|
dependencies:
|
21
20
|
- !ruby/object:Gem::Dependency
|
@@ -26,7 +25,6 @@ dependencies:
|
|
26
25
|
requirements:
|
27
26
|
- - ">="
|
28
27
|
- !ruby/object:Gem::Version
|
29
|
-
hash: 3
|
30
28
|
segments:
|
31
29
|
- 0
|
32
30
|
version: "0"
|
@@ -40,7 +38,6 @@ dependencies:
|
|
40
38
|
requirements:
|
41
39
|
- - ">="
|
42
40
|
- !ruby/object:Gem::Version
|
43
|
-
hash: 3
|
44
41
|
segments:
|
45
42
|
- 0
|
46
43
|
version: "0"
|
@@ -54,7 +51,6 @@ dependencies:
|
|
54
51
|
requirements:
|
55
52
|
- - ">="
|
56
53
|
- !ruby/object:Gem::Version
|
57
|
-
hash: 3
|
58
54
|
segments:
|
59
55
|
- 0
|
60
56
|
version: "0"
|
@@ -66,14 +62,13 @@ dependencies:
|
|
66
62
|
requirement: &id004 !ruby/object:Gem::Requirement
|
67
63
|
none: false
|
68
64
|
requirements:
|
69
|
-
- - "
|
65
|
+
- - ">="
|
70
66
|
- !ruby/object:Gem::Version
|
71
|
-
hash: 25
|
72
67
|
segments:
|
73
68
|
- 0
|
74
69
|
- 0
|
75
|
-
-
|
76
|
-
version: 0.0.
|
70
|
+
- 6
|
71
|
+
version: 0.0.6
|
77
72
|
type: :runtime
|
78
73
|
version_requirements: *id004
|
79
74
|
- !ruby/object:Gem::Dependency
|
@@ -84,7 +79,6 @@ dependencies:
|
|
84
79
|
requirements:
|
85
80
|
- - ">="
|
86
81
|
- !ruby/object:Gem::Version
|
87
|
-
hash: 3
|
88
82
|
segments:
|
89
83
|
- 0
|
90
84
|
version: "0"
|
@@ -98,7 +92,6 @@ dependencies:
|
|
98
92
|
requirements:
|
99
93
|
- - ">="
|
100
94
|
- !ruby/object:Gem::Version
|
101
|
-
hash: 3
|
102
95
|
segments:
|
103
96
|
- 0
|
104
97
|
version: "0"
|
@@ -112,7 +105,6 @@ dependencies:
|
|
112
105
|
requirements:
|
113
106
|
- - ">="
|
114
107
|
- !ruby/object:Gem::Version
|
115
|
-
hash: 3
|
116
108
|
segments:
|
117
109
|
- 0
|
118
110
|
version: "0"
|
@@ -126,13 +118,12 @@ dependencies:
|
|
126
118
|
requirements:
|
127
119
|
- - ">="
|
128
120
|
- !ruby/object:Gem::Version
|
129
|
-
hash: 3
|
130
121
|
segments:
|
131
122
|
- 0
|
132
123
|
version: "0"
|
133
124
|
type: :development
|
134
125
|
version_requirements: *id008
|
135
|
-
description: tddium
|
126
|
+
description: tddium runs your rspec (and Selenium) tests in the cloud, in parallel!
|
136
127
|
email:
|
137
128
|
- info@tddium.com
|
138
129
|
executables:
|
@@ -171,7 +162,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
171
162
|
requirements:
|
172
163
|
- - ">="
|
173
164
|
- !ruby/object:Gem::Version
|
174
|
-
hash: 3
|
175
165
|
segments:
|
176
166
|
- 0
|
177
167
|
version: "0"
|
@@ -180,17 +170,16 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
180
170
|
requirements:
|
181
171
|
- - ">="
|
182
172
|
- !ruby/object:Gem::Version
|
183
|
-
hash: 3
|
184
173
|
segments:
|
185
174
|
- 0
|
186
175
|
version: "0"
|
187
176
|
requirements: []
|
188
177
|
|
189
178
|
rubyforge_project: tddium
|
190
|
-
rubygems_version: 1.
|
179
|
+
rubygems_version: 1.3.7
|
191
180
|
signing_key:
|
192
181
|
specification_version: 3
|
193
|
-
summary: tddium
|
182
|
+
summary: tddium Hosted Testing
|
194
183
|
test_files:
|
195
184
|
- spec/spec_helper.rb
|
196
185
|
- spec/tddium_spec.rb
|