tddium-preview 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
data/lib/tddium.rb CHANGED
@@ -20,6 +20,7 @@ require File.expand_path("../tddium/constant", __FILE__)
20
20
  # tddium logout # Log out
21
21
  #
22
22
  # tddium account # View/Manage account information
23
+ # tddium account:password # Change password
23
24
  #
24
25
  # tddium dev # Enter "dev" mode, for single-test quick-turnaround debugging.
25
26
  # tddium stopdev # Leave "dev" mode.
@@ -77,6 +78,31 @@ class Tddium < Thor
77
78
  end
78
79
  end
79
80
 
81
+ desc "password", "Change password"
82
+ method_option :environment, :type => :string, :default => nil
83
+ def password
84
+ set_default_environment(options[:environment])
85
+ return unless tddium_settings
86
+ user_details = user_logged_in?
87
+ return unless user_details
88
+
89
+ params = {}
90
+ params[:current_password] = HighLine.ask(Text::Prompt::CURRENT_PASSWORD) { |q| q.echo = "*" }
91
+ params[:password] = HighLine.ask(Text::Prompt::NEW_PASSWORD) { |q| q.echo = "*" }
92
+ params[:password_confirmation] = HighLine.ask(Text::Prompt::PASSWORD_CONFIRMATION) { |q| q.echo = "*" }
93
+
94
+ begin
95
+ user_id = user_details["user"]["id"]
96
+ result = call_api(:put, "#{Api::Path::USERS}/#{user_id}/", {:user=>params},
97
+ tddium_settings["api_key"], false)
98
+ say Text::Process::PASSWORD_CHANGED
99
+ rescue TddiumClient::Error::API => e
100
+ say Text::Error::PASSWORD_ERROR % e.explanation
101
+ rescue TddiumClient::Error::Base => e
102
+ say e.message
103
+ end
104
+ end
105
+
80
106
  desc "login", "Log in to tddium using your email address and password"
81
107
  method_option :environment, :type => :string, :default => nil
82
108
  method_option :email, :type => :string, :default => nil
@@ -483,8 +509,8 @@ class Tddium < Thor
483
509
  git_push
484
510
  end
485
511
 
486
- def user_logged_in?(active = true)
487
- result = tddium_settings(:fail_with_message => false) && tddium_settings["api_key"]
512
+ def user_logged_in?(active = true, message = false)
513
+ result = tddium_settings(:fail_with_message => message) && tddium_settings["api_key"]
488
514
  (result && active) ? get_user : result
489
515
  end
490
516
 
@@ -51,7 +51,9 @@ module TddiumConstant
51
51
  SUITE_NAME = "Enter a suite name or press 'Return'. Using '%s' by default:"
52
52
  LICENSE_AGREEMENT = "Type '%s' to accept the license and continue:" % Response::AGREE_TO_LICENSE
53
53
  EMAIL = "Enter your email address:"
54
- PASSWORD = "Enter a password: "
54
+ CURRENT_PASSWORD = "Enter your old password: "
55
+ PASSWORD = "Enter password: "
56
+ NEW_PASSWORD = "Enter a new password: "
55
57
  PASSWORD_CONFIRMATION = "Confirm your password: "
56
58
  INVITATION_TOKEN = "Enter your invitation token:"
57
59
  USE_EXISTING_SUITE = "The suite name '%s' already exists. Enter '#{Response::YES}' to use it, or enter a new name:"
@@ -67,6 +69,7 @@ module TddiumConstant
67
69
  EXISTING_SUITE = "Current suite: %s"
68
70
  CREATING_SUITE = "Creating suite '%s'. This will take a few seconds."
69
71
  PASSWORD_CONFIRMATION_INCORRECT = "Password confirmation incorrect"
72
+ PASSWORD_CHANGED = "Your password has been changed."
70
73
  ACCOUNT_CREATED = "
71
74
  Congratulations %s, your tddium account has been created!
72
75
 
@@ -118,6 +121,7 @@ http://blog.tddium.com/home/
118
121
  "
119
122
  NO_USER_DATA_FILE = "User data file '%s' does not exist"
120
123
  NO_MATCHING_FILES = "No files match '%s'"
124
+ PASSWORD_ERROR = "Error changing password: %s"
121
125
  end
122
126
  end
123
127
 
@@ -3,5 +3,5 @@ Copyright (c) 2011 Solano Labs All Rights Reserved
3
3
  =end
4
4
 
5
5
  module TddiumVersion
6
- VERSION = "0.1.2"
6
+ VERSION = "0.1.3"
7
7
  end
data/spec/tddium_spec.rb CHANGED
@@ -21,19 +21,23 @@ describe Tddium do
21
21
  SAMPLE_GIT_REPO_URI = "ssh://git@api.tddium.com/home/git/repo/#{SAMPLE_APP_NAME}"
22
22
  SAMPLE_LICENSE_TEXT = "LICENSE"
23
23
  SAMPLE_PASSWORD = "foobar"
24
+ SAMPLE_NEW_PASSWORD = "foobar2"
24
25
  SAMPLE_REPORT_URL = "http://api.tddium.com/1/sessions/1/test_executions/report"
25
26
  SAMPLE_RUBYGEMS_VERSION = "1.3.7"
26
27
  SAMPLE_RUBY_VERSION = "1.8.7"
27
28
  SAMPLE_RECURLY_URL = "https://tddium.recurly.com/account/1"
28
29
  SAMPLE_SESSION_ID = 1
29
30
  SAMPLE_SUITE_ID = 1
31
+ SAMPLE_USER_ID = 1
30
32
  DEFAULT_TEST_PATTERN = "**/*_spec.rb"
31
33
  CUSTOM_TEST_PATTERN = "**/cat_spec.rb"
32
34
  SAMPLE_SUITE_RESPONSE = {"repo_name" => SAMPLE_APP_NAME, "branch" => SAMPLE_BRANCH_NAME, "id" => SAMPLE_SUITE_ID, "ruby_version"=>SAMPLE_RUBY_VERSION, "git_repo_uri" => SAMPLE_GIT_REPO_URI}
33
35
  SAMPLE_SUITES_RESPONSE = {"suites" => [SAMPLE_SUITE_RESPONSE]}
34
36
  SAMPLE_TDDIUM_CONFIG_FILE = ".tddium.test"
35
37
  SAMPLE_TEST_EXECUTION_STATS = "total 1, notstarted 0, started 1, passed 0, failed 0, pending 0, error 0", "start_time"
36
- SAMPLE_USER_RESPONSE = {"user"=> {"api_key" => SAMPLE_API_KEY, "email" => SAMPLE_EMAIL, "created_at" => SAMPLE_DATE_TIME, "recurly_url" => SAMPLE_RECURLY_URL}}
38
+ SAMPLE_USER_RESPONSE = {"user"=> {"id"=>SAMPLE_USER_ID, "api_key" => SAMPLE_API_KEY, "email" => SAMPLE_EMAIL, "created_at" => SAMPLE_DATE_TIME, "recurly_url" => SAMPLE_RECURLY_URL}}
39
+ PASSWORD_ERROR_EXPLANATION = "bad confirmation"
40
+ PASSWORD_ERROR_RESPONSE = {"status"=>1, "explanation"=> PASSWORD_ERROR_EXPLANATION}
37
41
 
38
42
  def call_api_should_receive(options = {})
39
43
  params = [options[:method] || anything, options[:path] || anything, options[:params] || anything, (options[:api_key] || options[:api_key] == false) ? options[:api_key] : anything]
@@ -53,7 +57,7 @@ describe Tddium do
53
57
  send("run_#{example.example_group.ancestors.map(&:description)[-2][1..-1]}", tddium, options)
54
58
  end
55
59
 
56
- [:suite, :spec, :status, :account, :login, :logout].each do |method|
60
+ [:suite, :spec, :status, :account, :login, :logout, :password].each do |method|
57
61
  define_method("run_#{method}") do |tddium, *params|
58
62
  options = params.first || {}
59
63
  if method == :spec
@@ -339,6 +343,86 @@ describe Tddium do
339
343
  end
340
344
  end
341
345
 
346
+ shared_examples_for "prompting for password" do
347
+ it "should prompt for a password" do
348
+ highline = mock(HighLine)
349
+ HighLine.should_receive(:ask).with(password_prompt).and_yield(highline)
350
+ highline.should_receive(:echo=).with("*")
351
+ run(tddium)
352
+ end
353
+ end
354
+
355
+ describe "#password" do
356
+ before do
357
+ stub_defaults
358
+ stub_config_file(:api_key => true, :branches => true)
359
+ tddium.stub(:ask).and_return("")
360
+ HighLine.stub(:ask).and_return("")
361
+ end
362
+
363
+ it_should_behave_like ".tddium file is missing or corrupt"
364
+
365
+ context "the user is already logged in" do
366
+ before do
367
+ stub_call_api_response(:get, Tddium::Api::Path::USERS, SAMPLE_USER_RESPONSE)
368
+ end
369
+
370
+ it_should_behave_like "set the default environment"
371
+
372
+ it_should_behave_like "prompting for password" do
373
+ let(:password_prompt) {Tddium::Text::Prompt::CURRENT_PASSWORD}
374
+ end
375
+
376
+ it_should_behave_like "prompting for password" do
377
+ let(:password_prompt) {Tddium::Text::Prompt::NEW_PASSWORD}
378
+ end
379
+
380
+ it_should_behave_like "prompting for password" do
381
+ let(:password_prompt) {Tddium::Text::Prompt::PASSWORD_CONFIRMATION}
382
+ end
383
+
384
+ context "the user confirms their password correctly" do
385
+ before do
386
+ @user_path = "#{Tddium::Api::Path::USERS}/#{SAMPLE_USER_ID}/"
387
+ HighLine.stub(:ask).with(Tddium::Text::Prompt::CURRENT_PASSWORD).and_return(SAMPLE_PASSWORD)
388
+ HighLine.stub(:ask).with(Tddium::Text::Prompt::NEW_PASSWORD).and_return(SAMPLE_NEW_PASSWORD)
389
+ HighLine.stub(:ask).with(Tddium::Text::Prompt::PASSWORD_CONFIRMATION).and_return(SAMPLE_NEW_PASSWORD)
390
+ end
391
+
392
+
393
+ it "should send a 'PUT' request to user_path with passwords" do
394
+ call_api_should_receive(:method => :put,
395
+ :path => /#{@user_path}$/,
396
+ :params => {:user =>
397
+ {:current_password=>SAMPLE_PASSWORD,
398
+ :password => SAMPLE_NEW_PASSWORD,
399
+ :password_confirmation => SAMPLE_NEW_PASSWORD}},
400
+ :api_key => SAMPLE_API_KEY)
401
+ run_password(tddium)
402
+ end
403
+
404
+ context "'PUT user_path' is successful" do
405
+ before{stub_call_api_response(:put, @user_path, {"status"=>0})}
406
+
407
+ it "should show the user '#{Tddium::Text::Process::PASSWORD_CHANGED}'" do
408
+ tddium.should_receive(:say).with(Tddium::Text::Process::PASSWORD_CHANGED)
409
+ run_password(tddium)
410
+ end
411
+ end
412
+ context "'PUT user_path' is unsuccessful" do
413
+
414
+ context "invalid original password" do
415
+ before{stub_call_api_response(:put, @user_path, PASSWORD_ERROR_RESPONSE)}
416
+ it "should show the user: '#{Tddium::Text::Error::PASSWORD_ERROR}'" do
417
+ tddium.should_receive(:say).with(Tddium::Text::Error::PASSWORD_ERROR % PASSWORD_ERROR_EXPLANATION)
418
+ run_password(tddium)
419
+ end
420
+ end
421
+ end
422
+ end
423
+ end
424
+ end
425
+
342
426
  describe "#account" do
343
427
  before do
344
428
  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.1.2
5
+ version: 0.1.3
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-05-01 00:00:00 -07:00
13
+ date: 2011-05-02 00:00:00 -07:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency