stormpath-sdk 1.1.5 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (145) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -0
  3. data/.ruby-gemset +0 -0
  4. data/.travis.yml +1 -0
  5. data/CHANGES.md +20 -0
  6. data/Gemfile +0 -0
  7. data/README.md +78 -2
  8. data/Rakefile +0 -0
  9. data/lib/stormpath-sdk/api_key.rb +0 -0
  10. data/lib/stormpath-sdk/auth/authentication_result.rb +0 -0
  11. data/lib/stormpath-sdk/auth/basic_authenticator.rb +0 -0
  12. data/lib/stormpath-sdk/auth/basic_login_attempt.rb +0 -0
  13. data/lib/stormpath-sdk/auth/http_basic_authentication.rb +47 -0
  14. data/lib/stormpath-sdk/auth/http_bearer_authentication.rb +27 -0
  15. data/lib/stormpath-sdk/auth/username_password_request.rb +0 -0
  16. data/lib/stormpath-sdk/cache/cache.rb +0 -0
  17. data/lib/stormpath-sdk/cache/cache_entry.rb +0 -0
  18. data/lib/stormpath-sdk/cache/cache_manager.rb +0 -0
  19. data/lib/stormpath-sdk/cache/cache_stats.rb +0 -0
  20. data/lib/stormpath-sdk/cache/disabled_cache_store.rb +0 -0
  21. data/lib/stormpath-sdk/cache/memcached_store.rb +37 -0
  22. data/lib/stormpath-sdk/cache/memory_store.rb +0 -0
  23. data/lib/stormpath-sdk/cache/redis_store.rb +0 -0
  24. data/lib/stormpath-sdk/client.rb +0 -0
  25. data/lib/stormpath-sdk/data_store.rb +1 -0
  26. data/lib/stormpath-sdk/error.rb +5 -5
  27. data/lib/stormpath-sdk/http/authc/sauthc1_signer.rb +0 -0
  28. data/lib/stormpath-sdk/http/http_client_request_executor.rb +2 -3
  29. data/lib/stormpath-sdk/http/request.rb +12 -10
  30. data/lib/stormpath-sdk/http/response.rb +0 -0
  31. data/lib/stormpath-sdk/http/utils.rb +8 -5
  32. data/lib/stormpath-sdk/id_site/id_site_result.rb +0 -0
  33. data/lib/stormpath-sdk/oauth/access_token_authentication_result.rb +0 -0
  34. data/lib/stormpath-sdk/oauth/authenticator.rb +2 -1
  35. data/lib/stormpath-sdk/oauth/error.rb +12 -8
  36. data/lib/stormpath-sdk/oauth/id_site_grant_request.rb +0 -0
  37. data/lib/stormpath-sdk/oauth/local_access_token_verification.rb +45 -0
  38. data/lib/stormpath-sdk/oauth/password_grant.rb +9 -7
  39. data/lib/stormpath-sdk/oauth/password_grant_request.rb +3 -2
  40. data/lib/stormpath-sdk/oauth/refresh_grant_request.rb +0 -0
  41. data/lib/stormpath-sdk/oauth/remote_access_token_verification.rb +28 -0
  42. data/lib/stormpath-sdk/oauth/social_grant.rb +27 -0
  43. data/lib/stormpath-sdk/oauth/social_grant_request.rb +14 -0
  44. data/lib/stormpath-sdk/oauth/stormpath_grant_request.rb +3 -2
  45. data/lib/stormpath-sdk/oauth/verify_access_token.rb +11 -6
  46. data/lib/stormpath-sdk/oauth/{verify_token.rb → verify_token_result.rb} +1 -1
  47. data/lib/stormpath-sdk/provider/account_access.rb +0 -0
  48. data/lib/stormpath-sdk/provider/account_request.rb +0 -0
  49. data/lib/stormpath-sdk/provider/account_resolver.rb +0 -0
  50. data/lib/stormpath-sdk/provider/account_result.rb +0 -0
  51. data/lib/stormpath-sdk/provider/facebook/facebook_provider.rb +0 -0
  52. data/lib/stormpath-sdk/provider/facebook/facebook_provider_data.rb +0 -0
  53. data/lib/stormpath-sdk/provider/github/github_provider.rb +0 -0
  54. data/lib/stormpath-sdk/provider/github/github_provider_data.rb +0 -0
  55. data/lib/stormpath-sdk/provider/google/google_provider.rb +0 -0
  56. data/lib/stormpath-sdk/provider/google/google_provider_data.rb +0 -1
  57. data/lib/stormpath-sdk/provider/linkedin/linkedin_provider.rb +0 -0
  58. data/lib/stormpath-sdk/provider/linkedin/linkedin_provider_data.rb +0 -0
  59. data/lib/stormpath-sdk/provider/provider.rb +0 -0
  60. data/lib/stormpath-sdk/provider/provider_data.rb +0 -0
  61. data/lib/stormpath-sdk/provider/saml/saml_mapping_rules.rb +0 -0
  62. data/lib/stormpath-sdk/provider/saml/saml_provider.rb +0 -0
  63. data/lib/stormpath-sdk/provider/saml/saml_provider_data.rb +0 -0
  64. data/lib/stormpath-sdk/provider/saml/saml_provider_metadata.rb +0 -0
  65. data/lib/stormpath-sdk/provider/stormpath/stormpath_provider.rb +0 -0
  66. data/lib/stormpath-sdk/provider/stormpath/stormpath_provider_data.rb +0 -0
  67. data/lib/stormpath-sdk/resource/access_token.rb +0 -0
  68. data/lib/stormpath-sdk/resource/account_creation_policy.rb +3 -1
  69. data/lib/stormpath-sdk/resource/account_membership.rb +0 -0
  70. data/lib/stormpath-sdk/resource/account_overrides.rb +0 -0
  71. data/lib/stormpath-sdk/resource/account_store.rb +7 -8
  72. data/lib/stormpath-sdk/resource/account_store_mapping.rb +0 -0
  73. data/lib/stormpath-sdk/resource/application.rb +5 -5
  74. data/lib/stormpath-sdk/resource/base.rb +0 -0
  75. data/lib/stormpath-sdk/resource/collection.rb +0 -0
  76. data/lib/stormpath-sdk/resource/custom_data.rb +0 -0
  77. data/lib/stormpath-sdk/resource/custom_data_hash_methods.rb +0 -0
  78. data/lib/stormpath-sdk/resource/custom_data_storage.rb +0 -0
  79. data/lib/stormpath-sdk/resource/directory.rb +1 -0
  80. data/lib/stormpath-sdk/resource/email_template.rb +0 -0
  81. data/lib/stormpath-sdk/resource/email_verification_token.rb +0 -0
  82. data/lib/stormpath-sdk/resource/error.rb +2 -3
  83. data/lib/stormpath-sdk/resource/expansion.rb +0 -0
  84. data/lib/stormpath-sdk/resource/group.rb +0 -0
  85. data/lib/stormpath-sdk/resource/group_membership.rb +0 -0
  86. data/lib/stormpath-sdk/resource/instance.rb +0 -0
  87. data/lib/stormpath-sdk/resource/oauth_policy.rb +0 -0
  88. data/lib/stormpath-sdk/resource/organization.rb +1 -1
  89. data/lib/stormpath-sdk/resource/organization_account_store_mapping.rb +0 -0
  90. data/lib/stormpath-sdk/resource/password_policy.rb +0 -0
  91. data/lib/stormpath-sdk/resource/password_reset_token.rb +0 -0
  92. data/lib/stormpath-sdk/resource/password_strength.rb +0 -0
  93. data/lib/stormpath-sdk/resource/refresh_token.rb +0 -0
  94. data/lib/stormpath-sdk/resource/tenant.rb +0 -0
  95. data/lib/stormpath-sdk/resource/utils.rb +0 -0
  96. data/lib/stormpath-sdk/resource/verification_email.rb +0 -0
  97. data/lib/stormpath-sdk/util/assert.rb +0 -0
  98. data/lib/stormpath-sdk/util/uri_builder.rb +38 -0
  99. data/lib/stormpath-sdk/version.rb +2 -2
  100. data/lib/stormpath-sdk.rb +47 -39
  101. data/spec/api_key_spec.rb +0 -0
  102. data/spec/auth/basic_authenticator_spec.rb +0 -0
  103. data/spec/auth/http_basic_authentication_spec.rb +86 -0
  104. data/spec/auth/http_bearer_authentication_spec.rb +86 -0
  105. data/spec/auth/sauthc1_signer_spec.rb +0 -0
  106. data/spec/cache/cache_entry_spec.rb +0 -0
  107. data/spec/cache/cache_spec.rb +0 -0
  108. data/spec/cache/cache_stats_spec.rb +0 -0
  109. data/spec/client_spec.rb +0 -0
  110. data/spec/data_store_spec.rb +40 -16
  111. data/spec/fixtures/response/create_saml_directory.json +0 -0
  112. data/spec/fixtures/response/create_saml_directory_mapping_rules.json +0 -0
  113. data/spec/fixtures/response/get_saml_directory_provider.json +0 -0
  114. data/spec/fixtures/response/get_saml_directory_provider_metadata.json +0 -0
  115. data/spec/oauth/access_token_authentication_result_spec.rb +8 -0
  116. data/spec/provider/account_resolver_spec.rb +0 -0
  117. data/spec/provider/provider_spec.rb +0 -0
  118. data/spec/resource/account_creation_policy_spec.rb +125 -2
  119. data/spec/resource/account_store_mapping_spec.rb +0 -0
  120. data/spec/resource/account_store_spec.rb +40 -13
  121. data/spec/resource/application_spec.rb +268 -51
  122. data/spec/resource/base_spec.rb +0 -0
  123. data/spec/resource/collection_spec.rb +60 -2
  124. data/spec/resource/custom_data_spec.rb +0 -0
  125. data/spec/resource/directory_spec.rb +82 -1
  126. data/spec/resource/email_template_spec.rb +0 -0
  127. data/spec/resource/expansion_spec.rb +0 -0
  128. data/spec/resource/group_membership_spec.rb +0 -0
  129. data/spec/resource/group_spec.rb +0 -0
  130. data/spec/resource/organization_spec.rb +37 -8
  131. data/spec/resource/password_policy_spec.rb +0 -0
  132. data/spec/resource/password_strength_spec.rb +0 -0
  133. data/spec/resource/status_spec.rb +0 -0
  134. data/spec/resource/tenant_spec.rb +0 -0
  135. data/spec/spec_helper.rb +5 -6
  136. data/spec/support/custom_data_storage_behavior.rb +0 -0
  137. data/spec/support/mocked_provider_accounts.rb +129 -117
  138. data/spec/support/resource_factory.rb +0 -0
  139. data/spec/support/resource_matchers.rb +7 -0
  140. data/spec/support/test_cache_stores.rb +0 -0
  141. data/spec/support/test_request_executor.rb +0 -0
  142. data/spec/util/uri_builder_spec.rb +47 -0
  143. data/stormpath-sdk.gemspec +1 -0
  144. data/support/api.rb +0 -0
  145. metadata +29 -4
@@ -0,0 +1,86 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'HttpBearerAuthentication', vcr: true do
4
+ let(:application) { test_api_client.applications.create(name: 'ruby sdk test app') }
5
+ let(:directory) { test_api_client.directories.create(name: random_directory_name) }
6
+ let(:account) do
7
+ application.accounts.create(
8
+ email: 'test@example.com',
9
+ given_name: 'Ruby SDK',
10
+ password: 'P@$$w0rd',
11
+ surname: 'SDK'
12
+ )
13
+ end
14
+ let(:password_grant_request) do
15
+ Stormpath::Oauth::PasswordGrantRequest.new('test@example.com', 'P@$$w0rd')
16
+ end
17
+ let(:aquire_token) { application.authenticate_oauth(password_grant_request) }
18
+
19
+ let(:access_token) { aquire_token.access_token }
20
+ let(:bearer_authorization_header) { "Bearer #{access_token}" }
21
+ let(:authenticate_locally) do
22
+ Stormpath::Authentication::HttpBearerAuthentication.new(application,
23
+ bearer_authorization_header,
24
+ local: true).authenticate!
25
+ end
26
+ let(:authenticate_remotely) do
27
+ Stormpath::Authentication::HttpBearerAuthentication.new(application,
28
+ bearer_authorization_header).authenticate!
29
+ end
30
+ before do
31
+ test_api_client.account_store_mappings.create(application: application,
32
+ account_store: directory,
33
+ list_index: 1,
34
+ is_default_account_store: true,
35
+ is_default_group_store: true)
36
+ account
37
+ end
38
+
39
+ after do
40
+ account.delete
41
+ directory.delete
42
+ application.delete
43
+ end
44
+
45
+ describe 'remote authentication' do
46
+ context 'with a valid bearer authorization header' do
47
+ it 'should return VerifyTokenResult' do
48
+ expect(authenticate_remotely).to be_kind_of(Stormpath::Oauth::VerifyTokenResult)
49
+ expect(authenticate_remotely.account).to eq(account)
50
+ end
51
+
52
+ it 'should contain the account' do
53
+ expect(authenticate_remotely.account).to eq(account)
54
+ end
55
+ end
56
+
57
+ context 'with no bearer authorization header' do
58
+ let(:bearer_authorization_header) { nil }
59
+
60
+ it 'should raise error' do
61
+ expect do
62
+ authenticate_remotely
63
+ end.to raise_error(Stormpath::Error)
64
+ end
65
+ end
66
+
67
+ context 'with invalid authorization header type' do
68
+ let(:bearer_authorization_header) { "Basic #{access_token}" }
69
+
70
+ it 'should raise error' do
71
+ expect do
72
+ authenticate_remotely
73
+ end.to raise_error(Stormpath::Error)
74
+ end
75
+ end
76
+ end
77
+
78
+ describe 'local authentication' do
79
+ context 'with a valid bearer authorization header' do
80
+ it 'should return account' do
81
+ expect(authenticate_locally).to be_kind_of(Stormpath::Oauth::LocalAccessTokenVerificationResult)
82
+ expect(authenticate_locally.account).to eq(account)
83
+ end
84
+ end
85
+ end
86
+ end
File without changes
File without changes
File without changes
File without changes
data/spec/client_spec.rb CHANGED
File without changes
@@ -1,10 +1,11 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Stormpath::DataStore do
3
+ shared_examples 'a data store' do
4
4
  let(:factory) { Stormpath::Test::ResourceFactory.new }
5
5
  let(:request_executor) { Stormpath::Test::TestRequestExecutor.new }
6
- let(:store) { Stormpath::Cache::RedisStore }
7
- let(:data_store) { Stormpath::DataStore.new request_executor, test_api_key, {store: store}, nil, nil }
6
+ let(:data_store) do
7
+ Stormpath::DataStore.new(request_executor, test_api_key, { store: store }, nil)
8
+ end
8
9
  let(:application_cache) { data_store.cache_manager.get_cache 'applications' }
9
10
  let(:tenant_cache) { data_store.cache_manager.get_cache 'tenants' }
10
11
  let(:group_cache) { data_store.cache_manager.get_cache 'groups' }
@@ -16,12 +17,13 @@ describe Stormpath::DataStore do
16
17
 
17
18
  describe '.region_for' do
18
19
  it 'pulls resource name from href' do
19
- region = data_store.send :region_for, default_base_url+"/directories/4NykYrYH0OBiOOVOg8LXQ5"
20
+ region = data_store.send :region_for, "#{default_base_url}/directories/4NykYrYH0OBiOOVOg8LXQ5"
20
21
  expect(region).to eq('directories')
21
22
  end
22
23
 
23
24
  it 'pulls resource name from href if its custom data also' do
24
- region = data_store.send :region_for, default_base_url+"/v1/accounts/7jWpcEVSgawKkAZp8XDIEw/customData"
25
+ region = data_store.send(:region_for,
26
+ "#{default_base_url}/v1/accounts/7jWpcEVSgawKkAZp8XDIEw/customData")
25
27
  expect(region).to eq('customData')
26
28
  end
27
29
  end
@@ -30,13 +32,19 @@ describe Stormpath::DataStore do
30
32
  let(:custom_data_delete_field_url_regex) { data_store.send :custom_data_delete_field_url_regex }
31
33
  context 'CUSTOM_DATA_DELETE_FIELD_REGEX' do
32
34
  it 'should match custom data field href' do
33
- expect(default_base_url+"/accounts/2f8U7r5JweVf1ZTtcJ08L8/customData/rank").to match(custom_data_delete_field_url_regex)
34
- expect(default_base_url+"/groups/4x6vwucf1w9wjHvt7paGoY/customData/rank").to match(custom_data_delete_field_url_regex)
35
+ expect("#{default_base_url}/accounts/2f8U7r5JweVf1ZTtcJ08L8/customData/rank")
36
+ .to match(custom_data_delete_field_url_regex)
37
+
38
+ expect("#{default_base_url}/groups/4x6vwucf1w9wjHvt7paGoY/customData/rank")
39
+ .to match(custom_data_delete_field_url_regex)
35
40
  end
36
41
 
37
42
  it 'should not match custom data resource href' do
38
- expect(default_base_url+"/accounts/2f8U7r5JweVf1ZTtcJ08L8/customData").not_to match(custom_data_delete_field_url_regex)
39
- expect(default_base_url+"/groups/4x6vwucf1w9wjHvt7paGoY/customData").not_to match(custom_data_delete_field_url_regex)
43
+ expect("#{default_base_url}/accounts/2f8U7r5JweVf1ZTtcJ08L8/customData")
44
+ .not_to match(custom_data_delete_field_url_regex)
45
+
46
+ expect("#{default_base_url}/groups/4x6vwucf1w9wjHvt7paGoY/customData")
47
+ .not_to match(custom_data_delete_field_url_regex)
40
48
  end
41
49
  end
42
50
  end
@@ -79,7 +87,7 @@ describe Stormpath::DataStore do
79
87
  end
80
88
 
81
89
  it 'misses the cache on the get' do
82
- expect(application_cache.stats.hits).to eq(1) # this hit is when we grab @cached
90
+ expect(application_cache.stats.hits).to eq(1) # this hit is when we grab @cached
83
91
  expect(application_cache.stats.misses).to eq(1)
84
92
  end
85
93
 
@@ -146,24 +154,40 @@ describe Stormpath::DataStore do
146
154
  expect(group_cache.size).to eq(4)
147
155
  end
148
156
  end
149
-
150
157
  end
151
158
 
152
159
  context '#apply_default_user_agent' do
153
160
  let(:request) do
154
- Stormpath::Http::Request.new 'get', 'http://example.com/resources/abc123', nil, Hash.new, nil, test_api_key
161
+ Stormpath::Http::Request.new('get',
162
+ 'http://example.com/resources/abc123',
163
+ nil,
164
+ {},
165
+ nil,
166
+ test_api_key)
155
167
  end
156
168
 
157
169
  before do
158
- allow(Gem::Platform.local).to receive(:os) { "darwin" }
159
- allow(Gem::Platform.local).to receive(:version) { "14" }
170
+ allow(Gem::Platform.local).to receive(:os) { 'darwin' }
171
+ allow(Gem::Platform.local).to receive(:version) { '14' }
160
172
 
161
173
  data_store.send(:apply_default_user_agent, request)
162
174
  end
163
175
 
164
176
  it 'adds User-Agent to header' do
165
- expect(request.http_headers["User-Agent"]).to include("darwin")
166
- expect(request.http_headers["User-Agent"]).to include("14")
177
+ expect(request.http_headers['User-Agent']).to include('darwin')
178
+ expect(request.http_headers['User-Agent']).to include('14')
167
179
  end
168
180
  end
169
181
  end
182
+
183
+ describe Stormpath::DataStore do
184
+ context 'redis store' do
185
+ let(:store) { Stormpath::Cache::RedisStore }
186
+ it_should_behave_like 'a data store'
187
+ end
188
+
189
+ context 'memcached store' do
190
+ let(:store) { Stormpath::Cache::MemcachedStore }
191
+ it_should_behave_like 'a data store'
192
+ end
193
+ end
File without changes
@@ -22,6 +22,10 @@ describe Stormpath::Oauth::AccessTokenAuthenticationResult, :vcr do
22
22
  expect(jwt_authentication_result.account).to eq(account)
23
23
  end
24
24
 
25
+ it 'jwt access token should contain the stt header' do
26
+ expect(jwt_authentication_result.access_token).to have_stt_in_header('access')
27
+ end
28
+
25
29
  it 'should be able to delete the access token' do
26
30
  jwt_authentication_result
27
31
 
@@ -36,6 +40,10 @@ describe Stormpath::Oauth::AccessTokenAuthenticationResult, :vcr do
36
40
  expect(account.access_tokens.count).to eq(0)
37
41
  end
38
42
 
43
+ it 'jwt refresh token should contain the stt header' do
44
+ expect(jwt_authentication_result.refresh_token).to have_stt_in_header('refresh')
45
+ end
46
+
39
47
  it 'should be able to delete the refresh token' do
40
48
  jwt_authentication_result
41
49
 
File without changes
File without changes
@@ -1,10 +1,28 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Stormpath::Resource::AccountCreationPolicy, :vcr do
4
- describe "instances should respond to attribute property methods" do
4
+ describe 'instances should respond to attribute property methods' do
5
5
  let(:application) { test_application }
6
6
  let(:directory) { test_api_client.directories.create(name: random_directory_name) }
7
7
  let(:account_creation_policy) { directory.account_creation_policy }
8
+ let(:create_valid_account) do
9
+ directory.accounts.create(
10
+ username: 'cilim',
11
+ email: 'cilim@infinum.co',
12
+ given_name: 'Marko',
13
+ surname: 'Cilimkovic',
14
+ password: 'wonderfulWeatherIsntIt2'
15
+ )
16
+ end
17
+ let(:create_invalid_account) do
18
+ directory.accounts.create(
19
+ username: 'cilim',
20
+ email: 'cilim@infinum.hr',
21
+ given_name: 'Marko',
22
+ surname: 'Cilimkovic',
23
+ password: 'wonderfulWeatherIsntIt2'
24
+ )
25
+ end
8
26
 
9
27
  before do
10
28
  test_api_client.account_store_mappings.create(
@@ -23,7 +41,9 @@ describe Stormpath::Resource::AccountCreationPolicy, :vcr do
23
41
 
24
42
  [:welcome_email_status,
25
43
  :verification_email_status,
26
- :verification_success_email_status].each do |property_accessor|
44
+ :verification_success_email_status,
45
+ :email_domain_whitelist,
46
+ :email_domain_blacklist].each do |property_accessor|
27
47
  expect(account_creation_policy).to respond_to(property_accessor)
28
48
  expect(account_creation_policy).to respond_to("#{property_accessor}=")
29
49
  end
@@ -57,5 +77,108 @@ describe Stormpath::Resource::AccountCreationPolicy, :vcr do
57
77
  account_creation_policy.save
58
78
  expect(directory.account_creation_policy.verification_success_email_status).to eq('ENABLED')
59
79
  end
80
+
81
+ it 'can change whitelisted email domains' do
82
+ whitelisted = ['*infinum.co', '*infinum.hr']
83
+ account_creation_policy.email_domain_whitelist = whitelisted
84
+ account_creation_policy.save
85
+ expect(directory.account_creation_policy.email_domain_whitelist).to eq whitelisted
86
+
87
+ account_creation_policy.email_domain_whitelist = ['*infinum.hr']
88
+ account_creation_policy.save
89
+ expect(directory.account_creation_policy.email_domain_whitelist).to include '*infinum.hr'
90
+ expect(directory.account_creation_policy.email_domain_whitelist).not_to include '*infinum.co'
91
+ end
92
+
93
+ it 'can change blacklisted email domains' do
94
+ blacklisted = ['*spam.com', '*e1ppe.ro']
95
+ account_creation_policy.email_domain_blacklist = blacklisted
96
+ account_creation_policy.save
97
+ expect(directory.account_creation_policy.email_domain_blacklist).to eq blacklisted
98
+
99
+ account_creation_policy.email_domain_blacklist = ['*spam.com']
100
+ account_creation_policy.save
101
+ expect(directory.account_creation_policy.email_domain_blacklist).to include '*spam.com'
102
+ expect(directory.account_creation_policy.email_domain_blacklist).not_to include '*e1ppe.ro'
103
+ end
104
+
105
+ context 'when domain not string' do
106
+ it 'should raise error' do
107
+ blacklisted = ['*spam.com', 12345]
108
+ account_creation_policy.email_domain_blacklist = blacklisted
109
+ expect do
110
+ account_creation_policy.save
111
+ end.to raise_error(Stormpath::Error, /is an invalid type./)
112
+ end
113
+ end
114
+
115
+ context 'when domain invalid' do
116
+ it 'should raise error' do
117
+ blacklisted = ['*spam.com', '*youre@jiberish']
118
+ account_creation_policy.email_domain_blacklist = blacklisted
119
+ expect do
120
+ account_creation_policy.save
121
+ end.to raise_error(Stormpath::Error, /It is not a valid domain./)
122
+ end
123
+ end
124
+
125
+ describe 'create account' do
126
+ context 'when whitelisted domains exist' do
127
+ before do
128
+ whitelisted = ['*infinum.co']
129
+ account_creation_policy.email_domain_whitelist = whitelisted
130
+ account_creation_policy.save
131
+ end
132
+
133
+ context 'when account whitelisted' do
134
+ it 'should successfully create the account' do
135
+ account = create_valid_account
136
+ expect(account).to be_a Stormpath::Resource::Account
137
+ expect(account.username).to eq('cilim')
138
+ end
139
+ end
140
+
141
+ context 'when account not whitelisted' do
142
+ it 'should raise error' do
143
+ expect do
144
+ create_invalid_account
145
+ end.to raise_error(Stormpath::Error, "Cannot create the Account because your email's domain is not allowed.")
146
+ end
147
+ end
148
+ end
149
+
150
+ context 'when blacklisted domains exist' do
151
+ context 'when account email blacklisted' do
152
+ it 'should not create the account' do
153
+ blacklisted = ['*spam.com']
154
+ account_creation_policy.email_domain_blacklist = blacklisted
155
+ account_creation_policy.save
156
+
157
+ expect do
158
+ @account = directory.accounts.create(
159
+ username: 'cilim',
160
+ email: 'cilim@spam.com',
161
+ given_name: 'Marko',
162
+ surname: 'Cilimkovic',
163
+ password: 'wonderfulWeatherIsntIt2'
164
+ )
165
+ end.to raise_error(Stormpath::Error, "Cannot create the Account because your email's domain is not allowed.")
166
+ end
167
+ end
168
+ end
169
+
170
+ context 'when account email in blacklisted and whitelisted domains' do
171
+ it 'should not create the account' do
172
+ bothlisted = ['*infinum.hr']
173
+ account_creation_policy.email_domain_blacklist = bothlisted
174
+ account_creation_policy.email_domain_whitelist = bothlisted
175
+ account_creation_policy.save
176
+
177
+ expect do
178
+ create_invalid_account
179
+ end.to raise_error(Stormpath::Error, "Cannot create the Account because your email's domain is not allowed.")
180
+ end
181
+ end
182
+ end
60
183
  end
61
184
  end
File without changes
@@ -1,49 +1,76 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Stormpath::Resource::AccountStore, :vcr do
4
-
5
- def create_account_store_mapping(application, account_store, is_default_group_store=false)
6
- test_api_client.account_store_mappings.create({
4
+ def create_account_store_mapping(application, account_store, is_default_group_store = false)
5
+ test_api_client.account_store_mappings.create(
7
6
  application: application,
8
7
  account_store: account_store,
9
8
  list_index: 0,
10
9
  is_default_account_store: true,
11
10
  is_default_group_store: is_default_group_store
12
- })
11
+ )
12
+ end
13
+
14
+ let(:application) do
15
+ test_api_client.applications.create name: random_application_name,
16
+ description: 'testApplication for AccountStoreMappings'
13
17
  end
14
18
 
15
- let(:application) { test_api_client.applications.create name: random_application_name, description: 'testApplication for AccountStoreMappings' }
19
+ let(:directory) do
20
+ test_api_client.directories.create name: random_directory_name,
21
+ description: 'testDirectory for AccountStoreMappings'
22
+ end
16
23
 
17
- let(:directory) { test_api_client.directories.create name: random_directory_name, description: 'testDirectory for AccountStoreMappings' }
24
+ let(:group) do
25
+ directory.groups.create name: 'testGroup', description: 'testGroup for AccountStoreMappings'
26
+ end
18
27
 
19
- let(:group) { directory.groups.create name: 'testGroup', description: 'testGroup for AccountStoreMappings' }
28
+ let(:organization) do
29
+ test_api_client.organizations.create name: 'testOrganization', name_key: 'test-organization'
30
+ end
20
31
 
21
32
  after do
22
33
  application.delete if application
23
34
  group.delete if group
24
35
  directory.delete if directory
36
+ organization.delete if organization
25
37
  end
26
38
 
27
39
  describe 'given an account_store_mapping and a directory' do
28
- let!(:account_store_mapping) {create_account_store_mapping(application,directory,true)}
29
- let(:reloaded_mapping){ application.account_store_mappings.get account_store_mapping.href }
40
+ let!(:account_store_mapping) { create_account_store_mapping(application, directory, true) }
41
+ let(:reloaded_mapping) { application.account_store_mappings.get account_store_mapping.href }
30
42
 
31
43
  it 'should return a directory' do
32
44
  expect(reloaded_mapping.account_store.class).to eq(Stormpath::Resource::Directory)
33
45
  expect(reloaded_mapping.account_store).to eq(directory)
34
46
  end
35
-
36
47
  end
37
48
 
38
- describe 'given an account_store_mapping and a group' do
39
- let!(:account_store_mapping) {create_account_store_mapping(application,group)}
40
- let(:reloaded_mapping){ application.account_store_mappings.get account_store_mapping.href }
49
+ describe 'given an account_store_mapping and a group' do
50
+ let!(:account_store_mapping) { create_account_store_mapping(application, group) }
51
+ let(:reloaded_mapping) { application.account_store_mappings.get account_store_mapping.href }
41
52
 
42
53
  it 'should return a group' do
43
54
  expect(reloaded_mapping.account_store.class).to eq(Stormpath::Resource::Group)
44
55
  expect(reloaded_mapping.account_store).to eq(group)
45
56
  end
57
+ end
58
+
59
+ describe 'given an account_store_mapping and an organization' do
60
+ let!(:account_store_mapping) { create_account_store_mapping(application, organization) }
61
+ let(:reloaded_mapping) { application.account_store_mappings.get account_store_mapping.href }
46
62
 
63
+ it 'should return an organization' do
64
+ expect(reloaded_mapping.account_store.class).to eq(Stormpath::Resource::Organization)
65
+ expect(reloaded_mapping.account_store).to eq(organization)
66
+ end
47
67
  end
48
68
 
69
+ describe 'given an undefined account_store_mapping' do
70
+ it 'should raise an error' do
71
+ expect do
72
+ create_account_store_mapping(application, 'undefined')
73
+ end.to raise_error
74
+ end
75
+ end
49
76
  end