tddium-preview 0.6.16 → 0.6.18
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/.gitignore +2 -0
- data/Gemfile.lock +1 -1
- data/Rakefile +2 -1
- data/lib/tddium.rb +79 -17
- data/lib/tddium/constant.rb +50 -6
- data/lib/tddium/version.rb +1 -1
- data/spec/spec_helper.rb +1 -0
- data/spec/tddium_spec.rb +91 -28
- metadata +2 -2
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
data/Rakefile
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# Copyright (c) 2011 Solano Labs All Rights Reserved
|
|
2
|
+
#
|
|
2
3
|
|
|
3
4
|
require 'bundler'
|
|
4
5
|
Bundler::GemHelper.install_tasks
|
|
@@ -11,7 +12,7 @@ end
|
|
|
11
12
|
task :default => :spec
|
|
12
13
|
|
|
13
14
|
namespace :spec do
|
|
14
|
-
RUBY_VERSIONS = ["1.9.2-p180", "1.8.7-
|
|
15
|
+
RUBY_VERSIONS = ["1.9.2-p180", "1.8.7-p334"]
|
|
15
16
|
GEMSET = "tddium"
|
|
16
17
|
desc "Runs the specs across Ruby 1.8.7 and 1.9.2"
|
|
17
18
|
task :xruby do
|
data/lib/tddium.rb
CHANGED
|
@@ -8,7 +8,7 @@ require "highline/import"
|
|
|
8
8
|
require "json"
|
|
9
9
|
require "tddium_client"
|
|
10
10
|
require "base64"
|
|
11
|
-
require
|
|
11
|
+
require "erb"
|
|
12
12
|
require File.expand_path("../tddium/constant", __FILE__)
|
|
13
13
|
require File.expand_path("../tddium/version", __FILE__)
|
|
14
14
|
require File.expand_path("../tddium/heroku", __FILE__)
|
|
@@ -107,6 +107,7 @@ class Tddium < Thor
|
|
|
107
107
|
end
|
|
108
108
|
|
|
109
109
|
desc "password", "Change password"
|
|
110
|
+
map "passwd" => :password
|
|
110
111
|
method_option :environment, :type => :string, :default => nil
|
|
111
112
|
def password
|
|
112
113
|
set_default_environment(options[:environment])
|
|
@@ -157,8 +158,14 @@ class Tddium < Thor
|
|
|
157
158
|
method_option :user_data_file, :type => :string, :default => nil
|
|
158
159
|
method_option :max_parallelism, :type => :numeric, :default => nil
|
|
159
160
|
method_option :test_pattern, :type => :string, :default => nil
|
|
161
|
+
method_option :force, :type => :boolean, :default => false
|
|
160
162
|
def spec
|
|
161
163
|
set_default_environment(options[:environment])
|
|
164
|
+
git_version_ok
|
|
165
|
+
if git_changes then
|
|
166
|
+
exit_failure(Text::Error::GIT_CHANGES_NOT_COMMITTED) if !options[:force]
|
|
167
|
+
warn(Text::Warning::GIT_CHANGES_NOT_COMMITTED)
|
|
168
|
+
end
|
|
162
169
|
exit_failure unless git_repo? && tddium_settings && suite_for_current_branch?
|
|
163
170
|
|
|
164
171
|
test_execution_params = {}
|
|
@@ -247,7 +254,8 @@ class Tddium < Thor
|
|
|
247
254
|
say "#{finished_tests.size} tests, #{test_statuses["failed"]} failures, #{test_statuses["error"]} errors, #{test_statuses["pending"]} pending"
|
|
248
255
|
|
|
249
256
|
# Save the spec options
|
|
250
|
-
write_suite(
|
|
257
|
+
write_suite(suite_details["suite"].merge({"id" => current_suite_id}),
|
|
258
|
+
{"user_data_file" => user_data_file_path,
|
|
251
259
|
"max_parallelism" => max_parallelism,
|
|
252
260
|
"test_pattern" => test_pattern})
|
|
253
261
|
|
|
@@ -263,6 +271,7 @@ class Tddium < Thor
|
|
|
263
271
|
method_option :environment, :type => :string, :default => nil
|
|
264
272
|
def status
|
|
265
273
|
set_default_environment(options[:environment])
|
|
274
|
+
git_version_ok
|
|
266
275
|
return unless git_repo? && tddium_settings && suite_for_current_branch?
|
|
267
276
|
|
|
268
277
|
begin
|
|
@@ -292,6 +301,7 @@ class Tddium < Thor
|
|
|
292
301
|
end
|
|
293
302
|
|
|
294
303
|
desc "suite", "Register the suite for this project, or edit its settings"
|
|
304
|
+
method_option :edit, :type => :boolean, :default => false
|
|
295
305
|
method_option :name, :type => :string, :default => nil
|
|
296
306
|
method_option :pull_url, :type => :string, :default => nil
|
|
297
307
|
method_option :push_url, :type => :string, :default => nil
|
|
@@ -299,6 +309,7 @@ class Tddium < Thor
|
|
|
299
309
|
method_option :environment, :type => :string, :default => nil
|
|
300
310
|
def suite
|
|
301
311
|
set_default_environment(options[:environment])
|
|
312
|
+
git_version_ok
|
|
302
313
|
return unless git_repo? && tddium_settings
|
|
303
314
|
|
|
304
315
|
params = {}
|
|
@@ -306,8 +317,11 @@ class Tddium < Thor
|
|
|
306
317
|
if current_suite_id
|
|
307
318
|
current_suite = call_api(:get, current_suite_path)["suite"]
|
|
308
319
|
|
|
309
|
-
|
|
310
|
-
|
|
320
|
+
if options[:edit]
|
|
321
|
+
update_suite(current_suite, options)
|
|
322
|
+
else
|
|
323
|
+
say Text::Process::EXISTING_SUITE % format_suite_details(current_suite)
|
|
324
|
+
end
|
|
311
325
|
else
|
|
312
326
|
params[:branch] = current_git_branch
|
|
313
327
|
default_suite_name = File.basename(Dir.pwd)
|
|
@@ -317,7 +331,7 @@ class Tddium < Thor
|
|
|
317
331
|
|
|
318
332
|
if use_existing_suite
|
|
319
333
|
# Write to file and exit when using the existing suite
|
|
320
|
-
write_suite(existing_suite
|
|
334
|
+
write_suite(existing_suite)
|
|
321
335
|
say Text::Status::USING_SUITE % format_suite_details(existing_suite)
|
|
322
336
|
return
|
|
323
337
|
end
|
|
@@ -332,7 +346,7 @@ class Tddium < Thor
|
|
|
332
346
|
say Text::Process::CREATING_SUITE % [params[:repo_name], params[:branch]]
|
|
333
347
|
new_suite = call_api(:post, Api::Path::SUITES, {:suite => params})
|
|
334
348
|
# Save the created suite
|
|
335
|
-
write_suite(new_suite["suite"]
|
|
349
|
+
write_suite(new_suite["suite"])
|
|
336
350
|
|
|
337
351
|
# Manage git
|
|
338
352
|
exit_failure("Failed to push repo to Tddium!") unless update_git_remote_and_push(new_suite)
|
|
@@ -363,6 +377,45 @@ class Tddium < Thor
|
|
|
363
377
|
result
|
|
364
378
|
end
|
|
365
379
|
|
|
380
|
+
def git_changes
|
|
381
|
+
cmd = "(git ls-files --exclude-standard -d -m -t || echo GIT_FAILED) < /dev/null 2>&1"
|
|
382
|
+
p = IO.popen(cmd)
|
|
383
|
+
changes = false
|
|
384
|
+
while line = p.gets do
|
|
385
|
+
if line =~ /GIT_FAILED/
|
|
386
|
+
warn(Text::Warning::GIT_UNABLE_TO_DETECT)
|
|
387
|
+
return false
|
|
388
|
+
end
|
|
389
|
+
line = line.strip
|
|
390
|
+
fields = line.split(/\s+/)
|
|
391
|
+
status = fields[0]
|
|
392
|
+
if status !~ /^\?/ then
|
|
393
|
+
changes = true
|
|
394
|
+
break
|
|
395
|
+
end
|
|
396
|
+
end
|
|
397
|
+
return changes
|
|
398
|
+
end
|
|
399
|
+
|
|
400
|
+
def git_version_ok
|
|
401
|
+
version = nil
|
|
402
|
+
begin
|
|
403
|
+
version_string = `git --version`
|
|
404
|
+
m = version_string.match(Dependency::VERSION_REGEXP)
|
|
405
|
+
version = m[0] unless m.nil?
|
|
406
|
+
rescue Errno
|
|
407
|
+
rescue Exception
|
|
408
|
+
end
|
|
409
|
+
if version.nil? || version.empty? then
|
|
410
|
+
exit_failure(Text::Error::GIT_NOT_FOUND)
|
|
411
|
+
end
|
|
412
|
+
version_parts = version.split(".")
|
|
413
|
+
if version_parts[0].to_i < 1 ||
|
|
414
|
+
version_parts[1].to_i < 7 then
|
|
415
|
+
warn(Text::Warning::GIT_VERSION % version)
|
|
416
|
+
end
|
|
417
|
+
end
|
|
418
|
+
|
|
366
419
|
def current_git_branch
|
|
367
420
|
@current_git_branch ||= File.basename(`git symbolic-ref HEAD`.gsub("\n", ""))
|
|
368
421
|
end
|
|
@@ -546,13 +599,11 @@ class Tddium < Thor
|
|
|
546
599
|
ask_or_update.call(:campfire_room, Text::Prompt::CAMPFIRE_ROOM, nil)
|
|
547
600
|
end
|
|
548
601
|
|
|
549
|
-
def
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
say Text::Process::UPDATED_SUITE
|
|
555
|
-
end
|
|
602
|
+
def update_suite(suite, options)
|
|
603
|
+
params = {}
|
|
604
|
+
prompt_suite_params(options, params, suite)
|
|
605
|
+
call_api(:put, "#{Api::Path::SUITES}/#{suite['id']}", params)
|
|
606
|
+
say Text::Process::UPDATED_SUITE
|
|
556
607
|
end
|
|
557
608
|
|
|
558
609
|
def resolve_suite_name(options, params, default_suite_name)
|
|
@@ -630,6 +681,11 @@ class Tddium < Thor
|
|
|
630
681
|
details
|
|
631
682
|
end
|
|
632
683
|
|
|
684
|
+
def tddium_deploy_key_file_name
|
|
685
|
+
extension = ".#{environment}" unless environment == :production
|
|
686
|
+
".tddium-deploy-key#{extension}"
|
|
687
|
+
end
|
|
688
|
+
|
|
633
689
|
def suite_for_current_branch?
|
|
634
690
|
unless current_suite_id
|
|
635
691
|
message = Text::Error::NO_SUITE_EXISTS % current_git_branch
|
|
@@ -685,20 +741,26 @@ class Tddium < Thor
|
|
|
685
741
|
write_tddium_to_gitignore
|
|
686
742
|
end
|
|
687
743
|
|
|
688
|
-
def write_suite(
|
|
744
|
+
def write_suite(suite, options = {})
|
|
745
|
+
suite_id = suite["id"]
|
|
689
746
|
branches = tddium_settings["branches"] || {}
|
|
690
747
|
branches.merge!({current_git_branch => {"id" => suite_id, "options" => options}})
|
|
691
748
|
File.open(tddium_file_name, "w") do |file|
|
|
692
749
|
file.write(tddium_settings.merge({"branches" => branches}).to_json)
|
|
693
750
|
end
|
|
751
|
+
File.open(tddium_deploy_key_file_name, "w") do |file|
|
|
752
|
+
file.write(suite["ci_ssh_pubkey"])
|
|
753
|
+
end
|
|
694
754
|
write_tddium_to_gitignore
|
|
695
755
|
end
|
|
696
756
|
|
|
697
757
|
def write_tddium_to_gitignore
|
|
698
758
|
content = File.exists?(Git::GITIGNORE) ? File.read(Git::GITIGNORE) : ''
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
759
|
+
[tddium_file_name, tddium_deploy_key_file_name].each do |fn|
|
|
760
|
+
unless content.include?("#{fn}\n")
|
|
761
|
+
File.open(Git::GITIGNORE, "a") do |file|
|
|
762
|
+
file.write("#{fn}\n")
|
|
763
|
+
end
|
|
702
764
|
end
|
|
703
765
|
end
|
|
704
766
|
end
|
data/lib/tddium/constant.rb
CHANGED
|
@@ -59,7 +59,6 @@ module TddiumConstant
|
|
|
59
59
|
INVITATION_TOKEN = "Enter your invitation token:"
|
|
60
60
|
USE_EXISTING_SUITE = "A suite exists '%%s' (branch %s). Enter '#{Response::YES}' to use it, or enter a new repo name:"
|
|
61
61
|
TEST_PATTERN = "Enter a test pattern or press 'Return'. Using '%s' by default:"
|
|
62
|
-
UPDATE_SUITE = "Do you want to edit settings for this suite? (y/n)"
|
|
63
62
|
CI_PULL_URL = "Enter git URL to pull from (default '%s'):"
|
|
64
63
|
CI_PUSH_URL = "Enter git URL to push to (default '%s'):"
|
|
65
64
|
CAMPFIRE_SUBDOMAIN = "Enter your Campfire subdomain (default '%s'):"
|
|
@@ -68,7 +67,9 @@ module TddiumConstant
|
|
|
68
67
|
end
|
|
69
68
|
|
|
70
69
|
module Warning
|
|
71
|
-
|
|
70
|
+
GIT_VERSION = "Unsupported git version: %s"
|
|
71
|
+
GIT_CHANGES_NOT_COMMITTED = "There are uncommitted changes in the local git repository"
|
|
72
|
+
GIT_UNABLE_TO_DETECT = "Unable to detect uncommitted git changes"
|
|
72
73
|
end
|
|
73
74
|
|
|
74
75
|
module Process
|
|
@@ -222,19 +223,54 @@ Notifications:
|
|
|
222
223
|
Authorize the following SSH key to let Tddium's pulls and pushes through:
|
|
223
224
|
|
|
224
225
|
<%=suite["ci_ssh_pubkey"]%>
|
|
226
|
+
<% if suite["ci_pull_url"] =~ /^git@github.com:(.*).git$/ %>
|
|
227
|
+
Tddium will pull from your Github repository. Visit
|
|
228
|
+
https://github.com/<%= $1 %>/admin/keys
|
|
229
|
+
then click "Add another deploy key" and copy and paste the above key.
|
|
230
|
+
<% end %>
|
|
231
|
+
<% if suite["ci_push_url"] =~ /^git@heroku.com:(.*).git$/ %>
|
|
232
|
+
Tddium will push to your Heroku application <%= $1 %>.
|
|
233
|
+
To authorize the key, use the following command:
|
|
234
|
+
heroku keys:add <%= tddium_deploy_key_file_name %> --app <%= $1 %>
|
|
235
|
+
<% end %>
|
|
225
236
|
|
|
226
|
-
|
|
227
|
-
|
|
237
|
+
<% if suite["ci_pull_url"] =~ /^git@github.com:(.*).git$/ %>
|
|
238
|
+
Github can notify Tddium of your commits with a post-receive hook. Visit
|
|
239
|
+
https://github.com/<%= $1 %>/admin/hooks#generic_minibucket
|
|
240
|
+
then add the following URL and click "Update Settings":
|
|
228
241
|
<%=suite["hook_uri"]%>
|
|
242
|
+
<% else %>
|
|
243
|
+
It looks like you aren't using Github, so you'll need to manually configure
|
|
244
|
+
your post-commit hook. In Unix-based Git repositories, find the repository
|
|
245
|
+
root and look for a shell script in `.git/hooks/post-commit`.
|
|
246
|
+
To trigger CI builds, POST to the following URL from a post-commit hook:
|
|
247
|
+
<% end %>
|
|
229
248
|
|
|
230
|
-
See www.tddium.com/support for more information.
|
|
249
|
+
See http://www.tddium.com/support for more information on Tddium CI.
|
|
231
250
|
<% end %>
|
|
251
|
+
|
|
252
|
+
If your tests don't require a database, you're all set and can now run
|
|
253
|
+
tddium spec.
|
|
254
|
+
|
|
255
|
+
If your tests do use a database, you'll now need to configure your
|
|
256
|
+
database setup. See http://www.tddium.com/support/reference#setup_hooks
|
|
257
|
+
to create a Rake task for Tddium to set up your database.
|
|
258
|
+
|
|
259
|
+
Run 'tddium suite --edit' to edit suite settings.
|
|
232
260
|
EOF
|
|
233
261
|
end
|
|
234
262
|
|
|
235
263
|
module Error
|
|
264
|
+
GIT_CHANGES_NOT_COMMITTED =<<EOF
|
|
265
|
+
There are uncommitted changes in the local git repository.
|
|
266
|
+
|
|
267
|
+
Commit changes before running 'tddium spec'.
|
|
268
|
+
|
|
269
|
+
Use 'tddium spec --force' to test with only already-committed changes.
|
|
270
|
+
EOF
|
|
236
271
|
NOT_INITIALIZED = "tddium must be initialized. Try 'tddium login'"
|
|
237
272
|
INVALID_TDDIUM_FILE = ".tddium.%s config file is corrupt. Try 'tddium login'"
|
|
273
|
+
GIT_NOT_FOUND = "Tddium requires git and git is not on your PATH"
|
|
238
274
|
GIT_NOT_INITIALIZED =<<EOF;
|
|
239
275
|
It doesn't look like you're in a git repo. If you're not, use 'git init' to
|
|
240
276
|
create one.
|
|
@@ -265,7 +301,15 @@ http://blog.tddium.com/home/
|
|
|
265
301
|
HEROKU_MISCONFIGURED = "There was an error linking your Heroku account to Tddium: %s"
|
|
266
302
|
module Heroku
|
|
267
303
|
NOT_FOUND = "heroku command not found. Make sure the latest heroku gem is installed.\nOutput of `gem list heroku`:\n%s"
|
|
268
|
-
NOT_ADDED
|
|
304
|
+
NOT_ADDED =<<EOF;
|
|
305
|
+
It looks like you haven't enabled the tddium add-on for the default app.
|
|
306
|
+
Add it using 'heroku addons:add tddium'
|
|
307
|
+
|
|
308
|
+
If you've already enabled the addon for a specific app, try running:
|
|
309
|
+
|
|
310
|
+
$ tddium heroku --app <your app name>'
|
|
311
|
+
|
|
312
|
+
EOF
|
|
269
313
|
INVALID_FORMAT = "The 'heroku -s' command output a format we didn't recognize. Make sure you're running the latest version of the heroku gem"
|
|
270
314
|
NOT_LOGGED_IN = "Log in to your heroku account first using 'heroku login'"
|
|
271
315
|
APP_NOT_FOUND = "The app '%s' is not recognized by Heroku"
|
data/lib/tddium/version.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
data/spec/tddium_spec.rb
CHANGED
|
@@ -35,6 +35,7 @@ describe Tddium do
|
|
|
35
35
|
DEFAULT_TEST_PATTERN = "**/*_spec.rb"
|
|
36
36
|
SAMPLE_SUITE_PATTERN = "features/*.feature, spec/**/*_spec.rb"
|
|
37
37
|
CUSTOM_TEST_PATTERN = "**/cat_spec.rb"
|
|
38
|
+
SAMPLE_SSH_PUBKEY = "ssh-rsa 1234567890"
|
|
38
39
|
SAMPLE_SUITE_RESPONSE = {"repo_name" => SAMPLE_APP_NAME,
|
|
39
40
|
"branch" => SAMPLE_BRANCH_NAME,
|
|
40
41
|
"id" => SAMPLE_SUITE_ID,
|
|
@@ -42,10 +43,11 @@ describe Tddium do
|
|
|
42
43
|
"rubygems_version"=>SAMPLE_RUBYGEMS_VERSION,
|
|
43
44
|
"bundler_version"=>SAMPLE_BUNDLER_VERSION,
|
|
44
45
|
"git_repo_uri" => SAMPLE_GIT_REPO_URI,
|
|
46
|
+
"ci_ssh_pubkey" => SAMPLE_SSH_PUBKEY,
|
|
45
47
|
"test_pattern" => SAMPLE_SUITE_PATTERN}
|
|
46
48
|
SAMPLE_SUITES_RESPONSE = {"suites" => [SAMPLE_SUITE_RESPONSE]}
|
|
47
|
-
SAMPLE_SUITE_OUTPUT = "Repo: #{SAMPLE_APP_NAME}/#{SAMPLE_BRANCH_NAME}\nDefault Test Pattern: #{SAMPLE_SUITE_PATTERN}\nRuby Version: #{SAMPLE_RUBY_VERSION}\nRubygems Version: #{SAMPLE_RUBYGEMS_VERSION}\nBundler Version: #{SAMPLE_BUNDLER_VERSION}\n\n"
|
|
48
49
|
SAMPLE_TDDIUM_CONFIG_FILE = ".tddium.test"
|
|
50
|
+
SAMPLE_TDDIUM_DEPLOY_KEY_FILE = ".tddium-deploy-key.test"
|
|
49
51
|
SAMPLE_TEST_EXECUTION_STATS = "total 1, notstarted 0, started 1, passed 0, failed 0, pending 0, error 0", "start_time"
|
|
50
52
|
SAMPLE_USER_RESPONSE = {"status"=>0, "user"=>
|
|
51
53
|
{ "id"=>SAMPLE_USER_ID,
|
|
@@ -53,7 +55,6 @@ describe Tddium do
|
|
|
53
55
|
"email" => SAMPLE_EMAIL,
|
|
54
56
|
"created_at" => SAMPLE_DATE_TIME,
|
|
55
57
|
"recurly_url" => SAMPLE_RECURLY_URL}}
|
|
56
|
-
SAMPLE_SSH_PUBKEY = "ssh-rsa 1234567890"
|
|
57
58
|
SAMPLE_HEROKU_USER_RESPONSE = {"user"=>
|
|
58
59
|
{ "id"=>SAMPLE_USER_ID,
|
|
59
60
|
"api_key" => SAMPLE_API_KEY,
|
|
@@ -178,6 +179,8 @@ describe Tddium do
|
|
|
178
179
|
stub_tddium_client
|
|
179
180
|
stub_git_status(tddium)
|
|
180
181
|
stub_git_config(tddium)
|
|
182
|
+
stub_git_changes(tddium)
|
|
183
|
+
stub_git_version_ok(tddium)
|
|
181
184
|
create_file(File.join(".git", "something"), "something")
|
|
182
185
|
create_file(Tddium::Git::GITIGNORE, "something")
|
|
183
186
|
end
|
|
@@ -190,6 +193,14 @@ describe Tddium do
|
|
|
190
193
|
tddium.stub(:system).with(/git status/).and_return(result)
|
|
191
194
|
end
|
|
192
195
|
|
|
196
|
+
def stub_git_changes(tddium, result=false)
|
|
197
|
+
tddium.stub(:git_changes).and_return(result)
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
def stub_git_version_ok(tddium, result=false)
|
|
201
|
+
tddium.stub(:git_version_ok).and_return(result)
|
|
202
|
+
end
|
|
203
|
+
|
|
193
204
|
def stub_git_config(tddium)
|
|
194
205
|
tddium.stub(:`).with("git config --get remote.origin.url").and_return(SAMPLE_GIT_REPO_URI)
|
|
195
206
|
end
|
|
@@ -230,6 +241,61 @@ describe Tddium do
|
|
|
230
241
|
let(:tddium) { Tddium.new }
|
|
231
242
|
let(:tddium_client) { mock(TddiumClient).as_null_object }
|
|
232
243
|
|
|
244
|
+
describe "problems running git" do
|
|
245
|
+
before(:each) do
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
it "should fail and exit if git is not found" do
|
|
249
|
+
tddium.stub(:`).with('git --version').and_raise(Errno::ENOENT)
|
|
250
|
+
tddium.should_receive(:exit_failure).with(Tddium::Text::Error::GIT_NOT_FOUND).and_raise("exit")
|
|
251
|
+
lambda { tddium.send(:git_version_ok) }.should raise_error("exit")
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
it "should warn if git version is unsupported" do
|
|
255
|
+
tddium.stub(:`).with('git --version').and_return("git version 1.6.2")
|
|
256
|
+
tddium.should_receive(:warn).with(Tddium::Text::Warning::GIT_VERSION % "1.6.2").and_return(nil)
|
|
257
|
+
tddium.send(:git_version_ok)
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
it "should warn if git version is unsupported" do
|
|
261
|
+
tddium.stub(:`).with('git --version').and_return("git version 1.7.5")
|
|
262
|
+
tddium.should_not_receive(:exit_failure)
|
|
263
|
+
tddium.should_not_receive(:warn)
|
|
264
|
+
tddium.send(:git_version_ok)
|
|
265
|
+
end
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
describe "changes in git" do
|
|
269
|
+
before(:each) do
|
|
270
|
+
@none = ''
|
|
271
|
+
@modified = "C lib/tddium.rb\n R spec/spec_helper.rb\n"
|
|
272
|
+
@unknown = " ? spec/bogus_spec.rb\n"
|
|
273
|
+
stub_config_file(:api_key => true, :branches => true)
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
it "should handle failure" do
|
|
277
|
+
::IO.stub(:popen) { StringIO.new("GIT_FAILED") }
|
|
278
|
+
tddium.should_receive(:warn).with(Tddium::Text::Warning::GIT_UNABLE_TO_DETECT).and_return(nil)
|
|
279
|
+
tddium.send(:git_changes).should be_false
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
it "should signal no changes if there are none" do
|
|
283
|
+
::IO.stub(:popen) { StringIO.new(@none) }
|
|
284
|
+
tddium.send(:git_changes).should be_false
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
it "should ignore unknown files if there are any" do
|
|
288
|
+
::IO.stub(:popen) { StringIO.new(@unknown) }
|
|
289
|
+
tddium.send(:git_changes).should be_false
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
it "should signal uncommitted changes" do
|
|
293
|
+
status = @unknown + @modified
|
|
294
|
+
::IO.stub(:popen) { StringIO.new(status) }
|
|
295
|
+
tddium.send(:git_changes).should be_true
|
|
296
|
+
end
|
|
297
|
+
end
|
|
298
|
+
|
|
233
299
|
shared_examples_for "a password prompt" do
|
|
234
300
|
context "--password was not passed in" do
|
|
235
301
|
it "should prompt for a password or confirmation" do
|
|
@@ -1041,6 +1107,13 @@ describe Tddium do
|
|
|
1041
1107
|
end
|
|
1042
1108
|
end
|
|
1043
1109
|
|
|
1110
|
+
shared_examples_for("saving spec options") do
|
|
1111
|
+
it "should save the spec options" do
|
|
1112
|
+
tddium.should_receive(:write_suite).with(SAMPLE_SUITE_RESPONSE, {"user_data_file" => nil, "max_parallelism" => 3, "test_pattern" => nil})
|
|
1113
|
+
run_spec(tddium, {:max_parallelism => 3})
|
|
1114
|
+
end
|
|
1115
|
+
end
|
|
1116
|
+
|
|
1044
1117
|
context "user presses 'Ctrl-C' during the process" do
|
|
1045
1118
|
before do
|
|
1046
1119
|
stub_call_api_response(:get, "#{Tddium::Api::Path::SESSIONS}/#{SAMPLE_SESSION_ID}/#{Tddium::Api::Path::TEST_EXECUTIONS}", get_test_executions_response)
|
|
@@ -1106,11 +1179,7 @@ describe Tddium do
|
|
|
1106
1179
|
end
|
|
1107
1180
|
end
|
|
1108
1181
|
|
|
1109
|
-
|
|
1110
|
-
tddium.should_receive(:write_suite).with(SAMPLE_SUITE_ID, {"user_data_file" => nil, "max_parallelism" => 3, "test_pattern" => nil})
|
|
1111
|
-
run_spec(tddium, {:max_parallelism => 3})
|
|
1112
|
-
end
|
|
1113
|
-
|
|
1182
|
+
it_behaves_like "saving spec options"
|
|
1114
1183
|
it_should_behave_like("test output summary")
|
|
1115
1184
|
end
|
|
1116
1185
|
|
|
@@ -1167,11 +1236,7 @@ describe Tddium do
|
|
|
1167
1236
|
end
|
|
1168
1237
|
end
|
|
1169
1238
|
|
|
1170
|
-
|
|
1171
|
-
tddium.should_receive(:write_suite).with(SAMPLE_SUITE_ID, {"user_data_file" => nil, "max_parallelism" => 3, "test_pattern" => nil})
|
|
1172
|
-
run_spec(tddium, {:max_parallelism => 3})
|
|
1173
|
-
end
|
|
1174
|
-
|
|
1239
|
+
it_should_behave_like "saving spec options"
|
|
1175
1240
|
it_should_behave_like("test output summary")
|
|
1176
1241
|
end
|
|
1177
1242
|
end
|
|
@@ -1339,18 +1404,18 @@ describe Tddium do
|
|
|
1339
1404
|
tddium.stub(:ask).and_return("")
|
|
1340
1405
|
end
|
|
1341
1406
|
|
|
1342
|
-
shared_examples_for "prompting for suite configuration" do
|
|
1407
|
+
shared_examples_for "prompting for suite configuration" do |options|
|
|
1343
1408
|
it "should prompt for URLs" do
|
|
1344
1409
|
tddium.should_receive(:ask).with(Tddium::Text::Prompt::CI_PULL_URL % current.fetch('ci_pull_url', SAMPLE_GIT_REPO_URI), anything)
|
|
1345
1410
|
tddium.should_receive(:ask).with(Tddium::Text::Prompt::CI_PUSH_URL % current['ci_push_url'], anything)
|
|
1346
|
-
run_suite(tddium)
|
|
1411
|
+
run_suite(tddium, options)
|
|
1347
1412
|
end
|
|
1348
1413
|
|
|
1349
1414
|
it "should prompt for campfire" do
|
|
1350
1415
|
tddium.should_receive(:ask).with(Tddium::Text::Prompt::CAMPFIRE_SUBDOMAIN % current['campfire_subdomain'], anything)
|
|
1351
1416
|
tddium.should_receive(:ask).with(Tddium::Text::Prompt::CAMPFIRE_TOKEN % current['campfire_token'], anything)
|
|
1352
1417
|
tddium.should_receive(:ask).with(Tddium::Text::Prompt::CAMPFIRE_ROOM % current['campfire_room'], anything)
|
|
1353
|
-
run_suite(tddium)
|
|
1418
|
+
run_suite(tddium, options)
|
|
1354
1419
|
end
|
|
1355
1420
|
end
|
|
1356
1421
|
|
|
@@ -1420,6 +1485,12 @@ describe Tddium do
|
|
|
1420
1485
|
JSON.parse(tddium_file)["branches"][SAMPLE_BRANCH_NAME]["id"].should == SAMPLE_SUITE_ID
|
|
1421
1486
|
end
|
|
1422
1487
|
|
|
1488
|
+
it "should write the deploy key file" do
|
|
1489
|
+
run_suite(tddium)
|
|
1490
|
+
deploy_key_data = File.open(SAMPLE_TDDIUM_DEPLOY_KEY_FILE) { |file| file.read }
|
|
1491
|
+
deploy_key_data.should == SAMPLE_SSH_PUBKEY
|
|
1492
|
+
end
|
|
1493
|
+
|
|
1423
1494
|
it "should update the gitignore file with tddium" do
|
|
1424
1495
|
run_suite(tddium)
|
|
1425
1496
|
gitignore_file = File.open(Tddium::Git::GITIGNORE) { |file| file.read }
|
|
@@ -1473,8 +1544,8 @@ describe Tddium do
|
|
|
1473
1544
|
|
|
1474
1545
|
it_should_behave_like "writing the suite to file"
|
|
1475
1546
|
|
|
1476
|
-
it "should show the user:
|
|
1477
|
-
tddium.should_receive(:say).with(Tddium::Text::Status::USING_SUITE %
|
|
1547
|
+
it "should show the user: sample suite output" do
|
|
1548
|
+
tddium.should_receive(:say).with(Tddium::Text::Status::USING_SUITE % tddium.send(:format_suite_details, SAMPLE_SUITE_RESPONSE))
|
|
1478
1549
|
run_suite(tddium)
|
|
1479
1550
|
end
|
|
1480
1551
|
end
|
|
@@ -1570,25 +1641,17 @@ describe Tddium do
|
|
|
1570
1641
|
end
|
|
1571
1642
|
|
|
1572
1643
|
it "should display '#{Tddium::Text::Process::EXISTING_SUITE}'" do
|
|
1573
|
-
tddium.should_receive(:say).with(Tddium::Text::Process::EXISTING_SUITE %
|
|
1574
|
-
run_suite(tddium)
|
|
1575
|
-
end
|
|
1576
|
-
|
|
1577
|
-
it "should check if the user wants to update the suite" do
|
|
1578
|
-
tddium.should_receive(:ask).with(Tddium::Text::Prompt::UPDATE_SUITE, anything)
|
|
1644
|
+
tddium.should_receive(:say).with(Tddium::Text::Process::EXISTING_SUITE % tddium.send(:format_suite_details, SAMPLE_SUITE_RESPONSE))
|
|
1579
1645
|
run_suite(tddium)
|
|
1580
1646
|
end
|
|
1581
1647
|
|
|
1582
1648
|
context "user wants to update the suite" do
|
|
1583
|
-
|
|
1584
|
-
tddium.stub(:ask).with(Tddium::Text::Prompt::UPDATE_SUITE, anything).and_return(Tddium::Text::Prompt::Response::YES)
|
|
1585
|
-
end
|
|
1586
|
-
it_behaves_like "prompting for suite configuration" do
|
|
1649
|
+
it_behaves_like "prompting for suite configuration", {:edit=>true} do
|
|
1587
1650
|
let(:current) { SAMPLE_SUITE_RESPONSE }
|
|
1588
1651
|
end
|
|
1589
1652
|
it "should PUT to /suites/#{SAMPLE_SUITE_ID}" do
|
|
1590
1653
|
call_api_should_receive(:method=>:put, :path=>"#{Tddium::Api::Path::SUITES}/#{SAMPLE_SUITE_ID}")
|
|
1591
|
-
run_suite(tddium)
|
|
1654
|
+
run_suite(tddium, {:edit=>true})
|
|
1592
1655
|
end
|
|
1593
1656
|
end
|
|
1594
1657
|
|
metadata
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: tddium-preview
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease:
|
|
5
|
-
version: 0.6.
|
|
5
|
+
version: 0.6.18
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
8
8
|
- Solano Labs
|
|
@@ -10,7 +10,7 @@ autorequire:
|
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
12
|
|
|
13
|
-
date: 2011-06-
|
|
13
|
+
date: 2011-06-30 00:00:00 -07:00
|
|
14
14
|
default_executable:
|
|
15
15
|
dependencies:
|
|
16
16
|
- !ruby/object:Gem::Dependency
|