stormpath-sdk 1.0.0.beta.6 → 1.0.0.beta.7
Sign up to get free protection for your applications and to get access to all the features.
- 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
|