stormpath-sdk 1.3.0 → 1.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +1 -0
  3. data/.travis.yml +0 -3
  4. data/CHANGES.md +9 -0
  5. data/README.md +8 -21
  6. data/Rakefile +1 -15
  7. data/lib/stormpath-sdk/oauth/error.rb +21 -0
  8. data/lib/stormpath-sdk/oauth/local_access_token_verification.rb +2 -2
  9. data/lib/stormpath-sdk/oauth/remote_access_token_verification.rb +2 -2
  10. data/lib/stormpath-sdk/version.rb +2 -2
  11. data/spec/auth/http_basic_authentication_spec.rb +6 -21
  12. data/spec/auth/http_bearer_authentication_spec.rb +11 -24
  13. data/spec/client_spec.rb +116 -258
  14. data/spec/oauth/access_token_authentication_result_spec.rb +14 -14
  15. data/spec/provider/provider_spec.rb +32 -40
  16. data/spec/resource/account_creation_policy_spec.rb +8 -13
  17. data/spec/resource/account_link_spec.rb +4 -17
  18. data/spec/resource/account_spec.rb +37 -81
  19. data/spec/resource/account_store_mapping_spec.rb +20 -32
  20. data/spec/resource/account_store_spec.rb +8 -31
  21. data/spec/resource/api_key_spec.rb +11 -14
  22. data/spec/resource/application_spec.rb +39 -168
  23. data/spec/resource/collection_spec.rb +17 -17
  24. data/spec/resource/custom_data_spec.rb +2 -2
  25. data/spec/resource/directory_spec.rb +164 -240
  26. data/spec/resource/email_template_spec.rb +21 -24
  27. data/spec/resource/group_membership_spec.rb +9 -12
  28. data/spec/resource/group_spec.rb +17 -31
  29. data/spec/resource/linked_account_spec.rb +4 -17
  30. data/spec/resource/organization_spec.rb +38 -110
  31. data/spec/resource/password_policy_spec.rb +13 -16
  32. data/spec/resource/password_strength_spec.rb +15 -18
  33. data/spec/resource/status_spec.rb +32 -35
  34. data/spec/spec_helper.rb +8 -139
  35. data/spec/support/api_key_helpers.rb +34 -0
  36. data/spec/support/custom_data_storage_behavior.rb +139 -156
  37. data/spec/support/env_names_warning.rb +59 -0
  38. data/spec/support/resource_helpers.rb +84 -0
  39. data/spec/support/resource_matchers.rb +6 -0
  40. data/stormpath-sdk.gemspec +1 -0
  41. metadata +20 -3
  42. data/support/api.rb +0 -55
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e9ba021abe721aacd48f6507ca61e7d23bbe85f1
4
- data.tar.gz: 4a0a74ae0bd2d179888becafc4ba94c8598b6c8a
3
+ metadata.gz: 7c94bbec690d16f6c04eda0f7e46dd79c9406747
4
+ data.tar.gz: 10271a383fb9537813d22cacc1646df9c67b709d
5
5
  SHA512:
6
- metadata.gz: 70784a596911dde78a22749952d552bf8c35042fad1387720796284f3a66ec4cd52c8757eb1117925a6c4d8d47546d0cb46ee6c7430a236becb5c32f046bcdc7
7
- data.tar.gz: 6eb7a9b888f7a5e3c4ab1b5078aa38f82f5eac37fc86ccf2befe3ff34d78e4e6d88a2dcaa026683eb2687e463f5cc1aa2e206b7722b53728926e340eeb1797c2
6
+ metadata.gz: 284ad0976afabc1777161def9266669f855f2eb3bcb6eaaa026bb66e195de22537da218f7cea5b33d68554202d28d5f4714e39e9c7e0e01f91de2b94dabf68e0
7
+ data.tar.gz: dc7e80f1a5501e989c7fab8f5b1f2ee889b3c71ae9f75bb1a91bb023e593bed70c83d8ee6bf1da8288556f73a709405c9f6245a12d2019f6d469326a1ff07c59
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color --format Fivemat
@@ -11,6 +11,3 @@ env:
11
11
  global:
12
12
  - secure: MeyjZGgySZvpYVRm2i7wkrhvu9KUeU7eQ5aKj7FXqIYlQe3T67k+KKA3Ejp6WC3wUEVPUFseWMZCuNkRc0UeGA5/4e4LLc++XuaZn1jLTm1yNofh/CFAAjt5VdIYz4R7sKxpyLxs0orK2+HcaiCoqSDj7ehw2SlDca9VEi0GoQk=
13
13
  - secure: MrtbhfH1IfwDkkvf0pq6trgj68to/fK4c+L1daKvMaNiNvwggbA3s0ea9QjHxXfWmPqL5bf8Q5N7YqXUw8cLpRPrKUA65JkyhyzIju8FgzXz83aCvjJD+5XhJIGzpLM8qHeKh7F0K6/iURTKIUgZXbguK4HpEeCMrrdPYcof3Ew=
14
- - secure: JChx6k5NOw/PBzH6gpHdqxHPy8hpaTALVs2riTVXorJZ5p06F3riqFBQbMh6REzXdJLjD6VKPORt19WOkmLHCPW8x0g7HxIRHT0DCDLX/4980dZZAev3blSvfJ7t1cWlBVsZb0LgVEkswvKdSYEZvDQTy5XlWsIMuNhHUclsTZk=
15
- - secure: c5tUXb7FPMDD/KkpDwYNfnZ2k0N0RltBAQt1IYOFkdcztIAdcGmWPtT4l07He+UJiF2Vy92KrsSK709FFDwdxAleSgFKwpCrtgJRXXqRqT/gDiJUsGU1jC4QgXpu/QWCWsCSs/v1l1GzZyZF61aQzqINVrGwF5n2/MeMGOAJkaA=
16
- - secure: SepFOaSOjRr5EJLBlXKT60FgSmKZ604zhhDaes+s9rQgJcaUsVkTxFYhkE6mkDadH7dZ6ACW1TaWWTmFm+JMFuli/bcyvX9wm5akWM6EF3BdJ8djMac34iJuTB3MWED+fOaFco9oZjMQOYZlSu9nS4VOvH0ekcTnQnThzxYxpfs=
data/CHANGES.md CHANGED
@@ -1,6 +1,15 @@
1
1
  stormpath-sdk-ruby Changelog
2
2
  ============================
3
3
 
4
+ Version 1.3.1
5
+ -------------
6
+
7
+ Released on November 07, 2016
8
+
9
+ - Add oauth jwt errors
10
+ - Refactor and DRY up specs
11
+
12
+
4
13
  Version 1.3.0
5
14
  -------------
6
15
 
data/README.md CHANGED
@@ -79,13 +79,13 @@ If you have not already done so, register as a developer on
79
79
  1. **Create an account for a user** on the directory.
80
80
 
81
81
  ```ruby
82
- account = directory.accounts.create({
82
+ account = directory.accounts.create(
83
83
  given_name: 'John',
84
84
  surname: 'Smith',
85
85
  email: 'john.smith@example.com',
86
86
  username: 'johnsmith',
87
87
  password: '4P@$$w0rd!'
88
- })
88
+ )
89
89
  ```
90
90
 
91
91
  1. **Update an account**
@@ -517,13 +517,13 @@ ways:
517
517
  on the directory:
518
518
 
519
519
  ```ruby
520
- account = directory.accounts.create({
520
+ account = directory.accounts.create(
521
521
  given_name: 'John',
522
522
  surname: 'Smith',
523
523
  email: 'john.smith@example.com',
524
524
  username: 'johnsmith',
525
525
  password: '4P@$$w0rd!'
526
- })
526
+ )
527
527
  ```
528
528
 
529
529
  Both these methods can take either a <code>Hash</code> of the account
@@ -945,27 +945,14 @@ account.custom_data.delete
945
945
  ### Setup
946
946
 
947
947
  The functional tests of the SDK run against a Stormpath tenant. In that
948
- account, create:
949
-
950
- * An application reserved for testing.
951
- * A directory reserved for test accounts. _Be sure to associate this
952
- directory to the test application as a login source_.
953
- * Another directory reserved for test accounts with the account
954
- verification workflow turned on. _Be sure to associate this directory
955
- to the test application as a login source_.
948
+ account they automatically create and destroy resources.
956
949
 
957
- The following environment variables need will then need to be set:
950
+ The following environment variables need to be set:
958
951
 
959
- * <code>STORMPATH_SDK_TEST_API_KEY_ID</code> - The <code>id</code> from
952
+ * <code>STORMPATH_CLIENT_APIKEY_ID</code> - The <code>id</code> from
960
953
  your Stormpath API key.
961
- * <code>STORMPATH_SDK_TEST_API_KEY_SECRET</code> - The
954
+ * <code>STORMPATH_CLIENT_APIKEY_SECRET</code> - The
962
955
  <code>secret</code> from your Stormpath API key.
963
- * <code>STORMPATH_SDK_TEST_APPLICATION_URL</code> - The URL to the
964
- application created above.
965
- * <code>STORMPATH_SDK_TEST_DIRECTORY_URL</code> - The URL to the first
966
- directory created above.
967
- * <code>STORMPATH_SDK_TEST_DIRECTORY_WITH_VERIFICATION_URL</code> - The
968
- URL to the second directory created above.
969
956
 
970
957
  ### Running
971
958
 
data/Rakefile CHANGED
@@ -3,8 +3,6 @@ require 'rubygems'
3
3
  require 'rubygems/package_task'
4
4
  require 'rspec/core/rake_task'
5
5
  require 'stormpath-sdk'
6
- require './support/api'
7
-
8
6
 
9
7
  spec = eval(File.read('stormpath-sdk.gemspec'))
10
8
 
@@ -17,16 +15,4 @@ RSpec::Core::RakeTask.new do |t|
17
15
  t.rspec_opts = ['-c']
18
16
  end
19
17
 
20
- task :default => :spec
21
-
22
- namespace :api do
23
- task :clean do
24
- Stormpath::Support::Api.destroy_resources(
25
- ENV['STORMPATH_SDK_TEST_API_KEY_ID'],
26
- ENV['STORMPATH_SDK_TEST_API_KEY_SECRET'],
27
- ENV['STORMPATH_SDK_TEST_APPLICATION_URL'],
28
- ENV['STORMPATH_SDK_TEST_DIRECTORY_URL'],
29
- ENV['STORMPATH_SDK_TEST_DIRECTORY_WITH_VERIFICATION_URL']
30
- )
31
- end
32
- end
18
+ task default: :spec
@@ -37,6 +37,27 @@ module Stormpath
37
37
  message: 'Token is invalid',
38
38
  developer_message: 'Token is invalid because the issued at time (iat) is after the current time',
39
39
  request_id: 'Oauth error UUID'
40
+ },
41
+ jwt_invalid_issuer: {
42
+ status: 400,
43
+ code: 10014,
44
+ message: 'Token is invalid',
45
+ developer_message: 'Token is invalid because the issuer of the token does not match the Application validating the token.',
46
+ request_id: 'Oauth error UUID'
47
+ },
48
+ jwt_invalid_signature: {
49
+ status: 400,
50
+ code: 10017,
51
+ message: 'Token is invalid',
52
+ developer_message: 'Token is invalid because verifying the signature of a JWT failed.',
53
+ request_id: 'Oauth error UUID'
54
+ },
55
+ jwt_invalid_stt: {
56
+ status: 400,
57
+ code: nil,
58
+ message: 'Token is invalid',
59
+ developer_message: "Token is invalid because the stt header doesn't match the right type",
60
+ request_id: 'Oauth error UUID'
40
61
  }
41
62
  }
42
63
  end
@@ -26,12 +26,12 @@ module Stormpath
26
26
 
27
27
  def validate_jwt_is_an_access_token
28
28
  return if decoded_jwt.second['stt'] == 'access'
29
- raise ArgumentError, 'Token is not an access token'
29
+ raise Stormpath::Oauth::Error, :jwt_invalid_stt
30
30
  end
31
31
 
32
32
  def validate_jwt_has_a_valid_issuer
33
33
  return if decoded_jwt.first['iss'] == application.href
34
- raise ArgumentError, 'Token issuer is invalid'
34
+ raise Stormpath::Oauth::Error, :jwt_invalid_issuer
35
35
  end
36
36
  end
37
37
 
@@ -16,8 +16,8 @@ module Stormpath
16
16
  end
17
17
 
18
18
  def validate_access_token
19
- raise Stormpath::Oauth::Error, :jwt_invalid unless decoded_jwt.second['stt'] == 'access'
20
- raise Stormpath::Oauth::Error, :jwt_invalid unless decoded_jwt.first['iss'] == application.href
19
+ raise Stormpath::Oauth::Error, :jwt_invalid_stt unless decoded_jwt.second['stt'] == 'access'
20
+ raise Stormpath::Oauth::Error, :jwt_invalid_issuer unless decoded_jwt.first['iss'] == application.href
21
21
  end
22
22
 
23
23
  def decoded_jwt
@@ -14,6 +14,6 @@
14
14
  # limitations under the License.
15
15
  #
16
16
  module Stormpath
17
- VERSION = '1.3.0'
18
- VERSION_DATE = '2016-11-04'
17
+ VERSION = '1.3.1'
18
+ VERSION_DATE = '2016-11-07'
19
19
  end
@@ -1,33 +1,18 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'HttpBasicAuthentication', 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
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) }
14
7
  let(:api_key) { account.api_keys.create({}) }
15
8
  let(:api_key_id) { api_key.id }
16
9
  let(:api_key_secret) { api_key.secret }
17
10
  let(:encoded_api_key) { Base64.encode64("#{api_key_id}:#{api_key_secret}") }
18
11
  let(:basic_authorization_header) { "Basic #{encoded_api_key}" }
19
- let(:authenticate) do
20
- Stormpath::Authentication::HttpBasicAuthentication.new(application,
21
- basic_authorization_header).authenticate!
22
- end
12
+ let(:authenticator) { Stormpath::Authentication::HttpBasicAuthentication }
13
+ let(:authenticate) { authenticator.new(application, basic_authorization_header).authenticate! }
23
14
 
24
- before do
25
- test_api_client.account_store_mappings.create(application: application,
26
- account_store: directory,
27
- list_index: 1,
28
- is_default_account_store: true,
29
- is_default_group_store: true)
30
- end
15
+ before { map_account_store(application, directory, 1, true, true) }
31
16
 
32
17
  after do
33
18
  account.delete
@@ -1,39 +1,25 @@
1
1
  require 'spec_helper'
2
2
 
3
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
4
+ let(:application) { test_api_client.applications.create(build_application) }
5
+ let(:directory) { test_api_client.directories.create(build_directory) }
14
6
  let(:password_grant_request) do
15
- Stormpath::Oauth::PasswordGrantRequest.new('test@example.com', 'P@$$w0rd')
7
+ Stormpath::Oauth::PasswordGrantRequest.new("test#{default_domain}", 'P@$$w0rd')
16
8
  end
17
9
  let(:aquire_token) { application.authenticate_oauth(password_grant_request) }
18
10
 
19
11
  let(:access_token) { aquire_token.access_token }
20
12
  let(:bearer_authorization_header) { "Bearer #{access_token}" }
13
+ let(:authenticator) { Stormpath::Authentication::HttpBearerAuthentication }
21
14
  let(:authenticate_locally) do
22
- Stormpath::Authentication::HttpBearerAuthentication.new(application,
23
- bearer_authorization_header,
24
- local: true).authenticate!
15
+ authenticator.new(application, bearer_authorization_header, local: true).authenticate!
25
16
  end
26
17
  let(:authenticate_remotely) do
27
- Stormpath::Authentication::HttpBearerAuthentication.new(application,
28
- bearer_authorization_header).authenticate!
18
+ authenticator.new(application, bearer_authorization_header).authenticate!
29
19
  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
20
+ before { map_account_store(application, directory, 1, true, true) }
21
+ let!(:account) do
22
+ application.accounts.create(build_account(email: 'test', password: 'P@$$w0rd'))
37
23
  end
38
24
 
39
25
  after do
@@ -78,7 +64,8 @@ describe 'HttpBearerAuthentication', vcr: true do
78
64
  describe 'local authentication' do
79
65
  context 'with a valid bearer authorization header' do
80
66
  it 'should return account' do
81
- expect(authenticate_locally).to be_kind_of(Stormpath::Oauth::LocalAccessTokenVerificationResult)
67
+ expect(authenticate_locally)
68
+ .to be_kind_of(Stormpath::Oauth::LocalAccessTokenVerificationResult)
82
69
  expect(authenticate_locally.account).to eq(account)
83
70
  end
84
71
  end
@@ -33,7 +33,7 @@ describe Stormpath::Client, :vcr do
33
33
 
34
34
  context 'with an api key file location', 'that points to a file' do
35
35
  after do
36
- File.delete(api_key_file_location) if File.exists?(api_key_file_location)
36
+ File.delete(api_key_file_location) if File.exist?(api_key_file_location)
37
37
  end
38
38
 
39
39
  context 'by default' do
@@ -59,10 +59,10 @@ properties
59
59
  File.join(File.dirname(__FILE__), 'testApiKey.fooId.properties')
60
60
  end
61
61
  let(:client) do
62
- Stormpath::Client.new({
62
+ Stormpath::Client.new(
63
63
  api_key_file_location: api_key_file_location,
64
64
  api_key_id_property_name: 'foo.id'
65
- })
65
+ )
66
66
  end
67
67
 
68
68
  before do
@@ -82,10 +82,10 @@ properties
82
82
  File.join(File.dirname(__FILE__), 'testApiKey.barBazSecret.properties')
83
83
  end
84
84
  let(:client) do
85
- Stormpath::Client.new({
85
+ Stormpath::Client.new(
86
86
  api_key_file_location: api_key_file_location,
87
87
  api_key_secret_property_name: 'bar.baz'
88
- })
88
+ )
89
89
  end
90
90
 
91
91
  before do
@@ -105,9 +105,9 @@ properties
105
105
  File.join(File.dirname(__FILE__), 'testApiKey.noApiKeyId.properties')
106
106
  end
107
107
  let(:client) do
108
- Stormpath::Client.new({
108
+ Stormpath::Client.new(
109
109
  api_key_file_location: api_key_file_location,
110
- })
110
+ )
111
111
  end
112
112
 
113
113
  before do
@@ -132,11 +132,7 @@ properties
132
132
  let(:api_key_file_location) do
133
133
  File.join(File.dirname(__FILE__), 'testApiKey.noApiKeySecret.properties')
134
134
  end
135
- let(:client) do
136
- Stormpath::Client.new({
137
- api_key_file_location: api_key_file_location,
138
- })
139
- end
135
+ let(:client) { Stormpath::Client.new(api_key_file_location: api_key_file_location) }
140
136
 
141
137
  before do
142
138
  File.open(api_key_file_location, 'w') do |f|
@@ -147,11 +143,14 @@ properties
147
143
  end
148
144
 
149
145
  it 'raises an error' do
150
- expect { client }.to raise_error ArgumentError,
151
- "No API secret in properties. Please provide a 'apiKey.secret' property in '" +
152
- api_key_file_location +
153
- "' or pass in an 'api_key_secret_property_name' to the Stormpath::Client " +
154
- "constructor to specify an alternative property."
146
+ expect { client }
147
+ .to raise_error(
148
+ ArgumentError,
149
+ "No API secret in properties. Please provide a 'apiKey.secret' property in '" +
150
+ api_key_file_location +
151
+ "' or pass in an 'api_key_secret_property_name' to the Stormpath::Client " \
152
+ 'constructor to specify an alternative property.'
153
+ )
155
154
  end
156
155
  end
157
156
 
@@ -159,17 +158,15 @@ properties
159
158
  let(:api_key_file_location) do
160
159
  'no_such_file'
161
160
  end
162
- let(:client) do
163
- Stormpath::Client.new({
164
- api_key_file_location: api_key_file_location,
165
- })
166
- end
161
+ let(:client) { Stormpath::Client.new(api_key_file_location: api_key_file_location) }
167
162
 
168
163
  it 'raises an error' do
169
- expect { client }.to raise_error ArgumentError,
164
+ expect { client }.to raise_error(
165
+ ArgumentError,
170
166
  "No API Key file could be found or loaded from '" +
171
167
  api_key_file_location +
172
168
  "'."
169
+ )
173
170
  end
174
171
  end
175
172
  end
@@ -177,7 +174,9 @@ properties
177
174
  context 'with a base url' do
178
175
  context 'creates a client that connects to that base' do
179
176
  let(:api_key) { Stormpath::ApiKey.new(test_api_key_id, test_api_key_secret) }
180
- let(:client) { Stormpath::Client.new(api_key: api_key, base_url: "https://api.stormpath.com/v1") }
177
+ let(:client) do
178
+ Stormpath::Client.new(api_key: api_key, base_url: 'https://api.stormpath.com/v1')
179
+ end
181
180
 
182
181
  it_behaves_like 'a valid client'
183
182
  end
@@ -193,11 +192,12 @@ properties
193
192
 
194
193
  context 'as a hash' do
195
194
  let(:client) do
196
- Stormpath::Client.new({
197
- api_key: { id: test_api_key_id,
198
- secret: test_api_key_secret
195
+ Stormpath::Client.new(
196
+ api_key: {
197
+ id: test_api_key_id,
198
+ secret: test_api_key_secret
199
199
  }
200
- })
200
+ )
201
201
  end
202
202
 
203
203
  it_behaves_like 'a valid client'
@@ -206,24 +206,26 @@ properties
206
206
 
207
207
  context 'with no api key', 'and no api key file location' do
208
208
  it 'raises an error' do
209
- expect { Stormpath::Client.new({}) }.to raise_error ArgumentError,
209
+ expect { Stormpath::Client.new({}) }.to raise_error(
210
+ ArgumentError,
210
211
  /^No API key has been provided\./
212
+ )
211
213
  end
212
214
  end
213
215
 
214
216
  context 'with cache configuration' do
215
217
  let(:api_key_file_location) { 'http://fake.server.com/apiKey.properties' }
216
218
  let(:client) do
217
- Stormpath::Client.new( {
219
+ Stormpath::Client.new(
218
220
  api_key_file_location: api_key_file_location,
219
221
  cache: {
220
222
  store: Stormpath::Test::FakeStore1,
221
223
  regions: {
222
224
  directories: { ttl_seconds: 40, tti_seconds: 20 },
223
- groups: { ttl_seconds: 80, tti_seconds: 40, store: Stormpath::Test::FakeStore2 }
225
+ groups: { ttl_seconds: 80, tti_seconds: 40, store: Stormpath::Test::FakeStore2 }
224
226
  }
225
227
  }
226
- })
228
+ )
227
229
  end
228
230
 
229
231
  before do
@@ -271,16 +273,9 @@ properties
271
273
 
272
274
  describe '#applications' do
273
275
  context 'by default' do
274
- let(:applications) do
275
- test_api_client.applications
276
- end
276
+ let(:applications) { test_api_client.applications }
277
277
 
278
- let(:application) do
279
- applications.create(
280
- name: 'Client Applications Test',
281
- description: 'A test description'
282
- )
283
- end
278
+ let(:application) { applications.create(build_application) }
284
279
 
285
280
  it 'returns the collection' do
286
281
  expect(applications).to be_kind_of(Stormpath::Resource::Collection)
@@ -295,7 +290,7 @@ properties
295
290
  context 'pagination' do
296
291
  let!(:applications) do
297
292
  (0..2).to_a.map do |index|
298
- test_api_client.applications.create name: random_application_name(index), description: 'foo'
293
+ test_api_client.applications.create(build_application(name: "ruby-sdk-test-#{index}"))
299
294
  end
300
295
  end
301
296
 
@@ -304,58 +299,21 @@ properties
304
299
  expect(test_api_client.applications.offset(1).limit(2).count).to be >= 2
305
300
  end
306
301
 
307
- after do
308
- applications.each do |application|
309
- application.delete
310
- end
311
- end
302
+ after { applications.each(&:delete) }
312
303
  end
313
304
 
314
305
  context 'expansion' do
315
- let(:client) do
316
- # every time a client is instantiated a new cache is created, so make
317
- # sure we use the same client across each "it" block
318
- test_api_client
319
- end
320
-
321
- let(:cache_manager) do
322
- data_store = client.instance_variable_get '@data_store'
323
- cache_manager = data_store.cache_manager
324
- end
325
-
326
- let(:accounts_cache_summary) do
327
- cache_manager.get_cache('accounts').stats.summary
328
- end
329
-
330
- let(:directories_cache_summary) do
331
- cache_manager.get_cache('directories').stats.summary
332
- end
333
-
334
- let(:groups_cache_summary) do
335
- cache_manager.get_cache('groups').stats.summary
336
- end
337
-
338
- let(:directory) do
339
- client.directories.create name: random_directory_name
340
- end
341
-
342
- let(:group) do
343
- directory.groups.create name: random_group_name
344
- end
345
-
346
- let(:account) do
347
- directory.accounts.create({
348
- email: 'rubysdk@example.com',
349
- given_name: 'Ruby SDK',
350
- password: 'P@$$w0rd',
351
- surname: 'SDK',
352
- username: 'rubysdk'
353
- })
354
- end
355
-
356
- before do
357
- group.add_account account
358
- end
306
+ let(:client) { test_api_client }
307
+ let(:data_store) { client.instance_variable_get '@data_store' }
308
+ let(:cache_manager) { data_store.cache_manager }
309
+ let(:accounts_cache_summary) { cache_manager.get_cache('accounts').stats.summary }
310
+ let(:directories_cache_summary) { cache_manager.get_cache('directories').stats.summary }
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) }
315
+
316
+ before { group.add_account(account) }
359
317
 
360
318
  after do
361
319
  group.delete if group
@@ -368,9 +326,7 @@ properties
368
326
  client.accounts.get account.href, Stormpath::Resource::Expansion.new('directory')
369
327
  end
370
328
 
371
- before do
372
- client.data_store.initialize_cache(Hash.new)
373
- end
329
+ before { client.data_store.initialize_cache({}) }
374
330
 
375
331
  it 'caches the nested resource' do
376
332
  expect(cached_account.directory.name).to be
@@ -382,14 +338,9 @@ properties
382
338
  let(:cached_account) do
383
339
  client.accounts.get account.href, Stormpath::Resource::Expansion.new('groups')
384
340
  end
341
+ let(:group) { directory.groups.create(build_group) }
385
342
 
386
- let(:group) do
387
- directory.groups.create name: random_group_name
388
- end
389
-
390
- before do
391
- client.data_store.initialize_cache(Hash.new)
392
- end
343
+ before { client.data_store.initialize_cache({}) }
393
344
 
394
345
  it 'caches the nested resource' do
395
346
  expect(cached_account.groups.first.name).to eq(group.name)
@@ -399,19 +350,16 @@ properties
399
350
  end
400
351
 
401
352
  context 'search' do
402
- let(:first_application_name) { random_application_name(1) }
403
- let(:second_application_name) { random_application_name(2) }
404
-
405
353
  let!(:applications) do
406
354
  [
407
- test_api_client.applications.create(name: first_application_name, description: 'foo'),
408
- test_api_client.applications.create(name: second_application_name, description: 'foo')
355
+ test_api_client.applications.create(build_application(name: 'rubytestapp1')),
356
+ test_api_client.applications.create(build_application(name: 'rubytestapp2'))
409
357
  ]
410
358
  end
411
359
 
412
360
  context 'by any attribute' do
413
361
  let(:search_results) do
414
- test_api_client.applications.search(first_application_name)
362
+ test_api_client.applications.search('rubytestapp1')
415
363
  end
416
364
 
417
365
  it 'returns the application' do
@@ -421,7 +369,7 @@ properties
421
369
 
422
370
  context 'by an explicit attribute' do
423
371
  let(:search_results) do
424
- test_api_client.applications.search(name: first_application_name)
372
+ test_api_client.applications.search(name: 'rubytestapp1')
425
373
  end
426
374
 
427
375
  it 'returns the application' do
@@ -429,15 +377,11 @@ properties
429
377
  end
430
378
  end
431
379
 
432
- after do
433
- applications.each do |application|
434
- application.delete
435
- end
436
- end
380
+ after { applications.each(&:delete) }
437
381
  end
438
382
 
439
383
  describe '.create' do
440
- let(:application_name) { random_application_name }
384
+ let(:application_name) { 'rubytestapp' }
441
385
 
442
386
  let(:application_attributes) do
443
387
  {
@@ -447,9 +391,7 @@ properties
447
391
  end
448
392
 
449
393
  context do
450
- let(:application) do
451
- test_api_client.applications.create application_attributes
452
- end
394
+ let(:application) { test_api_client.applications.create application_attributes }
453
395
 
454
396
  it 'creates that application' do
455
397
  expect(application).to be
@@ -457,9 +399,7 @@ properties
457
399
  expect(application.description).to eq(application_attributes[:description])
458
400
  end
459
401
 
460
- after do
461
- application.delete
462
- end
402
+ after { application.delete }
463
403
  end
464
404
 
465
405
  describe 'auto directory creation' do
@@ -471,22 +411,19 @@ properties
471
411
 
472
412
  context 'login source' do
473
413
  let(:options) { { createDirectory: true } }
474
-
475
414
  let!(:account) do
476
415
  application.accounts.create(
477
- given_name: 'John',
478
- surname: 'Smith 2',
479
- email: 'john.smith2@example.com',
480
- username: 'johnsmith2',
481
- password: '4P@$$w0rd!'
416
+ build_account(username: 'johnsmith2', password: '4P@$$w0rd!')
482
417
  )
483
418
  end
419
+ let(:auth_request) do
420
+ Stormpath::Authentication::UsernamePasswordRequest.new 'johnsmith2', '4P@$$w0rd!'
421
+ end
422
+ let(:auth_result) { application.authenticate_account(auth_request) }
484
423
 
485
424
  before { application }
486
425
 
487
426
  it 'serves as the accounts store and login source' do
488
- auth_request = Stormpath::Authentication::UsernamePasswordRequest.new 'johnsmith2', '4P@$$w0rd!'
489
- auth_result = application.authenticate_account auth_request
490
427
  expect(account).to eq(auth_result.account)
491
428
  end
492
429
  end
@@ -502,7 +439,7 @@ properties
502
439
  context 'and existing directory' do
503
440
  it 'resolves naming conflict by adding (n) to directory name' do
504
441
  test_api_client.directories.each { |d| d.delete if "#{application_name} Directory" == d.name }
505
- test_api_client.directories.create({name: "#{application_name} Directory"})
442
+ test_api_client.directories.create(name: "#{application_name} Directory")
506
443
  application
507
444
  expect(directories.map(&:name)).to include("#{application_name} Directory (2)")
508
445
  end
@@ -558,39 +495,24 @@ properties
558
495
 
559
496
  describe '#directories' do
560
497
  context 'given a collection' do
561
- let(:directories) do
562
- test_api_client.directories
563
- end
564
-
565
- let(:directory) do
566
- directories.create(
567
- name: 'Client Directories Test',
568
- description: 'A test description'
569
- )
570
- end
498
+ let(:directories) { test_api_client.directories }
499
+ let(:directory) { directories.create(build_directory) }
571
500
 
572
501
  it 'returns the collection' do
573
502
  expect(directories).to be_kind_of(Stormpath::Resource::Collection)
574
503
  expect(directories.count).to be >= 1
575
504
  end
576
505
 
577
- after do
578
- directory.delete
579
- end
506
+ after { directory.delete }
580
507
  end
581
508
 
582
509
  context 'given a collection with a limit' do
583
- let!(:directory_1) do
584
- test_api_client.directories.create name: random_directory_name(1)
585
- end
586
-
587
- let!(:directory_2) do
588
- test_api_client.directories.create name: random_directory_name(2)
589
- end
510
+ let!(:directory_1) { test_api_client.directories.create(build_directory) }
511
+ let!(:directory_2) { test_api_client.directories.create(build_directory) }
590
512
 
591
513
  after do
592
- directory_1.delete if directory_1
593
- directory_2.delete if directory_2
514
+ directory_1.delete
515
+ directory_2.delete
594
516
  end
595
517
 
596
518
  it 'should retrieve the number of directories described with the limit' do
@@ -599,46 +521,29 @@ properties
599
521
  end
600
522
 
601
523
  describe '.create' do
602
-
603
- let(:directory_name) { random_directory_name }
604
-
605
- let(:directory_attributes) do
606
- {
607
- name: directory_name,
608
- description: 'A test description'
609
- }
610
- end
611
-
612
524
  let(:directory) do
613
- test_api_client.directories.create directory_attributes
525
+ test_api_client.directories.create(build_directory(name: 'ruby', description: 'ruby'))
614
526
  end
615
527
 
616
528
  it 'creates that application' do
617
529
  expect(directory).to be
618
- expect(directory.name).to eq(directory_attributes[:name])
619
- expect(directory.description).to eq(directory_attributes[:description])
530
+ expect(directory.name).to eq('ruby')
531
+ expect(directory.description).to eq('ruby')
620
532
  end
621
533
 
622
- after do
623
- directory.delete
624
- end
534
+ after { directory.delete }
625
535
  end
626
536
  end
627
537
 
628
538
  describe '#organization' do
629
539
  context 'search' do
630
- let(:organization_name) { random_organization_name }
631
-
632
540
  let!(:organization) do
633
- test_api_client.organizations.create(
634
- name: organization_name,
635
- name_key: "testorganization"
636
- )
541
+ test_api_client.organizations.create(build_organization(name: 'ruby-org'))
637
542
  end
638
543
 
639
544
  context 'by any attribute' do
640
545
  let(:search_results) do
641
- test_api_client.organizations.search(organization_name)
546
+ test_api_client.organizations.search('ruby-org')
642
547
  end
643
548
 
644
549
  it 'returns the application' do
@@ -647,9 +552,7 @@ properties
647
552
  end
648
553
 
649
554
  context 'by an explicit attribute' do
650
- let(:search_results) do
651
- test_api_client.organizations.search(name: organization_name)
652
- end
555
+ let(:search_results) { test_api_client.organizations.search(name: 'ruby-org') }
653
556
 
654
557
  it 'returns the application' do
655
558
  expect(search_results.count).to eq 1
@@ -660,13 +563,7 @@ properties
660
563
  end
661
564
 
662
565
  context 'given a collection' do
663
- let(:organization) do
664
- test_api_client.organizations.create(
665
- name: random_organization_name,
666
- name_key: random_name_key,
667
- description: 'A test description'
668
- )
669
- end
566
+ let(:organization) { test_api_client.organizations.create(build_organization) }
670
567
 
671
568
  it 'returns the collection' do
672
569
  expect(test_api_client.organizations).to be_kind_of(Stormpath::Resource::Collection)
@@ -677,13 +574,8 @@ properties
677
574
  end
678
575
 
679
576
  context 'given a collection with a limit' do
680
- let!(:organization_1) do
681
- test_api_client.organizations.create name: random_organization_name(1), name_key: random_name_key(1)
682
- end
683
-
684
- let!(:organization_2) do
685
- test_api_client.organizations.create name: random_organization_name(2), name_key: random_name_key(2)
686
- end
577
+ let!(:organization_1) { test_api_client.organizations.create(build_organization) }
578
+ let!(:organization_2) { test_api_client.organizations.create(build_organization) }
687
579
 
688
580
  after do
689
581
  organization_1.delete
@@ -696,54 +588,35 @@ properties
696
588
  end
697
589
 
698
590
  describe '.create' do
699
- let(:organization_name) { random_organization_name }
700
-
701
- let(:organization_attributes) do
702
- {
703
- name: organization_name,
704
- name_key: random_name_key,
705
- description: 'A test description'
706
- }
707
- end
708
-
709
591
  let(:organization) do
710
- test_api_client.organizations.create organization_attributes
592
+ test_api_client.organizations.create(build_organization(name: 'ruby',
593
+ name_key: 'ruby-org',
594
+ description: 'ruby-org'))
711
595
  end
712
596
 
713
597
  it 'creates an organization' do
714
598
  expect(organization).to be
715
- expect(organization.name).to eq(organization_attributes[:name])
716
- expect(organization.name_key).to eq(organization_attributes[:name_key])
717
- expect(organization.description).to eq(organization_attributes[:description])
599
+ expect(organization.name).to eq('ruby')
600
+ expect(organization.name_key).to eq('ruby-org')
601
+ expect(organization.description).to eq('ruby-org')
718
602
  end
719
603
 
720
- after do
721
- organization.delete
722
- end
604
+ after { organization.delete }
723
605
  end
724
606
  end
725
607
 
726
- describe "#organization_account_store_mappings" do
727
- let(:organization) do
728
- test_api_client.organizations.create name: 'test_organization',
729
- name_key: "testorganization"
730
- end
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) }
731
611
 
732
- let(:directory) { test_api_client.directories.create name: random_directory_name }
733
-
734
- let(:organization_account_store_mappings) do
735
- test_api_client.organization_account_store_mappings.create({
736
- account_store: { href: directory.href },
737
- organization: { href: organization.href }
738
- })
739
- end
612
+ let(:organization_account_store_mappings) { map_organization_store(directory, organization) }
740
613
 
741
614
  after do
742
- organization.delete if organization
743
- directory.delete if directory
615
+ organization.delete
616
+ directory.delete
744
617
  end
745
618
 
746
- it "returns the mapping" do
619
+ it 'returns the mapping' do
747
620
  expect(organization_account_store_mappings.is_default_account_store).to eq(false)
748
621
  expect(organization_account_store_mappings.is_default_group_store).to eq(false)
749
622
  expect(organization_account_store_mappings.organization).to eq(organization)
@@ -754,30 +627,28 @@ properties
754
627
 
755
628
  describe '#accounts.verify_account_email' do
756
629
  context 'given a verfication token of an account' do
757
- let(:directory) { test_directory_with_verification }
758
-
759
- let(:account) do
760
- account = Stormpath::Resource::Account.new({
761
- email: random_email,
762
- givenName: 'Ruby SDK',
763
- password: 'P@$$w0rd',
764
- surname: 'SDK',
765
- username: random_user_name
766
- })
767
- directory.create_account account
630
+ let(:application) { test_api_client.applications.create(build_application) }
631
+ let(:directory_with_verification) do
632
+ test_api_client.directories.create(build_directory(description: 'verification enabled'))
768
633
  end
769
634
 
770
- let(:verification_token) do
771
- account.email_verification_token.token
635
+ before do
636
+ map_account_store(application, directory_with_verification, 1, false, false)
637
+ enable_email_verification(directory_with_verification)
772
638
  end
773
639
 
774
- let(:verified_account) do
775
- test_api_client.accounts.verify_email_token verification_token
640
+ after do
641
+ application.delete
642
+ account.delete
643
+ directory_with_verification.delete
776
644
  end
777
645
 
778
- after do
779
- account.delete if account
646
+ let(:account) do
647
+ directory_with_verification.create_account(Stormpath::Resource::Account.new(build_account))
780
648
  end
649
+ let(:verification_token) { account.email_verification_token.token }
650
+
651
+ let(:verified_account) { test_api_client.accounts.verify_email_token verification_token }
781
652
 
782
653
  it 'returns the account' do
783
654
  expect(verified_account).to be
@@ -799,28 +670,15 @@ properties
799
670
  end
800
671
 
801
672
  before do
802
- test_api_client.account_store_mappings.create(
803
- application: application,
804
- account_store: directory1,
805
- list_index: 1,
806
- is_default_account_store: true,
807
- is_default_group_store: false
808
- )
809
-
810
- test_api_client.account_store_mappings.create(
811
- application: application,
812
- account_store: directory2,
813
- list_index: 2,
814
- is_default_account_store: false,
815
- is_default_group_store: false
816
- )
673
+ map_account_store(application, directory1, 1, true, false)
674
+ map_account_store(application, directory2, 2, false, false)
817
675
  end
818
676
 
819
677
  let!(:account1) do
820
- directory1.accounts.create(build_account(email: 'jekyll@example.com', username: 'account1'))
678
+ directory1.accounts.create(build_account(email: 'jekyll', username: 'jekyll'))
821
679
  end
822
680
  let!(:account2) do
823
- directory2.accounts.create(build_account(email: 'hyde@example.com', username: 'account2'))
681
+ directory2.accounts.create(build_account(email: 'hyde', username: 'hyde'))
824
682
  end
825
683
 
826
684
  let(:link_accounts) do