mode 0.0.10 → 0.0.11

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.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +1 -0
  3. data/.travis.yml +1 -0
  4. data/bin/mode +3 -8
  5. data/lib/connect.rb +13 -0
  6. data/lib/mode.rb +18 -5
  7. data/lib/mode/api/link.rb +4 -0
  8. data/lib/mode/api/request.rb +20 -10
  9. data/lib/mode/auth/access_token.rb +16 -0
  10. data/lib/mode/cli/connect.rb +1 -1
  11. data/lib/mode/commands/analyze_field.rb +1 -3
  12. data/lib/mode/commands/connect.rb +24 -49
  13. data/lib/mode/commands/helpers.rb +23 -18
  14. data/lib/mode/commands/import.rb +2 -4
  15. data/lib/mode/commands/login.rb +88 -25
  16. data/lib/mode/config.rb +60 -2
  17. data/lib/mode/connector/connect.rb +11 -0
  18. data/lib/mode/connector/daemon.rb +54 -12
  19. data/lib/mode/connector/daemonizer.rb +107 -0
  20. data/lib/mode/connector/data_source.rb +36 -9
  21. data/lib/mode/connector/scheduler.rb +6 -5
  22. data/lib/mode/connector/uploader.rb +3 -4
  23. data/lib/mode/version.rb +1 -1
  24. data/mode.gemspec +7 -4
  25. data/spec/api/request_spec.rb +9 -6
  26. data/spec/commands/connect_spec.rb +45 -59
  27. data/spec/commands/helpers_spec.rb +9 -22
  28. data/spec/commands/import_spec.rb +5 -0
  29. data/spec/commands/login_spec.rb +87 -76
  30. data/spec/config_spec.rb +9 -0
  31. data/spec/connector/daemon_spec.rb +11 -6
  32. data/spec/connector/daemonizer_spec.rb +106 -0
  33. data/spec/connector/data_source_spec.rb +15 -17
  34. data/spec/connector/registrar_spec.rb +5 -6
  35. data/spec/connector/scheduler_spec.rb +3 -2
  36. data/spec/connector/uploader_spec.rb +9 -9
  37. metadata +65 -65
  38. data/lib/mode/configurable.rb +0 -46
  39. data/lib/mode/connector/config.rb +0 -31
  40. data/spec/connector/config_spec.rb +0 -46
@@ -10,14 +10,12 @@ module Mode
10
10
  def initialize(data_sources, options = {})
11
11
  @data_sources = data_sources
12
12
  @scheduler = Rufus::Scheduler.new
13
- @max_jobs = options[:max_jobs] || 4
13
+ @max_jobs = (options[:max_jobs] || 4).to_i
14
14
  end
15
15
 
16
16
  def start!
17
- data_sources.each(&:connection)
18
- # Make sure this stays outside the scheduler
19
-
20
- scheduler.every('5s') { tick }
17
+ data_sources.each(&:connection) # Keep outside the scheduler loop
18
+ scheduler.interval('5s') { tick }
21
19
  scheduler.join
22
20
  end
23
21
 
@@ -39,6 +37,9 @@ module Mode
39
37
  if processors.length < max_jobs
40
38
  scheduler.in(0, :tag => 'processor') { tock }
41
39
  end
40
+ rescue => err
41
+ Mode::Logger.instance.error(
42
+ "Connector::Scheduler", err.message, err.backtrace)
42
43
  end
43
44
 
44
45
  def tock
@@ -10,9 +10,8 @@ module Mode
10
10
  end
11
11
 
12
12
  def perform!
13
- Mode::API::Request.put(
14
- path,
15
- :execution => {
13
+ Mode::API::Request.put(path,
14
+ :report_run => {
16
15
  :dataset => {
17
16
  :count => count,
18
17
  :content => content,
@@ -25,7 +24,7 @@ module Mode
25
24
  class << self
26
25
  def error!(path, message, detail = nil)
27
26
  Mode::API::Request.put(path,
28
- :execution => {
27
+ :report_run => {
29
28
  :error => {
30
29
  :detail => detail,
31
30
  :message => message
@@ -1,3 +1,3 @@
1
1
  module Mode
2
- VERSION = "0.0.10"
2
+ VERSION = "0.0.11"
3
3
  end
@@ -22,7 +22,7 @@ Gem::Specification.new do |spec|
22
22
  spec.add_runtime_dependency "thor"
23
23
  spec.add_runtime_dependency "terminal-table"
24
24
 
25
- # Data Packaging
25
+ # Data Packaging (In Development)
26
26
  spec.add_runtime_dependency "data_kit"
27
27
  spec.add_runtime_dependency "data_package"
28
28
 
@@ -34,14 +34,17 @@ Gem::Specification.new do |spec|
34
34
  spec.add_runtime_dependency "sequel"
35
35
 
36
36
  # Concurrency & Processes
37
- spec.add_runtime_dependency "daemon-spawn"
37
+ spec.add_runtime_dependency "spoon"
38
38
  spec.add_runtime_dependency "rufus-scheduler"
39
-
39
+
40
+ # Web Management
41
+ # spec.add_runtime_dependency "launchy"
42
+
40
43
  # Development Dependencies
41
44
  spec.add_development_dependency "bundler", "~> 1.3"
42
45
  spec.add_development_dependency "rake"
43
46
  spec.add_development_dependency "profile"
44
47
  spec.add_development_dependency "rspec"
45
- spec.add_development_dependency "ruby-prof"
46
48
  spec.add_development_dependency "simplecov"
49
+ spec.add_development_dependency "warbler"
47
50
  end
@@ -2,13 +2,16 @@ require 'spec_helper'
2
2
 
3
3
  describe Mode::API::Request do
4
4
  let(:username) { 'besquared' }
5
- let(:access_token) { 'access_token '}
5
+ let(:password) { 'token_password '}
6
6
 
7
7
  before do
8
8
  Mode::API::Request.configure(:test, {
9
- :credentials => {
10
- :username => username,
11
- :access_token => access_token
9
+ 'credentials' => {
10
+ 'username' => username,
11
+ 'password' => password
12
+ }, 'access_token' => {
13
+ 'token' => 'token123',
14
+ 'password' => 'password123'
12
15
  }
13
16
  })
14
17
  end
@@ -63,10 +66,10 @@ describe Mode::API::Request do
63
66
  '/api/besquared/data_source_connections'
64
67
 
65
68
  Mode::API::Request.data_source_connection_path.should == \
66
- '/api/besquared/data_source_connections/access_token'
69
+ '/api/besquared/data_source_connections/token123'
67
70
 
68
71
  Mode::API::Request.data_source_connection_messages_path.should == \
69
- '/api/besquared/data_source_connections/access_token/messages'
72
+ '/api/besquared/data_source_connections/token123/messages'
70
73
  end
71
74
 
72
75
  it 'has http object' do
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  describe Mode::Commands::Connect do
4
4
  let(:tmpdir) { Dir.mktmpdir }
5
5
  let(:config) { Mode::Config.init(tmpdir) }
6
- let(:connect_config) { Mode::Connector::Config.init(tmpdir) }
6
+ let(:daemon) { double(:daemon) }
7
7
 
8
8
  let(:data_source) {
9
9
  Mode::Connector::DataSource.new('testdb', {
@@ -19,75 +19,61 @@ describe Mode::Commands::Connect do
19
19
  initialize_logger
20
20
  end
21
21
 
22
- it "initializes with command and connect config" do
23
- connect = Mode::Commands::Connect.new('start')
24
-
25
- connect.command.should == 'start'
26
- connect.concurrency.should == 4
27
- end
28
-
29
- it "registers connector" do
30
- connect = Mode::Commands::Connect.new('start')
31
-
32
- registrar = double(:registrar, :perform! => true)
33
- Mode::Connector::Registrar.should_receive(:new).and_return(registrar)
34
-
35
- connect.send(:register!)
36
- end
37
-
38
- it "starts the daemon" do
39
- connect = Mode::Commands::Connect.new('start')
40
-
41
- Mode::Connector::Daemon.should_receive(:spawn!).and_return(true)
42
-
43
- connect.send(:spawn_command!, 'start')
44
- end
45
-
46
- it 'restarts the daemon' do
47
- connect = Mode::Commands::Connect.new('start')
22
+ describe "starting" do
23
+ let(:connect) { Mode::Commands::Connect.new('start') }
48
24
 
49
- Mode::Connector::Daemon.should_receive(:spawn!).twice.and_return(true)
25
+ it "initializes with command and connect config" do
26
+ connect.command.should == 'start'
27
+ connect.concurrency.should == 4
28
+ end
50
29
 
51
- connect.send(:spawn_restart!)
52
- end
53
-
54
- it 'spawns with the start command' do
55
- connect = Mode::Commands::Connect.new('start')
56
-
57
- Mode::Connector::Daemon.should_receive(:spawn!).and_return(true)
58
-
59
- connect.send(:spawn!)
60
- end
61
-
62
- it 'spawns with the restart command' do
63
- connect = Mode::Commands::Connect.new('restart')
64
-
65
- Mode::Connector::Daemon.should_receive(:spawn!).twice.and_return(true)
30
+ it "registers connector" do
31
+ connect.should_receive(:configuration).and_return(config)
66
32
 
67
- connect.send(:spawn!)
33
+ registrar = double(:registrar, :perform! => true)
34
+ Mode::Connector::Registrar.should_receive(:new).and_return(registrar)
35
+ connect.send(:register!)
36
+ end
68
37
  end
69
38
 
70
- it 'spawns with the stop command' do
71
- connect = Mode::Commands::Connect.new('stop')
72
-
73
- Mode::Connector::Daemon.should_receive(:spawn!).and_return(true)
74
-
75
- connect.send(:spawn!)
76
- end
77
-
78
- it 'raises on spawn if the command is unrecognized' do
79
- connect = Mode::Commands::Connect.new('fake')
80
-
81
- Mode::Connector::Daemon.should_not_receive(:spawn!)
82
-
83
- expect { connect.send(:spawn!) }.to raise_error
39
+ describe "controlling the daemon" do
40
+ it "starts" do
41
+ connect = Mode::Commands::Connect.new('start')
42
+ connect.should_receive(:daemon).and_return(daemon)
43
+
44
+ daemon.should_receive(:start).and_return(true)
45
+ connect.send(:run_command!)
46
+ end
47
+
48
+ it 'stops' do
49
+ connect = Mode::Commands::Connect.new('stop')
50
+ connect.should_receive(:daemon).and_return(daemon)
51
+
52
+ daemon.should_receive(:stop).and_return(true)
53
+ connect.send(:run_command!)
54
+ end
55
+
56
+ it 'restarts' do
57
+ connect = Mode::Commands::Connect.new('restart')
58
+ connect.should_receive(:daemon).and_return(daemon)
59
+
60
+ daemon.should_receive(:restart).and_return(true)
61
+ connect.send(:run_command!)
62
+ end
63
+
64
+ it 'raises on if the command is unrecognized' do
65
+ connect = Mode::Commands::Connect.new('fake')
66
+ daemon.should_not_receive(:start)
67
+ expect { connect.send(:run_command!) }.to raise_error
68
+ end
84
69
  end
85
70
 
86
71
  it 'executes the connector' do
87
72
  connect = Mode::Commands::Connect.new('start')
88
73
 
89
74
  connect.should_receive(:register!)
90
- connect.should_receive(:spawn!)
75
+ connect.should_receive(:run_command!)
76
+ connect.should_receive(:validate_config!)
91
77
 
92
78
  connect.execute
93
79
  end
@@ -7,6 +7,7 @@ end
7
7
  describe Mode::Commands::Helpers do
8
8
  let(:tmpdir) { Dir.mktmpdir }
9
9
  let(:command) { CommandClass.new }
10
+ let(:config) { Mode::Config.init(tmpdir) }
10
11
 
11
12
  before do
12
13
  initialize_logger
@@ -16,18 +17,10 @@ describe Mode::Commands::Helpers do
16
17
  command.config_dir.should == File.expand_path("~/.mode/")
17
18
  end
18
19
 
19
- it "provides a config path" do
20
- command.config_path.should == Mode::Config.full_path("~/.mode/")
21
- end
22
-
23
20
  it "provides config validation" do
24
- command.stub(:config_dir).and_return(tmpdir)
21
+ command.stub(:config_exists).and_return(false)
25
22
 
26
23
  expect { command.require_config! }.to raise_error
27
-
28
- config = Mode::Config.init(tmpdir)
29
-
30
- command.require_config!
31
24
  end
32
25
 
33
26
  it "provides credential validation" do
@@ -36,8 +29,6 @@ describe Mode::Commands::Helpers do
36
29
  # raise for no config
37
30
  expect { command.require_credentials! }.to raise_error
38
31
 
39
- config = Mode::Config.init(tmpdir)
40
-
41
32
  # raise for credentials not found
42
33
  expect { command.require_credentials! }.to raise_error
43
34
 
@@ -49,21 +40,17 @@ describe Mode::Commands::Helpers do
49
40
  end
50
41
 
51
42
  it "provides api request configuration" do
43
+ command.stub(:config).and_return(config)
44
+
52
45
  command.configure_api_requests!
53
46
  Mode::API::Request.valid?.should == true
54
47
  end
55
48
 
56
- it "provides connect config validation" do
57
- command.stub(:config_dir).and_return(tmpdir)
58
-
59
- # raise for no config
60
- expect { command.require_connect_config! }.to raise_error
61
-
62
- config = Mode::Connector::Config.init(tmpdir)
63
-
64
- config.data_sources << Mode::Connector::DataSource.new('test', {})
65
- config.save
49
+ it 'validates a configuration' do
50
+ command.should_receive(:require_config!)
51
+ command.should_receive(:require_credentials!)
52
+ command.should_receive(:configure_api_requests!)
66
53
 
67
- command.require_connect_config!
54
+ command.validate_config!
68
55
  end
69
56
  end
@@ -2,6 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  describe Mode::Commands::Import do
4
4
  let(:tmpdir) { Dir.mktmpdir }
5
+ let(:config) { Mode::Config.init(tmpdir) }
5
6
  let(:packages_path) { Mode::API::Request.packages_path }
6
7
 
7
8
  before do
@@ -129,6 +130,8 @@ describe Mode::Commands::Import do
129
130
  import_params = { 'table_name' => 'espn_draft' }
130
131
  import.should_receive(:parse_uploaded_response).with(:package).and_return(resource)
131
132
  import.should_receive(:submit_import_form).with(resource, import_params).and_return(true)
133
+
134
+ import.should_receive(:validate_config!).and_return(true)
132
135
 
133
136
  import.execute
134
137
  end
@@ -149,6 +152,8 @@ describe Mode::Commands::Import do
149
152
  import.should_receive(:parse_uploaded_response).with(:package).and_return(resource)
150
153
  import.should_receive(:submit_import_form).with(resource, import_params).and_return(true)
151
154
 
155
+ import.should_receive(:validate_config!).and_return(true)
156
+
152
157
  import.execute
153
158
  end
154
159
  end
@@ -5,57 +5,42 @@ describe Mode::Commands::Login do
5
5
  let(:username) { 'besquared' }
6
6
  let(:password) { 'password' }
7
7
 
8
- let(:personal_repr) {
8
+ let(:token_repr) {
9
9
  {
10
10
  'name' => 'personal',
11
11
  'token' => 'token123',
12
- 'account_name' => 'besquared'
12
+ 'password' => 'password123',
13
+ 'account_name' => 'besquared',
14
+ '_links' => {
15
+ 'verify' => {
16
+ 'href' => 'verification_url{?password}'
17
+ }
18
+ }
13
19
  }
14
20
  }
15
21
 
16
- let(:secondary_repr) {
17
- {
18
- 'name' => 'secondary',
19
- 'token' => 'token567',
20
- 'account_name' => 'besquared'
21
- }
22
+
23
+ let(:token_resource) {
24
+ Mode::API::Resource.new(token_repr)
22
25
  }
23
26
 
24
- let(:tokens_resource) {
25
- Mode::API::Resource.new({
26
- '_embedded' => {
27
- 'access_tokens' => [
28
- personal_repr,
29
- secondary_repr
30
- ]
31
- }
32
- })
27
+ let(:token) {
28
+ Mode::Auth::AccessToken.new(token_resource)
33
29
  }
34
30
 
35
- let(:single_tokens_resource) {
31
+ let(:tokens_resource) {
36
32
  Mode::API::Resource.new({
37
33
  '_embedded' => {
38
- 'access_tokens' => [
39
- personal_repr
40
- ]
34
+ 'access_tokens' => [token_repr]
41
35
  }
42
36
  })
43
37
  }
44
38
 
45
- let(:personal_token) {
46
- Mode::Auth::AccessToken.new(
47
- Mode::API::Resource.new(personal_repr)
48
- )
49
- }
50
-
51
- let(:secondary_token) {
52
- Mode::Auth::AccessToken.new(
53
- Mode::API::Resource.new(secondary_repr)
54
- )
55
- }
39
+ let(:command) { Mode::Commands::Login.new(:test => true) }
56
40
 
57
41
  before do
58
42
  initialize_logger
43
+ command.stub(:say)
59
44
  end
60
45
 
61
46
  it "initializes with each environment" do
@@ -65,65 +50,52 @@ describe Mode::Commands::Login do
65
50
  end
66
51
 
67
52
  it "executes a login process with a new config" do
68
- command = Mode::Commands::Login.new
69
-
70
- command.stub(:say)
71
53
  command.stub(:config_dir).and_return(tmpdir)
72
54
 
73
55
  command.should_receive(:configure_credentials).and_return([username, password])
74
- command.should_receive(:choose_access_token).and_return(personal_token)
56
+ command.should_receive(:choose_access_token).and_return(token)
75
57
 
76
58
  command.execute
77
59
 
78
60
  config = Mode::Config.new(tmpdir)
79
61
 
80
62
  config.username.should == 'besquared'
81
- config.access_token.should == 'token123'
63
+ config.access_token['token'].should == 'token123'
64
+ config.access_token['password'].should == 'password123'
82
65
  end
83
66
 
84
67
  it "executes a login process with an existing config" do
85
- command = Mode::Commands::Login.new
86
-
87
- command.stub(:say)
88
68
  command.stub(:config_dir).and_return(tmpdir)
89
69
 
90
70
  Mode::Config.init(tmpdir)
91
71
 
92
72
  command.should_receive(:configure_credentials).and_return([username, password])
93
- command.should_receive(:choose_access_token).and_return(personal_token)
73
+ command.should_receive(:choose_access_token).and_return(token)
94
74
 
95
75
  command.execute
96
76
 
97
77
  config = Mode::Config.new(tmpdir)
98
78
 
99
79
  config.username.should == 'besquared'
100
- config.access_token.should == 'token123'
80
+ config.access_token['token'].should == 'token123'
81
+ config.access_token['password'].should == 'password123'
101
82
  end
102
83
 
103
84
  it "rescues and displays errors during the login process" do
104
- command = Mode::Commands::Login.new
105
-
106
85
  command.stub(:config_dir).and_return(tmpdir)
107
86
 
108
87
  error = StandardError.new("Expected Break")
109
88
  command.should_receive(:configure_credentials).and_raise(error)
110
-
111
89
  command.should_receive(:say).with("Expected Break")
112
-
113
90
  command.execute
114
91
  end
115
92
 
116
93
  it "configures API with credentials" do
117
- command = Mode::Commands::Login.new(:test => true)
118
-
119
94
  command.send(:configure_api, 'besquared', 'password')
120
-
121
95
  Mode::API::Request.environment.should == :test
122
96
  end
123
97
 
124
98
  it "requests credentials and configures API" do
125
- command = Mode::Commands::Login.new(:test => true)
126
-
127
99
  command.should_receive(:configure_api)
128
100
  command.should_receive(:ask).and_return('besquared', 'password')
129
101
 
@@ -134,46 +106,85 @@ describe Mode::Commands::Login do
134
106
  end
135
107
 
136
108
  it "raises when credentials are invalid" do
137
- command = Mode::Commands::Login.new(:test => true)
138
-
139
109
  response = double(:response, :status => 401)
140
- Mode::API::Request.should_receive(:get).with(:access_tokens).and_return(response)
110
+ Mode::API::Request.should_receive(:get).with(
111
+ :access_tokens).and_return(response)
112
+
141
113
  expect { command.send(:fetch_access_tokens) }.to raise_error
142
114
  end
143
115
 
144
- it "fetches access tokens from the API" do
145
- command = Mode::Commands::Login.new(:test => true)
146
- Mode::API::Request.should_receive(:get).with(:access_tokens).and_return(tokens_resource)
116
+ it "fetches access tokens" do
117
+ Mode::API::Request.should_receive(:get).with(
118
+ :access_tokens).and_return(tokens_resource)
119
+
120
+ command.send(:fetch_access_tokens).first.token.should == 'token123'
121
+ end
147
122
 
148
- tokens = command.send(:fetch_access_tokens)
123
+ it "creates a new access token" do
124
+ Mode::API::Request.should_receive(:post).with(:access_tokens, {
125
+ :access_token => { :name => "Token Name" } }).and_return(token_resource)
149
126
 
150
- tokens.length.should == 2
151
- tokens.first.token.should == 'token123'
152
- tokens.last.token.should == 'token567'
127
+ command.should_receive(:ask).and_return("Token Name")
128
+ command.send(:create_access_token).token.should == 'token123'
153
129
  end
154
130
 
155
- it "chooses the first token if there is only one" do
156
- command = Mode::Commands::Login.new(:test => true)
157
- Mode::API::Request.should_receive(:get).with(:access_tokens).and_return(single_tokens_resource)
131
+ it "verifies an access token password with success" do
132
+ Mode::API::Request.should_receive(:get).with(
133
+ 'verification_url?password=password').and_return(token_resource)
134
+
135
+ command.send(:verify_access_token, token, 'password').token.should == token.token
136
+ end
158
137
 
159
- command.should_not_receive(:ask)
138
+ describe "when there are no access tokens" do
139
+ it "prompts the user to create an access token" do
140
+ command.should_receive(:fetch_access_tokens).and_return([])
141
+ command.should_receive(:prompt_create_access_token).and_return(token)
142
+ command.send(:choose_access_token).should == token
143
+ end
160
144
 
161
- chosen_token = command.send(:choose_access_token)
145
+ it "creates a new token upon user request" do
146
+ command.should_receive(:yes?).and_return(true)
147
+ command.should_receive(:create_access_token).and_return(token)
148
+ command.send(:prompt_create_access_token).token.should == 'token123'
149
+ end
162
150
 
163
- chosen_token.should_not == nil
164
- chosen_token.token.should == 'token123'
151
+ it "raises an error if the user doesn't create a token" do
152
+ command.should_receive(:yes?).and_return(false)
153
+ expect { command.send(:prompt_create_access_token) }.to raise_error
154
+ end
165
155
  end
166
156
 
167
- it "prompts the user to choose a token" do
168
- command = Mode::Commands::Login.new(:test => true)
169
- Mode::API::Request.should_receive(:get).with(:access_tokens).and_return(tokens_resource)
157
+ describe "when there are one or more access tokens" do
158
+ it "prompts the user to choose an access token" do
159
+ command.should_receive(:fetch_access_tokens).and_return([token])
160
+ command.should_receive(:prompt_choose_access_token).with([token]).and_return(token)
161
+ command.send(:choose_access_token).should == token
162
+ end
170
163
 
171
- command.stub(:say)
172
- command.should_receive(:ask).and_return("2")
164
+ it "asks the user to make a token choice" do
165
+ command.should_receive(:ask).and_return("2")
166
+ command.should_receive(:ask).and_return("1")
167
+ command.send(:ask_for_access_token_choice, [token]).should == "1"
168
+ end
173
169
 
174
- chosen_token = command.send(:choose_access_token)
170
+ it "verifies the chosen access token" do
171
+ command.should_receive(:ask).and_return(:fake)
172
+ command.should_receive(:ask).and_return(:secret)
173
+ command.should_receive(:verify_access_token).with(token, :fake).and_return(false)
174
+ command.should_receive(:verify_access_token).with(token, :secret).and_return(true)
175
+ command.send(:verify_access_token_secret, token).should == true
176
+ end
175
177
 
176
- chosen_token.should_not == nil
177
- chosen_token.token.should == 'token567'
178
+ it "verifies the access token after prompted choice" do
179
+ command.should_receive(:ask_for_access_token_choice).and_return("1")
180
+ command.should_receive(:verify_access_token_secret).and_return(token)
181
+ command.send(:prompt_choose_access_token, [token]).should == token
182
+ end
183
+
184
+ it "creates a new token if the user skips token choice" do
185
+ command.should_receive(:ask_for_access_token_choice).and_return("")
186
+ command.should_receive(:create_access_token).and_return(token)
187
+ command.send(:prompt_choose_access_token, [token]).should == token
188
+ end
178
189
  end
179
190
  end