osso 0.0.3.14 → 0.0.3.19
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.
- checksums.yaml +4 -4
- data/.buildkite/pipeline.yml +17 -1
- data/.rubocop.yml +1 -0
- data/Gemfile +1 -0
- data/Gemfile.lock +10 -2
- data/README.md +3 -2
- data/bin/publish +18 -0
- data/db/schema.rb +9 -1
- data/lib/osso/db/migrate/20200826201852_create_app_config.rb +11 -0
- data/lib/osso/graphql/mutation.rb +7 -0
- data/lib/osso/graphql/mutations.rb +2 -0
- data/lib/osso/graphql/mutations/base_mutation.rb +18 -5
- data/lib/osso/graphql/mutations/configure_identity_provider.rb +8 -10
- data/lib/osso/graphql/mutations/create_enterprise_account.rb +7 -0
- data/lib/osso/graphql/mutations/create_identity_provider.rb +14 -5
- data/lib/osso/graphql/mutations/create_oauth_client.rb +1 -3
- data/lib/osso/graphql/mutations/delete_enterprise_account.rb +9 -11
- data/lib/osso/graphql/mutations/delete_oauth_client.rb +1 -3
- data/lib/osso/graphql/mutations/regenerate_oauth_credentials.rb +1 -3
- data/lib/osso/graphql/mutations/set_redirect_uris.rb +2 -4
- data/lib/osso/graphql/mutations/update_app_config.rb +30 -0
- data/lib/osso/graphql/query.rb +14 -0
- data/lib/osso/graphql/resolvers.rb +1 -0
- data/lib/osso/graphql/resolvers/base_resolver.rb +21 -0
- data/lib/osso/graphql/resolvers/enterprise_account.rb +1 -11
- data/lib/osso/graphql/resolvers/enterprise_accounts.rb +2 -2
- data/lib/osso/graphql/resolvers/oauth_clients.rb +2 -2
- data/lib/osso/graphql/types.rb +2 -1
- data/lib/osso/graphql/types/admin_user.rb +22 -0
- data/lib/osso/graphql/types/app_config.rb +22 -0
- data/lib/osso/graphql/types/base_object.rb +22 -0
- data/lib/osso/graphql/types/enterprise_account.rb +0 -5
- data/lib/osso/graphql/types/identity_provider.rb +0 -6
- data/lib/osso/graphql/types/oauth_client.rb +2 -4
- data/lib/osso/graphql/types/redirect_uri.rb +2 -4
- data/lib/osso/helpers/auth.rb +40 -18
- data/lib/osso/lib/route_map.rb +2 -2
- data/lib/osso/models/app_config.rb +33 -0
- data/lib/osso/models/identity_provider.rb +6 -12
- data/lib/osso/models/models.rb +1 -0
- data/lib/osso/models/oauth_client.rb +1 -0
- data/lib/osso/models/redirect_uri.rb +0 -11
- data/lib/osso/routes/admin.rb +2 -2
- data/lib/osso/routes/auth.rb +29 -12
- data/lib/osso/routes/oauth.rb +25 -18
- data/lib/osso/version.rb +1 -1
- data/lib/tasks/bootstrap.rake +2 -0
- data/spec/graphql/mutations/configure_identity_provider_spec.rb +17 -4
- data/spec/graphql/mutations/create_enterprise_account_spec.rb +53 -4
- data/spec/graphql/mutations/create_identity_provider_spec.rb +18 -6
- data/spec/graphql/mutations/create_oauth_client_spec.rb +10 -3
- data/spec/graphql/mutations/delete_enterprise_account_spec.rb +18 -4
- data/spec/graphql/mutations/delete_oauth_client_spec.rb +8 -4
- data/spec/graphql/query/enterprise_account_spec.rb +21 -6
- data/spec/graphql/query/enterprise_accounts_spec.rb +4 -2
- data/spec/graphql/query/identity_provider_spec.rb +16 -6
- data/spec/graphql/query/oauth_clients_spec.rb +10 -7
- data/spec/helpers/auth_spec.rb +97 -0
- data/spec/models/identity_provider_spec.rb +12 -0
- data/spec/routes/auth_spec.rb +18 -0
- data/spec/routes/oauth_spec.rb +5 -2
- data/spec/spec_helper.rb +3 -0
- data/spec/support/views/error.erb +0 -0
- metadata +15 -6
- data/lib/osso/graphql/types/user.rb +0 -17
@@ -4,17 +4,6 @@ module Osso
|
|
4
4
|
module Models
|
5
5
|
class RedirectUri < ActiveRecord::Base
|
6
6
|
belongs_to :oauth_client
|
7
|
-
|
8
|
-
# TODO
|
9
|
-
# before_validation :set_primary, on: :creaet, :update
|
10
|
-
|
11
|
-
private
|
12
|
-
|
13
|
-
def set_primary
|
14
|
-
if primary_was.true? && primary.false?
|
15
|
-
|
16
|
-
end
|
17
|
-
end
|
18
7
|
end
|
19
8
|
end
|
20
9
|
end
|
data/lib/osso/routes/admin.rb
CHANGED
data/lib/osso/routes/auth.rb
CHANGED
@@ -14,10 +14,6 @@ module Osso
|
|
14
14
|
/[0-9a-f]{8}-[0-9a-f]{3,4}-[0-9a-f]{4}-[0-9a-f]{3,4}-[0-9a-f]{12}/.
|
15
15
|
freeze
|
16
16
|
|
17
|
-
def self.internal_redirect?(env)
|
18
|
-
env['HTTP_REFERER']&.match(env['SERVER_NAME'])
|
19
|
-
end
|
20
|
-
|
21
17
|
use OmniAuth::Builder do
|
22
18
|
OmniAuth::MultiProvider.register(
|
23
19
|
self,
|
@@ -26,21 +22,24 @@ module Osso
|
|
26
22
|
path_prefix: '/auth/saml',
|
27
23
|
callback_suffix: 'callback',
|
28
24
|
) do |identity_provider_id, _env|
|
29
|
-
|
30
|
-
|
25
|
+
Models::IdentityProvider.find(identity_provider_id).
|
26
|
+
saml_options
|
31
27
|
end
|
32
28
|
end
|
33
29
|
|
34
|
-
namespace '/auth' do
|
30
|
+
namespace '/auth' do # rubocop:disable Metrics/BlockLength
|
31
|
+
get '/failure' do
|
32
|
+
@error = params[:message]
|
33
|
+
erb :error
|
34
|
+
end
|
35
35
|
# Enterprise users are sent here after authenticating against
|
36
36
|
# their Identity Provider. We find or create a user record,
|
37
37
|
# and then create an authorization code for that user. The user
|
38
38
|
# is redirected back to your application with this code
|
39
|
-
# as a URL query param, which you then
|
39
|
+
# as a URL query param, which you then exchange for an access token.
|
40
40
|
post '/saml/:id/callback' do
|
41
41
|
provider = Models::IdentityProvider.find(params[:id])
|
42
|
-
oauth_client = provider.oauth_client
|
43
|
-
redirect_uri = env['redirect_uri'] || oauth_client.primary_redirect_uri.uri
|
42
|
+
@oauth_client = provider.oauth_client
|
44
43
|
|
45
44
|
attributes = env['omniauth.auth']&.
|
46
45
|
extra&.
|
@@ -56,11 +55,29 @@ module Osso
|
|
56
55
|
end
|
57
56
|
|
58
57
|
authorization_code = user.authorization_codes.create!(
|
59
|
-
oauth_client: oauth_client,
|
58
|
+
oauth_client: @oauth_client,
|
60
59
|
redirect_uri: redirect_uri,
|
61
60
|
)
|
62
61
|
|
63
|
-
|
62
|
+
# Mark IDP as active
|
63
|
+
|
64
|
+
redirect(redirect_uri + "?code=#{CGI.escape(authorization_code.token)}&state=#{provider_state}")
|
65
|
+
end
|
66
|
+
|
67
|
+
def redirect_uri
|
68
|
+
return @oauth_client.primary_redirect_uri.uri if valid_idp_initiated_flow
|
69
|
+
|
70
|
+
session[:osso_oauth_redirect_uri]
|
71
|
+
end
|
72
|
+
|
73
|
+
def provider_state
|
74
|
+
return @provider_state = 'IDP_INITIATED' if valid_idp_initiated_flow
|
75
|
+
|
76
|
+
session.delete(:osso_oauth_state)
|
77
|
+
end
|
78
|
+
|
79
|
+
def valid_idp_initiated_flow
|
80
|
+
!session[:osso_oauth_redirect_uri] && !session[:osso_oauth_state]
|
64
81
|
end
|
65
82
|
end
|
66
83
|
end
|
data/lib/osso/routes/oauth.rb
CHANGED
@@ -6,38 +6,45 @@ module Osso
|
|
6
6
|
class Oauth < Sinatra::Base
|
7
7
|
include AppConfig
|
8
8
|
register Sinatra::Namespace
|
9
|
-
|
10
|
-
namespace '/oauth' do
|
9
|
+
|
10
|
+
namespace '/oauth' do # rubocop:disable Metrics/BlockLength
|
11
11
|
# Send your users here in order to being an authentication
|
12
12
|
# flow. This flow follows the authorization grant oauth
|
13
13
|
# spec with one exception - you must also pass the domain
|
14
|
-
# of the user who wants to sign in.
|
14
|
+
# of the user who wants to sign in. If the sign in request
|
15
|
+
# is valid, the user is redirected to their Identity Provider.
|
16
|
+
# Once they complete IdP login, they will be returned to the
|
17
|
+
# redirect_uri with an authorization code parameter.
|
15
18
|
get '/authorize' do
|
16
|
-
@enterprise = Models::EnterpriseAccount.
|
17
|
-
includes(:identity_providers).
|
18
|
-
find_by!(domain: params[:domain])
|
19
|
-
|
20
19
|
Rack::OAuth2::Server::Authorize.new do |req, _res|
|
21
20
|
client = Models::OauthClient.find_by!(identifier: req.client_id)
|
22
|
-
req.verify_redirect_uri!(client.redirect_uri_values)
|
21
|
+
session[:osso_oauth_redirect_uri] = req.verify_redirect_uri!(client.redirect_uri_values)
|
22
|
+
session[:osso_oauth_state] = params[:state]
|
23
23
|
end.call(env)
|
24
24
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
25
|
+
enterprise = Models::EnterpriseAccount.
|
26
|
+
includes(:identity_providers).
|
27
|
+
find_by!(domain: params[:domain])
|
28
|
+
|
29
|
+
redirect "/auth/saml/#{enterprise.provider.id}" if enterprise.single_provider?
|
29
30
|
|
30
31
|
# TODO: multiple provider support
|
31
32
|
# erb :multiple_providers
|
32
33
|
|
33
34
|
rescue Rack::OAuth2::Server::Authorize::BadRequest => e
|
34
35
|
@error = e
|
35
|
-
|
36
|
+
erb :error
|
37
|
+
rescue ActiveRecord::RecordNotFound => e
|
38
|
+
@error = e
|
39
|
+
@error = 'No OAuth Client exists for the provided client_id' if e.model == 'Osso::Models::OauthClient'
|
40
|
+
@error = "No Customer exists with the domain #{params[:domain]}" if e.model == 'Osso::Models::EnterpriseAccount'
|
41
|
+
erb :error
|
36
42
|
end
|
37
43
|
|
38
|
-
# Exchange an authorization code
|
39
|
-
# In addition to the
|
40
|
-
# required by
|
44
|
+
# Exchange an authorization code for an access token.
|
45
|
+
# In addition to the authorization code, you must include all
|
46
|
+
# paramaters required by OAuth spec: redirect_uri, client ID,
|
47
|
+
# and client secret
|
41
48
|
post '/token' do
|
42
49
|
Rack::OAuth2::Server::Token.new do |req, res|
|
43
50
|
code = Models::AuthorizationCode.
|
@@ -49,7 +56,8 @@ module Osso
|
|
49
56
|
end.call(env)
|
50
57
|
end
|
51
58
|
|
52
|
-
# Use the access token to request a user
|
59
|
+
# Use the access token to request a profile for the user who
|
60
|
+
# just logged in. Access tokens are short-lived.
|
53
61
|
get '/me' do
|
54
62
|
json Models::AccessToken.
|
55
63
|
includes(:user).
|
@@ -60,4 +68,3 @@ module Osso
|
|
60
68
|
end
|
61
69
|
end
|
62
70
|
end
|
63
|
-
# rubocop:enable Metrics/BlockLength
|
data/lib/osso/version.rb
CHANGED
data/lib/tasks/bootstrap.rake
CHANGED
@@ -39,12 +39,15 @@ describe Osso::GraphQL::Schema do
|
|
39
39
|
described_class.execute(
|
40
40
|
mutation,
|
41
41
|
variables: variables,
|
42
|
-
context:
|
42
|
+
context: current_context,
|
43
43
|
)
|
44
44
|
end
|
45
45
|
|
46
46
|
describe 'for an admin user' do
|
47
|
-
let(:
|
47
|
+
let(:current_context) do
|
48
|
+
{ scope: 'admin' }
|
49
|
+
end
|
50
|
+
|
48
51
|
it 'configures an identity provider' do
|
49
52
|
expect(subject.dig('data', 'configureIdentityProvider', 'identityProvider', 'status')).
|
50
53
|
to eq('Configured')
|
@@ -53,7 +56,12 @@ describe Osso::GraphQL::Schema do
|
|
53
56
|
|
54
57
|
describe 'for an email scoped user' do
|
55
58
|
let(:domain) { Faker::Internet.domain_name }
|
56
|
-
let(:
|
59
|
+
let(:current_context) do
|
60
|
+
{
|
61
|
+
scope: 'end-user',
|
62
|
+
email: "user@#{domain}",
|
63
|
+
}
|
64
|
+
end
|
57
65
|
let(:enterprise_account) { create(:enterprise_account, domain: domain) }
|
58
66
|
let(:identity_provider) { create(:identity_provider, enterprise_account: enterprise_account, domain: domain) }
|
59
67
|
|
@@ -65,7 +73,12 @@ describe Osso::GraphQL::Schema do
|
|
65
73
|
|
66
74
|
describe 'for the wrong email scoped user' do
|
67
75
|
let(:domain) { Faker::Internet.domain_name }
|
68
|
-
let(:
|
76
|
+
let(:current_context) do
|
77
|
+
{
|
78
|
+
scope: 'end-user',
|
79
|
+
email: "user@#{domain}",
|
80
|
+
}
|
81
|
+
end
|
69
82
|
|
70
83
|
it 'does not configure an identity provider' do
|
71
84
|
expect(subject.dig('errors')).to_not be_empty
|
@@ -5,6 +5,7 @@ require 'spec_helper'
|
|
5
5
|
describe Osso::GraphQL::Schema do
|
6
6
|
describe 'CreateIdentityProvider' do
|
7
7
|
let(:domain) { Faker::Internet.domain_name }
|
8
|
+
let!(:oauth_client) { create(:oauth_client) }
|
8
9
|
let(:variables) do
|
9
10
|
{
|
10
11
|
input: {
|
@@ -33,30 +34,78 @@ describe Osso::GraphQL::Schema do
|
|
33
34
|
described_class.execute(
|
34
35
|
mutation,
|
35
36
|
variables: variables,
|
36
|
-
context:
|
37
|
+
context: current_context,
|
37
38
|
)
|
38
39
|
end
|
39
40
|
|
40
41
|
describe 'for an admin user' do
|
41
|
-
let(:
|
42
|
+
let(:current_context) do
|
43
|
+
{ scope: 'admin' }
|
44
|
+
end
|
45
|
+
let(:variables) do
|
46
|
+
{
|
47
|
+
input: {
|
48
|
+
name: Faker::Company.name,
|
49
|
+
domain: domain,
|
50
|
+
oauthClientId: oauth_client.id,
|
51
|
+
},
|
52
|
+
}
|
53
|
+
end
|
54
|
+
|
42
55
|
it 'creates an Enterprise Account' do
|
43
56
|
expect { subject }.to change { Osso::Models::EnterpriseAccount.count }.by(1)
|
44
57
|
expect(subject.dig('data', 'createEnterpriseAccount', 'enterpriseAccount', 'domain')).
|
45
58
|
to eq(domain)
|
46
59
|
end
|
60
|
+
|
61
|
+
it 'attaches the Enterprise Account to the correct OAuth Client' do
|
62
|
+
expect { subject }.to change { oauth_client.enterprise_accounts.count }.by(1)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe 'for an internal scoped user' do
|
67
|
+
let(:current_context) do
|
68
|
+
{
|
69
|
+
scope: 'internal',
|
70
|
+
email: 'user@saasco.com',
|
71
|
+
oauth_client_id: oauth_client.identifier,
|
72
|
+
}
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'creates an Enterprise Account' do
|
76
|
+
expect { subject }.to change { Osso::Models::EnterpriseAccount.count }.by(1)
|
77
|
+
expect(subject.dig('data', 'createEnterpriseAccount', 'enterpriseAccount', 'domain')).
|
78
|
+
to eq(domain)
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'attaches the Enterprise Account to the correct OAuth Client' do
|
82
|
+
expect { subject }.to change { oauth_client.enterprise_accounts.count }.by(1)
|
83
|
+
end
|
47
84
|
end
|
48
85
|
|
49
86
|
describe 'for an email scoped user' do
|
50
|
-
let(:
|
87
|
+
let(:current_context) do
|
88
|
+
{
|
89
|
+
scope: 'end-user',
|
90
|
+
email: "user@#{domain}",
|
91
|
+
oauth_client_id: oauth_client.identifier,
|
92
|
+
}
|
93
|
+
end
|
51
94
|
|
52
95
|
it 'creates an Enterprise Account' do
|
53
96
|
expect { subject }.to change { Osso::Models::EnterpriseAccount.count }.by(1)
|
54
97
|
expect(subject.dig('data', 'createEnterpriseAccount', 'enterpriseAccount', 'domain')).
|
55
98
|
to eq(domain)
|
56
99
|
end
|
100
|
+
|
101
|
+
it 'attaches the Enterprise Account to the correct OAuth Client' do
|
102
|
+
expect { subject }.to change { oauth_client.enterprise_accounts.count }.by(1)
|
103
|
+
end
|
57
104
|
end
|
58
105
|
describe 'for the wrong email scoped user' do
|
59
|
-
let(:
|
106
|
+
let(:current_context) do
|
107
|
+
{ scope: 'end-user', email: 'user@foo.com' }
|
108
|
+
end
|
60
109
|
|
61
110
|
it 'does not create an Enterprise Account' do
|
62
111
|
expect { subject }.to_not(change { Osso::Models::EnterpriseAccount.count })
|
@@ -25,12 +25,14 @@ describe Osso::GraphQL::Schema do
|
|
25
25
|
described_class.execute(
|
26
26
|
mutation,
|
27
27
|
variables: variables,
|
28
|
-
context:
|
28
|
+
context: current_context,
|
29
29
|
)
|
30
30
|
end
|
31
31
|
|
32
32
|
describe 'for an admin user' do
|
33
|
-
let(:
|
33
|
+
let(:current_context) do
|
34
|
+
{ scope: 'admin' }
|
35
|
+
end
|
34
36
|
describe 'without a service' do
|
35
37
|
let(:variables) { { input: { enterpriseAccountId: enterprise_account.id } } }
|
36
38
|
|
@@ -54,7 +56,12 @@ describe Osso::GraphQL::Schema do
|
|
54
56
|
|
55
57
|
describe 'for an email scoped user' do
|
56
58
|
let(:domain) { Faker::Internet.domain_name }
|
57
|
-
let(:
|
59
|
+
let(:current_context) do
|
60
|
+
{
|
61
|
+
scope: 'end-user',
|
62
|
+
email: "user@#{domain}",
|
63
|
+
}
|
64
|
+
end
|
58
65
|
let(:enterprise_account) { create(:enterprise_account, domain: domain) }
|
59
66
|
|
60
67
|
describe 'without a service' do
|
@@ -80,12 +87,17 @@ describe Osso::GraphQL::Schema do
|
|
80
87
|
|
81
88
|
describe 'for a wrong email scoped user' do
|
82
89
|
let(:domain) { Faker::Internet.domain_name }
|
83
|
-
let(:
|
90
|
+
let(:current_context) do
|
91
|
+
{
|
92
|
+
scope: 'end-user',
|
93
|
+
email: "user@#{domain}",
|
94
|
+
}
|
95
|
+
end
|
84
96
|
let(:enterprise_account) { create(:enterprise_account, domain: domain) }
|
85
97
|
let(:target_account) { create(:enterprise_account) }
|
86
98
|
|
87
99
|
describe 'without a service' do
|
88
|
-
let(:variables) { { input: { enterpriseAccountId: target_account.id } } }
|
100
|
+
let(:variables) { { input: { enterpriseAccountId: target_account.id, domain: domain } } }
|
89
101
|
|
90
102
|
it 'does not creates a identity provider' do
|
91
103
|
expect { subject }.to_not(change { Osso::Models::IdentityProvider.count })
|
@@ -93,7 +105,7 @@ describe Osso::GraphQL::Schema do
|
|
93
105
|
end
|
94
106
|
|
95
107
|
describe 'with a service' do
|
96
|
-
let(:variables) { { input: { enterpriseAccountId: target_account.id, service: 'OKTA' } } }
|
108
|
+
let(:variables) { { input: { enterpriseAccountId: target_account.id, service: 'OKTA', domain: domain } } }
|
97
109
|
|
98
110
|
it 'does not creates a identity provider' do
|
99
111
|
expect { subject }.to_not(change { Osso::Models::IdentityProvider.count })
|
@@ -31,12 +31,14 @@ describe Osso::GraphQL::Schema do
|
|
31
31
|
described_class.execute(
|
32
32
|
mutation,
|
33
33
|
variables: variables,
|
34
|
-
context:
|
34
|
+
context: current_context,
|
35
35
|
)
|
36
36
|
end
|
37
37
|
|
38
38
|
describe 'for an admin user' do
|
39
|
-
let(:
|
39
|
+
let(:current_context) do
|
40
|
+
{ scope: 'admin' }
|
41
|
+
end
|
40
42
|
it 'creates an OauthClient' do
|
41
43
|
expect { subject }.to change { Osso::Models::OauthClient.count }.by(1)
|
42
44
|
expect(subject.dig('data', 'createOauthClient', 'oauthClient', 'clientId')).
|
@@ -45,7 +47,12 @@ describe Osso::GraphQL::Schema do
|
|
45
47
|
end
|
46
48
|
|
47
49
|
describe 'for an email scoped user' do
|
48
|
-
let(:
|
50
|
+
let(:current_context) do
|
51
|
+
{
|
52
|
+
scope: 'end-user',
|
53
|
+
email: 'user@foo.com',
|
54
|
+
}
|
55
|
+
end
|
49
56
|
|
50
57
|
it 'does not create an OauthClient Account' do
|
51
58
|
expect { subject }.to_not(change { Osso::Models::OauthClient.count })
|
@@ -30,12 +30,15 @@ describe Osso::GraphQL::Schema do
|
|
30
30
|
described_class.execute(
|
31
31
|
mutation,
|
32
32
|
variables: variables,
|
33
|
-
context:
|
33
|
+
context: current_context,
|
34
34
|
)
|
35
35
|
end
|
36
36
|
|
37
37
|
describe 'for an admin user' do
|
38
|
-
let(:
|
38
|
+
let(:current_context) do
|
39
|
+
{ scope: 'admin' }
|
40
|
+
end
|
41
|
+
|
39
42
|
it 'deletes an Enterprise Account' do
|
40
43
|
expect { subject }.to change { Osso::Models::EnterpriseAccount.count }.by(-1)
|
41
44
|
expect(subject.dig('data', 'createEnterpriseAccount', 'enterpriseAccount')).
|
@@ -44,7 +47,12 @@ describe Osso::GraphQL::Schema do
|
|
44
47
|
end
|
45
48
|
|
46
49
|
describe 'for an email scoped user' do
|
47
|
-
let(:
|
50
|
+
let(:current_context) do
|
51
|
+
{
|
52
|
+
scope: 'end-user',
|
53
|
+
email: "user@#{domain}",
|
54
|
+
}
|
55
|
+
end
|
48
56
|
|
49
57
|
it 'deletes the Enterprise Account' do
|
50
58
|
expect { subject }.to change { Osso::Models::EnterpriseAccount.count }.by(-1)
|
@@ -52,8 +60,14 @@ describe Osso::GraphQL::Schema do
|
|
52
60
|
to be_nil
|
53
61
|
end
|
54
62
|
end
|
63
|
+
|
55
64
|
describe 'for the wrong email scoped user' do
|
56
|
-
let(:
|
65
|
+
let(:current_context) do
|
66
|
+
{
|
67
|
+
scope: 'end-user',
|
68
|
+
email: 'user@foo.com',
|
69
|
+
}
|
70
|
+
end
|
57
71
|
|
58
72
|
it 'does not delete the Enterprise Account' do
|
59
73
|
expect { subject }.to_not(change { Osso::Models::EnterpriseAccount.count })
|