stormpath-sdk 1.0.0.beta.4 → 1.0.0.beta.5
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/.gitignore +1 -0
- data/CHANGES.md +15 -0
- data/README.md +35 -3
- data/lib/stormpath-sdk.rb +5 -6
- data/lib/stormpath-sdk/auth/basic_authenticator.rb +2 -0
- data/lib/stormpath-sdk/auth/basic_login_attempt.rb +11 -0
- data/lib/stormpath-sdk/auth/username_password_request.rb +6 -12
- data/lib/stormpath-sdk/data_store.rb +118 -127
- data/lib/stormpath-sdk/http/http_client_request_executor.rb +10 -42
- data/lib/stormpath-sdk/resource/account.rb +13 -3
- data/lib/stormpath-sdk/resource/account_membership.rb +16 -0
- data/lib/stormpath-sdk/resource/account_status.rb +26 -0
- data/lib/stormpath-sdk/resource/account_store_mapping.rb +4 -2
- data/lib/stormpath-sdk/resource/application.rb +4 -2
- data/lib/stormpath-sdk/resource/associations.rb +7 -3
- data/lib/stormpath-sdk/resource/base.rb +21 -15
- data/lib/stormpath-sdk/resource/custom_data.rb +86 -0
- data/lib/stormpath-sdk/resource/custom_data_hash_methods.rb +33 -0
- data/lib/stormpath-sdk/resource/custom_data_storage.rb +39 -0
- data/lib/stormpath-sdk/resource/directory.rb +4 -4
- data/lib/stormpath-sdk/resource/expansion.rb +15 -0
- data/lib/stormpath-sdk/resource/group.rb +10 -0
- data/lib/stormpath-sdk/resource/status.rb +16 -5
- data/lib/stormpath-sdk/version.rb +2 -2
- data/spec/client_spec.rb +6 -1
- data/spec/data_store_spec.rb +7 -2
- data/spec/resource/account_spec.rb +73 -30
- data/spec/resource/account_store_mapping_spec.rb +20 -5
- data/spec/resource/application_spec.rb +135 -0
- data/spec/resource/custom_data_spec.rb +198 -0
- data/spec/resource/directory_spec.rb +192 -9
- data/spec/resource/group_membership_spec.rb +35 -0
- data/spec/resource/group_spec.rb +44 -26
- data/spec/resource/status_spec.rb +81 -0
- data/spec/resource/tenant_spec.rb +19 -0
- data/stormpath-sdk.gemspec +2 -2
- metadata +13 -3
@@ -0,0 +1,39 @@
|
|
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
|
+
module Stormpath::Resource::CustomDataStorage
|
17
|
+
extend ActiveSupport::Concern
|
18
|
+
|
19
|
+
CUSTOM_DATA = "custom_data"
|
20
|
+
|
21
|
+
included do
|
22
|
+
|
23
|
+
def save
|
24
|
+
apply_custom_data_updates_if_necessary
|
25
|
+
super
|
26
|
+
end
|
27
|
+
|
28
|
+
def apply_custom_data_updates_if_necessary
|
29
|
+
if custom_data.send :has_removed_properties?
|
30
|
+
custom_data.send :delete_removed_properties
|
31
|
+
end
|
32
|
+
if custom_data.send :has_new_properties?
|
33
|
+
self.set_property CUSTOM_DATA, custom_data.properties
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
@@ -20,15 +20,15 @@ class Stormpath::Resource::Directory < Stormpath::Resource::Instance
|
|
20
20
|
|
21
21
|
belongs_to :tenant
|
22
22
|
|
23
|
-
has_many :accounts, can: :create
|
24
|
-
has_many :groups, can: :create
|
23
|
+
has_many :accounts, can: [:get, :create]
|
24
|
+
has_many :groups, can: [:get, :create]
|
25
25
|
|
26
26
|
def create_account account, registration_workflow_enabled=nil
|
27
27
|
href = accounts.href
|
28
|
-
|
28
|
+
if registration_workflow_enabled == false
|
29
29
|
href += "?registrationWorkflowEnabled=#{registration_workflow_enabled.to_s}"
|
30
30
|
end
|
31
|
-
|
31
|
+
account.apply_custom_data_updates_if_necessary
|
32
32
|
data_store.create href, account, Stormpath::Resource::Account
|
33
33
|
end
|
34
34
|
end
|
@@ -1,3 +1,18 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2013 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
|
+
#
|
1
16
|
class Stormpath::Resource::Expansion
|
2
17
|
attr_reader :query
|
3
18
|
|
@@ -15,6 +15,7 @@
|
|
15
15
|
#
|
16
16
|
class Stormpath::Resource::Group < Stormpath::Resource::Instance
|
17
17
|
include Stormpath::Resource::Status
|
18
|
+
include Stormpath::Resource::CustomDataStorage
|
18
19
|
|
19
20
|
prop_accessor :name, :description
|
20
21
|
|
@@ -22,8 +23,17 @@ class Stormpath::Resource::Group < Stormpath::Resource::Instance
|
|
22
23
|
belongs_to :directory
|
23
24
|
|
24
25
|
has_many :accounts
|
26
|
+
has_many :account_memberships
|
27
|
+
|
28
|
+
has_one :custom_data
|
25
29
|
|
26
30
|
def add_account account
|
27
31
|
client.group_memberships.create group: self, account: account
|
28
32
|
end
|
33
|
+
|
34
|
+
def remove_account account
|
35
|
+
account_membership = account_memberships.find {|account_membership| account_membership.account.href == account.href }
|
36
|
+
account_membership.delete if account_membership
|
37
|
+
end
|
38
|
+
|
29
39
|
end
|
@@ -1,3 +1,18 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2013 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
|
+
#
|
1
16
|
module Stormpath::Resource::Status
|
2
17
|
|
3
18
|
ENABLED = 'ENABLED'
|
@@ -11,11 +26,7 @@ module Stormpath::Resource::Status
|
|
11
26
|
|
12
27
|
def status
|
13
28
|
value = get_property STATUS
|
14
|
-
|
15
|
-
if !value.nil?
|
16
|
-
value = value.upcase
|
17
|
-
end
|
18
|
-
|
29
|
+
value.upcase! if value
|
19
30
|
value
|
20
31
|
end
|
21
32
|
|
data/spec/client_spec.rb
CHANGED
@@ -172,7 +172,12 @@ properties
|
|
172
172
|
end
|
173
173
|
|
174
174
|
context 'with a base url' do
|
175
|
-
|
175
|
+
context 'creates a client that connects to that base' do
|
176
|
+
let(:api_key) { Stormpath::ApiKey.new(test_api_key_id, test_api_key_secret) }
|
177
|
+
let(:client) { Stormpath::Client.new(api_key: api_key, base_url: "https://api.stormpath.com/v1") }
|
178
|
+
|
179
|
+
it_behaves_like 'a valid client'
|
180
|
+
end
|
176
181
|
end
|
177
182
|
|
178
183
|
context 'with an api key' do
|
data/spec/data_store_spec.rb
CHANGED
@@ -11,13 +11,18 @@ describe Stormpath::DataStore do
|
|
11
11
|
|
12
12
|
after do
|
13
13
|
application_cache.clear
|
14
|
-
|
14
|
+
end
|
15
15
|
|
16
16
|
describe '.region_for' do
|
17
|
-
let(:region) { data_store.send(:region_for, 'https://api.stormpath.com/v1/directories/4NykYrYH0OBiOOVOg8LXQ5') }
|
18
17
|
it 'pulls resource name from href' do
|
18
|
+
region = data_store.send :region_for, 'https://api.stormpath.com/v1/directories/4NykYrYH0OBiOOVOg8LXQ5'
|
19
19
|
expect(region).to eq('directories')
|
20
20
|
end
|
21
|
+
|
22
|
+
it 'pulls resource name from href if its custom data also' do
|
23
|
+
region = data_store.send :region_for, 'https://api.stormpath.com/v1/accounts/7jWpcEVSgawKkAZp8XDIEw/customData'
|
24
|
+
expect(region).to eq('customData')
|
25
|
+
end
|
21
26
|
end
|
22
27
|
|
23
28
|
describe '#delete' do
|
@@ -1,20 +1,43 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require 'pry-debugger'
|
2
3
|
|
3
4
|
describe Stormpath::Resource::Account, :vcr do
|
5
|
+
|
4
6
|
describe "instances" do
|
5
7
|
let(:directory) { test_api_client.directories.create name: 'testDirectory' }
|
8
|
+
|
9
|
+
let(:given_name) { 'Ruby SDK' }
|
10
|
+
let(:middle_name) { 'Gruby' }
|
11
|
+
let(:surname) { 'SDK' }
|
12
|
+
|
6
13
|
subject(:account) do
|
7
14
|
directory.accounts.create email: 'test@example.com',
|
8
|
-
|
15
|
+
given_name: given_name,
|
9
16
|
password: 'P@$$w0rd',
|
10
|
-
|
17
|
+
middle_name: middle_name,
|
18
|
+
surname: surname,
|
11
19
|
username: 'rubysdk'
|
12
20
|
end
|
13
21
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
22
|
+
[:given_name, :username, :middle_name, :surname, :email, :status].each do |property_accessor|
|
23
|
+
it { should respond_to property_accessor }
|
24
|
+
it { should respond_to "#{property_accessor}=" }
|
25
|
+
its(property_accessor) { should be_instance_of String }
|
26
|
+
end
|
27
|
+
|
28
|
+
it {should respond_to :full_name}
|
29
|
+
its(:full_name) { should be_instance_of String}
|
30
|
+
its(:full_name) { should eq("#{given_name} #{middle_name} #{surname}")}
|
31
|
+
|
32
|
+
it {should respond_to "password="}
|
33
|
+
|
34
|
+
its(:tenant) { should be_instance_of Stormpath::Resource::Tenant }
|
35
|
+
its(:directory) { should be_instance_of Stormpath::Resource::Directory }
|
36
|
+
its(:custom_data) { should be_instance_of Stormpath::Resource::CustomData }
|
37
|
+
its(:email_verification_token) { should be_instance_of Stormpath::Resource::EmailVerificationToken }
|
38
|
+
|
39
|
+
its(:groups) { should be_instance_of Stormpath::Resource::Collection }
|
40
|
+
its(:group_memberships) { should be_instance_of Stormpath::Resource::Collection }
|
18
41
|
|
19
42
|
after do
|
20
43
|
account.delete if account
|
@@ -23,31 +46,41 @@ describe Stormpath::Resource::Account, :vcr do
|
|
23
46
|
|
24
47
|
end
|
25
48
|
|
26
|
-
describe
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
let(:group) do
|
33
|
-
directory.groups.create name: 'testGroup'
|
34
|
-
end
|
35
|
-
|
36
|
-
let(:account) do
|
37
|
-
directory.accounts.create email: 'test@example.com',
|
49
|
+
describe 'account_associations' do
|
50
|
+
let(:directory) { test_api_client.directories.create name: 'testDirectory' }
|
51
|
+
|
52
|
+
let(:account) do
|
53
|
+
directory.accounts.create email: 'test@example.com',
|
38
54
|
givenName: 'Ruby SDK',
|
39
55
|
password: 'P@$$w0rd',
|
40
56
|
surname: 'SDK',
|
41
57
|
username: 'rubysdk'
|
42
|
-
|
58
|
+
end
|
43
59
|
|
44
|
-
|
45
|
-
|
46
|
-
|
60
|
+
it 'should belong_to directory' do
|
61
|
+
expect(account.directory).to eq(directory)
|
62
|
+
end
|
47
63
|
|
48
|
-
|
49
|
-
|
50
|
-
|
64
|
+
it 'should belong_to tenant' do
|
65
|
+
expect(account.tenant).to be
|
66
|
+
expect(account.tenant).to eq(account.directory.tenant)
|
67
|
+
end
|
68
|
+
|
69
|
+
after do
|
70
|
+
account.delete if account
|
71
|
+
directory.delete if directory
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe "#add_or_remove_group" do
|
76
|
+
context "given a group" do
|
77
|
+
let(:directory) { test_api_client.directories.create name: 'testDirectory' }
|
78
|
+
|
79
|
+
let(:group) { directory.groups.create name: 'testGroup' }
|
80
|
+
|
81
|
+
let(:account) { directory.accounts.create({ email: 'rubysdk@example.com', given_name: 'Ruby SDK', password: 'P@$$w0rd', surname: 'SDK' }) }
|
82
|
+
|
83
|
+
before { account.add_group group }
|
51
84
|
|
52
85
|
after do
|
53
86
|
account.delete if account
|
@@ -56,12 +89,21 @@ describe Stormpath::Resource::Account, :vcr do
|
|
56
89
|
end
|
57
90
|
|
58
91
|
it 'adds the group to the account' do
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
expect(
|
92
|
+
expect(account.groups).to include(group)
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'has one group membership resource' do
|
96
|
+
expect(account.group_memberships).to have(1).item
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'adds and removes the group from the account' do
|
100
|
+
expect(account.groups).to include(group)
|
101
|
+
|
102
|
+
account.remove_group group
|
103
|
+
|
104
|
+
expect(account.groups).not_to include(group)
|
64
105
|
end
|
106
|
+
|
65
107
|
end
|
66
108
|
end
|
67
109
|
|
@@ -93,4 +135,5 @@ describe Stormpath::Resource::Account, :vcr do
|
|
93
135
|
end
|
94
136
|
end
|
95
137
|
end
|
138
|
+
|
96
139
|
end
|
@@ -24,11 +24,26 @@ describe Stormpath::Resource::AccountStoreMapping, :vcr do
|
|
24
24
|
describe "instances" do
|
25
25
|
subject(:account_store_mapping) {create_account_store_mapping(application,directory)}
|
26
26
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
27
|
+
[:list_index, :is_default_account_store, :is_default_group_store, :default_account_store, :default_group_store ].each do |prop_accessor|
|
28
|
+
it { should respond_to prop_accessor }
|
29
|
+
it { should respond_to "#{prop_accessor}=" }
|
30
|
+
end
|
31
|
+
|
32
|
+
[:default_account_store?, :default_group_store?].each do |prop_getter|
|
33
|
+
it { should respond_to prop_getter }
|
34
|
+
end
|
35
|
+
|
36
|
+
its(:list_index) { should be_instance_of Fixnum }
|
37
|
+
|
38
|
+
[:default_account_store, :default_group_store].each do |default_store_method|
|
39
|
+
[default_store_method, "is_#{default_store_method}", "#{default_store_method}?"].each do |specific_store_method|
|
40
|
+
its(specific_store_method) {should satisfy {|attribute| [TrueClass, FalseClass].include? attribute.class }}
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
its(:account_store) { should satisfy {|prop_reader| [Stormpath::Resource::Directory, Stormpath::Resource::Group].include? prop_reader.class }}
|
45
|
+
|
46
|
+
its(:application) { should be_instance_of Stormpath::Resource::Application }
|
32
47
|
end
|
33
48
|
|
34
49
|
|
@@ -4,6 +4,29 @@ describe Stormpath::Resource::Application, :vcr do
|
|
4
4
|
let(:application) { test_application }
|
5
5
|
let(:directory) { test_directory }
|
6
6
|
|
7
|
+
describe "instances should respond to attribute property methods" do
|
8
|
+
subject(:application) { test_application }
|
9
|
+
|
10
|
+
it { should be_instance_of Stormpath::Resource::Application }
|
11
|
+
|
12
|
+
[:name, :description, :status].each do |property_accessor|
|
13
|
+
it { should respond_to property_accessor }
|
14
|
+
it { should respond_to "#{property_accessor}="}
|
15
|
+
its(property_accessor) { should be_instance_of String }
|
16
|
+
end
|
17
|
+
|
18
|
+
its(:tenant) { should be_instance_of Stormpath::Resource::Tenant }
|
19
|
+
its(:default_account_store_mapping) { should be_instance_of Stormpath::Resource::AccountStoreMapping }
|
20
|
+
its(:default_group_store_mapping) { should be_instance_of Stormpath::Resource::AccountStoreMapping }
|
21
|
+
|
22
|
+
its(:groups) { should be_instance_of Stormpath::Resource::Collection }
|
23
|
+
its(:accounts) { should be_instance_of Stormpath::Resource::Collection }
|
24
|
+
its(:password_reset_tokens) { should be_instance_of Stormpath::Resource::Collection }
|
25
|
+
its(:account_store_mappings) { should be_instance_of Stormpath::Resource::Collection }
|
26
|
+
|
27
|
+
|
28
|
+
end
|
29
|
+
|
7
30
|
describe '.load' do
|
8
31
|
let(:url) do
|
9
32
|
uri = URI(application.href)
|
@@ -26,6 +49,44 @@ describe Stormpath::Resource::Application, :vcr do
|
|
26
49
|
end
|
27
50
|
end
|
28
51
|
|
52
|
+
describe 'application_associations' do
|
53
|
+
|
54
|
+
context '#accounts' do
|
55
|
+
let(:account) { application.accounts.create build_account}
|
56
|
+
|
57
|
+
after do
|
58
|
+
account.delete if account
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'should be able to create an account' do
|
62
|
+
expect(application.accounts).to include(account)
|
63
|
+
expect(application.default_account_store_mapping.account_store.accounts).to include(account)
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'should be able to create and fetch the account' do
|
67
|
+
expect(application.accounts.get account.href).to be
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
context '#groups' do
|
72
|
+
let(:group) { application.groups.create name: "test_group"}
|
73
|
+
|
74
|
+
after do
|
75
|
+
group.delete if group
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'should be able to create a group' do
|
79
|
+
expect(application.groups).to include(group)
|
80
|
+
expect(application.default_group_store_mapping.account_store.groups).to include(group)
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'should be able to create and fetch a group' do
|
84
|
+
expect(application.groups.get group.href).to be
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
|
29
90
|
describe '#authenticate_account' do
|
30
91
|
let(:account) do
|
31
92
|
directory.accounts.create build_account(password: 'P@$$w0rd')
|
@@ -63,6 +124,80 @@ describe Stormpath::Resource::Application, :vcr do
|
|
63
124
|
end
|
64
125
|
end
|
65
126
|
|
127
|
+
describe '#authenticate_account_with_an_account_store_specified' do
|
128
|
+
let(:password) {'P@$$w0rd' }
|
129
|
+
|
130
|
+
let(:authentication_result) { application.authenticate_account login_request }
|
131
|
+
|
132
|
+
after do
|
133
|
+
account.delete if account
|
134
|
+
end
|
135
|
+
|
136
|
+
context 'given a proper directory' do
|
137
|
+
let(:account) { directory.accounts.create build_account(password: 'P@$$w0rd') }
|
138
|
+
|
139
|
+
let(:login_request) do
|
140
|
+
Stormpath::Authentication::UsernamePasswordRequest.new account.username, password, account_store: directory
|
141
|
+
end
|
142
|
+
|
143
|
+
it 'should return an authentication result' do
|
144
|
+
expect(authentication_result).to be
|
145
|
+
expect(authentication_result.account).to be
|
146
|
+
expect(authentication_result.account).to be_kind_of Stormpath::Resource::Account
|
147
|
+
expect(authentication_result.account.email).to eq(account.email)
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
context 'given a wrong directory' do
|
152
|
+
let(:new_directory) { test_api_client.directories.create name: 'test_account_store'}
|
153
|
+
|
154
|
+
let(:account) { new_directory.accounts.create build_account(password: 'P@$$w0rd') }
|
155
|
+
|
156
|
+
let(:login_request) do
|
157
|
+
Stormpath::Authentication::UsernamePasswordRequest.new account.username, password, account_store: directory
|
158
|
+
end
|
159
|
+
|
160
|
+
after do
|
161
|
+
new_directory.delete if new_directory
|
162
|
+
end
|
163
|
+
|
164
|
+
it 'raises an error' do
|
165
|
+
expect { authentication_result }.to raise_error Stormpath::Error
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
context 'given a group' do
|
170
|
+
let(:group) {directory.groups.create name: "test_group"}
|
171
|
+
|
172
|
+
let(:account) { directory.accounts.create build_account(password: 'P@$$w0rd') }
|
173
|
+
|
174
|
+
let(:login_request) do
|
175
|
+
Stormpath::Authentication::UsernamePasswordRequest.new account.username, password, account_store: group
|
176
|
+
end
|
177
|
+
|
178
|
+
before do
|
179
|
+
test_api_client.account_store_mappings.create({ application: application, account_store: group })
|
180
|
+
end
|
181
|
+
|
182
|
+
after do
|
183
|
+
group.delete if group
|
184
|
+
end
|
185
|
+
|
186
|
+
it 'and assigning the account to it, should return a authentication result' do
|
187
|
+
group.add_account account
|
188
|
+
expect(authentication_result).to be
|
189
|
+
expect(authentication_result.account).to be
|
190
|
+
expect(authentication_result.account).to be_kind_of Stormpath::Resource::Account
|
191
|
+
expect(authentication_result.account.email).to eq(account.email)
|
192
|
+
end
|
193
|
+
|
194
|
+
it 'but not assigning the account to, it should raise an error' do
|
195
|
+
expect { authentication_result }.to raise_error Stormpath::Error
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
end
|
200
|
+
|
66
201
|
describe '#send_password_reset_email' do
|
67
202
|
context 'given an email' do
|
68
203
|
context 'of an exisiting account on the application' do
|