stormpath-sdk 1.6.0 → 1.7.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.
Files changed (147) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +21 -0
  3. data/CHANGES.md +11 -0
  4. data/README.md +23 -25
  5. data/lib/stormpath-sdk.rb +11 -2
  6. data/lib/stormpath-sdk/api_key.rb +0 -1
  7. data/lib/stormpath-sdk/auth/basic_authenticator.rb +7 -7
  8. data/lib/stormpath-sdk/auth/basic_login_attempt.rb +7 -11
  9. data/lib/stormpath-sdk/auth/create_factor.rb +1 -1
  10. data/lib/stormpath-sdk/auth/register_service_provider.rb +41 -0
  11. data/lib/stormpath-sdk/auth/username_password_request.rb +3 -5
  12. data/lib/stormpath-sdk/cache/cache.rb +3 -3
  13. data/lib/stormpath-sdk/cache/cache_entry.rb +2 -2
  14. data/lib/stormpath-sdk/cache/cache_manager.rb +3 -4
  15. data/lib/stormpath-sdk/cache/cache_stats.rb +1 -3
  16. data/lib/stormpath-sdk/cache/disabled_cache_store.rb +5 -8
  17. data/lib/stormpath-sdk/cache/memory_store.rb +1 -1
  18. data/lib/stormpath-sdk/cache/redis_store.rb +4 -4
  19. data/lib/stormpath-sdk/client.rb +35 -33
  20. data/lib/stormpath-sdk/data_store.rb +278 -257
  21. data/lib/stormpath-sdk/error.rb +18 -7
  22. data/lib/stormpath-sdk/http/authc/sauthc1_signer.rb +76 -82
  23. data/lib/stormpath-sdk/http/http_client_request_executor.rb +10 -8
  24. data/lib/stormpath-sdk/http/response.rb +5 -7
  25. data/lib/stormpath-sdk/id_site/id_site_result.rb +5 -6
  26. data/lib/stormpath-sdk/oauth/access_token_authentication_result.rb +5 -9
  27. data/lib/stormpath-sdk/oauth/authenticator.rb +2 -2
  28. data/lib/stormpath-sdk/oauth/error.rb +4 -4
  29. data/lib/stormpath-sdk/oauth/id_site_grant_request.rb +1 -1
  30. data/lib/stormpath-sdk/oauth/password_grant_request.rb +1 -1
  31. data/lib/stormpath-sdk/oauth/refresh_grant_request.rb +2 -2
  32. data/lib/stormpath-sdk/oauth/stormpath_grant_request.rb +2 -2
  33. data/lib/stormpath-sdk/provider/account_access.rb +0 -2
  34. data/lib/stormpath-sdk/provider/account_result.rb +1 -2
  35. data/lib/stormpath-sdk/provider/facebook/facebook_provider.rb +6 -2
  36. data/lib/stormpath-sdk/provider/facebook/facebook_provider_data.rb +7 -3
  37. data/lib/stormpath-sdk/provider/github/github_provider.rb +6 -2
  38. data/lib/stormpath-sdk/provider/github/github_provider_data.rb +6 -2
  39. data/lib/stormpath-sdk/provider/google/google_provider.rb +7 -3
  40. data/lib/stormpath-sdk/provider/google/google_provider_data.rb +6 -2
  41. data/lib/stormpath-sdk/provider/linkedin/linkedin_provider.rb +6 -2
  42. data/lib/stormpath-sdk/provider/linkedin/linkedin_provider_data.rb +6 -2
  43. data/lib/stormpath-sdk/provider/provider.rb +8 -4
  44. data/lib/stormpath-sdk/provider/provider_data.rb +6 -2
  45. data/lib/stormpath-sdk/provider/saml/saml_provider.rb +10 -4
  46. data/lib/stormpath-sdk/provider/saml/saml_provider_data.rb +6 -3
  47. data/lib/stormpath-sdk/provider/stormpath/stormpath_provider.rb +6 -2
  48. data/lib/stormpath-sdk/provider/stormpath/stormpath_provider_data.rb +6 -2
  49. data/lib/stormpath-sdk/provider/twitter/twitter_provider.rb +6 -2
  50. data/lib/stormpath-sdk/provider/twitter/twitter_provider_data.rb +6 -2
  51. data/lib/stormpath-sdk/resource/account.rb +46 -40
  52. data/lib/stormpath-sdk/resource/account_link.rb +9 -5
  53. data/lib/stormpath-sdk/resource/account_linking_policy.rb +8 -4
  54. data/lib/stormpath-sdk/resource/account_membership.rb +1 -1
  55. data/lib/stormpath-sdk/resource/account_overrides.rb +20 -16
  56. data/lib/stormpath-sdk/resource/account_store.rb +15 -11
  57. data/lib/stormpath-sdk/resource/account_store_mapping.rb +14 -13
  58. data/lib/stormpath-sdk/resource/application.rb +147 -136
  59. data/lib/stormpath-sdk/resource/application_web_config.rb +11 -7
  60. data/lib/stormpath-sdk/resource/associations.rb +36 -43
  61. data/lib/stormpath-sdk/resource/attribute_statement_mapping_rules.rb +8 -0
  62. data/lib/stormpath-sdk/resource/base.rb +201 -200
  63. data/lib/stormpath-sdk/resource/challenge.rb +12 -8
  64. data/lib/stormpath-sdk/resource/collection.rb +77 -76
  65. data/lib/stormpath-sdk/resource/custom_data.rb +60 -61
  66. data/lib/stormpath-sdk/resource/custom_data_hash_methods.rb +28 -25
  67. data/lib/stormpath-sdk/resource/custom_data_storage.rb +18 -16
  68. data/lib/stormpath-sdk/resource/directory.rb +37 -60
  69. data/lib/stormpath-sdk/resource/email_verification_token.rb +7 -3
  70. data/lib/stormpath-sdk/resource/error.rb +8 -4
  71. data/lib/stormpath-sdk/resource/expansion.rb +22 -20
  72. data/lib/stormpath-sdk/resource/factor.rb +12 -8
  73. data/lib/stormpath-sdk/resource/field.rb +8 -4
  74. data/lib/stormpath-sdk/resource/group.rb +21 -16
  75. data/lib/stormpath-sdk/resource/group_membership.rb +7 -5
  76. data/lib/stormpath-sdk/resource/instance.rb +10 -6
  77. data/lib/stormpath-sdk/resource/linked_account.rb +7 -3
  78. data/lib/stormpath-sdk/resource/oauth_policy.rb +7 -3
  79. data/lib/stormpath-sdk/resource/organization.rb +14 -10
  80. data/lib/stormpath-sdk/resource/organization_account_store_mapping.rb +8 -4
  81. data/lib/stormpath-sdk/resource/password_reset_token.rb +9 -5
  82. data/lib/stormpath-sdk/resource/phone.rb +8 -4
  83. data/lib/stormpath-sdk/resource/registered_saml_service_provider.rb +8 -0
  84. data/lib/stormpath-sdk/resource/saml_identity_provider.rb +14 -0
  85. data/lib/stormpath-sdk/resource/saml_identity_provider_metadata.rb +9 -0
  86. data/lib/stormpath-sdk/resource/saml_policy.rb +10 -0
  87. data/lib/stormpath-sdk/resource/saml_service_provider.rb +7 -0
  88. data/lib/stormpath-sdk/{provider/saml/saml_mapping_rules.rb → resource/saml_service_provider_metadata.rb} +6 -5
  89. data/lib/stormpath-sdk/resource/saml_service_provider_registration.rb +11 -0
  90. data/lib/stormpath-sdk/resource/schema.rb +8 -4
  91. data/lib/stormpath-sdk/resource/tenant.rb +11 -8
  92. data/lib/stormpath-sdk/resource/user_info_mapping_rules.rb +7 -3
  93. data/lib/stormpath-sdk/resource/utils.rb +7 -10
  94. data/lib/stormpath-sdk/resource/verification_email.rb +7 -3
  95. data/lib/stormpath-sdk/resource/x_509_certificate.rb +7 -0
  96. data/lib/stormpath-sdk/util/assert.rb +1 -3
  97. data/lib/stormpath-sdk/version.rb +2 -2
  98. data/spec/auth/basic_authenticator_spec.rb +28 -24
  99. data/spec/auth/register_service_provider_spec.rb +68 -0
  100. data/spec/auth/sauthc1_signer_spec.rb +8 -4
  101. data/spec/cache/cache_entry_spec.rb +28 -29
  102. data/spec/cache/cache_spec.rb +9 -9
  103. data/spec/cache/cache_stats_spec.rb +1 -1
  104. data/spec/client_spec.rb +63 -63
  105. data/spec/data_store_spec.rb +23 -14
  106. data/spec/oauth/access_token_authentication_result_spec.rb +8 -2
  107. data/spec/provider/account_resolver_spec.rb +6 -4
  108. data/spec/provider/provider_spec.rb +6 -6
  109. data/spec/resource/account_creation_policy_spec.rb +1 -1
  110. data/spec/resource/account_link_spec.rb +7 -15
  111. data/spec/resource/account_spec.rb +17 -17
  112. data/spec/resource/account_store_mapping_spec.rb +16 -22
  113. data/spec/resource/account_store_spec.rb +3 -3
  114. data/spec/resource/application_spec.rb +324 -330
  115. data/spec/resource/base_spec.rb +7 -31
  116. data/spec/resource/collection_spec.rb +63 -114
  117. data/spec/resource/custom_data_spec.rb +1 -1
  118. data/spec/resource/directory_spec.rb +91 -87
  119. data/spec/resource/expansion_spec.rb +10 -10
  120. data/spec/resource/factor_spec.rb +1 -1
  121. data/spec/resource/group_spec.rb +1 -1
  122. data/spec/resource/linked_account_spec.rb +7 -7
  123. data/spec/resource/organization_spec.rb +12 -11
  124. data/spec/resource/phone_spec.rb +1 -1
  125. data/spec/resource/registered_saml_service_provider_spec.rb +35 -0
  126. data/spec/resource/saml_identity_provider_metadata_spec.rb +27 -0
  127. data/spec/resource/saml_identity_provider_spec.rb +94 -0
  128. data/spec/resource/saml_policy_spec.rb +27 -0
  129. data/spec/resource/saml_service_provider_registration_spec.rb +58 -0
  130. data/spec/resource/saml_service_provider_spec.rb +19 -0
  131. data/spec/resource/status_spec.rb +4 -3
  132. data/spec/resource/tenant_spec.rb +4 -6
  133. data/spec/spec_helper.rb +1 -1
  134. data/spec/support/custom_data_save_period.rb +4 -0
  135. data/spec/support/custom_data_storage_behavior.rb +7 -8
  136. data/spec/support/mocked_provider_accounts.rb +101 -101
  137. data/spec/support/mocked_saml_responses.rb +130 -0
  138. data/spec/support/resource_factory.rb +4 -4
  139. data/spec/support/resource_helpers.rb +10 -4
  140. data/spec/support/resource_matchers.rb +4 -4
  141. data/spec/support/test_request_executor.rb +2 -2
  142. metadata +21 -8
  143. data/lib/stormpath-sdk/provider/saml/saml_provider_metadata.rb +0 -19
  144. data/spec/fixtures/response/create_saml_directory.json +0 -26
  145. data/spec/fixtures/response/create_saml_directory_mapping_rules.json +0 -12
  146. data/spec/fixtures/response/get_saml_directory_provider.json +0 -16
  147. data/spec/fixtures/response/get_saml_directory_provider_metadata.json +0 -12
@@ -6,13 +6,7 @@ describe Stormpath::Resource::Base do
6
6
  class TestResource < Stormpath::Resource::Base
7
7
  prop_accessor :username, :given_name
8
8
  end
9
-
10
- let(:resource) do
11
- TestResource.new({
12
- 'username' => 'bar',
13
- 'givenName' => 'foo'
14
- }, nil)
15
- end
9
+ let(:resource) { TestResource.new({ 'username' => 'bar', 'givenName' => 'foo' }, nil) }
16
10
 
17
11
  it 'generates a getter method for each property' do
18
12
  expect(resource.username).to eq('bar')
@@ -33,13 +27,7 @@ describe Stormpath::Resource::Base do
33
27
  class TestResource < Stormpath::Resource::Base
34
28
  prop_non_printable :password
35
29
  end
36
-
37
- let(:resource) do
38
- TestResource.new({
39
- 'username' => 'bar',
40
- 'password' => 'P@$$w0rd'
41
- }, nil)
42
- end
30
+ let(:resource) { TestResource.new({ 'username' => 'bar', 'password' => 'P@$$w0rd' }, nil) }
43
31
 
44
32
  it 'marks that property as not being printable' do
45
33
  expect(resource.inspect).to include('username')
@@ -70,14 +58,10 @@ describe Stormpath::Resource::Base do
70
58
  class TestResource < Stormpath::Resource::Base; end
71
59
 
72
60
  context 'compared against an object of the same class' do
73
- let(:resource) do
74
- TestResource.new('http://foo.com/test/123')
75
- end
61
+ let(:resource) { TestResource.new('http://foo.com/test/123') }
76
62
 
77
63
  context 'href matches' do
78
- let(:other) do
79
- TestResource.new('http://foo.com/test/123')
80
- end
64
+ let(:other) { TestResource.new('http://foo.com/test/123') }
81
65
 
82
66
  it 'passes' do
83
67
  expect(resource).to eq(other)
@@ -85,9 +69,7 @@ describe Stormpath::Resource::Base do
85
69
  end
86
70
 
87
71
  context 'href does not match' do
88
- let(:other) do
89
- TestResource.new('http://foo.com/test/456')
90
- end
72
+ let(:other) { TestResource.new('http://foo.com/test/456') }
91
73
 
92
74
  it 'fails' do
93
75
  expect(resource).to_not eq(other)
@@ -97,14 +79,8 @@ describe Stormpath::Resource::Base do
97
79
 
98
80
  context 'compared against an object of another class' do
99
81
  class NotAResource; end
100
-
101
- let(:resource) do
102
- TestResource.new('http://foo.com/test/123')
103
- end
104
-
105
- let(:other) do
106
- NotAResource.new
107
- end
82
+ let(:resource) { TestResource.new('http://foo.com/test/123') }
83
+ let(:other) { NotAResource.new }
108
84
 
109
85
  it 'fails' do
110
86
  expect(resource).to_not eq(other)
@@ -1,23 +1,13 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Stormpath::Resource::Collection, :vcr do
4
- let(:href) do
5
- 'http://example.com'
6
- end
7
-
8
- let(:item_class) do
9
- Stormpath::Resource::Application
10
- end
11
-
12
- let(:client) do
13
- Stormpath::Client
14
- end
4
+ let(:href) { 'http://example.com' }
5
+ let(:item_class) { Stormpath::Resource::Application }
6
+ let(:client) { Stormpath::Client }
15
7
 
16
8
  describe '#collection_href' do
17
9
  context 'by default' do
18
- let(:collection) do
19
- Stormpath::Resource::Collection.new href, item_class, client
20
- end
10
+ let(:collection) { Stormpath::Resource::Collection.new href, item_class, client }
21
11
 
22
12
  it 'defaults to href' do
23
13
  expect(collection.collection_href).to eq href
@@ -25,9 +15,7 @@ describe Stormpath::Resource::Collection, :vcr do
25
15
  end
26
16
 
27
17
  context 'when specified' do
28
- let(:collection_href) do
29
- 'http://fakie.com'
30
- end
18
+ let(:collection_href) { 'http://fakie.com' }
31
19
 
32
20
  let(:collection) do
33
21
  Stormpath::Resource::Collection.new(
@@ -43,13 +31,8 @@ describe Stormpath::Resource::Collection, :vcr do
43
31
  end
44
32
 
45
33
  describe '#offset' do
46
- let(:collection) do
47
- Stormpath::Resource::Collection.new href, item_class, client
48
- end
49
-
50
- let!(:offset) do
51
- collection.offset 5
52
- end
34
+ let(:collection) { Stormpath::Resource::Collection.new href, item_class, client }
35
+ let!(:offset) { collection.offset 5 }
53
36
 
54
37
  it 'returns the collection' do
55
38
  expect(offset.class).to eq Stormpath::Resource::Collection
@@ -61,13 +44,9 @@ describe Stormpath::Resource::Collection, :vcr do
61
44
  end
62
45
 
63
46
  describe '#limit' do
64
- let(:collection) do
65
- Stormpath::Resource::Collection.new href, item_class, client
66
- end
47
+ let(:collection) { Stormpath::Resource::Collection.new href, item_class, client }
67
48
 
68
- let!(:limit) do
69
- collection.limit 100
70
- end
49
+ let!(:limit) { collection.limit 100 }
71
50
 
72
51
  it 'returns the collection' do
73
52
  expect(limit.class).to eq Stormpath::Resource::Collection
@@ -79,17 +58,11 @@ describe Stormpath::Resource::Collection, :vcr do
79
58
  end
80
59
 
81
60
  describe '#order' do
82
- let(:collection) do
83
- Stormpath::Resource::Collection.new href, item_class, client
84
- end
61
+ let(:collection) { Stormpath::Resource::Collection.new href, item_class, client }
85
62
 
86
- let(:order_statement) do
87
- 'lastName asc,age desc'
88
- end
63
+ let(:order_statement) { 'lastName asc,age desc' }
89
64
 
90
- let!(:order) do
91
- collection.order order_statement
92
- end
65
+ let!(:order) { collection.order order_statement }
93
66
 
94
67
  it 'returns the collection' do
95
68
  expect(order.class).to eq Stormpath::Resource::Collection
@@ -101,18 +74,12 @@ describe Stormpath::Resource::Collection, :vcr do
101
74
  end
102
75
 
103
76
  describe '#search' do
104
- let(:collection) do
105
- Stormpath::Resource::Collection.new href, item_class, client
106
- end
77
+ let(:collection) { Stormpath::Resource::Collection.new href, item_class, client }
107
78
 
108
79
  context 'when passed a string' do
109
- let(:query) do
110
- 'dagnabbit'
111
- end
80
+ let(:query) { 'dagnabbit' }
112
81
 
113
- let!(:search) do
114
- collection.search query
115
- end
82
+ let!(:search) { collection.search query }
116
83
 
117
84
  it 'returns the collection' do
118
85
  expect(search.class).to eq Stormpath::Resource::Collection
@@ -124,13 +91,8 @@ describe Stormpath::Resource::Collection, :vcr do
124
91
  end
125
92
 
126
93
  context 'when passed a hash of attributes' do
127
- let(:query_hash) do
128
- { name: 'Stanley Kubrick', description: 'That dude was a sick maniac' }
129
- end
130
-
131
- let!(:search) do
132
- collection.search query_hash
133
- end
94
+ let(:query_hash) { { name: 'Stanley Kubrick', description: 'That dude was a sick maniac' } }
95
+ let!(:search) { collection.search query_hash }
134
96
 
135
97
  it 'returns the collection' do
136
98
  expect(search.class).to eq Stormpath::Resource::Collection
@@ -143,9 +105,7 @@ describe Stormpath::Resource::Collection, :vcr do
143
105
  end
144
106
 
145
107
  describe '#criteria' do
146
- let(:collection) do
147
- Stormpath::Resource::Collection.new href, item_class, client
148
- end
108
+ let(:collection) { Stormpath::Resource::Collection.new href, item_class, client }
149
109
 
150
110
  context 'when no fetch criteria present' do
151
111
  it 'returns an empty hash for criteria' do
@@ -173,13 +133,11 @@ describe Stormpath::Resource::Collection, :vcr do
173
133
 
174
134
  let(:groups) do
175
135
  ('A'..'Z').map do |letter|
176
- directory.groups.create name: "#{letter}. pagination testing group "
136
+ directory.groups.create(name: "#{letter}. pagination testing group ")
177
137
  end
178
138
  end
179
139
 
180
- after do
181
- directory.delete
182
- end
140
+ after { directory.delete }
183
141
 
184
142
  it 'should respond as expected with or without limits' do
185
143
  expect(groups.count).to eq(26)
@@ -212,21 +170,14 @@ describe Stormpath::Resource::Collection, :vcr do
212
170
 
213
171
  context 'testing limits and offsets with name checking' do
214
172
  let(:directory) { test_api_client.directories.create(directory_attrs) }
173
+ let!(:groups) { ('1'..'100').map { |number| directory.groups.create(name: number) } }
215
174
 
216
- let!(:groups) do
217
- ('1'..'100').map do |number|
218
- directory.groups.create name: number
219
- end
220
- end
221
-
222
- after do
223
- directory.delete
224
- end
175
+ after { directory.delete }
225
176
 
226
177
  it 'should paginate properly' do
227
178
  expect(directory.groups.count).to eq(100)
228
179
 
229
- expect(directory.groups.map {|group| group.name }).to eq(('1'..'100').to_a.sort)
180
+ expect(directory.groups.map(&:name)).to eq(('1'..'100').to_a.sort)
230
181
 
231
182
  expect(directory.groups.limit(30).count).to eq(100)
232
183
 
@@ -244,23 +195,23 @@ describe Stormpath::Resource::Collection, :vcr do
244
195
 
245
196
  expect(directory.groups.limit(30).offset(90).current_page.size).to eq(100)
246
197
 
247
- expect(directory.groups.limit(30).map {|group| group.name }).to eq(('1'..'100').to_a.sort)
198
+ expect(directory.groups.limit(30).map(&:name)).to eq(('1'..'100').to_a.sort)
248
199
 
249
- expect(directory.groups.limit(30).current_page.items.map {|group| group.name }).to eq(('1'..'100').to_a.sort.first(30))
200
+ expect(directory.groups.limit(30).current_page.items.map(&:name)).to eq(('1'..'100').to_a.sort.first(30))
250
201
 
251
- expect(directory.groups.limit(30).offset(30).map {|group| group.name }).to eq(('1'..'100').to_a.sort.drop(30))
202
+ expect(directory.groups.limit(30).offset(30).map(&:name)).to eq(('1'..'100').to_a.sort.drop(30))
252
203
 
253
- expect(directory.groups.limit(30).offset(30).current_page.items.map {|group| group.name }).to eq(('1'..'100').to_a.sort.drop(30).first(30))
204
+ expect(directory.groups.limit(30).offset(30).current_page.items.map(&:name)).to eq(('1'..'100').to_a.sort.drop(30).first(30))
254
205
 
255
- expect(directory.groups.limit(30).offset(60).map {|group| group.name }).to eq(('1'..'100').to_a.sort.drop(60))
206
+ expect(directory.groups.limit(30).offset(60).map(&:name)).to eq(('1'..'100').to_a.sort.drop(60))
256
207
 
257
- expect(directory.groups.limit(30).offset(60).current_page.items.map {|group| group.name }).to eq(('1'..'100').to_a.sort.drop(60).first(30))
208
+ expect(directory.groups.limit(30).offset(60).current_page.items.map(&:name)).to eq(('1'..'100').to_a.sort.drop(60).first(30))
258
209
 
259
- expect(directory.groups.limit(30).offset(90).map {|group| group.name }).to eq(('1'..'100').to_a.sort.drop(90))
210
+ expect(directory.groups.limit(30).offset(90).map(&:name)).to eq(('1'..'100').to_a.sort.drop(90))
260
211
 
261
- expect(directory.groups.limit(30).offset(90).current_page.items.map {|group| group.name }).to eq(('1'..'100').to_a.sort.drop(90).first(30))
212
+ expect(directory.groups.limit(30).offset(90).current_page.items.map(&:name)).to eq(('1'..'100').to_a.sort.drop(90).first(30))
262
213
 
263
- expect(directory.groups.limit(30).offset(90).current_page.items.map {|group| group.name }).to eq(('1'..'100').to_a.sort.drop(90).first(10))
214
+ expect(directory.groups.limit(30).offset(90).current_page.items.map(&:name)).to eq(('1'..'100').to_a.sort.drop(90).first(10))
264
215
 
265
216
  group_count = 0
266
217
  directory.groups.each do |group|
@@ -280,16 +231,16 @@ describe Stormpath::Resource::Collection, :vcr do
280
231
  let(:username) { 'jlpicard/!@$%^ *()_-+=?><]}[{' }
281
232
 
282
233
  let!(:account) do
283
- directory.accounts.create username: username,
284
- email: "captain#{default_domain}",
285
- givenName: "Jean-Luc",
286
- surname: "Picard",
287
- password: "hakunaMatata179Enterprise"
234
+ directory.accounts.create(
235
+ username: username,
236
+ email: "captain#{default_domain}",
237
+ givenName: 'Jean-Luc',
238
+ surname: 'Picard',
239
+ password: 'hakunaMatata179Enterprise'
240
+ )
288
241
  end
289
242
 
290
- after do
291
- directory.delete
292
- end
243
+ after { directory.delete }
293
244
 
294
245
  it 'should search accounts by username' do
295
246
  expect(directory.accounts.search(username: username).count).to eq(1)
@@ -312,27 +263,27 @@ describe Stormpath::Resource::Collection, :vcr do
312
263
  let(:directory) { test_api_client.directories.create(directory_attrs) }
313
264
 
314
265
  let!(:account) do
315
- directory.accounts.create username: "jlpicard",
316
- email: "captain#{default_domain}",
317
- givenName: "Jean-Luc",
318
- surname: "Picard",
319
- password: "hakunaMatata179Enterprise"
266
+ directory.accounts.create(
267
+ username: 'jlpicard',
268
+ email: "captain#{default_domain}",
269
+ givenName: 'Jean-Luc',
270
+ surname: 'Picard',
271
+ password: 'hakunaMatata179Enterprise'
272
+ )
320
273
  end
321
274
 
322
- after do
323
- directory.delete
324
- end
275
+ after { directory.delete }
325
276
 
326
277
  it 'should search accounts by username with asterisk at the beginning' do
327
- expect(directory.accounts.search(username: "*card").count).to eq(1)
278
+ expect(directory.accounts.search(username: '*card').count).to eq(1)
328
279
  end
329
280
 
330
281
  it 'should search accounts by username with asterisk at the end' do
331
- expect(directory.accounts.search(username: "jl*").count).to eq(1)
282
+ expect(directory.accounts.search(username: 'jl*').count).to eq(1)
332
283
  end
333
284
 
334
285
  it 'should search accounts by username with asterisk at the beginning and the end' do
335
- expect(directory.accounts.search(username: "*pic*").count).to eq(1)
286
+ expect(directory.accounts.search(username: '*pic*').count).to eq(1)
336
287
  end
337
288
  end
338
289
 
@@ -340,27 +291,27 @@ describe Stormpath::Resource::Collection, :vcr do
340
291
  let(:directory) { test_api_client.directories.create(directory_attrs) }
341
292
 
342
293
  let!(:account) do
343
- directory.accounts.create username: "jlpicard",
344
- email: "captain#{default_domain}",
345
- givenName: "Jean-Luc",
346
- surname: "Picard",
347
- password: "hakunaMatata179Enterprise"
294
+ directory.accounts.create(
295
+ username: 'jlpicard',
296
+ email: "captain#{default_domain}",
297
+ givenName: 'Jean-Luc',
298
+ surname: 'Picard',
299
+ password: 'hakunaMatata179Enterprise'
300
+ )
348
301
  end
349
302
 
350
- after do
351
- directory.delete
352
- end
303
+ after { directory.delete }
353
304
 
354
305
  it 'should search accounts by username with asterisk at the beginning' do
355
- expect(directory.accounts.search(username: "*card", email: "*stormpath.com").count).to eq(1)
306
+ expect(directory.accounts.search(username: '*card', email: '*stormpath.com').count).to eq(1)
356
307
  end
357
308
 
358
309
  it 'should search accounts by username with asterisk at the end' do
359
- expect(directory.accounts.search(username: "jl*", email: "capt*").count).to eq(1)
310
+ expect(directory.accounts.search(username: 'jl*', email: 'capt*').count).to eq(1)
360
311
  end
361
312
 
362
313
  it 'should search accounts by username with asterisk at the beginning and the end' do
363
- expect(directory.accounts.search(username: "*pic*", email: "*stormpath*").count).to eq(1)
314
+ expect(directory.accounts.search(username: '*pic*', email: '*stormpath*').count).to eq(1)
364
315
  end
365
316
  end
366
317
 
@@ -387,9 +338,7 @@ describe Stormpath::Resource::Collection, :vcr do
387
338
  )
388
339
  end
389
340
 
390
- after do
391
- directory.delete
392
- end
341
+ after { directory.delete }
393
342
 
394
343
  context 'camelCase' do
395
344
  before do
@@ -14,7 +14,7 @@ describe Stormpath::Resource::CustomData, :vcr do
14
14
 
15
15
  context 'without caching regions' do
16
16
  let(:disabled_cache_client) do
17
- @disabled_cache_client ||= Stormpath::Client.new({api_key: test_api_key, cache: { store: Stormpath::Cache::DisabledCacheStore }})
17
+ @disabled_cache_client ||= Stormpath::Client.new(api_key: test_api_key, cache: { store: Stormpath::Cache::DisabledCacheStore })
18
18
  end
19
19
 
20
20
  let(:directory) { disabled_cache_client.directories.create(directory_attrs) }
@@ -220,7 +220,7 @@ describe Stormpath::Resource::Directory, :vcr do
220
220
  end
221
221
 
222
222
  it 'can authenticate with the account credentials' do
223
- auth_request = Stormpath::Authentication::UsernamePasswordRequest.new 'jlucpicard', 'qwerty'
223
+ auth_request = Stormpath::Authentication::UsernamePasswordRequest.new('jlucpicard', 'qwerty')
224
224
  auth_result = application.authenticate_account auth_request
225
225
 
226
226
  expect(auth_result).to be_a Stormpath::Authentication::AuthenticationResult
@@ -253,7 +253,7 @@ describe Stormpath::Resource::Directory, :vcr do
253
253
  end
254
254
 
255
255
  it 'can authenticate with the account credentials' do
256
- auth_request = Stormpath::Authentication::UsernamePasswordRequest.new 'jlucpicard', 'testing12'
256
+ auth_request = Stormpath::Authentication::UsernamePasswordRequest.new('jlucpicard', 'testing12')
257
257
  auth_result = application.authenticate_account auth_request
258
258
 
259
259
  expect(auth_result).to be_a Stormpath::Authentication::AuthenticationResult
@@ -286,7 +286,7 @@ describe Stormpath::Resource::Directory, :vcr do
286
286
  end
287
287
 
288
288
  it 'can authenticate with the account credentials' do
289
- auth_request = Stormpath::Authentication::UsernamePasswordRequest.new 'jlucpicard', 'NotSecure'
289
+ auth_request = Stormpath::Authentication::UsernamePasswordRequest.new('jlucpicard', 'NotSecure')
290
290
  auth_result = application.authenticate_account auth_request
291
291
 
292
292
  expect(auth_result).to be_a Stormpath::Authentication::AuthenticationResult
@@ -311,9 +311,14 @@ describe Stormpath::Resource::Directory, :vcr do
311
311
  end
312
312
 
313
313
  describe '#create_directory_with_custom_data' do
314
+ let(:directory_name) { "rubysdkdir-#{random_number}" }
314
315
  let(:directory) do
315
- test_api_client.directories.create(directory_attrs(name: 'rubysdkdir',
316
- description: 'rubysdkdir desc'))
316
+ test_api_client.directories.create(
317
+ directory_attrs(
318
+ name: directory_name,
319
+ description: directory_name
320
+ )
321
+ )
317
322
  end
318
323
 
319
324
  after { directory.delete }
@@ -322,24 +327,26 @@ describe Stormpath::Resource::Directory, :vcr do
322
327
  directory.custom_data['category'] = 'classified'
323
328
 
324
329
  directory.save
325
- expect(directory.name).to eq('rubysdkdir')
326
- expect(directory.description).to eq('rubysdkdir desc')
330
+ expect(directory.name).to eq(directory_name)
331
+ expect(directory.description).to eq(directory_name)
327
332
  expect(directory.custom_data['category']).to eq('classified')
328
333
  end
329
334
  end
330
335
 
331
336
  describe 'create directory with provider data' do
337
+ let(:directory_name) { "rubysdkdirprovider-#{random_number}" }
338
+
332
339
  context 'valida data' do
333
340
  let(:directory) do
334
341
  test_api_client.directories.create(
335
- name: 'rubysdkdir',
336
- description: 'description_for_some_test_directory',
342
+ name: directory_name,
343
+ description: directory_name,
337
344
  provider: {
338
- provider_id: "saml",
339
- sso_login_url:"https://yourIdp.com/saml2/sso/login",
340
- sso_logout_url:"https://yourIdp.com/saml2/sso/logout",
341
- encoded_x509_signing_cert:"-----BEGIN CERTIFICATE-----\n...Certificate goes here...\n-----END CERTIFICATE-----",
342
- request_signature_algorithm:"RSA-SHA256"
345
+ provider_id: 'saml',
346
+ sso_login_url: 'https://yourIdp.com/saml2/sso/login',
347
+ sso_logout_url: 'https://yourIdp.com/saml2/sso/logout',
348
+ encoded_x509_signing_cert: "-----BEGIN CERTIFICATE-----\n...Certificate goes here...\n-----END CERTIFICATE-----",
349
+ request_signature_algorithm: 'RSA-SHA256'
343
350
  }
344
351
  )
345
352
  end
@@ -349,17 +356,17 @@ describe Stormpath::Resource::Directory, :vcr do
349
356
  end
350
357
 
351
358
  it 'creates the directory with provider data' do
352
- stub_request(:post, "https://api.stormpath.com/v1/directories").
353
- to_return(status:200, body: fixture('create_saml_directory.json'), headers:{})
359
+ stub_request(:post, 'https://api.stormpath.com/v1/directories')
360
+ .to_return(status: 200, body: Stormpath::Test.mocked_create_saml_directory)
354
361
 
355
- stub_request(:get, directory.href + "/provider").
356
- to_return(status: 200, body: fixture('get_saml_directory_provider.json'), headers:{})
362
+ stub_request(:get, directory.href + '/provider')
363
+ .to_return(status: 200, body: Stormpath::Test.mocked_saml_directory_provider_response)
357
364
 
358
365
  directory
359
- expect(directory.provider.provider_id).to eq("saml")
360
- expect(directory.provider.sso_login_url).to eq("https://yourIdp.com/saml2/sso/login")
361
- expect(directory.provider.sso_logout_url).to eq("https://yourIdp.com/saml2/sso/logout")
362
- expect(directory.provider.request_signature_algorithm).to eq("RSA-SHA256")
366
+ expect(directory.provider.provider_id).to eq('saml')
367
+ expect(directory.provider.sso_login_url).to eq('https://yourIdp.com/saml2/sso/login')
368
+ expect(directory.provider.sso_logout_url).to eq('https://yourIdp.com/saml2/sso/logout')
369
+ expect(directory.provider.request_signature_algorithm).to eq('RSA-SHA256')
363
370
  end
364
371
  end
365
372
 
@@ -367,14 +374,14 @@ describe Stormpath::Resource::Directory, :vcr do
367
374
  it 'raises Stormpath::Error' do
368
375
  expect do
369
376
  test_api_client.directories.create(
370
- name: 'rubysdkdir',
371
- description: 'description_for_some_test_directory',
377
+ name: directory_name,
378
+ description: directory_name,
372
379
  provider: {
373
- provider_id: "saml",
374
- sso_login_url:"",
375
- sso_logout_url:"",
376
- encoded_x509_signing_cert:"",
377
- request_signature_algorithm:"RSA-SHA256"
380
+ provider_id: 'saml',
381
+ sso_login_url: '',
382
+ sso_logout_url: '',
383
+ encoded_x509_signing_cert: '',
384
+ request_signature_algorithm: 'RSA-SHA256'
378
385
  }
379
386
  )
380
387
  end.to raise_error Stormpath::Error
@@ -383,16 +390,17 @@ describe Stormpath::Resource::Directory, :vcr do
383
390
  end
384
391
 
385
392
  describe 'saml #provider' do
393
+ let(:directory_name) { "rubysdkdirsaml-#{random_number}" }
386
394
  let(:directory) do
387
395
  test_api_client.directories.create(
388
- name: 'rubysdkdir',
389
- description: 'description_for_some_test_directory',
396
+ name: directory_name,
397
+ description: directory_name,
390
398
  provider: {
391
- provider_id: "saml",
392
- sso_login_url:"https://yourIdp.com/saml2/sso/login",
393
- sso_logout_url:"https://yourIdp.com/saml2/sso/logout",
394
- encoded_x509_signing_cert:"-----BEGIN CERTIFICATE-----\n...Certificate goes here...\n-----END CERTIFICATE-----",
395
- request_signature_algorithm:"RSA-SHA256"
399
+ provider_id: 'saml',
400
+ sso_login_url: 'https://yourIdp.com/saml2/sso/login',
401
+ sso_logout_url: 'https://yourIdp.com/saml2/sso/logout',
402
+ encoded_x509_signing_cert: "-----BEGIN CERTIFICATE-----\n...Certificate goes here...\n-----END CERTIFICATE-----",
403
+ request_signature_algorithm: 'RSA-SHA256'
396
404
  }
397
405
  )
398
406
  end
@@ -402,33 +410,34 @@ describe Stormpath::Resource::Directory, :vcr do
402
410
  end
403
411
 
404
412
  it 'returnes provider data' do
405
- stub_request(:post, "https://api.stormpath.com/v1/directories").
406
- to_return(status:200, body: fixture('create_saml_directory.json'), headers:{})
413
+ stub_request(:post, 'https://api.stormpath.com/v1/directories')
414
+ .to_return(status: 200, body: Stormpath::Test.mocked_create_saml_directory)
407
415
 
408
- stub_request(:get, directory.href + "/provider").
409
- to_return(status: 200, body: fixture('get_saml_directory_provider.json'), headers:{})
416
+ stub_request(:get, directory.href + '/provider')
417
+ .to_return(status: 200, body: Stormpath::Test.mocked_saml_directory_provider_response)
410
418
 
411
419
  directory
412
420
  expect(directory.provider.href).not_to be_empty
413
- expect(directory.provider.provider_id).to eq("saml")
414
- expect(directory.provider.sso_login_url).to eq("https://yourIdp.com/saml2/sso/login")
415
- expect(directory.provider.sso_logout_url).to eq("https://yourIdp.com/saml2/sso/logout")
421
+ expect(directory.provider.provider_id).to eq('saml')
422
+ expect(directory.provider.sso_login_url).to eq('https://yourIdp.com/saml2/sso/login')
423
+ expect(directory.provider.sso_logout_url).to eq('https://yourIdp.com/saml2/sso/logout')
416
424
  expect(directory.provider.encoded_x509_signing_cert).not_to be_empty
417
- expect(directory.provider.request_signature_algorithm).to eq("RSA-SHA256")
425
+ expect(directory.provider.request_signature_algorithm).to eq('RSA-SHA256')
418
426
  end
419
427
  end
420
428
 
421
- describe 'saml #provider_metadata' do
429
+ describe 'saml #service_provider_metadata' do
430
+ let(:directory_name) { "rubysdkdirsaml-#{random_number}" }
422
431
  let(:directory) do
423
432
  test_api_client.directories.create(
424
- name: 'rubysdkdir',
433
+ name: directory_name,
425
434
  description: 'description_for_some_test_directory',
426
435
  provider: {
427
- provider_id: "saml",
428
- sso_login_url:"https://yourIdp.com/saml2/sso/login",
429
- sso_logout_url:"https://yourIdp.com/saml2/sso/logout",
430
- encoded_x509_signing_cert:"-----BEGIN CERTIFICATE-----\n...Certificate goes here...\n-----END CERTIFICATE-----",
431
- request_signature_algorithm:"RSA-SHA256"
436
+ provider_id: 'saml',
437
+ sso_login_url: 'https://yourIdp.com/saml2/sso/login',
438
+ sso_logout_url: 'https://yourIdp.com/saml2/sso/logout',
439
+ encoded_x509_signing_cert: "-----BEGIN CERTIFICATE-----\n...Certificate goes here...\n-----END CERTIFICATE-----",
440
+ request_signature_algorithm: 'RSA-SHA256'
432
441
  }
433
442
  )
434
443
  end
@@ -437,34 +446,35 @@ describe Stormpath::Resource::Directory, :vcr do
437
446
  directory.delete if directory
438
447
  end
439
448
 
440
- it 'returnes provider metadata' do
441
- stub_request(:post, "https://api.stormpath.com/v1/directories").
442
- to_return(status:200, body: fixture('create_saml_directory.json'), headers:{})
449
+ it 'returnes service provider metadata' do
450
+ stub_request(:post, 'https://api.stormpath.com/v1/directories')
451
+ .to_return(status: 200, body: Stormpath::Test.mocked_create_saml_directory)
443
452
 
444
- stub_request(:get, directory.href + "/provider").
445
- to_return(status: 200, body: fixture('get_saml_directory_provider.json'), headers:{})
453
+ stub_request(:get, directory.href + '/provider')
454
+ .to_return(status: 200, body: Stormpath::Test.mocked_saml_directory_provider_response)
455
+ stub_request(:get, directory.service_provider_metadata.href)
456
+ .to_return(body: Stormpath::Test.mocked_saml_directory_provider_metadata_response, status: 200)
446
457
 
447
- stub_request(:get, directory.provider.service_provider_metadata["href"]).
448
- to_return(status: 200, body: fixture('get_saml_directory_provider_metadata.json'), headers: {})
449
-
450
- expect(directory.provider_metadata.href).not_to be_empty
451
- expect(directory.provider_metadata.entity_id).not_to be_empty
452
- expect(directory.provider_metadata.assertion_consumer_service_post_endpoint).not_to be_empty
453
- expect(directory.provider_metadata.x509_signing_cert).not_to be_empty
458
+ expect(directory.service_provider_metadata.href).not_to be_empty
459
+ expect(directory.service_provider_metadata.entity_id).not_to be_empty
460
+ expect(directory.service_provider_metadata.assertion_consumer_service_post_endpoint).not_to be_empty
461
+ expect(directory.service_provider_metadata.x509_signing_cert).not_to be_empty
454
462
  end
455
463
  end
456
464
 
457
465
  describe 'saml mapping rules' do
466
+ let(:directory_name) { "rubysdkdirsaml-#{random_number}" }
467
+ let(:rule) { { 'name' => 'email', 'accountAttributes' => ['email'] } }
458
468
  let(:directory) do
459
469
  test_api_client.directories.create(
460
- name: 'rubysdkdir',
470
+ name: directory_name,
461
471
  description: 'description_for_some_test_directory',
462
472
  provider: {
463
- provider_id: "saml",
464
- sso_login_url:"https://yourIdp.com/saml2/sso/login",
465
- sso_logout_url:"https://yourIdp.com/saml2/sso/logout",
466
- encoded_x509_signing_cert:"-----BEGIN CERTIFICATE-----\n...Certificate goes here...\n-----END CERTIFICATE-----",
467
- request_signature_algorithm:"RSA-SHA256"
473
+ provider_id: 'saml',
474
+ sso_login_url: 'https://yourIdp.com/saml2/sso/login',
475
+ sso_logout_url: 'https://yourIdp.com/saml2/sso/logout',
476
+ encoded_x509_signing_cert: Stormpath::Test.mocked_encoded_x509_signing_cert,
477
+ request_signature_algorithm: 'RSA-SHA256'
468
478
  }
469
479
  )
470
480
  end
@@ -474,26 +484,19 @@ describe Stormpath::Resource::Directory, :vcr do
474
484
  end
475
485
 
476
486
  it 'updates the directory mappings' do
477
- mappings = Stormpath::Provider::SamlMappingRules.new(items: [
478
- {
479
- name: "uid",
480
- account_attributes: ["username"]
481
- }
482
- ])
487
+ stub_request(:post, 'https://api.stormpath.com/v1/directories')
488
+ .to_return(status: 200, body: Stormpath::Test.mocked_create_saml_directory)
483
489
 
484
- stub_request(:post, "https://api.stormpath.com/v1/directories").
485
- to_return(status:200, body: fixture('create_saml_directory.json'), headers:{})
490
+ stub_request(:get, directory.href + '/provider')
491
+ .to_return(status: 200, body: Stormpath::Test.mocked_saml_directory_provider_response)
486
492
 
487
- stub_request(:get, directory.href + "/provider").
488
- to_return(status: 200, body: fixture('get_saml_directory_provider.json'), headers:{})
493
+ stub_request(:post, directory.provider.attribute_statement_mapping_rules.href)
494
+ .to_return(status: 200, body: Stormpath::Test.mocked_create_saml_directory_rules)
489
495
 
490
- stub_request(:post, directory.provider.attribute_statement_mapping_rules["href"]).
491
- to_return(status:200, body: fixture('create_saml_directory_mapping_rules.json'), headers:{})
492
-
493
- response = directory.create_attribute_mappings(mappings)
494
- expect(response.items).to eq( [ { "name" => "uid4", "name_format" => "nil", "account_attributes" => ["username"] } ] )
496
+ directory.attribute_statement_mapping_rules.items = [rule]
497
+ response = directory.attribute_statement_mapping_rules.save
498
+ expect(response.items).to eq([{ 'name' => 'uid4', 'name_format' => 'nil', 'account_attributes' => ['username'] }])
495
499
  end
496
-
497
500
  end
498
501
 
499
502
  describe '#create_account_with_custom_data' do
@@ -522,13 +525,14 @@ describe Stormpath::Resource::Directory, :vcr do
522
525
  after { directory.delete }
523
526
 
524
527
  context 'given a valid group' do
525
- let(:created_group) { directory.groups.create(group_attrs(name: 'rubysdkgroup')) }
528
+ let(:group_name) { "rubysdkgroup#{random_number}" }
529
+ let(:created_group) { directory.groups.create(group_attrs(name: group_name)) }
526
530
 
527
531
  after { created_group.delete }
528
532
 
529
533
  it 'creates a group' do
530
534
  expect(created_group).to be
531
- expect(created_group.name).to eq('rubysdkgroup')
535
+ expect(created_group.name).to eq(group_name)
532
536
  end
533
537
  end
534
538
  end