stormpath-sdk 1.3.1 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -1
  3. data/.travis.yml +3 -3
  4. data/CHANGES.md +8 -0
  5. data/lib/stormpath-sdk.rb +8 -0
  6. data/lib/stormpath-sdk/auth/create_factor.rb +64 -0
  7. data/lib/stormpath-sdk/data_store.rb +17 -1
  8. data/lib/stormpath-sdk/oauth/authenticator.rb +2 -1
  9. data/lib/stormpath-sdk/oauth/challenge_factor_grant.rb +25 -0
  10. data/lib/stormpath-sdk/oauth/challenge_factor_grant_request.rb +16 -0
  11. data/lib/stormpath-sdk/resource/account.rb +6 -0
  12. data/lib/stormpath-sdk/resource/account_link.rb +1 -1
  13. data/lib/stormpath-sdk/resource/challenge.rb +26 -0
  14. data/lib/stormpath-sdk/resource/collection.rb +0 -1
  15. data/lib/stormpath-sdk/resource/directory.rb +1 -0
  16. data/lib/stormpath-sdk/resource/factor.rb +26 -0
  17. data/lib/stormpath-sdk/resource/field.rb +20 -0
  18. data/lib/stormpath-sdk/resource/linked_account.rb +1 -1
  19. data/lib/stormpath-sdk/resource/phone.rb +21 -0
  20. data/lib/stormpath-sdk/resource/schema.rb +21 -0
  21. data/lib/stormpath-sdk/version.rb +2 -2
  22. data/spec/auth/create_factor_spec.rb +92 -0
  23. data/spec/auth/http_basic_authentication_spec.rb +3 -3
  24. data/spec/auth/http_bearer_authentication_spec.rb +3 -3
  25. data/spec/client_spec.rb +25 -25
  26. data/spec/oauth/access_token_authentication_result_spec.rb +3 -3
  27. data/spec/provider/provider_spec.rb +2 -2
  28. data/spec/resource/account_creation_policy_spec.rb +2 -2
  29. data/spec/resource/account_link_spec.rb +2 -2
  30. data/spec/resource/account_spec.rb +196 -12
  31. data/spec/resource/account_store_mapping_spec.rb +3 -3
  32. data/spec/resource/account_store_spec.rb +4 -4
  33. data/spec/resource/api_key_spec.rb +3 -3
  34. data/spec/resource/application_spec.rb +74 -33
  35. data/spec/resource/challenge_spec.rb +53 -0
  36. data/spec/resource/collection_spec.rb +6 -6
  37. data/spec/resource/custom_data_spec.rb +2 -2
  38. data/spec/resource/directory_spec.rb +27 -21
  39. data/spec/resource/email_template_spec.rb +2 -2
  40. data/spec/resource/factor_spec.rb +124 -0
  41. data/spec/resource/field_spec.rb +35 -0
  42. data/spec/resource/group_membership_spec.rb +3 -3
  43. data/spec/resource/group_spec.rb +3 -3
  44. data/spec/resource/linked_account_spec.rb +2 -2
  45. data/spec/resource/organization_spec.rb +6 -6
  46. data/spec/resource/password_policy_spec.rb +2 -2
  47. data/spec/resource/password_strength_spec.rb +2 -2
  48. data/spec/resource/phone_spec.rb +63 -0
  49. data/spec/resource/schema_spec.rb +39 -0
  50. data/spec/resource/status_spec.rb +4 -4
  51. data/spec/spec_helper.rb +6 -3
  52. data/spec/support/custom_data_storage_behavior.rb +2 -2
  53. data/spec/support/mocked_provider_accounts.rb +106 -0
  54. data/spec/support/resource_helpers.rb +20 -16
  55. metadata +16 -2
@@ -1,9 +1,9 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'HttpBasicAuthentication', vcr: true do
4
- let(:application) { test_api_client.applications.create(build_application) }
5
- let(:directory) { test_api_client.directories.create(build_directory) }
6
- let(:account) { application.accounts.create(build_account) }
4
+ let(:application) { test_api_client.applications.create(application_attrs) }
5
+ let(:directory) { test_api_client.directories.create(directory_attrs) }
6
+ let(:account) { application.accounts.create(account_attrs) }
7
7
  let(:api_key) { account.api_keys.create({}) }
8
8
  let(:api_key_id) { api_key.id }
9
9
  let(:api_key_secret) { api_key.secret }
@@ -1,8 +1,8 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'HttpBearerAuthentication', vcr: true do
4
- let(:application) { test_api_client.applications.create(build_application) }
5
- let(:directory) { test_api_client.directories.create(build_directory) }
4
+ let(:application) { test_api_client.applications.create(application_attrs) }
5
+ let(:directory) { test_api_client.directories.create(directory_attrs) }
6
6
  let(:password_grant_request) do
7
7
  Stormpath::Oauth::PasswordGrantRequest.new("test#{default_domain}", 'P@$$w0rd')
8
8
  end
@@ -19,7 +19,7 @@ describe 'HttpBearerAuthentication', vcr: true do
19
19
  end
20
20
  before { map_account_store(application, directory, 1, true, true) }
21
21
  let!(:account) do
22
- application.accounts.create(build_account(email: 'test', password: 'P@$$w0rd'))
22
+ application.accounts.create(account_attrs(email: 'test', password: 'P@$$w0rd'))
23
23
  end
24
24
 
25
25
  after do
@@ -275,7 +275,7 @@ properties
275
275
  context 'by default' do
276
276
  let(:applications) { test_api_client.applications }
277
277
 
278
- let(:application) { applications.create(build_application) }
278
+ let(:application) { applications.create(application_attrs) }
279
279
 
280
280
  it 'returns the collection' do
281
281
  expect(applications).to be_kind_of(Stormpath::Resource::Collection)
@@ -290,7 +290,7 @@ properties
290
290
  context 'pagination' do
291
291
  let!(:applications) do
292
292
  (0..2).to_a.map do |index|
293
- test_api_client.applications.create(build_application(name: "ruby-sdk-test-#{index}"))
293
+ test_api_client.applications.create(application_attrs(name: "ruby-sdk-test-#{index}"))
294
294
  end
295
295
  end
296
296
 
@@ -309,9 +309,9 @@ properties
309
309
  let(:accounts_cache_summary) { cache_manager.get_cache('accounts').stats.summary }
310
310
  let(:directories_cache_summary) { cache_manager.get_cache('directories').stats.summary }
311
311
  let(:groups_cache_summary) { cache_manager.get_cache('groups').stats.summary }
312
- let(:directory) { client.directories.create(build_directory) }
313
- let(:group) { directory.groups.create(build_group) }
314
- let(:account) { directory.accounts.create(build_account) }
312
+ let(:directory) { client.directories.create(directory_attrs) }
313
+ let(:group) { directory.groups.create(group_attrs) }
314
+ let(:account) { directory.accounts.create(account_attrs) }
315
315
 
316
316
  before { group.add_account(account) }
317
317
 
@@ -338,7 +338,7 @@ properties
338
338
  let(:cached_account) do
339
339
  client.accounts.get account.href, Stormpath::Resource::Expansion.new('groups')
340
340
  end
341
- let(:group) { directory.groups.create(build_group) }
341
+ let(:group) { directory.groups.create(group_attrs) }
342
342
 
343
343
  before { client.data_store.initialize_cache({}) }
344
344
 
@@ -352,8 +352,8 @@ properties
352
352
  context 'search' do
353
353
  let!(:applications) do
354
354
  [
355
- test_api_client.applications.create(build_application(name: 'rubytestapp1')),
356
- test_api_client.applications.create(build_application(name: 'rubytestapp2'))
355
+ test_api_client.applications.create(application_attrs(name: 'rubytestapp1')),
356
+ test_api_client.applications.create(application_attrs(name: 'rubytestapp2'))
357
357
  ]
358
358
  end
359
359
 
@@ -413,7 +413,7 @@ properties
413
413
  let(:options) { { createDirectory: true } }
414
414
  let!(:account) do
415
415
  application.accounts.create(
416
- build_account(username: 'johnsmith2', password: '4P@$$w0rd!')
416
+ account_attrs(username: 'johnsmith2', password: '4P@$$w0rd!')
417
417
  )
418
418
  end
419
419
  let(:auth_request) do
@@ -496,7 +496,7 @@ properties
496
496
  describe '#directories' do
497
497
  context 'given a collection' do
498
498
  let(:directories) { test_api_client.directories }
499
- let(:directory) { directories.create(build_directory) }
499
+ let(:directory) { directories.create(directory_attrs) }
500
500
 
501
501
  it 'returns the collection' do
502
502
  expect(directories).to be_kind_of(Stormpath::Resource::Collection)
@@ -507,8 +507,8 @@ properties
507
507
  end
508
508
 
509
509
  context 'given a collection with a limit' do
510
- let!(:directory_1) { test_api_client.directories.create(build_directory) }
511
- let!(:directory_2) { test_api_client.directories.create(build_directory) }
510
+ let!(:directory_1) { test_api_client.directories.create(directory_attrs) }
511
+ let!(:directory_2) { test_api_client.directories.create(directory_attrs) }
512
512
 
513
513
  after do
514
514
  directory_1.delete
@@ -522,7 +522,7 @@ properties
522
522
 
523
523
  describe '.create' do
524
524
  let(:directory) do
525
- test_api_client.directories.create(build_directory(name: 'ruby', description: 'ruby'))
525
+ test_api_client.directories.create(directory_attrs(name: 'ruby', description: 'ruby'))
526
526
  end
527
527
 
528
528
  it 'creates that application' do
@@ -538,7 +538,7 @@ properties
538
538
  describe '#organization' do
539
539
  context 'search' do
540
540
  let!(:organization) do
541
- test_api_client.organizations.create(build_organization(name: 'ruby-org'))
541
+ test_api_client.organizations.create(organization_attrs(name: 'ruby-org'))
542
542
  end
543
543
 
544
544
  context 'by any attribute' do
@@ -563,7 +563,7 @@ properties
563
563
  end
564
564
 
565
565
  context 'given a collection' do
566
- let(:organization) { test_api_client.organizations.create(build_organization) }
566
+ let(:organization) { test_api_client.organizations.create(organization_attrs) }
567
567
 
568
568
  it 'returns the collection' do
569
569
  expect(test_api_client.organizations).to be_kind_of(Stormpath::Resource::Collection)
@@ -574,8 +574,8 @@ properties
574
574
  end
575
575
 
576
576
  context 'given a collection with a limit' do
577
- let!(:organization_1) { test_api_client.organizations.create(build_organization) }
578
- let!(:organization_2) { test_api_client.organizations.create(build_organization) }
577
+ let!(:organization_1) { test_api_client.organizations.create(organization_attrs) }
578
+ let!(:organization_2) { test_api_client.organizations.create(organization_attrs) }
579
579
 
580
580
  after do
581
581
  organization_1.delete
@@ -589,7 +589,7 @@ properties
589
589
 
590
590
  describe '.create' do
591
591
  let(:organization) do
592
- test_api_client.organizations.create(build_organization(name: 'ruby',
592
+ test_api_client.organizations.create(organization_attrs(name: 'ruby',
593
593
  name_key: 'ruby-org',
594
594
  description: 'ruby-org'))
595
595
  end
@@ -606,8 +606,8 @@ properties
606
606
  end
607
607
 
608
608
  describe '#organization_account_store_mappings' do
609
- let(:organization) { test_api_client.organizations.create(build_organization) }
610
- let(:directory) { test_api_client.directories.create(build_directory) }
609
+ let(:organization) { test_api_client.organizations.create(organization_attrs) }
610
+ let(:directory) { test_api_client.directories.create(directory_attrs) }
611
611
 
612
612
  let(:organization_account_store_mappings) { map_organization_store(directory, organization) }
613
613
 
@@ -627,9 +627,9 @@ properties
627
627
 
628
628
  describe '#accounts.verify_account_email' do
629
629
  context 'given a verfication token of an account' do
630
- let(:application) { test_api_client.applications.create(build_application) }
630
+ let(:application) { test_api_client.applications.create(application_attrs) }
631
631
  let(:directory_with_verification) do
632
- test_api_client.directories.create(build_directory(description: 'verification enabled'))
632
+ test_api_client.directories.create(directory_attrs(description: 'verification enabled'))
633
633
  end
634
634
 
635
635
  before do
@@ -644,7 +644,7 @@ properties
644
644
  end
645
645
 
646
646
  let(:account) do
647
- directory_with_verification.create_account(Stormpath::Resource::Account.new(build_account))
647
+ directory_with_verification.create_account(Stormpath::Resource::Account.new(account_attrs))
648
648
  end
649
649
  let(:verification_token) { account.email_verification_token.token }
650
650
 
@@ -675,10 +675,10 @@ properties
675
675
  end
676
676
 
677
677
  let!(:account1) do
678
- directory1.accounts.create(build_account(email: 'jekyll', username: 'jekyll'))
678
+ directory1.accounts.create(account_attrs(email: 'jekyll', username: 'jekyll'))
679
679
  end
680
680
  let!(:account2) do
681
- directory2.accounts.create(build_account(email: 'hyde', username: 'hyde'))
681
+ directory2.accounts.create(account_attrs(email: 'hyde', username: 'hyde'))
682
682
  end
683
683
 
684
684
  let(:link_accounts) do
@@ -1,11 +1,11 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Stormpath::Oauth::AccessTokenAuthenticationResult, :vcr do
4
- let(:application) { test_api_client.applications.create(build_application) }
5
- let(:directory) { test_api_client.directories.create(build_directory) }
4
+ let(:application) { test_api_client.applications.create(application_attrs) }
5
+ let(:directory) { test_api_client.directories.create(directory_attrs) }
6
6
  before { map_account_store(application, directory, 1, true, false) }
7
7
  let!(:account) do
8
- application.accounts.create(build_account(email: 'ruby25', password: 'P@$$w0rd'))
8
+ application.accounts.create(account_attrs(email: 'ruby25', password: 'P@$$w0rd'))
9
9
  end
10
10
  let(:password_grant_request) do
11
11
  Stormpath::Oauth::PasswordGrantRequest.new("ruby25#{default_domain}", 'P@$$w0rd')
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Stormpath::Provider::Provider, :vcr do
4
- let(:application) { test_api_client.applications.create(build_application) }
4
+ let(:application) { test_api_client.applications.create(application_attrs) }
5
5
  let(:account_store_mapping) { map_account_store(application, directory, 0, false, false) }
6
6
  let(:directory) { test_api_client.directories.create(directory_hash) }
7
7
 
@@ -96,7 +96,7 @@ describe Stormpath::Provider::Provider, :vcr do
96
96
  it_behaves_like 'a provider directory'
97
97
 
98
98
  it 'should be able to retrieve provider data from a regular account' do
99
- account = directory.accounts.create(build_account)
99
+ account = directory.accounts.create(account_attrs)
100
100
 
101
101
  expect(account.provider_data).to be_kind_of(Stormpath::Provider::ProviderData)
102
102
  expect(account.provider_data.provider_id).to eq(provider_id)
@@ -2,8 +2,8 @@ require 'spec_helper'
2
2
 
3
3
  describe Stormpath::Resource::AccountCreationPolicy, :vcr do
4
4
  describe 'instances should respond to attribute property methods' do
5
- let(:application) { test_api_client.applications.create(build_application) }
6
- let(:directory) { test_api_client.directories.create(build_directory) }
5
+ let(:application) { test_api_client.applications.create(application_attrs) }
6
+ let(:directory) { test_api_client.directories.create(directory_attrs) }
7
7
  let(:account_creation_policy) { directory.account_creation_policy }
8
8
  let(:create_valid_account) do
9
9
  directory.accounts.create(
@@ -17,10 +17,10 @@ describe Stormpath::Resource::AccountLink, :vcr do
17
17
  end
18
18
 
19
19
  let!(:account1) do
20
- directory1.accounts.create(build_account(email: 'jekyll', username: 'jekyll'))
20
+ directory1.accounts.create(account_attrs(email: 'jekyll', username: 'jekyll'))
21
21
  end
22
22
  let!(:account2) do
23
- directory2.accounts.create(build_account(email: 'hyde', username: 'hyde'))
23
+ directory2.accounts.create(account_attrs(email: 'hyde', username: 'hyde'))
24
24
  end
25
25
 
26
26
  let!(:account_link) do
@@ -2,9 +2,9 @@ require 'spec_helper'
2
2
 
3
3
  describe Stormpath::Resource::Account, :vcr do
4
4
  describe 'instances should respond to attribute property methods' do
5
- let(:directory) { test_api_client.directories.create(build_directory) }
5
+ let(:directory) { test_api_client.directories.create(directory_attrs) }
6
6
  let(:account) do
7
- directory.accounts.create(build_account(email: 'ruby',
7
+ directory.accounts.create(account_attrs(email: 'ruby',
8
8
  given_name: 'ruby',
9
9
  surname: 'ruby',
10
10
  middle_name: 'ruby'))
@@ -39,13 +39,15 @@ describe Stormpath::Resource::Account, :vcr do
39
39
  expect(account.groups).to be_a Stormpath::Resource::Collection
40
40
  expect(account.group_memberships).to be_a Stormpath::Resource::Collection
41
41
  expect(account.applications).to be_a Stormpath::Resource::Collection
42
+ expect(account.phones).to be_a Stormpath::Resource::Collection
43
+ expect(account.factors).to be_a Stormpath::Resource::Collection
42
44
  end
43
45
  end
44
46
 
45
47
  describe 'account_associations' do
46
- let(:application) { test_api_client.applications.create(build_application) }
47
- let(:directory) { test_api_client.directories.create(build_directory) }
48
- let(:account) { directory.accounts.create(build_account) }
48
+ let(:application) { test_api_client.applications.create(application_attrs) }
49
+ let(:directory) { test_api_client.directories.create(directory_attrs) }
50
+ let(:account) { directory.accounts.create(account_attrs) }
49
51
  before { map_account_store(application, directory, 1, true, true) }
50
52
 
51
53
  it 'should belong_to directory' do
@@ -62,7 +64,7 @@ describe Stormpath::Resource::Account, :vcr do
62
64
  end
63
65
 
64
66
  describe 'linked accounts' do
65
- let(:directory2) { test_api_client.directories.create(build_directory) }
67
+ let(:directory2) { test_api_client.directories.create(directory_attrs) }
66
68
  before do
67
69
  map_account_store(application, directory2, 2, false, false)
68
70
  account
@@ -70,7 +72,7 @@ describe Stormpath::Resource::Account, :vcr do
70
72
 
71
73
  after { directory2.delete }
72
74
 
73
- let!(:account2) { directory2.accounts.create(build_account) }
75
+ let!(:account2) { directory2.accounts.create(account_attrs) }
74
76
  let!(:link_accounts) do
75
77
  test_api_client.account_links.create(
76
78
  left_account: {
@@ -97,9 +99,9 @@ describe Stormpath::Resource::Account, :vcr do
97
99
 
98
100
  describe '#add_or_remove_group' do
99
101
  context 'given a group' do
100
- let(:directory) { test_api_client.directories.create(build_directory) }
101
- let(:group) { directory.groups.create(build_group) }
102
- let(:account) { directory.accounts.create(build_account) }
102
+ let(:directory) { test_api_client.directories.create(directory_attrs) }
103
+ let(:group) { directory.groups.create(group_attrs) }
104
+ let(:account) { directory.accounts.create(account_attrs) }
103
105
  before { account.add_group(group) }
104
106
 
105
107
  after do
@@ -126,10 +128,192 @@ describe Stormpath::Resource::Account, :vcr do
126
128
  end
127
129
  end
128
130
 
131
+ describe 'managing phones' do
132
+ let(:application) { test_api_client.applications.create(application_attrs) }
133
+ let(:directory) { test_api_client.directories.create(directory_attrs) }
134
+
135
+ before do
136
+ map_account_store(application, directory, 1, true, true)
137
+ phone
138
+ end
139
+
140
+ let(:account) { directory.accounts.create(account_attrs) }
141
+ let(:phone) do
142
+ account.phones.create(
143
+ number: '+12025550173',
144
+ name: 'test phone',
145
+ description: 'this is a testing phone number'
146
+ )
147
+ end
148
+
149
+ it 'can fetch phones' do
150
+ expect(account.phones).to include(phone)
151
+ end
152
+
153
+ it 'can fetch a specific phone' do
154
+ expect(account.phones.get(phone.href)).to be_a Stormpath::Resource::Phone
155
+ end
156
+
157
+ it 'raises error if phone with same number created' do
158
+ expect do
159
+ account.phones.create(
160
+ number: '+12025550173',
161
+ name: 'test duplicate phone'
162
+ )
163
+ end.to raise_error(Stormpath::Error, 'An existing phone with that number already exists for this Account.')
164
+ end
165
+
166
+ after do
167
+ application.delete if application
168
+ directory.delete if directory
169
+ account.delete if account
170
+ end
171
+ end
172
+
173
+ describe 'managing factors' do
174
+ let(:application) { test_api_client.applications.create(application_attrs) }
175
+ let(:directory) { test_api_client.directories.create(directory_attrs) }
176
+
177
+ before { map_account_store(application, directory, 1, true, true) }
178
+
179
+ let(:account) { directory.accounts.create(account_attrs) }
180
+
181
+ context 'sms type' do
182
+ let!(:factor) do
183
+ account.factors.create(
184
+ type: 'SMS',
185
+ phone: {
186
+ number: '+12025550173',
187
+ name: 'test phone',
188
+ description: 'this is a testing phone number'
189
+ }
190
+ )
191
+ end
192
+
193
+ it 'can fetch factors' do
194
+ expect(account.factors).to include(factor)
195
+ end
196
+
197
+ it 'can fetch a specific factor' do
198
+ expect(account.factors.get(factor.href)).to be_a Stormpath::Resource::Factor
199
+ end
200
+
201
+ it 'creates a phone with a factor' do
202
+ expect(account.phones.count).to eq 1
203
+ end
204
+ end
205
+
206
+ context 'google-authenticator type' do
207
+ let!(:factor) do
208
+ account.factors.create(
209
+ type: 'google-authenticator',
210
+ account_name: "marko.cilimkovic#{default_domain}",
211
+ issuer: 'ACME',
212
+ status: 'ENABLED'
213
+ )
214
+ end
215
+
216
+ it 'can fetch factors' do
217
+ expect(account.factors).to include(factor)
218
+ end
219
+ end
220
+
221
+ after do
222
+ directory.delete if directory
223
+ application.delete if application
224
+ end
225
+ end
226
+
227
+ describe '#create_factor' do
228
+ let(:application) { test_api_client.applications.create(application_attrs) }
229
+ let(:directory) { test_api_client.directories.create(directory_attrs) }
230
+ let(:account) { directory.accounts.create(account_attrs) }
231
+ before { map_account_store(application, directory, 1, true, true) }
232
+
233
+ context 'type sms' do
234
+ before do
235
+ stub_request(:post, "#{account.href}/factors?challenge=true")
236
+ .to_return(body: Stormpath::Test.mocked_factor_response)
237
+ end
238
+
239
+ let(:factor) do
240
+ account.create_factor(:sms,
241
+ phone: { number: '+12025550173',
242
+ name: 'Rspec test phone',
243
+ description: 'This is a testing phone number' },
244
+ challenge: { message: 'Enter code please: ' })
245
+ end
246
+
247
+ it 'factor should be created' do
248
+ expect(factor).to be_kind_of Stormpath::Resource::Factor
249
+ end
250
+ end
251
+
252
+ context 'type google-authenticator' do
253
+ let(:factor) do
254
+ account.create_factor(:google_authenticator, options)
255
+ end
256
+
257
+ context 'with account_name' do
258
+ let(:account_name) { "marko.cilimkovic#{default_domain}" }
259
+ let(:options) do
260
+ {
261
+ custom_options: {
262
+ account_name: account_name,
263
+ issuer: 'ACME',
264
+ status: 'ENABLED'
265
+ }
266
+ }
267
+ end
268
+
269
+ it 'should create factor with custom account_name' do
270
+ expect(factor.account_name).to eq account_name
271
+ end
272
+ end
273
+
274
+ context 'with account_name not set' do
275
+ let(:options) do
276
+ {
277
+ custom_options: {
278
+ issuer: 'ACME',
279
+ status: 'ENABLED'
280
+ }
281
+ }
282
+ end
283
+
284
+ it 'should create factor with account_name set to username' do
285
+ expect(factor.account_name).to eq account.username
286
+ end
287
+ end
288
+
289
+ context 'without custom options' do
290
+ let(:options) { {} }
291
+ it 'should create factor with account_name set to username' do
292
+ expect(factor.account_name).to eq account.username
293
+ end
294
+ end
295
+ end
296
+
297
+ context 'with bad type set' do
298
+ let(:factor) do
299
+ account.create_factor(:invalid_type)
300
+ end
301
+
302
+ it 'should raise error' do
303
+ expect { factor }.to raise_error(Stormpath::Error)
304
+ end
305
+ end
306
+
307
+ after do
308
+ directory.delete if directory
309
+ application.delete if application
310
+ end
311
+ end
312
+
129
313
  describe '#save' do
130
314
  context 'when property values have changed' do
131
- let(:directory) { test_api_client.directories.create(build_directory) }
132
- let(:account) { directory.accounts.create(build_account) }
315
+ let(:directory) { test_api_client.directories.create(directory_attrs) }
316
+ let(:account) { directory.accounts.create(account_attrs) }
133
317
  let(:account_uri) { account.href }
134
318
  let(:new_surname) { 'NewSurname' }
135
319
  let(:reloaded_account) { test_api_client.accounts.get(account_uri) }