tddium-preview 0.8.1 → 0.9.0

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/Gemfile CHANGED
@@ -9,4 +9,5 @@ group :development, :test do
9
9
  gem 'mimic'
10
10
  gem 'daemons'
11
11
  gem 'httparty'
12
+ gem 'antilles'
12
13
  end
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- tddium-preview (0.8.0)
4
+ tddium-preview (0.9.0)
5
5
  bundler
6
6
  highline
7
7
  json
@@ -12,6 +12,12 @@ PATH
12
12
  GEM
13
13
  remote: http://rubygems.org/
14
14
  specs:
15
+ antilles (0.1.3)
16
+ bundler
17
+ daemons
18
+ httparty
19
+ json
20
+ mimic
15
21
  aruba (0.4.6)
16
22
  bcat (>= 0.6.1)
17
23
  childprocess (>= 0.2.0)
@@ -34,12 +40,12 @@ GEM
34
40
  diff-lcs (1.1.3)
35
41
  fakefs (0.3.2)
36
42
  ffi (1.0.9)
37
- gherkin (2.4.16)
43
+ gherkin (2.4.21)
38
44
  json (>= 1.4.6)
39
45
  highline (1.6.2)
40
46
  httparty (0.7.8)
41
47
  crack (= 0.1.8)
42
- json (1.5.3)
48
+ json (1.6.1)
43
49
  mimic (0.4.3)
44
50
  json
45
51
  plist
@@ -69,7 +75,7 @@ GEM
69
75
  tddium_client (0.0.10)
70
76
  httparty
71
77
  json
72
- tddium_reporting (0.0.3)
78
+ tddium_reporting (0.0.4)
73
79
  term-ansicolor (1.0.6)
74
80
  thor (0.14.6)
75
81
  tilt (1.3.3)
@@ -78,6 +84,7 @@ PLATFORMS
78
84
  ruby
79
85
 
80
86
  DEPENDENCIES
87
+ antilles
81
88
  aruba
82
89
  daemons
83
90
  fakefs
data/bin/tddium CHANGED
@@ -1,6 +1,10 @@
1
1
  #!/usr/bin/env ruby
2
2
  #
3
3
  # Copyright (c) 2011 Solano Labs All Rights Reserved
4
+ #
5
+
6
+ require 'yaml'
7
+ YAML::ENGINE.yamler = 'syck'
4
8
 
5
9
  $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
6
10
  require "tddium"
@@ -23,6 +23,11 @@ Feature: Account command
23
23
  [admin] admin@example.com
24
24
  """
25
25
 
26
+ Scenario: Fail if user isn't logged in
27
+ When I run `tddium account`
28
+ Then the exit status should not be 0
29
+ And the output should contain "tddium login"
30
+
26
31
  Scenario: Add member to account successfully
27
32
  Given the user is logged in
28
33
  And adding a member to the account will succeed
@@ -0,0 +1,91 @@
1
+ @mimic
2
+ Feature: Activate command
3
+ As a Tddium user
4
+ In order to use an invitation code
5
+ I want to activate my account and upload an ssh key
6
+
7
+ Background:
8
+ Given the command is "tddium activate"
9
+
10
+ Scenario: Try to activate when logged in
11
+ Given the user is logged in
12
+ When I run `tddium activate`
13
+ Then the exit status should not be 0
14
+ And the output should contain "You are logged in."
15
+
16
+ Scenario: Activate for the first time
17
+ Given "abcdef" is a valid invitation token
18
+ And a file named "ssh_public_key" with:
19
+ """
20
+ ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAkbX/gEl+anbWCMG1qbliaIrI2mcoDk0qPkHFnrlHVCn00zFSY8nHzJoTzkCvBW43iPjagfhHz2mYzChXdbNesf2fxxrvXQbDRrpEyQzw42Iak0OiscomVUkVDyG4J+yR2QH8FiIvx9n2Umow1BLCB/b8socBkyJekMk7NzLf+7/RIOWCgdbj2qY3S8uDNzAVse+lpwkClb+dTLIsy8nYQHnKuG9pLNeTwca5Wu+3+BkgS/Ub6H7m1uaeCxnDz6MiN42uWxwAzWHWd3tZO/cVitTgGpGqDut+E0qbUpg+p8/KNQLYRBb2Mm6DhV4bUVGOJ6/s6bgqr/LjB9WFz4Qjww== moorthi@localhost
21
+ """
22
+ When I run `tddium activate` interactively
23
+ And I respond to "token" with "abcdef"
24
+ And I respond to "Enter password" with "password"
25
+ And I respond to "Confirm your password" with "password"
26
+ And I respond to "Enter your ssh key" with "ssh_public_key"
27
+ And I respond to "accept the license" with "I AGREE"
28
+ Then the output from "tddium activate" should contain "Creating account"
29
+ When the console session ends
30
+ Then the exit status should be 0
31
+
32
+ Scenario: Activate fails with no ssh key
33
+ Given "abcdef" is a valid invitation token
34
+ When I run `tddium activate` interactively
35
+ And I respond to "token" with "abcdef"
36
+ And I respond to "Enter password" with "password"
37
+ And I respond to "Confirm your password" with "password"
38
+ And I respond to "Enter your ssh key" with "ssh_public_key"
39
+ Then the output from "tddium activate" should contain "not accessible"
40
+ And the output from "tddium activate" should not contain "accept the license"
41
+ And the output from "tddium activate" should not contain "Creating account"
42
+ When the console session ends
43
+ Then the exit status should not be 0
44
+
45
+ Scenario: Activate fails with bad invite token
46
+ Given "abcdef" is not a valid invitation token
47
+ And a file named "ssh_public_key" with:
48
+ """
49
+ ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAkbX/gEl+anbWCMG1qbliaIrI2mcoDk0qPkHFnrlHVCn00zFSY8nHzJoTzkCvBW43iPjagfhHz2mYzChXdbNesf2fxxrvXQbDRrpEyQzw42Iak0OiscomVUkVDyG4J+yR2QH8FiIvx9n2Umow1BLCB/b8socBkyJekMk7NzLf+7/RIOWCgdbj2qY3S8uDNzAVse+lpwkClb+dTLIsy8nYQHnKuG9pLNeTwca5Wu+3+BkgS/Ub6H7m1uaeCxnDz6MiN42uWxwAzWHWd3tZO/cVitTgGpGqDut+E0qbUpg+p8/KNQLYRBb2Mm6DhV4bUVGOJ6/s6bgqr/LjB9WFz4Qjww== moorthi@localhost
50
+ """
51
+ When I run `tddium activate` interactively
52
+ And I respond to "token" with "abcdef"
53
+ And I respond to "Enter password" with "password"
54
+ And I respond to "Confirm your password" with "password"
55
+ And I respond to "Enter your ssh key" with "ssh_public_key"
56
+ And I respond to "accept the license" with "I AGREE"
57
+ Then the output from "tddium activate" should contain "Creating account"
58
+ And the output from "tddium activate" should contain "409"
59
+ When the console session ends
60
+ Then the exit status should not be 0
61
+
62
+ Scenario: Activate fails if license isn't accepted
63
+ Given "abcdef" is not a valid invitation token
64
+ And a file named "ssh_public_key" with:
65
+ """
66
+ ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAkbX/gEl+anbWCMG1qbliaIrI2mcoDk0qPkHFnrlHVCn00zFSY8nHzJoTzkCvBW43iPjagfhHz2mYzChXdbNesf2fxxrvXQbDRrpEyQzw42Iak0OiscomVUkVDyG4J+yR2QH8FiIvx9n2Umow1BLCB/b8socBkyJekMk7NzLf+7/RIOWCgdbj2qY3S8uDNzAVse+lpwkClb+dTLIsy8nYQHnKuG9pLNeTwca5Wu+3+BkgS/Ub6H7m1uaeCxnDz6MiN42uWxwAzWHWd3tZO/cVitTgGpGqDut+E0qbUpg+p8/KNQLYRBb2Mm6DhV4bUVGOJ6/s6bgqr/LjB9WFz4Qjww== moorthi@localhost
67
+ """
68
+ When I run `tddium activate` interactively
69
+ And I respond to "token" with "abcdef"
70
+ And I respond to "Enter password" with "password"
71
+ And I respond to "Confirm your password" with "password"
72
+ And I respond to "Enter your ssh key" with "ssh_public_key"
73
+ And I respond to "accept the license" with "NO WAY"
74
+ Then the output from "tddium activate" should not contain "Creating account"
75
+ When the console session ends
76
+ Then the exit status should not be 0
77
+
78
+ Scenario: Activate fails with password mismatch
79
+ Given "abcdef" is a valid invitation token
80
+ And a file named "ssh_public_key" with:
81
+ """
82
+ ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAkbX/gEl+anbWCMG1qbliaIrI2mcoDk0qPkHFnrlHVCn00zFSY8nHzJoTzkCvBW43iPjagfhHz2mYzChXdbNesf2fxxrvXQbDRrpEyQzw42Iak0OiscomVUkVDyG4J+yR2QH8FiIvx9n2Umow1BLCB/b8socBkyJekMk7NzLf+7/RIOWCgdbj2qY3S8uDNzAVse+lpwkClb+dTLIsy8nYQHnKuG9pLNeTwca5Wu+3+BkgS/Ub6H7m1uaeCxnDz6MiN42uWxwAzWHWd3tZO/cVitTgGpGqDut+E0qbUpg+p8/KNQLYRBb2Mm6DhV4bUVGOJ6/s6bgqr/LjB9WFz4Qjww== moorthi@localhost
83
+ """
84
+ When I run `tddium activate` interactively
85
+ And I respond to "token" with "abcdef"
86
+ And I respond to "Enter password" with "password"
87
+ And I respond to "Confirm your password" with "wordpass"
88
+ Then the output from "tddium activate" should contain "confirmation incorrect"
89
+ And the output from "tddium activate" should not contain "Creating account"
90
+ When the console session ends
91
+ Then the exit status should not be 0
@@ -14,6 +14,12 @@ Feature: Login command
14
14
  And the exit status should be 0
15
15
  And dotfiles should be updated
16
16
 
17
+ Scenario: Already logged in
18
+ Given the user is logged in
19
+ When I run `tddium login`
20
+ Then the output should contain "already"
21
+ And the exit status should be 0
22
+
17
23
  Scenario: Non-interactively log in successfully
18
24
  Given the user can log in and gets API key "apikey"
19
25
  When I run `tddium login --email=foo@example.com --password=barbarbar`
@@ -1,5 +1,5 @@
1
1
  Given /^the user has the following memberships in his account:$/ do |table|
2
- MimicServer.server.install(:get, "/1/memberships", {:status=>0, :memberships=>table.hashes})
2
+ Antilles.install(:get, "/1/memberships", {:status=>0, :memberships=>table.hashes})
3
3
  @memberships = {}
4
4
  table.hashes.each do |row|
5
5
  @memberships[row['email']]=row
@@ -7,18 +7,18 @@ Given /^the user has the following memberships in his account:$/ do |table|
7
7
  end
8
8
 
9
9
  Given /^adding a member to the account will succeed$/ do
10
- MimicServer.server.install(:post, "/1/memberships", {:status=>0}, :code=>201)
10
+ Antilles.install(:post, "/1/memberships", {:status=>0}, :code=>201)
11
11
  end
12
12
 
13
13
  Given /^adding a member to the account will fail with error "([^"]*)"$/ do |error|
14
- MimicServer.server.install(:post, "/1/memberships", {:status=>1, :explanation=>error}, :code=>409)
14
+ Antilles.install(:post, "/1/memberships", {:status=>1, :explanation=>error}, :code=>409)
15
15
  end
16
16
 
17
17
  Given /^removing "([^"]*)" from the account will succeed$/ do |member|
18
- MimicServer.server.install(:delete, "/1/memberships/#{member}", {:status=>0}, :code=>200)
18
+ Antilles.install(:delete, "/1/memberships/#{member}", {:status=>0}, :code=>200)
19
19
  end
20
20
 
21
21
  Given /^removing "([^"]*)" from the account will fail with error "([^"]*)"$/ do |member, error|
22
- MimicServer.server.install(:delete, "/1/memberships/#{member}", {:status=>1, :explanation=>error}, :code=>409)
22
+ Antilles.install(:delete, "/1/memberships/#{member}", {:status=>1, :explanation=>error}, :code=>409)
23
23
  end
24
24
 
@@ -0,0 +1,7 @@
1
+ Given /^"([^"]*)" is a valid invitation token$/ do |arg1|
2
+ Antilles.install(:post, "/1/users", SAMPLE_USER_RESPONSE, :code=>201)
3
+ end
4
+
5
+ Given /^"([^"]*)" is not a valid invitation token$/ do |arg1|
6
+ Antilles.install(:post, "/1/users", {:status=>1, :explanation=>"unrecognized"}, :code=>409)
7
+ end
@@ -1,7 +1,7 @@
1
1
  Given /^the user is logged in$/ do
2
2
  @api_key = "abcdef"
3
- MimicServer.server.install(:get, "/1/users", SAMPLE_USER_RESPONSE)
4
- MimicServer.server.install(:get, "/1/accounts/usage", SAMPLE_ACCOUNT_USAGE)
3
+ Antilles.install(:get, "/1/users", SAMPLE_USER_RESPONSE)
4
+ Antilles.install(:get, "/1/accounts/usage", SAMPLE_ACCOUNT_USAGE)
5
5
  steps %Q{
6
6
  Given a file named ".tddium.mimic" with:
7
7
  """
@@ -11,11 +11,11 @@ Given /^the user is logged in$/ do
11
11
  end
12
12
 
13
13
  Given /^the user can log in and gets API key "([^"]*)"$/ do |apikey|
14
- MimicServer.server.install(:post, "/1/users/sign_in", {:status=>0, :api_key=>apikey})
14
+ Antilles.install(:post, "/1/users/sign_in", {:status=>0, :api_key=>apikey})
15
15
  end
16
16
 
17
17
  Given /^the user cannot log in$/ do
18
- MimicServer.server.install(:post, "/1/users/sign_in", {:status=>1, :explanation=>"Access Denied."}, :code=>403)
18
+ Antilles.install(:post, "/1/users/sign_in", {:status=>1, :explanation=>"Access Denied."}, :code=>403)
19
19
  end
20
20
 
21
21
  Then /^dotfiles should be updated$/ do
@@ -1,6 +1,11 @@
1
+ Given /^the command is "([^"]*)"$/ do |command|
2
+ @command = command
3
+ end
4
+
1
5
  When /^I respond to "([^"]*)" with "([^"]*)"$/ do |expect, response|
6
+ cmd = @command || "tddium suite"
2
7
  steps %Q{
3
- Then the output from "tddium suite" should contain "#{expect}"
8
+ Then the output from "#{cmd}" should contain "#{expect}"
4
9
  When I type "#{response}"
5
10
  }
6
11
  end
@@ -7,15 +7,15 @@ def make_suite_response(name, branch)
7
7
  end
8
8
 
9
9
  Given /^the user has a suite for "([^"]*)" on "([^"]*)"$/ do |name, branch|
10
- MimicServer.server.install(:get, "/1/suites", {:status=>0, :suites=>[make_suite_response(name, branch)]})
10
+ Antilles.install(:get, "/1/suites", {:status=>0, :suites=>[make_suite_response(name, branch)]})
11
11
  end
12
12
 
13
13
  Given /^the user has no suites/ do
14
- MimicServer.server.install(:get, "/1/suites", {:status=>0, :suites=>[]})
14
+ Antilles.install(:get, "/1/suites", {:status=>0, :suites=>[]})
15
15
  end
16
16
 
17
17
  Given /^the user can create a suite named "([^"]*)" on branch "([^"]*)"$/ do |name, branch|
18
- MimicServer.server.install(:post, "/1/suites", {:status=>0, :suite=>make_suite_response(name, branch)}, :code=>201)
18
+ Antilles.install(:post, "/1/suites", {:status=>0, :suite=>make_suite_response(name, branch)}, :code=>201)
19
19
  end
20
20
 
21
21
  Given /^the destination repo exists$/ do
@@ -41,3 +41,12 @@ Given /^a git repo is initialized on branch "([^"]*)"$/ do |branch|
41
41
  And I successfully run `git checkout -b #{branch}`
42
42
  }
43
43
  end
44
+
45
+ Given /^I choose defaults for test pattern, CI and campfire settings$/ do
46
+ steps %Q{
47
+ And I respond to "test pattern" with ""
48
+ And I respond to "URL to pull from" with "disable"
49
+ And I respond to "URL to push to" with "disable"
50
+ And I respond to "Campfire subdomain" with "disable"
51
+ }
52
+ end
@@ -4,6 +4,9 @@ Feature: suite command
4
4
  In order to interact with Tddium
5
5
  I want to configure a test suite
6
6
 
7
+ Background:
8
+ Given the command is "tddium suite"
9
+
7
10
  Scenario: Configure a new suite with a complex branch
8
11
  Given the destination repo exists
9
12
  And a git repo is initialized on branch "test/foobar"
@@ -11,14 +14,35 @@ Feature: suite command
11
14
  And the user has no suites
12
15
  And the user can create a suite named "beta" on branch "test/foobar"
13
16
  When I run `tddium suite` interactively
17
+ Then the output from "tddium suite" should contain "Looks like"
18
+ And I respond to "repo name" with "beta"
19
+ Then the output from "tddium suite" should contain "Detected branch test/foobar"
20
+ When I choose defaults for test pattern, CI and campfire settings
21
+ Then the output from "tddium suite" should contain "Created suite..."
22
+ When the console session ends
23
+ Then the exit status should be 0
24
+
25
+ Scenario: Configure new suite with ruby from tddium.yml
26
+ Given the destination repo exists
27
+ And a git repo is initialized on branch "test/foobar"
28
+ And the user is logged in
29
+ And the user has no suites
30
+ And the user can create a suite named "beta" on branch "test/foobar"
31
+ And a file named "config/tddium.yml" with:
32
+ """
33
+ ---
34
+ :tddium:
35
+ :ruby_version: ruby-1.9.2-p290-psych
36
+ """
37
+ When I run `tddium suite` interactively
38
+ Then the output from "tddium suite" should contain "Looks like"
14
39
  And I respond to "repo name" with "beta"
15
40
  Then the output from "tddium suite" should contain "Detected branch test/foobar"
16
- And I respond to "test pattern" with ""
17
- And I respond to "URL to pull from" with "disable"
18
- And I respond to "URL to push to" with "disable"
19
- And I respond to "Campfire subdomain" with "disable"
20
- Then the output from "tddium suite" should contain "Pushing changes to Tddium..."
21
- And the output from "tddium suite" should contain "Created suite..."
41
+ Then the output from "tddium suite" should contain "Configured ruby ruby-1.9.2-p290-psych from tddium.yml"
42
+ When I choose defaults for test pattern, CI and campfire settings
43
+ Then the output from "tddium suite" should contain "Created suite..."
22
44
  When the console session ends
23
45
  Then the exit status should be 0
24
46
 
47
+
48
+
@@ -1,137 +1,13 @@
1
1
  # Copyright (c) 2011 Solano Labs All Rights Reserved
2
2
 
3
- require 'mimic'
4
- require 'timeout'
5
- require 'daemons'
6
- require 'httparty'
3
+ require 'antilles/cucumber'
7
4
 
8
- class MimicServer
9
- attr_reader :port
5
+ tid = ENV['TDDIUM_TID'] || 0
6
+ port = 8500 + tid.to_i
7
+ ENV['TDDIUM_CLIENT_PORT'] = port.to_s
8
+ ENV['TDDIUM_CLIENT_ENVIRONMENT'] = 'mimic'
10
9
 
11
- def initialize(port, log=nil)
12
- @port = port || 8080
13
- @pid_list = []
14
- @log = log
15
- end
16
-
17
- def start
18
- pid = Kernel.fork
19
- if pid.nil? then
20
- args = {:fork => false,
21
- :host => 'localhost',
22
- :port => @port,
23
- :remote_configuration_path => '/api'}
24
- args[:log] = @log if @log
25
- Mimic.mimic(args) do
26
- [:INT, :TERM].each { |sig| trap(sig) { Kernel.exit!(0) } }
27
- end
28
- Kernel.exit!(0)
29
- end
30
- @pid_list.push(pid)
31
- wait
32
- end
33
-
34
- def stop
35
- @pid_list.each do |pid|
36
- Process.kill("TERM", pid)
37
- end
38
- @pid_list = []
39
- end
40
-
41
- def wait
42
- (0...5).each do |i|
43
- if ping then
44
- break
45
- end
46
- Kernel.sleep(0.1)
47
- end
48
- end
49
-
50
- def ping
51
- begin
52
- http = call_api(:get, '/api/ping')
53
- rescue Exception, Timeout::Error
54
- return false
55
- end
56
- return http.code == 200
57
- end
58
-
59
- def clear
60
- http = call_api(:post, '/api/clear')
61
- return http
62
- end
63
-
64
- def install(verb, path, body, options={})
65
- api_headers = options.delete(:api_headers)
66
- params = { 'path' => path, 'body' => body.to_json }.merge(options)
67
- http = call_api(:post, "/api/#{verb}", params.to_json, api_headers)
68
- return http
69
- end
70
-
71
- def call_api(method, path, params = {}, headers = {})
72
- tries = 0
73
- retries = 7
74
- done = false
75
- while (tries <= retries) && !done
76
- begin
77
- http = HTTParty.send(method, "http://localhost:#{@port}#{path}",
78
- :body => params, :headers => headers)
79
- done = true
80
- rescue SystemCallError
81
- Kernel.sleep(0.5)
82
- rescue Timeout::Error
83
- Kernel.sleep(0.5)
84
- ensure
85
- tries += 1
86
- end
87
- end
88
- raise Timeout::Error if tries > retries && retries >= 0
89
- return http
90
- end
91
-
92
- class << self
93
- def test
94
- mimic = MimicServer.start
95
- mimic.clear
96
- mimic.stop
97
- end
98
-
99
- def start(port=nil, log=nil)
100
- return @server if @server
101
- @server = MimicServer.new(port, log || @log)
102
- @server.start
103
- @server
104
- end
105
-
106
- def server
107
- @server
108
- end
109
-
110
- def clear
111
- @server.clear rescue nil
112
- end
113
-
114
- def log=(log)
115
- @log = log
116
- end
117
- end
118
- end
119
-
120
- MimicServer.log = STDOUT
121
-
122
- Before('@mimic') do
123
- tid = ENV['TDDIUM_TID'] || 0
124
- port = 8500 + tid.to_i
125
- ENV['TDDIUM_CLIENT_PORT'] = port.to_s
126
- ENV['TDDIUM_CLIENT_ENVIRONMENT'] = 'mimic'
127
- MimicServer.start(port)
128
- end
129
-
130
- After('@mimic') do
131
- MimicServer.clear
132
- end
133
-
134
- at_exit do
135
- server = MimicServer.server
136
- server.stop if server
10
+ Antilles.configure do |server|
11
+ server.log = STDOUT
12
+ server.port = port
137
13
  end
data/lib/tddium.rb CHANGED
@@ -40,16 +40,27 @@ class Tddium < Thor
40
40
  class_option :environment, :type => :string, :default => nil
41
41
  class_option :port, :type => :numeric, :default => nil
42
42
 
43
- desc "account", "View/Manage account information"
43
+ desc "account", "View account information"
44
+ def account
45
+ set_shell
46
+ set_default_environment
47
+ if user_details = user_logged_in?(true, true)
48
+ # User is already logged in, so just display the info
49
+ show_user_details(user_details)
50
+ else
51
+ exit_failure Text::Error::USE_ACTIVATE
52
+ end
53
+ end
54
+
55
+ desc "activate", "Activate an account with an invitation token"
44
56
  method_option :email, :type => :string, :default => nil
45
57
  method_option :password, :type => :string, :default => nil
46
58
  method_option :ssh_key_file, :type => :string, :default => nil
47
- def account
59
+ def activate
48
60
  set_shell
49
61
  set_default_environment
50
62
  if user_details = user_logged_in?
51
- # User is already logged in, so just display the info
52
- show_user_details(user_details)
63
+ exit_failure Text::Error::ACTIVATE_LOGGED_IN
53
64
  else
54
65
  params = get_user_credentials(options.merge(:invited => true))
55
66
 
@@ -73,7 +84,7 @@ class Tddium < Thor
73
84
  end
74
85
  say content
75
86
  license_accepted = ask(Text::Prompt::LICENSE_AGREEMENT)
76
- return unless license_accepted.downcase == Text::Prompt::Response::AGREE_TO_LICENSE.downcase
87
+ exit_failure unless license_accepted.downcase == Text::Prompt::Response::AGREE_TO_LICENSE.downcase
77
88
 
78
89
  begin
79
90
  say Text::Process::STARTING_ACCOUNT_CREATION
@@ -86,9 +97,9 @@ class Tddium < Thor
86
97
  say Text::Process::ACCOUNT_ADDED % [new_user["user"]["email"], new_user["user"]["account_role"], new_user["user"]["account"]]
87
98
  end
88
99
  rescue TddiumClient::Error::API => e
89
- say((e.status == Api::ErrorCode::INVALID_INVITATION) ? Text::Error::INVALID_INVITATION : e.message)
100
+ exit_failure ((e.status == Api::ErrorCode::INVALID_INVITATION) ? Text::Error::INVALID_INVITATION : e.message)
90
101
  rescue TddiumClient::Error::Base => e
91
- say e.message
102
+ exit_failure say e.message
92
103
  end
93
104
  end
94
105
  end
@@ -208,6 +219,9 @@ class Tddium < Thor
208
219
  say Text::Process::LOGGED_OUT_SUCCESSFULLY
209
220
  end
210
221
 
222
+ map "cucumber" => :spec
223
+ map "test" => :spec
224
+ map "run" => :spec
211
225
  desc "spec", "Run the test suite"
212
226
  method_option :user_data_file, :type => :string, :default => nil
213
227
  method_option :max_parallelism, :type => :numeric, :default => nil
@@ -248,7 +262,7 @@ class Tddium < Thor
248
262
  suite_details = call_api(:get, current_suite_path)
249
263
 
250
264
  # Push the latest code to git
251
- exit_failure unless update_git_remote_and_push(suite_details)
265
+ exit_failure Text::Error::GIT_PUSH_FAILED unless update_git_remote_and_push(suite_details)
252
266
 
253
267
  # Create a session
254
268
  new_session = call_api(:post, Api::Path::SESSIONS)
@@ -350,7 +364,7 @@ class Tddium < Thor
350
364
  end
351
365
  end
352
366
 
353
- desc "suite", "Register the suite for this project, or edit its settings"
367
+ desc "suite", "Register the current repo/branch, view/edit CI repos & deploy keys"
354
368
  method_option :edit, :type => :boolean, :default => false
355
369
  method_option :name, :type => :string, :default => nil
356
370
  method_option :pull_url, :type => :string, :default => nil
@@ -376,6 +390,8 @@ class Tddium < Thor
376
390
  default_suite_name = File.basename(Dir.pwd)
377
391
  params[:repo_name] = options[:name] || default_suite_name
378
392
 
393
+ say Text::Process::NO_CONFIGURED_SUITE % [params[:repo_name], params[:branch]]
394
+
379
395
  use_existing_suite, existing_suite = resolve_suite_name(options, params, default_suite_name)
380
396
 
381
397
  if use_existing_suite
@@ -397,9 +413,6 @@ class Tddium < Thor
397
413
  # Save the created suite
398
414
  write_suite(new_suite["suite"])
399
415
 
400
- # Manage git
401
- exit_failure("Failed to push repo to Tddium!") unless update_git_remote_and_push(new_suite)
402
-
403
416
  say Text::Process::CREATED_SUITE % format_suite_details(new_suite["suite"])
404
417
  end
405
418
  rescue TddiumClient::Error::Base
@@ -465,6 +478,20 @@ class Tddium < Thor
465
478
  end
466
479
  end
467
480
 
481
+ def tool_version(tool)
482
+ key = "#{tool}_version".to_sym
483
+ result = tddium_config[key]
484
+
485
+ if result
486
+ say Text::Process::CONFIGURED_VERSION % [tool, result]
487
+ return result
488
+ end
489
+
490
+ result = `#{tool} -v`.strip
491
+ say Text::Process::DEPENDENCY_VERSION % [tool, result]
492
+ result
493
+ end
494
+
468
495
  def current_git_branch
469
496
  @current_git_branch ||= `git symbolic-ref HEAD`.gsub("\n", "").split("/")[2..-1].join("/")
470
497
  end
@@ -483,12 +510,6 @@ class Tddium < Thor
483
510
  "#{Api::Path::SUITES}/#{current_suite_id}"
484
511
  end
485
512
 
486
- def dependency_version(command)
487
- result = `#{command} -v`.strip
488
- say Text::Process::DEPENDENCY_VERSION % [command, result]
489
- result
490
- end
491
-
492
513
  def display_attributes(names_to_display, attributes)
493
514
  names_to_display.each do |attr|
494
515
  say Text::Status::ATTRIBUTE_DETAIL % [attr.gsub("_", " ").capitalize, attributes[attr]] if attributes[attr]
@@ -618,7 +639,13 @@ class Tddium < Thor
618
639
  def prompt_ssh_key(current)
619
640
  # Prompt for ssh-key file
620
641
  ssh_file = prompt(Text::Prompt::SSH_KEY, options[:ssh_key_file], Default::SSH_FILE)
621
- data = File.open(File.expand_path(ssh_file)) {|file| file.read}
642
+
643
+ begin
644
+ data = File.open(File.expand_path(ssh_file)) {|file| file.read}
645
+ rescue Errno::ENOENT => e
646
+ raise TddiumError.new(Text::Error::INACCESSIBLE_SSH_PUBLIC_KEY % [ssh_file, e])
647
+ end
648
+
622
649
  if data =~ /^-+BEGIN [DR]SA PRIVATE KEY-+/ then
623
650
  raise TddiumError.new(Text::Error::INVALID_SSH_PUBLIC_KEY % ssh_file)
624
651
  end
@@ -630,9 +657,9 @@ class Tddium < Thor
630
657
 
631
658
  def prompt_suite_params(options, params, current={})
632
659
  say Text::Process::DETECTED_BRANCH % params[:branch] if params[:branch]
633
- params[:ruby_version] = dependency_version(:ruby)
634
- params[:bundler_version] = dependency_version(:bundle)
635
- params[:rubygems_version] = dependency_version(:gem)
660
+ params[:ruby_version] = tool_version(:ruby)
661
+ params[:bundler_version] = tool_version(:bundle)
662
+ params[:rubygems_version] = tool_version(:gem)
636
663
 
637
664
  ask_or_update = lambda do |key, text, default|
638
665
  params[key] = prompt(text, options[key], current.fetch(key.to_s, default))
@@ -794,6 +821,10 @@ puts "EXN: #{e.inspect}"
794
821
  @tddium_client ||= TddiumClient::Client.new
795
822
  end
796
823
 
824
+ def tddium_config
825
+ YAML.load(File.read(Config::CONFIG_PATH))[:tddium] rescue {}
826
+ end
827
+
797
828
  def tddium_file_name
798
829
  extension = ".#{environment}" unless environment == :production
799
830
  ".tddium#{extension}"
@@ -803,10 +834,10 @@ puts "EXN: #{e.inspect}"
803
834
  options[:fail_with_message] = true unless options[:fail_with_message] == false
804
835
  if @tddium_settings.nil? || options[:force_reload]
805
836
  if File.exists?(tddium_file_name)
806
- tddium_config = File.open(tddium_file_name) do |file|
837
+ settings_file = File.open(tddium_file_name) do |file|
807
838
  file.read
808
839
  end
809
- @tddium_settings = JSON.parse(tddium_config) rescue nil
840
+ @tddium_settings = JSON.parse(settings_file) rescue nil
810
841
  say (Text::Error::INVALID_TDDIUM_FILE % environment) if @tddium_settings.nil? && options[:fail_with_message]
811
842
  else
812
843
  say Text::Error::NOT_INITIALIZED if options[:fail_with_message]
@@ -15,6 +15,10 @@ module TddiumConstant
15
15
  SUITE_TEST_PATTERN = "features/*.feature, spec/**/*_spec.rb, test/**/*_test.rb"
16
16
  end
17
17
 
18
+ module Config
19
+ CONFIG_PATH = "config/tddium.yml"
20
+ end
21
+
18
22
  module Git
19
23
  REMOTE_NAME = "tddium"
20
24
  GITIGNORE = ".gitignore"
@@ -74,6 +78,7 @@ module TddiumConstant
74
78
  end
75
79
 
76
80
  module Process
81
+ NO_CONFIGURED_SUITE = "Looks like you haven't set up a suite on this computer for %s/%s..."
77
82
  TERMINATE_INSTRUCTION = "Press Ctrl-C to stop waiting. Tests will continue running."
78
83
  INTERRUPT = "Interrupted"
79
84
  GIT_PUSH = "Pushing changes to Tddium..."
@@ -134,6 +139,7 @@ with Tddium.
134
139
  "
135
140
  UPDATED_SUITE = "Updated suite successfully."
136
141
  DEPENDENCY_VERSION = "Detected %s %s"
142
+ CONFIGURED_VERSION = "Configured %s %s from tddium.yml"
137
143
  DETECTED_BRANCH = "Detected branch %s"
138
144
  SETUP_CI_FIRST_TIME =<<EOF;
139
145
 
@@ -295,7 +301,19 @@ EOF
295
301
  end
296
302
 
297
303
  module Error
304
+ GIT_PUSH_FAILED = <<EOF;
305
+
306
+ The git push to Tddium failed.
307
+
308
+ SSH may not be configured to authenticate with the keypair you provided when you set up your account.
309
+
310
+ See this URL for SSH configuration instructions:
311
+
312
+ https://www.tddium.com/support/faq#othersshkey
313
+
314
+ EOF
298
315
  INVALID_SSH_PUBLIC_KEY = '%s does not appear to be a valid SSH public key'
316
+ INACCESSIBLE_SSH_PUBLIC_KEY = '%s is not accessible: %s'
299
317
  GIT_CHANGES_NOT_COMMITTED =<<EOF
300
318
  There are uncommitted changes in the local git repository.
301
319
 
@@ -351,6 +369,8 @@ EOF
351
369
  end
352
370
  ADD_MEMBER_ERROR = "Error adding %s: %s"
353
371
  REMOVE_MEMBER_ERROR = "Error removing %s: %s"
372
+ ACTIVATE_LOGGED_IN = "You are logged in. Use 'tddium account' for account information"
373
+ USE_ACTIVATE = "Use 'tddium activate' to accept an invitation token"
354
374
  end
355
375
  end
356
376
 
@@ -3,5 +3,5 @@ Copyright (c) 2011 Solano Labs All Rights Reserved
3
3
  =end
4
4
 
5
5
  module TddiumVersion
6
- VERSION = "0.8.1"
6
+ VERSION = "0.9.0"
7
7
  end
data/spec/tddium_spec.rb CHANGED
@@ -307,23 +307,6 @@ describe Tddium do
307
307
  end
308
308
  end
309
309
 
310
- shared_examples_for "a password prompt" do
311
- context "--password was not passed in" do
312
- it "should prompt for a password or confirmation" do
313
- highline = mock(HighLine)
314
- HighLine.should_receive(:ask).with(password_prompt).and_yield(highline)
315
- highline.should_receive(:echo=).with("*")
316
- run(tddium)
317
- end
318
- end
319
- context "--password was passed in" do
320
- it "should not prompt for a password or confirmation" do
321
- HighLine.should_not_receive(:ask).with(password_prompt)
322
- run(tddium, :password => SAMPLE_PASSWORD)
323
- end
324
- end
325
- end
326
-
327
310
  shared_examples_for "an unsuccessful api call" do
328
311
  it "should show the error" do
329
312
  tddium_client.stub(:call_api).and_raise(TddiumClient::Error::Base)
@@ -508,28 +491,6 @@ describe Tddium do
508
491
  end
509
492
  end
510
493
 
511
-
512
- shared_examples_for "show account usage" do
513
- it "should send a 'GET' request to '#{Tddium::Api::Path::ACCOUNT_USAGE}'" do
514
- call_api_should_receive(:method => :get, :path => Tddium::Api::Path::ACCOUNT_USAGE)
515
- run(tddium)
516
- end
517
-
518
- context "'GET #{Tddium::Api::Path::SUITES}' is successful" do
519
- before { stub_call_api_response(:get, Tddium::Api::Path::ACCOUNT_USAGE, {"usage" => "something"}) }
520
-
521
- it "should display the account usage" do
522
- tddium.should_receive(:say).with("something")
523
- run(tddium)
524
- end
525
-
526
- it "should show all suites" do
527
- tddium.should_receive(:say).with(Tddium::Text::Status::ALL_SUITES % SAMPLE_APP_NAME)
528
- run(tddium)
529
- end
530
- end
531
- end
532
-
533
494
  describe "#password" do
534
495
  before do
535
496
  stub_defaults
@@ -739,204 +700,6 @@ describe Tddium do
739
700
  end
740
701
  end
741
702
 
742
-
743
- describe "#account" do
744
- before do
745
- stub_defaults
746
- tddium.stub(:ask).and_return("")
747
- HighLine.stub(:ask).and_return("")
748
- create_file(File.join(File.dirname(__FILE__), "..", Tddium::License::FILE_NAME), SAMPLE_LICENSE_TEXT)
749
- create_file(Tddium::Default::SSH_FILE, SAMPLE_SSH_PUBKEY)
750
- HerokuConfig.stub(:read_config).and_return(nil)
751
- end
752
-
753
- it_should_behave_like "set the default environment"
754
-
755
- context "the user is already logged in" do
756
- before do
757
- stub_config_file(:api_key => SAMPLE_API_KEY)
758
- stub_call_api_response(:get, Tddium::Api::Path::USERS, SAMPLE_USER_RESPONSE)
759
- stub_call_api_response(:get, Tddium::Api::Path::SUITES, {"suites" => []})
760
- stub_call_api_response(:get, Tddium::Api::Path::ACCOUNT_USAGE, {"usage" => "something"})
761
- end
762
-
763
- it "should show the user's email address" do
764
- tddium.should_receive(:say).with(/#{SAMPLE_EMAIL}/)
765
- run_account(tddium)
766
- end
767
-
768
- it "should show the user's account creation date" do
769
- tddium.should_receive(:say).with(/#{SAMPLE_DATE_TIME}/)
770
- run_account(tddium)
771
- end
772
-
773
- it "should show the user's recurly account url" do
774
- tddium.should_receive(:say).with(/#{SAMPLE_RECURLY_URL}/)
775
- run_account(tddium)
776
- end
777
-
778
- # it_should_behave_like "show account usage"
779
- end
780
-
781
- context "the user is not already logged in" do
782
- let(:call_api_result) {[403, "Forbidden"]}
783
-
784
- it_should_behave_like "a password prompt" do
785
- let(:password_prompt) {Tddium::Text::Prompt::PASSWORD_CONFIRMATION}
786
- end
787
-
788
- context "the user does not confirm their password correctly" do
789
- before {HighLine.stub(:ask).with(Tddium::Text::Prompt::PASSWORD_CONFIRMATION).and_return("wrong confirmation")}
790
- it "should tell the user '#{Tddium::Text::Process::PASSWORD_CONFIRMATION_INCORRECT}'" do
791
- account_should_fail(tddium) do
792
- tddium.should_receive(:exit_failure).with(Tddium::Text::Process::PASSWORD_CONFIRMATION_INCORRECT)
793
- end
794
- end
795
- end
796
-
797
- context "the user confirms their password correctly" do
798
- before do
799
- HighLine.stub(:ask).with(Tddium::Text::Prompt::PASSWORD).and_return(SAMPLE_PASSWORD)
800
- HighLine.stub(:ask).with(Tddium::Text::Prompt::PASSWORD_CONFIRMATION).and_return(SAMPLE_PASSWORD)
801
- end
802
-
803
- it_behaves_like "prompt for ssh key"
804
-
805
- it "should show the user the license" do
806
- tddium.should_receive(:say).with(SAMPLE_LICENSE_TEXT)
807
- run_account(tddium)
808
- end
809
-
810
- it "should ask the user to accept the license" do
811
- tddium.should_receive(:ask).with(Tddium::Text::Prompt::LICENSE_AGREEMENT)
812
- run_account(tddium)
813
- end
814
-
815
- context "accepting the license" do
816
- before do
817
- tddium.stub(:ask).with(Tddium::Text::Prompt::LICENSE_AGREEMENT).and_return(Tddium::Text::Prompt::Response::AGREE_TO_LICENSE)
818
- tddium.stub(:ask).with(Tddium::Text::Prompt::INVITATION_TOKEN).and_return(SAMPLE_INVITATION_TOKEN)
819
- create_file(Tddium::Default::SSH_FILE, "ssh-rsa 1234")
820
- end
821
-
822
- it "should send a 'POST' request to '#{Tddium::Api::Path::USERS}' with the user's invitation token, password and ssh key" do
823
- call_api_should_receive(:method => :post, :path => /#{Tddium::Api::Path::USERS}$/, :params => {:user => {:invitation_token => SAMPLE_INVITATION_TOKEN, :password => SAMPLE_PASSWORD, :user_git_pubkey => "ssh-rsa 1234"}}, :api_key => false)
824
- run_account(tddium)
825
- end
826
-
827
- context "'POST #{Tddium::Api::Path::USERS}' succeeds in creating a new account" do
828
- before{stub_call_api_response(:post, Tddium::Api::Path::USERS, SAMPLE_USER_RESPONSE)}
829
-
830
- it_should_behave_like "writing the api key to the .tddium file"
831
-
832
- it "should show the user '#{Tddium::Text::Process::ACCOUNT_CREATED % [SAMPLE_EMAIL, SAMPLE_RECURLY_URL]}'" do
833
- tddium.should_receive(:say).with(Tddium::Text::Process::ACCOUNT_CREATED % [SAMPLE_EMAIL, SAMPLE_RECURLY_URL])
834
- run_account(tddium)
835
- end
836
- end
837
-
838
- context "'POST #{Tddium::Api::Path::USERS}' succeeds in adding a new account" do
839
- before{stub_call_api_response(:post, Tddium::Api::Path::USERS, SAMPLE_ADDED_USER_RESPONSE)}
840
-
841
- it_should_behave_like "writing the api key to the .tddium file"
842
-
843
- it "should show the user '#{Tddium::Text::Process::ACCOUNT_ADDED % [SAMPLE_EMAIL, SAMPLE_ROLE, SAMPLE_ACCOUNT_NAME]}'" do
844
- tddium.should_receive(:say).with(Tddium::Text::Process::ACCOUNT_ADDED % [SAMPLE_EMAIL, SAMPLE_ROLE, SAMPLE_ACCOUNT_NAME])
845
- run_account(tddium)
846
- end
847
- end
848
- context "'POST #{Tddium::Api::Path::USERS}' is unsuccessful" do
849
-
850
- it_should_behave_like "an unsuccessful api call"
851
-
852
- context "because the invitation is invalid" do
853
- before { stub_call_api_response(:post, Tddium::Api::Path::USERS, {"status" => Tddium::Api::ErrorCode::INVALID_INVITATION}) }
854
- it "should show the user: '#{Tddium::Text::Error::INVALID_INVITATION}'" do
855
- tddium.should_receive(:say).with(Tddium::Text::Error::INVALID_INVITATION)
856
- run_account(tddium)
857
- end
858
- end
859
- end
860
- end
861
- end
862
- end
863
- end
864
-
865
- describe "#login" do
866
- before do
867
- stub_defaults
868
- tddium.stub(:ask).and_return("")
869
- HighLine.stub(:ask).and_return("")
870
- end
871
-
872
- it_should_behave_like "set the default environment"
873
-
874
- context "there is a tddium config file with an api key" do
875
- before {stub_config_file(:api_key => "some api key")}
876
-
877
- it "should send a 'GET' request to '#{Tddium::Api::Path::USERS}'" do
878
- call_api_should_receive(:method => :get, :path => /#{Tddium::Api::Path::USERS}$/)
879
- run(tddium)
880
- end
881
- end
882
-
883
- context "the tddium config file is missing or corrupt or the api key is invalid" do
884
- context "--email was not passed in" do
885
- it "should prompt for the user's email address" do
886
- tddium.should_receive(:ask).with(Tddium::Text::Prompt::EMAIL)
887
- run(tddium)
888
- end
889
- end
890
-
891
- context "--email was passed in" do
892
- it "should not prompt for the user's email address" do
893
- tddium.should_not_receive(:ask).with(Tddium::Text::Prompt::EMAIL)
894
- run(tddium, :email => SAMPLE_EMAIL)
895
- end
896
- end
897
-
898
- it_should_behave_like "a password prompt" do
899
- let(:password_prompt) {Tddium::Text::Prompt::PASSWORD}
900
- end
901
-
902
- it "should try to sign in the user with their email & password" do
903
- tddium.stub(:ask).with(Tddium::Text::Prompt::EMAIL).and_return(SAMPLE_EMAIL)
904
- HighLine.stub(:ask).with(Tddium::Text::Prompt::PASSWORD).and_return(SAMPLE_PASSWORD)
905
- call_api_should_receive(:method => :post, :path => /#{Tddium::Api::Path::SIGN_IN}$/, :params => {:user => {:email => SAMPLE_EMAIL, :password => SAMPLE_PASSWORD}}, :api_key => false)
906
- run(tddium)
907
- end
908
-
909
- context "the user logs in successfully with their email and password" do
910
- before{stub_call_api_response(:post, Tddium::Api::Path::SIGN_IN, {"api_key" => SAMPLE_API_KEY})}
911
- it_should_behave_like "writing the api key to the .tddium file"
912
- end
913
- end
914
-
915
- context "user is already logged in" do
916
- before do
917
- stub_config_file(:api_key => SAMPLE_API_KEY)
918
- stub_call_api_response(:get, Tddium::Api::Path::USERS)
919
- end
920
-
921
- it "should show the user: '#{Tddium::Text::Process::ALREADY_LOGGED_IN}'" do
922
- tddium.should_receive(:say).with(Tddium::Text::Process::ALREADY_LOGGED_IN)
923
- run_login(tddium)
924
- end
925
- end
926
-
927
- context "the user logs in successfully" do
928
- before{ stub_call_api_response(:post, Tddium::Api::Path::SIGN_IN, {"api_key" => SAMPLE_API_KEY})}
929
- it "should show the user: '#{Tddium::Text::Process::LOGGED_IN_SUCCESSFULLY}'" do
930
- tddium.should_receive(:say).with(Tddium::Text::Process::LOGGED_IN_SUCCESSFULLY)
931
- run_login(tddium)
932
- end
933
- end
934
-
935
- context "the user does not sign in successfully" do
936
- it_should_behave_like "an unsuccessful api call"
937
- end
938
- end
939
-
940
703
  describe "#spec" do
941
704
  before do
942
705
  stub_defaults
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: tddium-preview
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.8.1
5
+ version: 0.9.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Solano Labs
@@ -10,8 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-09-02 00:00:00 -07:00
14
- default_executable:
13
+ date: 2011-09-22 00:00:00 Z
15
14
  dependencies:
16
15
  - !ruby/object:Gem::Dependency
17
16
  name: thor
@@ -152,9 +151,11 @@ files:
152
151
  - Rakefile
153
152
  - bin/tddium
154
153
  - features/account_command.feature
154
+ - features/activate_command.feature
155
155
  - features/login_command.feature
156
156
  - features/logout_command.feature
157
157
  - features/step_definitions/account_steps.rb
158
+ - features/step_definitions/activate_steps.rb
158
159
  - features/step_definitions/aruba_steps.rb
159
160
  - features/step_definitions/login_steps.rb
160
161
  - features/step_definitions/mimic_steps.rb
@@ -172,7 +173,6 @@ files:
172
173
  - spec/spec_helper.rb
173
174
  - spec/tddium_spec.rb
174
175
  - tddium.gemspec
175
- has_rdoc: true
176
176
  homepage: http://www.tddium.com/
177
177
  licenses: []
178
178
 
@@ -196,7 +196,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
196
196
  requirements: []
197
197
 
198
198
  rubyforge_project: tddium
199
- rubygems_version: 1.6.2
199
+ rubygems_version: 1.8.10
200
200
  signing_key:
201
201
  specification_version: 3
202
202
  summary: tddium Hosted Ruby Testing