tddium-preview 0.9.3 → 0.9.4

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 CHANGED
@@ -52,5 +52,4 @@ nbproject
52
52
  # For vim:
53
53
  *.swp
54
54
  *.swo
55
- .tddium.staging
56
- .tddium-deploy-key.staging
55
+ .tddium*
data/Gemfile.lock CHANGED
@@ -1,11 +1,11 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- tddium-preview (0.9.3)
4
+ tddium-preview (0.9.4)
5
5
  bundler
6
6
  highline
7
7
  json
8
- tddium_client (>= 0.0.10)
8
+ tddium_client (~> 0.1.0)
9
9
  tddium_reporting (>= 0.0.5)
10
10
  thor
11
11
 
@@ -74,10 +74,10 @@ GEM
74
74
  sinatra (1.2.6)
75
75
  rack (~> 1.1)
76
76
  tilt (< 2.0, >= 1.2.2)
77
- tddium_client (0.0.10)
77
+ tddium_client (0.1.0)
78
78
  httparty
79
79
  json
80
- tddium_reporting (0.0.5)
80
+ tddium_reporting (0.0.6)
81
81
  term-ansicolor (1.0.6)
82
82
  thor (0.14.6)
83
83
  tilt (1.3.3)
@@ -24,6 +24,17 @@ Feature: Account command
24
24
  [member] member@example.com
25
25
  [admin] admin@example.com
26
26
  """
27
+ And the output should contain "alpha/master"
28
+
29
+ Scenario: Handle API failure
30
+ Given the user is logged in
31
+ And there is a problem retrieving suite information
32
+ When I run `tddium account`
33
+ Then the output should contain "someone@example.com"
34
+ And the output should contain:
35
+ """
36
+ API Error
37
+ """
27
38
 
28
39
  Scenario: Fail if user isn't logged in
29
40
  When I run `tddium account`
@@ -0,0 +1,6 @@
1
+ @mimic @wip
2
+ Feature: "tddium heroku" command
3
+ As a user of the tddium Heroku addon
4
+ In order to use Tddium without signing up again
5
+ I want to link my heroku account with Tddium
6
+
@@ -0,0 +1,46 @@
1
+ @mimic
2
+ Feature: Password command
3
+ As a Tddium user
4
+ I want to change my password
5
+
6
+ Background:
7
+ Given the command is "tddium password"
8
+
9
+ Scenario: Fail if user isn't logged in
10
+ When I run `tddium password`
11
+ Then the exit status should not be 0
12
+ And the output should contain "tddium login"
13
+ And the output should contain "tddium heroku"
14
+
15
+ Scenario: Successfully change password interactively
16
+ Given the user is logged in
17
+ And the password change succeeds
18
+ When I run `tddium password` interactively
19
+ And I respond to "old password" with "foobar"
20
+ And I respond to "new password" with "foobar3"
21
+ And I respond to "new password" with "foobar3"
22
+ Then the output from "tddium password" should contain "Your password has been changed"
23
+ When the console session ends
24
+ Then the exit status should be 0
25
+
26
+ Scenario: Old password incorrect
27
+ Given the user is logged in
28
+ And the old password is invalid
29
+ When I run `tddium password` interactively
30
+ And I respond to "old password" with "foobar"
31
+ And I respond to "new password" with "foobar3"
32
+ And I respond to "new password" with "foobar3"
33
+ Then the output from "tddium password" should contain "Current password is invalid"
34
+ When the console session ends
35
+ Then the exit status should not be 0
36
+
37
+ Scenario: Confirmation mismatch
38
+ Given the user is logged in
39
+ And the confirmation doesn't match
40
+ When I run `tddium password` interactively
41
+ And I respond to "old password" with "foobar"
42
+ And I respond to "new password" with "foobar3"
43
+ And I respond to "new password" with "foobar2"
44
+ Then the output from "tddium password" should contain "Password doesn't match confirmation"
45
+ When the console session ends
46
+ Then the exit status should not be 0
@@ -0,0 +1,15 @@
1
+ @mimic
2
+ Feature: spec command
3
+ As a tddium user
4
+ In order to run tests
5
+ I want to start a test session
6
+
7
+ Background:
8
+ Given the command is "tddium spec"
9
+
10
+ Scenario: Fail if user isn't logged in
11
+ Given a git repo is initialized
12
+ When I run `tddium spec`
13
+ Then the exit status should not be 0
14
+ And the output should contain "tddium login"
15
+ And the output should contain "tddium heroku"
@@ -0,0 +1,15 @@
1
+ @mimic
2
+ Feature: "tddium status" command
3
+ As a Tddium user
4
+ In order to view my recent sessions
5
+ I want a simple status display
6
+
7
+ Background:
8
+ Given the command is "tddium status"
9
+
10
+ Scenario: Fail if user isn't logged in
11
+ Given a git repo is initialized
12
+ When I run `tddium status`
13
+ Then the exit status should not be 0
14
+ And the output should contain "tddium login"
15
+ And the output should contain "tddium heroku"
@@ -0,0 +1,31 @@
1
+
2
+ Given /^the destination repo exists$/ do
3
+ steps %Q{
4
+ Given a directory named "repo"
5
+ And I cd to "repo"
6
+ And I successfully run `git init --bare .`
7
+ And I cd to ".."
8
+ }
9
+ end
10
+
11
+ Given /^a git repo is initialized(?: on branch "([^"]*)")?$/ do |branch|
12
+ steps %Q{
13
+ Given a directory named "work"
14
+ And I cd to "work"
15
+ And I successfully run `git init .`
16
+ And a file named "testfile" with:
17
+ """
18
+ some data
19
+ """
20
+ And I successfully run `git config user.email "a@b.com"`
21
+ And I successfully run `git config user.name "A User"`
22
+ And I successfully run `git add .`
23
+ And I successfully run `git commit -am 'testfile'`
24
+ }
25
+ if branch && branch != 'master'
26
+ steps %Q{
27
+ And I successfully run `git checkout -b #{branch}`
28
+ }
29
+ end
30
+ end
31
+
@@ -23,7 +23,6 @@ end
23
23
  Then /^dotfiles should be updated$/ do
24
24
  steps %Q{
25
25
  And the file ".tddium.mimic" should contain "apikey"
26
- And the file ".gitignore" should contain ".tddium.mimic"
27
- And the file ".gitignore" should contain ".tddium-deploy-key.mimic"
26
+ And the file ".gitignore" should contain ".tddium*"
28
27
  }
29
28
  end
@@ -0,0 +1,12 @@
1
+ Given /^the password change succeeds$/ do
2
+ Antilles.install(:put, "/1/users/1/", {:status=>0})
3
+ end
4
+
5
+ Given /^the old password is invalid$/ do
6
+ Antilles.install(:put, "/1/users/1/", {:status=>1, :explanation=>"Current password is invalid"})
7
+ end
8
+
9
+ Given /^the confirmation doesn't match$/ do
10
+ Antilles.install(:put, "/1/users/1/", {:status=>1, :explanation=>"Password doesn't match confirmation"})
11
+ end
12
+
@@ -16,34 +16,12 @@ Given /^the user has no suites/ do
16
16
  Antilles.install(:get, "/1/suites", {:status=>0, :suites=>[]})
17
17
  end
18
18
 
19
- Given /^the user can create a suite named "([^"]*)" on branch "([^"]*)"$/ do |name, branch|
20
- Antilles.install(:post, "/1/suites", {:status=>0, :suite=>make_suite_response(name, branch)}, :code=>201)
21
- end
22
-
23
- Given /^the destination repo exists$/ do
24
- steps %Q{
25
- Given a directory named "repo"
26
- And I cd to "repo"
27
- And I successfully run `git init --bare .`
28
- And I cd to ".."
29
- }
19
+ Given /^there is a problem retrieving suite information$/ do
20
+ Antilles.install(:get, "/1/suites", {:status=>1, :explanation=>"Some error"})
30
21
  end
31
22
 
32
- Given /^a git repo is initialized on branch "([^"]*)"$/ do |branch|
33
- steps %Q{
34
- Given a directory named "work"
35
- And I cd to "work"
36
- And I successfully run `git init .`
37
- And a file named "testfile" with:
38
- """
39
- some data
40
- """
41
- And I successfully run `git config user.email "a@b.com"`
42
- And I successfully run `git config user.name "A User"`
43
- And I successfully run `git add .`
44
- And I successfully run `git commit -am 'testfile'`
45
- And I successfully run `git checkout -b #{branch}`
46
- }
23
+ Given /^the user can create a suite named "([^"]*)" on branch "([^"]*)"$/ do |name, branch|
24
+ Antilles.install(:post, "/1/suites", {:status=>0, :suite=>make_suite_response(name, branch)}, :code=>201)
47
25
  end
48
26
 
49
27
  Given /^I choose defaults for test pattern, CI and campfire settings$/ do
@@ -0,0 +1,4 @@
1
+ Given /^my gem is out of date$/ do
2
+ Antilles.install(:get, "/1/suites", {:status=>1, :explanation=>"tddium-preview-0.9.4 is out of date."}, :code=>426)
3
+ end
4
+
@@ -0,0 +1,12 @@
1
+ @mimic
2
+ Feature: Detect upgrade required
3
+ As a Tddium user
4
+ In order to notice when my gem is out of date
5
+ I want the tddium gem to be notified when it needs to be upgraded
6
+
7
+ Scenario: Exit if upgrade is required
8
+ Given the user is logged in
9
+ And my gem is out of date
10
+ When I run `tddium account`
11
+ Then the output should contain "API Error: tddium-preview-0.9.4 is out of date."
12
+ And the exit status should not be 0
@@ -0,0 +1,51 @@
1
+ =begin
2
+ Copyright (c) 2011 Solano Labs All Rights Reserved
3
+ =end
4
+
5
+ class Tddium
6
+
7
+ desc "account", "View account information"
8
+ def account
9
+ set_shell
10
+ set_default_environment
11
+ if user_details = user_logged_in?(true, true)
12
+ # User is already logged in, so just display the info
13
+ show_user_details(user_details)
14
+ else
15
+ exit_failure Text::Error::USE_ACTIVATE
16
+ end
17
+ end
18
+
19
+ desc "account:add [ROLE] [EMAIL]", "Authorize and invite a user to use your account"
20
+ define_method "account:add" do |role, email|
21
+ set_shell
22
+ set_default_environment
23
+ user_details = user_logged_in?(true, true)
24
+ exit_failure unless user_details
25
+
26
+ params = {:role=>role, :email=>email}
27
+ begin
28
+ say Text::Process::ADDING_MEMBER % [params[:email], params[:role]]
29
+ result = call_api(:post, Api::Path::MEMBERSHIPS, params)
30
+ say Text::Process::ADDED_MEMBER % email
31
+ rescue TddiumClient::Error::API => e
32
+ exit_failure Text::Error::ADD_MEMBER_ERROR % [email, e.message]
33
+ end
34
+ end
35
+
36
+ desc "account:remove [EMAIL]", "Remove a user from your account"
37
+ define_method "account:remove" do |email|
38
+ set_shell
39
+ set_default_environment
40
+ user_details = user_logged_in?(true, true)
41
+ exit_failure unless user_details
42
+
43
+ begin
44
+ say Text::Process::REMOVING_MEMBER % email
45
+ result = call_api(:delete, "#{Api::Path::MEMBERSHIPS}/#{email}")
46
+ say Text::Process::REMOVED_MEMBER % email
47
+ rescue TddiumClient::Error::API => e
48
+ exit_failure Text::Error::REMOVE_MEMBER_ERROR % [email, e.message]
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,58 @@
1
+ =begin
2
+ Copyright (c) 2011 Solano Labs All Rights Reserved
3
+ =end
4
+
5
+ class Tddium
6
+ desc "activate", "Activate an account with an invitation token"
7
+ method_option :email, :type => :string, :default => nil
8
+ method_option :password, :type => :string, :default => nil
9
+ method_option :ssh_key_file, :type => :string, :default => nil
10
+ def activate
11
+ set_shell
12
+ set_default_environment
13
+ if user_details = user_logged_in?
14
+ exit_failure Text::Error::ACTIVATE_LOGGED_IN
15
+ else
16
+ params = get_user_credentials(options.merge(:invited => true))
17
+
18
+ # Prompt for the password confirmation if password is not from command line
19
+ unless options[:password]
20
+ password_confirmation = HighLine.ask(Text::Prompt::PASSWORD_CONFIRMATION) { |q| q.echo = "*" }
21
+ unless password_confirmation == params[:password]
22
+ exit_failure Text::Process::PASSWORD_CONFIRMATION_INCORRECT
23
+ end
24
+ end
25
+
26
+ begin
27
+ params[:user_git_pubkey] = prompt_ssh_key(options[:ssh_key_file])
28
+ rescue TddiumError => e
29
+ exit_failure e.message
30
+ end
31
+
32
+ # Prompt for accepting license
33
+ content = File.open(License::FILE_NAME) do |file|
34
+ file.read
35
+ end
36
+ say content
37
+ license_accepted = ask(Text::Prompt::LICENSE_AGREEMENT)
38
+ exit_failure unless license_accepted.downcase == Text::Prompt::Response::AGREE_TO_LICENSE.downcase
39
+
40
+ begin
41
+ say Text::Process::STARTING_ACCOUNT_CREATION
42
+ new_user = call_api(:post, Api::Path::USERS, {:user => params}, false, false)
43
+ write_api_key(new_user["user"]["api_key"])
44
+ role = new_user["user"]["account_role"]
45
+ if role.nil? || role == "owner"
46
+ u = new_user["user"]
47
+ say Text::Process::ACCOUNT_CREATED % [u["email"], u["trial_remaining"], u["recurly_url"]]
48
+ else
49
+ say Text::Process::ACCOUNT_ADDED % [new_user["user"]["email"], new_user["user"]["account_role"], new_user["user"]["account"]]
50
+ end
51
+ rescue TddiumClient::Error::API => e
52
+ exit_failure ((e.status == Api::ErrorCode::INVALID_INVITATION) ? Text::Error::INVALID_INVITATION : e.message)
53
+ rescue TddiumClient::Error::Base => e
54
+ exit_failure say e.message
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,38 @@
1
+ =begin
2
+ Copyright (c) 2011 Solano Labs All Rights Reserved
3
+ =end
4
+
5
+ class Tddium
6
+ desc "heroku", "Connect Heroku account with Tddium"
7
+ method_option :email, :type => :string, :default => nil
8
+ method_option :password, :type => :string, :default => nil
9
+ method_option :ssh_key_file, :type => :string, :default => nil
10
+ method_option :app, :type => :string, :default => nil
11
+ def heroku
12
+ set_shell
13
+ set_default_environment
14
+ if user_details = user_logged_in?
15
+ # User is already logged in, so just display the info
16
+ show_user_details(user_details)
17
+ else
18
+ begin
19
+ heroku_config = HerokuConfig.read_config(options[:app])
20
+ # User has logged in to heroku, and TDDIUM environment variables are
21
+ # present
22
+ handle_heroku_user(options, heroku_config)
23
+ rescue HerokuConfig::HerokuNotFound
24
+ gemlist = `gem list heroku`
25
+ msg = Text::Error::Heroku::NOT_FOUND % gemlist
26
+ exit_failure msg
27
+ rescue HerokuConfig::TddiumNotAdded
28
+ exit_failure Text::Error::Heroku::NOT_ADDED
29
+ rescue HerokuConfig::InvalidFormat
30
+ exit_failure Text::Error::Heroku::INVALID_FORMAT
31
+ rescue HerokuConfig::NotLoggedIn
32
+ exit_failure Text::Error::Heroku::NOT_LOGGED_IN
33
+ rescue HerokuConfig::AppNotFound
34
+ exit_failure Text::Error::Heroku::APP_NOT_FOUND % options[:app]
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,20 @@
1
+ =begin
2
+ Copyright (c) 2011 Solano Labs All Rights Reserved
3
+ =end
4
+
5
+ class Tddium
6
+ desc "login", "Log in to tddium using your email address and password"
7
+ method_option :email, :type => :string, :default => nil
8
+ method_option :password, :type => :string, :default => nil
9
+ def login
10
+ set_shell
11
+ set_default_environment
12
+ if user_logged_in?
13
+ say Text::Process::ALREADY_LOGGED_IN
14
+ elsif login_user(:params => get_user_credentials(options), :show_error => true)
15
+ say Text::Process::LOGGED_IN_SUCCESSFULLY
16
+ else
17
+ exit_failure
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,15 @@
1
+ =begin
2
+ Copyright (c) 2011 Solano Labs All Rights Reserved
3
+ =end
4
+
5
+ class Tddium
6
+ desc "logout", "Log out of tddium"
7
+ def logout
8
+ set_shell
9
+ set_default_environment
10
+ FileUtils.rm(tddium_file_name) if File.exists?(tddium_file_name)
11
+ say Text::Process::LOGGED_OUT_SUCCESSFULLY
12
+ end
13
+ end
14
+
15
+
@@ -0,0 +1,32 @@
1
+ =begin
2
+ Copyright (c) 2011 Solano Labs All Rights Reserved
3
+ =end
4
+
5
+ class Tddium
6
+ desc "password", "Change password"
7
+ map "passwd" => :password
8
+ def password
9
+ set_shell
10
+ set_default_environment
11
+ exit_failure unless tddium_settings
12
+ user_details = user_logged_in?
13
+ exit_failure unless user_details
14
+
15
+ params = {}
16
+ params[:current_password] = HighLine.ask(Text::Prompt::CURRENT_PASSWORD) { |q| q.echo = "*" }
17
+ params[:password] = HighLine.ask(Text::Prompt::NEW_PASSWORD) { |q| q.echo = "*" }
18
+ params[:password_confirmation] = HighLine.ask(Text::Prompt::PASSWORD_CONFIRMATION) { |q| q.echo = "*" }
19
+
20
+ begin
21
+ user_id = user_details["user"]["id"]
22
+ result = call_api(:put, "#{Api::Path::USERS}/#{user_id}/", {:user=>params},
23
+ tddium_settings["api_key"], false)
24
+ say Text::Process::PASSWORD_CHANGED
25
+ rescue TddiumClient::Error::API => e
26
+ exit_failure Text::Error::PASSWORD_ERROR % e.explanation
27
+ rescue TddiumClient::Error::Base => e
28
+ exit_failure e.message
29
+ end
30
+ end
31
+ end
32
+
@@ -0,0 +1,127 @@
1
+ =begin
2
+ Copyright (c) 2011 Solano Labs All Rights Reserved
3
+ =end
4
+
5
+ class Tddium
6
+ map "cucumber" => :spec
7
+ map "test" => :spec
8
+ map "run" => :spec
9
+ desc "spec", "Run the test suite"
10
+ method_option :user_data_file, :type => :string, :default => nil
11
+ method_option :max_parallelism, :type => :numeric, :default => nil
12
+ method_option :test_pattern, :type => :string, :default => nil
13
+ method_option :force, :type => :boolean, :default => false
14
+ def spec
15
+ set_shell
16
+ set_default_environment
17
+ git_version_ok
18
+ exit_failure unless git_repo? && tddium_settings && suite_for_current_branch?
19
+
20
+ if git_changes then
21
+ exit_failure(Text::Error::GIT_CHANGES_NOT_COMMITTED) if !options[:force]
22
+ warn(Text::Warning::GIT_CHANGES_NOT_COMMITTED)
23
+ end
24
+
25
+ test_execution_params = {}
26
+
27
+ user_data_file_path = get_remembered_option(options, :user_data_file, nil) do |user_data_file_path|
28
+ if File.exists?(user_data_file_path)
29
+ user_data = File.open(user_data_file_path) { |file| file.read }
30
+ test_execution_params[:user_data_text] = Base64.encode64(user_data)
31
+ test_execution_params[:user_data_filename] = File.basename(user_data_file_path)
32
+ else
33
+ exit_failure Text::Error::NO_USER_DATA_FILE % user_data_file_path
34
+ end
35
+ end
36
+
37
+ max_parallelism = get_remembered_option(options, :max_parallelism, nil) do |max_parallelism|
38
+ test_execution_params[:max_parallelism] = max_parallelism
39
+ end
40
+
41
+ test_pattern = get_remembered_option(options, :test_pattern, nil)
42
+
43
+ start_time = Time.now
44
+
45
+ # Call the API to get the suite and its tests
46
+ begin
47
+ suite_details = call_api(:get, current_suite_path)
48
+
49
+ exit_failure Text::Error::GIT_REPO_NOT_READY unless suite_details["suite"]["repoman_current"]
50
+
51
+ # Push the latest code to git
52
+ exit_failure Text::Error::GIT_PUSH_FAILED unless update_git_remote_and_push(suite_details)
53
+
54
+ # Create a session
55
+ new_session = call_api(:post, Api::Path::SESSIONS)
56
+ session_id = new_session["session"]["id"]
57
+
58
+ # Register the tests
59
+ call_api(:post, "#{Api::Path::SESSIONS}/#{session_id}/#{Api::Path::REGISTER_TEST_EXECUTIONS}", {:suite_id => current_suite_id, :test_pattern => test_pattern})
60
+
61
+ # Start the tests
62
+ start_test_executions = call_api(:post, "#{Api::Path::SESSIONS}/#{session_id}/#{Api::Path::START_TEST_EXECUTIONS}", test_execution_params)
63
+
64
+ say Text::Process::STARTING_TEST % start_test_executions["started"]
65
+
66
+ tests_not_finished_yet = true
67
+ finished_tests = {}
68
+ test_statuses = Hash.new(0)
69
+
70
+ say Text::Process::CHECK_TEST_REPORT % start_test_executions["report"]
71
+ say Text::Process::TERMINATE_INSTRUCTION
72
+ while tests_not_finished_yet do
73
+ # Poll the API to check the status
74
+ current_test_executions = call_api(:get, "#{Api::Path::SESSIONS}/#{session_id}/#{Api::Path::TEST_EXECUTIONS}")
75
+
76
+ # Catch Ctrl-C to interrupt the test
77
+ Signal.trap(:INT) do
78
+ say Text::Process::INTERRUPT
79
+ say Text::Process::CHECK_TEST_STATUS
80
+ tests_not_finished_yet = false
81
+ end
82
+
83
+ # Print out the progress of running tests
84
+ current_test_executions["tests"].each do |test_name, result_params|
85
+ test_status = result_params["status"]
86
+ if result_params["finished"] && !finished_tests[test_name]
87
+ message = case test_status
88
+ when "passed" then [".", :green, false]
89
+ when "failed" then ["F", :red, false]
90
+ when "error" then ["E", nil, false]
91
+ when "pending" then ["*", :yellow, false]
92
+ when "skipped" then [".", :yellow, false]
93
+ else [".", nil, false]
94
+ end
95
+ finished_tests[test_name] = test_status
96
+ test_statuses[test_status] += 1
97
+ say *message
98
+ end
99
+ end
100
+
101
+ # If all tests finished, exit the loop else sleep
102
+ if finished_tests.size == current_test_executions["tests"].size
103
+ tests_not_finished_yet = false
104
+ else
105
+ sleep(Default::SLEEP_TIME_BETWEEN_POLLS)
106
+ end
107
+ end
108
+
109
+ # Print out the result
110
+ say ""
111
+ say Text::Process::FINISHED_TEST % (Time.now - start_time)
112
+ say "#{finished_tests.size} tests, #{test_statuses["failed"]} failures, #{test_statuses["error"]} errors, #{test_statuses["pending"]} pending"
113
+
114
+ # Save the spec options
115
+ write_suite(suite_details["suite"].merge({"id" => current_suite_id}),
116
+ {"user_data_file" => user_data_file_path,
117
+ "max_parallelism" => max_parallelism,
118
+ "test_pattern" => test_pattern})
119
+
120
+ exit_failure if test_statuses["failed"] > 0 || test_statuses["error"] > 0
121
+ rescue TddiumClient::Error::Base
122
+ exit_failure "Failed due to error communicating with Tddium"
123
+ rescue RuntimeError => e
124
+ exit_failure "Failed due to internal error: #{e.inspect} #{e.backtrace}"
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,56 @@
1
+ =begin
2
+ Copyright (c) 2011 Solano Labs All Rights Reserved
3
+ =end
4
+
5
+ class Tddium
6
+ desc "status", "Display information about this suite, and any open dev sessions"
7
+ def status
8
+ set_shell
9
+ set_default_environment
10
+ git_version_ok
11
+ exit_failure unless git_repo? && tddium_settings
12
+
13
+ begin
14
+ current_suites = call_api(:get, Api::Path::SUITES)
15
+ if current_suites["suites"].size == 0
16
+ say Text::Status::NO_SUITE
17
+ else
18
+ if current_suite = current_suites["suites"].detect {|suite| suite["id"] == current_suite_id}
19
+ say Text::Status::CURRENT_SUITE % current_suite["repo_name"]
20
+ display_attributes(DisplayedAttributes::SUITE, current_suite)
21
+ say Text::Status::SEPARATOR
22
+ else
23
+ say Text::Status::CURRENT_SUITE_UNAVAILABLE
24
+ end
25
+ end
26
+ show_session_details({:active => false, :order => "date", :limit => 10}, Text::Status::NO_INACTIVE_SESSION, Text::Status::INACTIVE_SESSIONS)
27
+ show_session_details({:active => true, :order => "date"}, Text::Status::NO_ACTIVE_SESSION, Text::Status::ACTIVE_SESSIONS)
28
+ rescue TddiumClient::Error::Base => e
29
+ exit_failure e.message
30
+ end
31
+ end
32
+
33
+ private
34
+
35
+ def show_session_details(params, no_session_prompt, all_session_prompt)
36
+ begin
37
+ current_sessions = call_api(:get, Api::Path::SESSIONS, params)
38
+ say Text::Status::SEPARATOR
39
+ if current_sessions["sessions"].size == 0
40
+ say no_session_prompt
41
+ else
42
+ say all_session_prompt
43
+ current_sessions["sessions"].reverse_each do |session|
44
+ duration = "(%ds)" % ((session["end_time"] ? Time.parse(session["end_time"]) : Time.now) - Time.parse(session["start_time"])).round
45
+ say Text::Status::SESSION_DETAIL % [session["report"],
46
+ duration,
47
+ session["start_time"],
48
+ session["test_execution_stats"]]
49
+ end
50
+ end
51
+ rescue TddiumClient::Error::Base
52
+ end
53
+ end
54
+
55
+ end
56
+