stormpath-sdk 1.0.0.beta.6 → 1.0.0.beta.7
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.
- data/.travis.yml +2 -0
- data/CHANGES.md +10 -0
- data/lib/stormpath-sdk.rb +15 -0
- data/lib/stormpath-sdk/data_store.rb +30 -14
- data/lib/stormpath-sdk/http/request.rb +5 -25
- data/lib/stormpath-sdk/http/response.rb +0 -5
- data/lib/stormpath-sdk/provider/account_access.rb +28 -0
- data/lib/stormpath-sdk/provider/account_request.rb +30 -0
- data/lib/stormpath-sdk/provider/account_resolver.rb +43 -0
- data/lib/stormpath-sdk/provider/account_result.rb +27 -0
- data/lib/stormpath-sdk/provider/facebook/facebook_provider.rb +18 -0
- data/lib/stormpath-sdk/provider/facebook/facebook_provider_data.rb +18 -0
- data/lib/stormpath-sdk/provider/google/google_provider.rb +18 -0
- data/lib/stormpath-sdk/provider/google/google_provider_data.rb +19 -0
- data/lib/stormpath-sdk/provider/provider.rb +18 -0
- data/lib/stormpath-sdk/provider/provider_data.rb +18 -0
- data/lib/stormpath-sdk/provider/stormpath/stormpath_provider.rb +17 -0
- data/lib/stormpath-sdk/provider/stormpath/stormpath_provider_data.rb +17 -0
- data/lib/stormpath-sdk/resource/account.rb +15 -0
- data/lib/stormpath-sdk/resource/application.rb +5 -2
- data/lib/stormpath-sdk/resource/associations.rb +7 -5
- data/lib/stormpath-sdk/resource/directory.rb +15 -0
- data/lib/stormpath-sdk/version.rb +2 -2
- data/spec/auth/basic_authenticator_spec.rb +5 -5
- data/spec/cache/cache_entry_spec.rb +3 -3
- data/spec/client_spec.rb +27 -20
- data/spec/provider/account_resolver_spec.rb +25 -0
- data/spec/provider/provider_spec.rb +152 -0
- data/spec/resource/account_spec.rb +26 -30
- data/spec/resource/account_store_mapping_spec.rb +28 -27
- data/spec/resource/account_store_spec.rb +7 -7
- data/spec/resource/application_spec.rb +34 -26
- data/spec/resource/collection_spec.rb +34 -34
- data/spec/resource/custom_data_spec.rb +2 -2
- data/spec/resource/directory_spec.rb +25 -23
- data/spec/resource/group_membership_spec.rb +3 -3
- data/spec/resource/group_spec.rb +16 -17
- data/spec/resource/status_spec.rb +16 -16
- data/spec/resource/tenant_spec.rb +10 -8
- data/spec/spec_helper.rb +37 -18
- data/spec/support/custom_data_storage_behavior.rb +19 -19
- data/spec/support/mocked_provider_accounts.rb +72 -0
- data/stormpath-sdk.gemspec +5 -9
- metadata +104 -111
- checksums.yaml +0 -7
@@ -0,0 +1,19 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2014 Stormpath, Inc.
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
#
|
16
|
+
class Stormpath::Provider::GoogleProviderData < Stormpath::Provider::ProviderData
|
17
|
+
prop_reader :access_token, :refresh_token
|
18
|
+
end
|
19
|
+
|
@@ -0,0 +1,18 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2014 Stormpath, Inc.
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
#
|
16
|
+
class Stormpath::Provider::Provider < Stormpath::Resource::Base
|
17
|
+
prop_reader :provider_id, :created_at, :modified_at
|
18
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2014 Stormpath, Inc.
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
#
|
16
|
+
class Stormpath::Provider::ProviderData < Stormpath::Resource::Base
|
17
|
+
prop_reader :provider_id, :created_at, :modified_at
|
18
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2014 Stormpath, Inc.
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
#
|
16
|
+
class Stormpath::Provider::StormpathProvider < Stormpath::Provider::Provider
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2014 Stormpath, Inc.
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
#
|
16
|
+
class Stormpath::Provider::StormpathProviderData < Stormpath::Provider::ProviderData
|
17
|
+
end
|
@@ -41,4 +41,19 @@ class Stormpath::Resource::Account < Stormpath::Resource::Instance
|
|
41
41
|
group_membership.delete if group_membership
|
42
42
|
end
|
43
43
|
|
44
|
+
def provider_data
|
45
|
+
internal_instance = instance_variable_get "@_provider_data"
|
46
|
+
return internal_instance if internal_instance
|
47
|
+
|
48
|
+
provider_data_href = self.href + '/providerData'
|
49
|
+
|
50
|
+
clazz_proc = Proc.new do |data|
|
51
|
+
provider_id = data['providerId']
|
52
|
+
"Stormpath::Provider::#{provider_id.capitalize}ProviderData".constantize
|
53
|
+
end
|
54
|
+
|
55
|
+
provider_data = data_store.get_resource provider_data_href, clazz_proc
|
56
|
+
instance_variable_set "@_provider_data", provider_data
|
57
|
+
end
|
58
|
+
|
44
59
|
end
|
@@ -57,8 +57,11 @@ class Stormpath::Resource::Application < Stormpath::Resource::Instance
|
|
57
57
|
end
|
58
58
|
|
59
59
|
def authenticate_account request
|
60
|
-
|
61
|
-
|
60
|
+
Stormpath::Authentication::BasicAuthenticator.new(data_store).authenticate(href, request)
|
61
|
+
end
|
62
|
+
|
63
|
+
def get_provider_account request
|
64
|
+
Stormpath::Provider::AccountResolver.new(data_store).resolve_provider_account(href, request)
|
62
65
|
end
|
63
66
|
|
64
67
|
private
|
@@ -88,15 +88,17 @@ module Stormpath
|
|
88
88
|
if value.is_a? Hash
|
89
89
|
resource_href = get_href_from_hash value
|
90
90
|
end
|
91
|
-
|
92
|
-
|
91
|
+
|
92
|
+
key_name = "@_#{key.underscore}"
|
93
|
+
|
94
|
+
if instance_variable_get(key_name).nil?
|
93
95
|
if resource_href
|
94
|
-
instance_variable_set(
|
96
|
+
instance_variable_set(key_name, data_store.instantiate(clazz, value))
|
95
97
|
else
|
96
|
-
instance_variable_set(
|
98
|
+
instance_variable_set(key_name, clazz.new(value))
|
97
99
|
end
|
98
100
|
end
|
99
|
-
instance_variable_get(
|
101
|
+
instance_variable_get(key_name)
|
100
102
|
end
|
101
103
|
|
102
104
|
def get_resource_href_property(key)
|
@@ -31,4 +31,19 @@ class Stormpath::Resource::Directory < Stormpath::Resource::Instance
|
|
31
31
|
account.apply_custom_data_updates_if_necessary
|
32
32
|
data_store.create href, account, Stormpath::Resource::Account
|
33
33
|
end
|
34
|
+
|
35
|
+
def provider
|
36
|
+
internal_instance = instance_variable_get "@_provider"
|
37
|
+
return internal_instance if internal_instance
|
38
|
+
|
39
|
+
provider_href = self.href + '/provider'
|
40
|
+
|
41
|
+
clazz_proc = Proc.new do |data|
|
42
|
+
provider_id = data['providerId']
|
43
|
+
"Stormpath::Provider::#{provider_id.capitalize}Provider".constantize
|
44
|
+
end
|
45
|
+
|
46
|
+
provider = data_store.get_resource provider_href, clazz_proc
|
47
|
+
instance_variable_set "@_provider", provider
|
48
|
+
end
|
34
49
|
end
|
@@ -4,17 +4,17 @@ describe "BasicAuthenticator" do
|
|
4
4
|
context "given an instance of BasicAuthenticator" do
|
5
5
|
|
6
6
|
before do
|
7
|
-
|
8
|
-
allow(test_api_client).to receive(:data_store).and_return(
|
7
|
+
data_store = Stormpath::DataStore.new "", {}, ""
|
8
|
+
allow(test_api_client).to receive(:data_store).and_return(data_store)
|
9
9
|
auth_result = Stormpath::Authentication::AuthenticationResult.new({}, test_api_client)
|
10
|
-
allow(
|
10
|
+
allow(data_store).to receive(:create).and_return(auth_result)
|
11
11
|
|
12
|
-
@
|
12
|
+
@basic_authenticator = Stormpath::Authentication::BasicAuthenticator.new data_store
|
13
13
|
end
|
14
14
|
|
15
15
|
context "when authenticating" do
|
16
16
|
before do
|
17
|
-
@response = @
|
17
|
+
@response = @basic_authenticator.authenticate "foo/bar", Stormpath::Authentication::UsernamePasswordRequest.new("fake-username", "fake-password")
|
18
18
|
end
|
19
19
|
|
20
20
|
it "an AuthenticationResult is returned" do
|
@@ -63,7 +63,7 @@ describe Stormpath::Cache::CacheEntry do
|
|
63
63
|
end
|
64
64
|
|
65
65
|
it 'returns false' do
|
66
|
-
expect(expired).to
|
66
|
+
expect(expired).to be_falsey
|
67
67
|
end
|
68
68
|
end
|
69
69
|
|
@@ -76,7 +76,7 @@ describe Stormpath::Cache::CacheEntry do
|
|
76
76
|
end
|
77
77
|
|
78
78
|
it 'returns true' do
|
79
|
-
expect(@expired).to
|
79
|
+
expect(@expired).to be_truthy
|
80
80
|
end
|
81
81
|
end
|
82
82
|
|
@@ -89,7 +89,7 @@ describe Stormpath::Cache::CacheEntry do
|
|
89
89
|
end
|
90
90
|
|
91
91
|
it 'returns true' do
|
92
|
-
expect(@expired).to
|
92
|
+
expect(@expired).to be_truthy
|
93
93
|
end
|
94
94
|
end
|
95
95
|
end
|
data/spec/client_spec.rb
CHANGED
@@ -285,7 +285,7 @@ properties
|
|
285
285
|
|
286
286
|
it 'returns the collection' do
|
287
287
|
expect(applications).to be_kind_of(Stormpath::Resource::Collection)
|
288
|
-
expect(applications).to
|
288
|
+
expect(applications.count).to be >= 1
|
289
289
|
end
|
290
290
|
|
291
291
|
after do
|
@@ -296,13 +296,13 @@ properties
|
|
296
296
|
context 'pagination' do
|
297
297
|
let!(:applications) do
|
298
298
|
(0..2).to_a.map do |index|
|
299
|
-
test_api_client.applications.create name:
|
299
|
+
test_api_client.applications.create name: random_application_name(index), description: 'foo'
|
300
300
|
end
|
301
301
|
end
|
302
302
|
|
303
303
|
it 'accepts offset and limit' do
|
304
|
-
expect(test_api_client.applications.limit(2)).to
|
305
|
-
expect(test_api_client.applications.offset(1).limit(2)).to
|
304
|
+
expect(test_api_client.applications.limit(2).count).to be >= 3
|
305
|
+
expect(test_api_client.applications.offset(1).limit(2).count).to be >= 2
|
306
306
|
end
|
307
307
|
|
308
308
|
after do
|
@@ -337,11 +337,11 @@ properties
|
|
337
337
|
end
|
338
338
|
|
339
339
|
let(:directory) do
|
340
|
-
client.directories.create name:
|
340
|
+
client.directories.create name: random_directory_name
|
341
341
|
end
|
342
342
|
|
343
343
|
let(:group) do
|
344
|
-
directory.groups.create name:
|
344
|
+
directory.groups.create name: random_group_name
|
345
345
|
end
|
346
346
|
|
347
347
|
let(:account) do
|
@@ -385,7 +385,7 @@ properties
|
|
385
385
|
end
|
386
386
|
|
387
387
|
let(:group) do
|
388
|
-
directory.groups.create name:
|
388
|
+
directory.groups.create name: random_group_name
|
389
389
|
end
|
390
390
|
|
391
391
|
before do
|
@@ -401,16 +401,20 @@ properties
|
|
401
401
|
end
|
402
402
|
|
403
403
|
context 'search' do
|
404
|
+
|
405
|
+
let(:first_application_name) { random_application_name(1) }
|
406
|
+
let(:second_application_name ) { random_application_name(2) }
|
407
|
+
|
404
408
|
let!(:applications) do
|
405
409
|
[
|
406
|
-
test_api_client.applications.create(name:
|
407
|
-
test_api_client.applications.create(name:
|
410
|
+
test_api_client.applications.create(name: first_application_name, description: 'foo'),
|
411
|
+
test_api_client.applications.create(name: second_application_name, description: 'foo')
|
408
412
|
]
|
409
413
|
end
|
410
414
|
|
411
415
|
context 'by any attribute' do
|
412
416
|
let(:search_results) do
|
413
|
-
test_api_client.applications.search(
|
417
|
+
test_api_client.applications.search(first_application_name)
|
414
418
|
end
|
415
419
|
|
416
420
|
it 'returns the application' do
|
@@ -420,7 +424,7 @@ properties
|
|
420
424
|
|
421
425
|
context 'by an explicit attribute' do
|
422
426
|
let(:search_results) do
|
423
|
-
test_api_client.applications.search(name:
|
427
|
+
test_api_client.applications.search(name: first_application_name)
|
424
428
|
end
|
425
429
|
|
426
430
|
it 'returns the application' do
|
@@ -436,7 +440,7 @@ properties
|
|
436
440
|
end
|
437
441
|
|
438
442
|
describe '.create' do
|
439
|
-
let(:application_name) {
|
443
|
+
let(:application_name) { random_application_name }
|
440
444
|
|
441
445
|
let(:application_attributes) do
|
442
446
|
{
|
@@ -543,7 +547,7 @@ properties
|
|
543
547
|
end
|
544
548
|
end
|
545
549
|
|
546
|
-
after(:each) do
|
550
|
+
after(:each) do |example|
|
547
551
|
unless example.metadata[:skip_cleanup]
|
548
552
|
application.delete
|
549
553
|
test_api_client.directories.each do |d|
|
@@ -570,7 +574,7 @@ properties
|
|
570
574
|
|
571
575
|
it 'returns the collection' do
|
572
576
|
expect(directories).to be_kind_of(Stormpath::Resource::Collection)
|
573
|
-
expect(directories).to
|
577
|
+
expect(directories.count).to be >= 1
|
574
578
|
end
|
575
579
|
|
576
580
|
after do
|
@@ -580,11 +584,11 @@ properties
|
|
580
584
|
|
581
585
|
context 'given a collection with a limit' do
|
582
586
|
let!(:directory_1) do
|
583
|
-
test_api_client.directories.create name:
|
587
|
+
test_api_client.directories.create name: random_directory_name(1)
|
584
588
|
end
|
585
589
|
|
586
590
|
let!(:directory_2) do
|
587
|
-
test_api_client.directories.create name:
|
591
|
+
test_api_client.directories.create name: random_directory_name(2)
|
588
592
|
end
|
589
593
|
|
590
594
|
after do
|
@@ -593,14 +597,17 @@ properties
|
|
593
597
|
end
|
594
598
|
|
595
599
|
it 'should retrieve the number of directories described with the limit' do
|
596
|
-
expect(test_api_client.directories).to
|
600
|
+
expect(test_api_client.directories.count).to be >= 2
|
597
601
|
end
|
598
602
|
end
|
599
603
|
|
600
604
|
describe '.create' do
|
605
|
+
|
606
|
+
let(:directory_name) { random_directory_name }
|
607
|
+
|
601
608
|
let(:directory_attributes) do
|
602
609
|
{
|
603
|
-
name:
|
610
|
+
name: directory_name,
|
604
611
|
description: 'A test description'
|
605
612
|
}
|
606
613
|
end
|
@@ -627,11 +634,11 @@ properties
|
|
627
634
|
|
628
635
|
let(:account) do
|
629
636
|
account = Stormpath::Resource::Account.new({
|
630
|
-
email:
|
637
|
+
email: random_email,
|
631
638
|
givenName: 'Ruby SDK',
|
632
639
|
password: 'P@$$w0rd',
|
633
640
|
surname: 'SDK',
|
634
|
-
username:
|
641
|
+
username: random_user_name
|
635
642
|
})
|
636
643
|
directory.create_account account
|
637
644
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "ProviderAccountResolver" do
|
4
|
+
context "given an instance of ProviderAccountResolver" do
|
5
|
+
|
6
|
+
before do
|
7
|
+
data_store = Stormpath::DataStore.new "", {}, ""
|
8
|
+
allow(test_api_client).to receive(:data_store).and_return(data_store)
|
9
|
+
auth_result = Stormpath::Provider::AccountResult.new({}, test_api_client)
|
10
|
+
allow(data_store).to receive(:create).and_return(auth_result)
|
11
|
+
|
12
|
+
@provider_account_resolver = Stormpath::Provider::AccountResolver.new data_store
|
13
|
+
end
|
14
|
+
|
15
|
+
context "when integrating" do
|
16
|
+
before do
|
17
|
+
@response = @provider_account_resolver.resolve_provider_account "foo/bar", Stormpath::Provider::AccountRequest.new(:facebook, :access_token, "some-token")
|
18
|
+
end
|
19
|
+
|
20
|
+
it "an ProviderResult is returned" do
|
21
|
+
expect(@response).to be_a Stormpath::Provider::AccountResult
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,152 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Stormpath::Provider::Provider, :vcr do
|
4
|
+
|
5
|
+
let(:application) do
|
6
|
+
test_api_client.applications.create name: random_application_name,
|
7
|
+
description: 'Test Provider Application for AccountStoreMappings'
|
8
|
+
end
|
9
|
+
|
10
|
+
let(:account_store_mapping) do
|
11
|
+
test_api_client.account_store_mappings.create application: application, account_store: directory
|
12
|
+
end
|
13
|
+
|
14
|
+
let(:directory) do
|
15
|
+
test_api_client.directories.create directory_hash
|
16
|
+
end
|
17
|
+
|
18
|
+
let(:directory_hash) do
|
19
|
+
Hash.new.tap do |hash|
|
20
|
+
hash[:name] = name
|
21
|
+
hash[:description] = description
|
22
|
+
hash[:provider] = provider_info if defined? provider_info
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
subject(:provider) do
|
27
|
+
directory.provider
|
28
|
+
end
|
29
|
+
|
30
|
+
after do
|
31
|
+
directory.delete
|
32
|
+
application.delete
|
33
|
+
end
|
34
|
+
|
35
|
+
shared_examples 'a provider directory' do
|
36
|
+
it { should be_kind_of Stormpath::Provider::Provider }
|
37
|
+
|
38
|
+
it "assign provider directory to an application" do
|
39
|
+
expect(application.account_store_mappings.count).to eq(0)
|
40
|
+
expect(account_store_mapping.application).to eq(application)
|
41
|
+
expect(account_store_mapping.account_store).to eq(directory)
|
42
|
+
expect(application.account_store_mappings.count).to eq(1)
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'should properly respond to attributes' do
|
46
|
+
expect(provider.provider_id).to eq(provider_id)
|
47
|
+
expect(provider.created_at).to be
|
48
|
+
expect(provider.modified_at).to be
|
49
|
+
expect(provider.href).to eq(directory.href + "/provider")
|
50
|
+
|
51
|
+
provider_clazz = "Stormpath::Provider::#{provider_id.capitalize}Provider".constantize
|
52
|
+
expect(provider).to be_instance_of(provider_clazz)
|
53
|
+
|
54
|
+
if provider_id == "google" || provider_id == "facebook"
|
55
|
+
expect(provider.client_id).to eq(client_id)
|
56
|
+
expect(provider.client_secret).to eq(client_secret)
|
57
|
+
end
|
58
|
+
|
59
|
+
if provider_id == "google"
|
60
|
+
expect(provider.redirect_uri).to eq(redirect_uri)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
shared_examples 'a syncrhonizeable directory' do
|
66
|
+
it 'should be able to store provider accounts' do
|
67
|
+
account_store_mapping
|
68
|
+
|
69
|
+
access_token = "xyz"
|
70
|
+
request = Stormpath::Provider::AccountRequest.new(provider_id, :access_token, access_token)
|
71
|
+
|
72
|
+
stub_request(:post, application.href + "/accounts").to_return(body: Stormpath::Test.mocked_account(provider_id), status: 201)
|
73
|
+
result = application.get_provider_account(request)
|
74
|
+
expect(result.is_new_account?).to be
|
75
|
+
expect(result.account).to be_kind_of(Stormpath::Resource::Account)
|
76
|
+
|
77
|
+
stub_request(:get, result.account.href + "/providerData").to_return(body: Stormpath::Test.mocked_provider_data(provider_id))
|
78
|
+
|
79
|
+
expect(result.account.provider_data).to be_kind_of(Stormpath::Provider::ProviderData)
|
80
|
+
provider_data_clazz = "Stormpath::Provider::#{provider_id.capitalize}ProviderData".constantize
|
81
|
+
expect(result.account.provider_data).to be_instance_of(provider_data_clazz)
|
82
|
+
|
83
|
+
expect(result.account.provider_data.provider_id).to eq(provider_id)
|
84
|
+
expect(result.account.provider_data.created_at).to be
|
85
|
+
expect(result.account.provider_data.modified_at).to be
|
86
|
+
expect(result.account.provider_data.access_token).to be
|
87
|
+
|
88
|
+
if provider_id == 'google'
|
89
|
+
expect(result.account.provider_data.refresh_token).to be
|
90
|
+
end
|
91
|
+
|
92
|
+
stub_request(:post, application.href + "/accounts").to_return(body: Stormpath::Test.mocked_account(provider_id), status: 200)
|
93
|
+
new_result = application.get_provider_account(request)
|
94
|
+
expect(new_result.is_new_account).not_to be
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
describe 'create stormpath directory with empty provider credentials' do
|
99
|
+
let(:name) { random_directory_name('Stormpath') }
|
100
|
+
let(:description) { 'Directory for testing Stormpath directories.' }
|
101
|
+
let(:provider_id) { "stormpath" }
|
102
|
+
|
103
|
+
it_behaves_like 'a provider directory'
|
104
|
+
|
105
|
+
it 'should be able to retrieve provider data from a regular account' do
|
106
|
+
account = directory.accounts.create({
|
107
|
+
given_name: 'John',
|
108
|
+
surname: 'Smith',
|
109
|
+
email: 'john.smith@example.com',
|
110
|
+
username: 'johnsmith',
|
111
|
+
password: '4P@$$w0rd!'
|
112
|
+
})
|
113
|
+
|
114
|
+
expect(account.provider_data).to be_kind_of(Stormpath::Provider::ProviderData)
|
115
|
+
expect(account.provider_data.provider_id).to eq(provider_id)
|
116
|
+
expect(account.provider_data.created_at).to be
|
117
|
+
expect(account.provider_data.modified_at).to be
|
118
|
+
expect(account.provider_data).to be_instance_of(Stormpath::Provider::StormpathProviderData)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
describe 'create facebook directory with provider credentials' do
|
123
|
+
let(:name) { random_directory_name('Facebook') }
|
124
|
+
let(:description) { 'Directory for testing Facebook directories.' }
|
125
|
+
|
126
|
+
let(:provider_id) { "facebook" }
|
127
|
+
let(:client_id) { 'FACEBOOK_APP_ID' }
|
128
|
+
let(:client_secret) { 'FACEBOOK_APP_SECRET' }
|
129
|
+
let(:provider_info) do
|
130
|
+
{ provider_id: provider_id, client_id: client_id, client_secret: client_secret }
|
131
|
+
end
|
132
|
+
|
133
|
+
it_behaves_like 'a provider directory'
|
134
|
+
it_behaves_like 'a syncrhonizeable directory'
|
135
|
+
end
|
136
|
+
|
137
|
+
describe 'create google directory with provider credentials' do
|
138
|
+
let(:name) { random_directory_name('Google') }
|
139
|
+
let(:description) { 'Directory for testing Google directories.' }
|
140
|
+
|
141
|
+
let(:provider_id) { "google" }
|
142
|
+
let(:client_id) { 'GOOGLE_CLIENT_ID' }
|
143
|
+
let(:client_secret) { 'GOOGLE_CLIENT_SECRET' }
|
144
|
+
let(:redirect_uri) { 'GOOGLE_REDIRECT_URI' }
|
145
|
+
let(:provider_info) do
|
146
|
+
{ provider_id: provider_id, client_id: client_id, client_secret: client_secret, redirect_uri: redirect_uri }
|
147
|
+
end
|
148
|
+
|
149
|
+
it_behaves_like 'a provider directory'
|
150
|
+
it_behaves_like 'a syncrhonizeable directory'
|
151
|
+
end
|
152
|
+
end
|