stormpath-sdk 0.4.0 → 1.0.0.beta

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 (89) hide show
  1. data/.gitignore +6 -0
  2. data/.ruby-gemset +1 -0
  3. data/.ruby-version +1 -0
  4. data/.travis.yml +27 -0
  5. data/CHANGES.md +21 -1
  6. data/Gemfile +1 -2
  7. data/README.md +457 -11
  8. data/Rakefile +15 -1
  9. data/lib/stormpath-sdk.rb +52 -33
  10. data/lib/stormpath-sdk/{resource/group_list.rb → api_key.rb} +5 -9
  11. data/lib/stormpath-sdk/auth/authentication_result.rb +3 -13
  12. data/lib/stormpath-sdk/auth/basic_authenticator.rb +5 -11
  13. data/lib/stormpath-sdk/auth/basic_login_attempt.rb +6 -8
  14. data/lib/stormpath-sdk/auth/username_password_request.rb +2 -5
  15. data/lib/stormpath-sdk/cache/cache.rb +54 -0
  16. data/lib/stormpath-sdk/cache/cache_entry.rb +33 -0
  17. data/lib/stormpath-sdk/cache/cache_manager.rb +22 -0
  18. data/lib/stormpath-sdk/cache/cache_stats.rb +35 -0
  19. data/lib/stormpath-sdk/cache/memory_store.rb +29 -0
  20. data/lib/stormpath-sdk/cache/redis_store.rb +32 -0
  21. data/lib/stormpath-sdk/client.rb +111 -0
  22. data/lib/stormpath-sdk/data_store.rb +241 -0
  23. data/lib/stormpath-sdk/{client/api_key.rb → error.rb} +16 -10
  24. data/lib/stormpath-sdk/{util → ext}/hash.rb +1 -2
  25. data/lib/stormpath-sdk/http/authc/sauthc1_signer.rb +8 -4
  26. data/lib/stormpath-sdk/http/http_client_request_executor.rb +8 -7
  27. data/lib/stormpath-sdk/http/request.rb +4 -8
  28. data/lib/stormpath-sdk/{util/request_utils.rb → http/utils.rb} +17 -38
  29. data/lib/stormpath-sdk/resource/account.rb +12 -108
  30. data/lib/stormpath-sdk/resource/application.rb +35 -171
  31. data/lib/stormpath-sdk/resource/associations.rb +97 -0
  32. data/lib/stormpath-sdk/resource/base.rb +256 -0
  33. data/lib/stormpath-sdk/resource/collection.rb +94 -0
  34. data/lib/stormpath-sdk/resource/directory.rb +11 -68
  35. data/lib/stormpath-sdk/resource/email_verification_token.rb +3 -9
  36. data/lib/stormpath-sdk/resource/error.rb +4 -38
  37. data/lib/stormpath-sdk/resource/expansion.rb +28 -0
  38. data/lib/stormpath-sdk/resource/group.rb +8 -66
  39. data/lib/stormpath-sdk/resource/group_membership.rb +4 -55
  40. data/lib/stormpath-sdk/resource/{application_list.rb → instance.rb} +7 -13
  41. data/lib/stormpath-sdk/resource/password_reset_token.rb +5 -23
  42. data/lib/stormpath-sdk/resource/status.rb +22 -28
  43. data/lib/stormpath-sdk/resource/tenant.rb +5 -52
  44. data/lib/stormpath-sdk/resource/utils.rb +43 -13
  45. data/lib/stormpath-sdk/util/assert.rb +5 -15
  46. data/lib/stormpath-sdk/version.rb +3 -3
  47. data/spec/api_key_spec.rb +19 -0
  48. data/spec/auth/basic_authenticator_spec.rb +25 -0
  49. data/spec/auth/sauthc1_signer_spec.rb +42 -0
  50. data/spec/cache/cache_entry_spec.rb +157 -0
  51. data/spec/cache/cache_spec.rb +89 -0
  52. data/spec/cache/cache_stats_spec.rb +106 -0
  53. data/spec/client_spec.rb +538 -0
  54. data/spec/data_store_spec.rb +130 -0
  55. data/spec/resource/account_spec.rb +74 -0
  56. data/spec/resource/application_spec.rb +148 -0
  57. data/spec/resource/base_spec.rb +114 -0
  58. data/spec/resource/collection_spec.rb +169 -0
  59. data/spec/resource/directory_spec.rb +30 -0
  60. data/spec/resource/expansion_spec.rb +100 -0
  61. data/spec/resource/group_spec.rb +49 -0
  62. data/spec/spec_helper.rb +135 -0
  63. data/spec/support/resource_factory.rb +48 -0
  64. data/spec/support/resource_matchers.rb +27 -0
  65. data/spec/support/test_cache_stores.rb +9 -0
  66. data/spec/support/test_request_executor.rb +11 -0
  67. data/stormpath-sdk.gemspec +14 -4
  68. data/support/api.rb +55 -0
  69. metadata +214 -44
  70. data/lib/stormpath-sdk/client/client.rb +0 -38
  71. data/lib/stormpath-sdk/client/client_application.rb +0 -38
  72. data/lib/stormpath-sdk/client/client_application_builder.rb +0 -351
  73. data/lib/stormpath-sdk/client/client_builder.rb +0 -305
  74. data/lib/stormpath-sdk/ds/data_store.rb +0 -210
  75. data/lib/stormpath-sdk/ds/resource_factory.rb +0 -37
  76. data/lib/stormpath-sdk/resource/account_list.rb +0 -32
  77. data/lib/stormpath-sdk/resource/collection_resource.rb +0 -91
  78. data/lib/stormpath-sdk/resource/directory_list.rb +0 -30
  79. data/lib/stormpath-sdk/resource/group_membership_list.rb +0 -32
  80. data/lib/stormpath-sdk/resource/instance_resource.rb +0 -28
  81. data/lib/stormpath-sdk/resource/resource.rb +0 -327
  82. data/lib/stormpath-sdk/resource/resource_error.rb +0 -47
  83. data/test/client/client.yml +0 -16
  84. data/test/client/client_application_builder_spec.rb +0 -114
  85. data/test/client/client_builder_spec.rb +0 -176
  86. data/test/client/read_spec.rb +0 -254
  87. data/test/client/write_spec.rb +0 -420
  88. data/test/resource/resource_spec.rb +0 -41
  89. data/test/resource/test_resource.rb +0 -28
@@ -0,0 +1,169 @@
1
+ require 'spec_helper'
2
+
3
+ describe Stormpath::Resource::Collection 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
15
+
16
+ describe '#collection_href' do
17
+ context 'by default' do
18
+ let(:collection) do
19
+ Stormpath::Resource::Collection.new href, item_class, client
20
+ end
21
+
22
+ it 'defaults to href' do
23
+ expect(collection.collection_href).to eq href
24
+ end
25
+ end
26
+
27
+ context 'when specified' do
28
+ let(:collection_href) do
29
+ 'http://fakie.com'
30
+ end
31
+
32
+ let(:collection) do
33
+ Stormpath::Resource::Collection.new(
34
+ href, item_class, client,
35
+ collection_href: collection_href
36
+ )
37
+ end
38
+
39
+ it 'defaults to href' do
40
+ expect(collection.collection_href).to eq collection_href
41
+ end
42
+ end
43
+ end
44
+
45
+ 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
53
+
54
+ it 'returns the collection' do
55
+ expect(offset.class).to eq Stormpath::Resource::Collection
56
+ end
57
+
58
+ it 'adds the query to the criteria' do
59
+ expect(collection.criteria).to include offset: 5
60
+ end
61
+ end
62
+
63
+ describe '#limit' do
64
+ let(:collection) do
65
+ Stormpath::Resource::Collection.new href, item_class, client
66
+ end
67
+
68
+ let!(:limit) do
69
+ collection.limit 100
70
+ end
71
+
72
+ it 'returns the collection' do
73
+ expect(limit.class).to eq Stormpath::Resource::Collection
74
+ end
75
+
76
+ it 'adds the query param to the criteria' do
77
+ expect(collection.criteria).to include limit: 100
78
+ end
79
+ end
80
+
81
+ describe '#order' do
82
+ let(:collection) do
83
+ Stormpath::Resource::Collection.new href, item_class, client
84
+ end
85
+
86
+ let(:order_statement) do
87
+ 'lastName asc,age desc'
88
+ end
89
+
90
+ let!(:order) do
91
+ collection.order order_statement
92
+ end
93
+
94
+ it 'returns the collection' do
95
+ expect(order.class).to eq Stormpath::Resource::Collection
96
+ end
97
+
98
+ it 'adds the query param to the criteria' do
99
+ expect(collection.criteria).to include order_by: order_statement
100
+ end
101
+ end
102
+
103
+ describe '#search' do
104
+ let(:collection) do
105
+ Stormpath::Resource::Collection.new href, item_class, client
106
+ end
107
+
108
+ context 'when passed a string' do
109
+ let(:query) do
110
+ 'dagnabbit'
111
+ end
112
+
113
+ let!(:search) do
114
+ collection.search query
115
+ end
116
+
117
+ it 'returns the collection' do
118
+ expect(search.class).to eq Stormpath::Resource::Collection
119
+ end
120
+
121
+ it 'adds a "q" query string to the criteria' do
122
+ expect(collection.criteria).to include q: query
123
+ end
124
+ end
125
+
126
+ 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
134
+
135
+ it 'returns the collection' do
136
+ expect(search.class).to eq Stormpath::Resource::Collection
137
+ end
138
+
139
+ it 'adds a "q" query string to the criteria' do
140
+ expect(collection.criteria).to include query_hash
141
+ end
142
+ end
143
+ end
144
+
145
+ describe '#criteria' do
146
+ let(:collection) do
147
+ Stormpath::Resource::Collection.new href, item_class, client
148
+ end
149
+
150
+ context 'when no fetch criteria present' do
151
+ it 'returns an empty hash for criteria' do
152
+ expect(collection.criteria).to be_empty
153
+ end
154
+ end
155
+
156
+ context 'when search, offset, limit and order by are chained' do
157
+ before do
158
+ collection.search('Big up to Brooklyn').order('lastName asc').offset(15).limit 50
159
+ end
160
+
161
+ it 'has the search parameters' do
162
+ expect(collection.criteria).to include q: 'Big up to Brooklyn'
163
+ expect(collection.criteria).to include offset: 15
164
+ expect(collection.criteria).to include limit: 50
165
+ expect(collection.criteria).to include order_by: 'lastName asc'
166
+ end
167
+ end
168
+ end
169
+ end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+
3
+ describe Stormpath::Resource::Directory, :vcr do
4
+ describe '#create_account' do
5
+ let(:directory) { test_directory }
6
+
7
+ context 'given a valid account' do
8
+ let(:account) do
9
+ Stormpath::Resource::Account.new({
10
+ email: "test@example.com",
11
+ given_name: 'Ruby SDK',
12
+ password: 'P@$$w0rd',
13
+ surname: 'SDK',
14
+ username: "username"
15
+ })
16
+ end
17
+
18
+ let(:created_account) { directory.create_account account, false }
19
+
20
+ after do
21
+ created_account.delete if created_account
22
+ end
23
+
24
+ it 'creates an account' do
25
+ expect(created_account).to be
26
+ expect(created_account.username).to eq(account.username)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,100 @@
1
+ require 'spec_helper'
2
+
3
+ describe Stormpath::Resource::Expansion, :vcr do
4
+ describe '#initialize' do
5
+ context 'given a single property name' do
6
+ let(:expansion) do
7
+ Stormpath::Resource::Expansion.new 'foo'
8
+ end
9
+
10
+ it 'can be transmuted to a simple hash' do
11
+ expect(expansion.to_query).to eq({ expand: 'foo' })
12
+ end
13
+ end
14
+ context 'given a list of property names' do
15
+ let(:expansion) do
16
+ Stormpath::Resource::Expansion.new 'foo', 'bar'
17
+ end
18
+
19
+ it 'can be transmuted to a simple hash' do
20
+ expect(expansion.to_query).to eq({ expand: 'foo,bar' })
21
+ end
22
+ end
23
+
24
+ context 'given no arguments are passed to constructor' do
25
+ let(:expansion) do
26
+ Stormpath::Resource::Expansion.new
27
+ end
28
+
29
+ it 'will transmute to an empty hash' do
30
+ expect(expansion.to_query).to be_nil
31
+ end
32
+ end
33
+ end
34
+
35
+ describe "#add_property" do
36
+ context 'given a simple property name' do
37
+ let(:expansion) { Stormpath::Resource::Expansion.new }
38
+
39
+ before do
40
+ expansion.add_property :foo
41
+ end
42
+
43
+ it 'can be transmuted to a simple hash' do
44
+ expect(expansion.to_query).to eq({ expand: 'foo' })
45
+ end
46
+ end
47
+
48
+ context 'given two simple property names' do
49
+ let(:expansion) { Stormpath::Resource::Expansion.new }
50
+
51
+ before do
52
+ expansion.add_property :foo
53
+ expansion.add_property :bar
54
+ end
55
+
56
+ it 'can be transmuted to a simple hash' do
57
+ expect(expansion.to_query).to eq({ expand: 'foo,bar' })
58
+ end
59
+ end
60
+
61
+ context 'given a duplicate property name' do
62
+ let(:expansion) { Stormpath::Resource::Expansion.new }
63
+
64
+ before do
65
+ expansion.add_property :foo
66
+ expansion.add_property :bar
67
+ expansion.add_property :bar
68
+ end
69
+
70
+ it 'will not duplicate the property' do
71
+ expect(expansion.to_query).to eq({ expand: 'foo,bar' })
72
+ end
73
+ end
74
+
75
+ context 'given a property name, offset, and limit' do
76
+ let(:expansion) { Stormpath::Resource::Expansion.new }
77
+
78
+ before do
79
+ expansion.add_property :foo, offset: 5, limit: 100
80
+ end
81
+
82
+ it 'can be transmuted to a simple hash' do
83
+ expect(expansion.to_query).to eq({ expand: 'foo(offset:5,limit:100)' })
84
+ end
85
+ end
86
+
87
+ context 'given two calls to add the same property' do
88
+ let(:expansion) { Stormpath::Resource::Expansion.new }
89
+
90
+ before do
91
+ expansion.add_property :foo, offset: 5, limit: 100
92
+ expansion.add_property :foo, offset: 25
93
+ end
94
+
95
+ it 'allows the last call to win out over the first' do
96
+ expect(expansion.to_query).to eq({ expand: 'foo(offset:25)' })
97
+ end
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,49 @@
1
+
2
+ require 'spec_helper'
3
+
4
+ describe Stormpath::Resource::Group, :vcr do
5
+ describe '#add_account' do
6
+ context "given an account" do
7
+ let(:directory) do
8
+ test_api_client.directories.create name: 'testDirectory'
9
+ end
10
+
11
+ let(:group) do
12
+ directory.groups.create name: 'someGroup'
13
+ end
14
+
15
+ let(:account) do
16
+ directory.accounts.create({
17
+ email: 'rubysdk@example.com',
18
+ given_name: 'Ruby SDK',
19
+ password: 'P@$$w0rd',
20
+ surname: 'SDK',
21
+ username: 'rubysdk'
22
+ })
23
+ end
24
+
25
+ let(:reloaded_account) do
26
+ test_api_client.accounts.get account.href
27
+ end
28
+
29
+ let(:reloaded_group) do
30
+ test_api_client.groups.get group.href
31
+ end
32
+
33
+ before do
34
+ group.add_account account
35
+ end
36
+
37
+ after do
38
+ group.delete if group
39
+ directory.delete if directory
40
+ account.delete if account
41
+ end
42
+
43
+ it "adds the account to the group" do
44
+ found = reloaded_group.accounts.find { |a| a.href == account.href }
45
+ expect(found).to be
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,135 @@
1
+ # Note: If SimpleCov starts after your application code is already loaded (via require),
2
+ # it won't be able to track your files and their coverage! The SimpleCov.start must be
3
+ # issued before any of your application code is required!
4
+ require 'simplecov'
5
+ SimpleCov.start
6
+
7
+ require 'stormpath-sdk'
8
+ require 'pry'
9
+ require 'pry-debugger'
10
+ require 'webmock/rspec'
11
+ require 'vcr'
12
+ require_relative '../support/api.rb'
13
+
14
+ Dir['./spec/support/*.rb'].each { |file| require file }
15
+
16
+ HIJACK_HTTP_REQUESTS_WITH_VCR = ENV['STORMPATH_SDK_TEST_ENVIRONMENT'] != 'CI'
17
+
18
+ WebMock.allow_net_connect!
19
+
20
+ VCR.configure do |c|
21
+ c.cassette_library_dir = 'spec/fixtures/vcr_cassettes'
22
+ c.hook_into :webmock
23
+ c.configure_rspec_metadata!
24
+ c.ignore_request { |r| HIJACK_HTTP_REQUESTS_WITH_VCR != true }
25
+ end
26
+
27
+ module Stormpath
28
+ module TestApiKeyHelpers
29
+ TEST_ENV_REQUIRED_VARS = {
30
+ STORMPATH_SDK_TEST_API_KEY_ID: 'The id form your Stormpath API Key',
31
+ STORMPATH_SDK_TEST_API_KEY_SECRET: 'The secret from your Stormpath API Key',
32
+ STORMPATH_SDK_TEST_APPLICATION_URL: 'The REST URL of a Stormpath Application reserved for testing.',
33
+ STORMPATH_SDK_TEST_DIRECTORY_URL: 'The REST URL of a Stormpath Directory associated to the test Application.',
34
+ STORMPATH_SDK_TEST_DIRECTORY_WITH_VERIFICATION_URL: 'The REST URL of a Stormpath Directory configured for email verification, associated to the test Application.'
35
+ }
36
+
37
+ def test_api_key_id
38
+ ENV['STORMPATH_SDK_TEST_API_KEY_ID']
39
+ end
40
+
41
+ def test_api_key_secret
42
+ ENV['STORMPATH_SDK_TEST_API_KEY_SECRET']
43
+ end
44
+
45
+ def test_directory_url
46
+ ENV['STORMPATH_SDK_TEST_DIRECTORY_URL']
47
+ end
48
+
49
+ def test_directory_with_verification_url
50
+ ENV['STORMPATH_SDK_TEST_DIRECTORY_WITH_VERIFICATION_URL']
51
+ end
52
+
53
+ def test_application_url
54
+ ENV['STORMPATH_SDK_TEST_APPLICATION_URL']
55
+ end
56
+
57
+ def test_api_key
58
+ Stormpath::ApiKey.new test_api_key_id,
59
+ test_api_key_secret
60
+ end
61
+
62
+ def test_api_client
63
+ Stormpath::Client.new api_key: test_api_key
64
+ end
65
+
66
+ def test_missing_env_vars
67
+ TEST_ENV_REQUIRED_VARS.reject do |var, message|
68
+ ENV[var.to_s]
69
+ end
70
+ end
71
+
72
+ def test_application
73
+ test_api_client.applications.get test_application_url
74
+ end
75
+
76
+ def test_directory
77
+ test_api_client.directories.get test_directory_url
78
+ end
79
+
80
+ def test_directory_with_verification
81
+ test_api_client.directories.get test_directory_with_verification_url
82
+ end
83
+ end
84
+
85
+ module TestResourceHelpers
86
+ def destroy_all_stormpath_test_resources
87
+ Stormpath::Support::Api.destroy_resources(
88
+ test_api_key_id, test_api_key_secret, test_application_url,
89
+ test_directory_url, test_directory_with_verification_url
90
+ )
91
+ end
92
+
93
+ def build_account(opts={})
94
+ opts.tap do |o|
95
+ o[:surname] = (!opts[:surname].blank? && opts[:surname]) || 'surname'
96
+ o[:given_name] = (!opts[:given_name].blank? && opts[:given_name]) || 'givenname'
97
+ o[:username] = (!opts[:username].blank? && opts[:username]) || 'username'
98
+ o[:password] = (!opts[:password].blank? && opts[:password]) || 'P@$$w0rd'
99
+ o[:email] = (!opts[:email].blank? && opts[:email]) || 'test@example.com'
100
+ end
101
+ end
102
+ end
103
+ end
104
+
105
+ RSpec.configure do |c|
106
+ c.mock_with :rspec do |c|
107
+ c.syntax = :expect
108
+ end
109
+
110
+ c.expect_with :rspec do |c|
111
+ c.syntax = :expect
112
+ end
113
+
114
+ c.include Stormpath::TestApiKeyHelpers
115
+ c.include Stormpath::TestResourceHelpers
116
+
117
+ c.treat_symbols_as_metadata_keys_with_true_values = true
118
+
119
+ c.before(:all) do
120
+ unless test_missing_env_vars.empty?
121
+ set_up_message = "In order to run the specs of the Stormpath SDK you need to setup the following environment variables:\n\t"
122
+ set_up_message << test_missing_env_vars.map do |var, message|
123
+ "#{var.to_s} : #{message}"
124
+ end.join("\n\t")
125
+ set_up_message << "\nBe sure to configure these before running the specs again."
126
+ raise set_up_message
127
+ end
128
+
129
+ destroy_all_stormpath_test_resources unless HIJACK_HTTP_REQUESTS_WITH_VCR
130
+ end
131
+
132
+ c.after(:all) do
133
+ destroy_all_stormpath_test_resources unless HIJACK_HTTP_REQUESTS_WITH_VCR
134
+ end
135
+ end