scimaenaga 0.7.0 → 0.9.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +22 -7
  3. data/Rakefile +6 -8
  4. data/app/controllers/concerns/{scim_rails → scimaenaga}/exception_handler.rb +47 -37
  5. data/app/controllers/concerns/scimaenaga/response.rb +94 -0
  6. data/app/controllers/scimaenaga/application_controller.rb +72 -0
  7. data/app/controllers/{scim_rails → scimaenaga}/scim_groups_controller.rb +26 -26
  8. data/app/controllers/scimaenaga/scim_schemas_controller.rb +42 -0
  9. data/app/controllers/scimaenaga/scim_users_controller.rb +104 -0
  10. data/app/helpers/{scim_rails → scimaenaga}/application_helper.rb +1 -1
  11. data/app/libraries/scim_patch.rb +16 -9
  12. data/app/libraries/scim_patch_operation.rb +51 -141
  13. data/app/libraries/scim_patch_operation_converter.rb +90 -0
  14. data/app/libraries/scim_patch_operation_group.rb +100 -0
  15. data/app/libraries/scim_patch_operation_user.rb +53 -0
  16. data/app/models/{scim_rails → scimaenaga}/application_record.rb +1 -1
  17. data/app/models/scimaenaga/authorize_api_request.rb +39 -0
  18. data/app/models/{scim_rails → scimaenaga}/scim_count.rb +8 -4
  19. data/app/models/scimaenaga/scim_query_parser.rb +49 -0
  20. data/config/routes.rb +15 -13
  21. data/lib/generators/scimaenaga/USAGE +8 -0
  22. data/lib/generators/scimaenaga/scimaenaga_generator.rb +7 -0
  23. data/lib/generators/{scim_rails → scimaenaga}/templates/initializer.rb +128 -22
  24. data/lib/{scim_rails → scimaenaga}/config.rb +9 -7
  25. data/lib/scimaenaga/encoder.rb +27 -0
  26. data/lib/scimaenaga/engine.rb +12 -0
  27. data/lib/scimaenaga/version.rb +5 -0
  28. data/lib/scimaenaga.rb +6 -0
  29. data/lib/tasks/{scim_rails_tasks.rake → scimaenaga_tasks.rake} +1 -1
  30. data/spec/controllers/{scim_rails → scimaenaga}/scim_groups_controller_spec.rb +8 -8
  31. data/spec/controllers/{scim_rails → scimaenaga}/scim_groups_request_spec.rb +18 -18
  32. data/spec/controllers/scimaenaga/scim_schemas_controller_spec.rb +238 -0
  33. data/spec/controllers/scimaenaga/scim_schemas_request_spec.rb +39 -0
  34. data/spec/controllers/{scim_rails → scimaenaga}/scim_users_controller_spec.rb +14 -15
  35. data/spec/controllers/{scim_rails → scimaenaga}/scim_users_request_spec.rb +20 -20
  36. data/spec/dummy/app/assets/config/manifest.js +1 -1
  37. data/spec/dummy/config/application.rb +1 -2
  38. data/spec/dummy/config/initializers/{scim_rails_config.rb → scimaenaga_config.rb} +25 -25
  39. data/spec/dummy/config/routes.rb +1 -1
  40. data/spec/factories/company.rb +3 -3
  41. data/spec/lib/scimaenaga/encoder_spec.rb +64 -0
  42. data/spec/libraries/scim_patch_operation_group_spec.rb +165 -0
  43. data/spec/libraries/scim_patch_operation_user_spec.rb +101 -0
  44. data/spec/libraries/scim_patch_spec.rb +129 -45
  45. data/spec/models/scim_query_parser_spec.rb +5 -6
  46. metadata +107 -108
  47. data/app/controllers/concerns/scim_rails/response.rb +0 -94
  48. data/app/controllers/scim_rails/application_controller.rb +0 -72
  49. data/app/controllers/scim_rails/scim_users_controller.rb +0 -107
  50. data/app/models/scim_rails/authorize_api_request.rb +0 -40
  51. data/app/models/scim_rails/scim_query_parser.rb +0 -49
  52. data/lib/generators/scim_rails/USAGE +0 -8
  53. data/lib/generators/scim_rails/scim_rails_generator.rb +0 -7
  54. data/lib/scim_rails/encoder.rb +0 -25
  55. data/lib/scim_rails/engine.rb +0 -12
  56. data/lib/scim_rails/version.rb +0 -5
  57. data/lib/scim_rails.rb +0 -6
  58. data/spec/dummy/db/development.sqlite3 +0 -0
  59. data/spec/dummy/db/test.sqlite3 +0 -0
  60. data/spec/dummy/log/development.log +0 -0
  61. data/spec/dummy/log/test.log +0 -5770
  62. data/spec/dummy/put_group.http +0 -5
  63. data/spec/dummy/tmp/restart.txt +0 -0
  64. data/spec/lib/scim_rails/encoder_spec.rb +0 -62
  65. data/spec/libraries/scim_patch_operation_spec.rb +0 -116
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Scimaenaga
4
+ class ScimQueryParser
5
+ attr_accessor :query_elements, :query_attributes
6
+
7
+ def initialize(query_string, queryable_attributes)
8
+ self.query_elements = query_string.gsub(/\[(.+?)\]/, '.0').split
9
+ self.query_attributes = queryable_attributes
10
+ end
11
+
12
+ def attribute
13
+ attribute = query_elements[0]
14
+ raise Scimaenaga::ExceptionHandler::InvalidQuery if attribute.blank?
15
+
16
+ dig_keys = attribute.split('.').map do |step|
17
+ step == '0' ? 0 : step.to_sym
18
+ end
19
+
20
+ mapped_attribute = query_attributes.dig(*dig_keys)
21
+ raise Scimaenaga::ExceptionHandler::InvalidQuery if mapped_attribute.blank?
22
+
23
+ mapped_attribute
24
+ end
25
+
26
+ def operator
27
+ sql_comparison_operator(query_elements[1])
28
+ end
29
+
30
+ def parameter
31
+ parameter = query_elements[2..-1].join(' ')
32
+ return if parameter.blank?
33
+
34
+ parameter.gsub(/"/, '')
35
+ end
36
+
37
+ private
38
+
39
+ def sql_comparison_operator(element)
40
+ case element
41
+ when 'eq'
42
+ '='
43
+ else
44
+ # TODO: implement additional query filters
45
+ raise Scimaenaga::ExceptionHandler::InvalidQuery
46
+ end
47
+ end
48
+ end
49
+ end
data/config/routes.rb CHANGED
@@ -1,14 +1,16 @@
1
- ScimRails::Engine.routes.draw do
2
- get 'scim/v2/Users', action: :index, controller: 'scim_users'
3
- post 'scim/v2/Users', action: :create, controller: 'scim_users'
4
- get 'scim/v2/Users/:id', action: :show, controller: 'scim_users'
5
- put 'scim/v2/Users/:id', action: :put_update, controller: 'scim_users'
6
- patch 'scim/v2/Users/:id', action: :patch_update, controller: 'scim_users'
7
- delete 'scim/v2/Users/:id', action: :destroy, controller: 'scim_users'
8
- get 'scim/v2/Groups', action: :index, controller: 'scim_groups'
9
- post 'scim/v2/Groups', action: :create, controller: 'scim_groups'
10
- get 'scim/v2/Groups/:id', action: :show, controller: 'scim_groups'
11
- put 'scim/v2/Groups/:id', action: :put_update, controller: 'scim_groups'
12
- patch 'scim/v2/Groups/:id', action: :patch_update, controller: 'scim_groups'
13
- delete 'scim/v2/Groups/:id', action: :destroy, controller: 'scim_groups'
1
+ Scimaenaga::Engine.routes.draw do
2
+ get 'scim/v2/Users', action: :index, controller: 'scim_users'
3
+ post 'scim/v2/Users', action: :create, controller: 'scim_users'
4
+ get 'scim/v2/Users/:id', action: :show, controller: 'scim_users'
5
+ put 'scim/v2/Users/:id', action: :put_update, controller: 'scim_users'
6
+ patch 'scim/v2/Users/:id', action: :patch_update, controller: 'scim_users'
7
+ delete 'scim/v2/Users/:id', action: :destroy, controller: 'scim_users'
8
+ get 'scim/v2/Groups', action: :index, controller: 'scim_groups'
9
+ post 'scim/v2/Groups', action: :create, controller: 'scim_groups'
10
+ get 'scim/v2/Groups/:id', action: :show, controller: 'scim_groups'
11
+ put 'scim/v2/Groups/:id', action: :put_update, controller: 'scim_groups'
12
+ patch 'scim/v2/Groups/:id', action: :patch_update, controller: 'scim_groups'
13
+ delete 'scim/v2/Groups/:id', action: :destroy, controller: 'scim_groups'
14
+ get 'scim/v2/Schemas', action: :index, controller: 'scim_schemas'
15
+ get 'scim/v2/Schemas/:id', action: :show, controller: 'scim_schemas'
14
16
  end
@@ -0,0 +1,8 @@
1
+ Description:
2
+ Generates the scimaenaga initializer.
3
+
4
+ Example:
5
+ rails generate scimaenaga config
6
+
7
+ This will create:
8
+ config/initializers/scimaenaga_config.rb
@@ -0,0 +1,7 @@
1
+ class ScimaenagaGenerator < Rails::Generators::NamedBase
2
+ source_root File.expand_path('templates', __dir__)
3
+
4
+ def copy_initializer_file
5
+ copy_file 'initializer.rb', 'config/initializers/scimaenaga_config.rb'
6
+ end
7
+ end
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- ScimRails.configure do |config|
3
+ Scimaenaga.configure do |config|
4
4
  # Model used for authenticating and scoping users.
5
- config.basic_auth_model = "Company"
5
+ config.basic_auth_model = 'Company'
6
6
 
7
7
  # Attribute used to search for a given record. This
8
8
  # attribute should be unique as it will return the
@@ -14,7 +14,7 @@ ScimRails.configure do |config|
14
14
  config.basic_auth_model_authenticatable_attribute = :api_token
15
15
 
16
16
  # Model used for user records.
17
- config.scim_users_model = "User"
17
+ config.scim_users_model = 'User'
18
18
 
19
19
  # Method used for retrieving user records from the
20
20
  # authenticatable model.
@@ -25,7 +25,7 @@ ScimRails.configure do |config|
25
25
  config.scim_user_prevent_update_on_create = false
26
26
 
27
27
  # Model used for group records.
28
- config.scim_groups_model = "Group"
28
+ config.scim_groups_model = 'Group'
29
29
  # Method used for retrieving user records from the
30
30
  # authenticatable model.
31
31
  config.scim_groups_scope = :groups
@@ -56,16 +56,16 @@ ScimRails.configure do |config|
56
56
  userName: :email,
57
57
  givenName: :first_name,
58
58
  familyName: :last_name,
59
- email: :email
59
+ email: :email,
60
60
  }
61
61
 
62
62
  # Array of attributes that can be modified on the
63
63
  # user model. If the attribute is not in this array
64
64
  # the attribute cannot be modified by this Gem.
65
- config.mutable_user_attributes = [
66
- :first_name,
67
- :last_name,
68
- :email
65
+ config.mutable_user_attributes = %i[
66
+ first_name
67
+ last_name
68
+ email
69
69
  ]
70
70
 
71
71
  # Hash of mutable attributes. This object is the map
@@ -76,13 +76,13 @@ ScimRails.configure do |config|
76
76
  config.mutable_user_attributes_schema = {
77
77
  name: {
78
78
  givenName: :first_name,
79
- familyName: :last_name
79
+ familyName: :last_name,
80
80
  },
81
81
  emails: [
82
82
  {
83
- value: :email
83
+ value: :email,
84
84
  }
85
- ]
85
+ ],
86
86
  }
87
87
 
88
88
  # Hash of SCIM structure for a user schema. This object
@@ -93,31 +93,31 @@ ScimRails.configure do |config|
93
93
  # through as is, symbols will be passed to the user
94
94
  # object to return a value.
95
95
  config.user_schema = {
96
- schemas: ["urn:ietf:params:scim:schemas:core:2.0:User"],
96
+ schemas: ['urn:ietf:params:scim:schemas:core:2.0:User'],
97
97
  id: :id,
98
98
  userName: :email,
99
99
  name: {
100
100
  givenName: :first_name,
101
- familyName: :last_name
101
+ familyName: :last_name,
102
102
  },
103
103
  emails: [
104
104
  {
105
- value: :email
105
+ value: :email,
106
106
  }
107
107
  ],
108
- active: :active?
108
+ active: :active?,
109
109
  }
110
110
 
111
111
  # Schema for users used in "abbreviated" lists such as in
112
112
  # the `members` field of a Group.
113
113
  config.user_abbreviated_schema = {
114
114
  value: :id,
115
- display: :email
115
+ display: :email,
116
116
  }
117
117
 
118
118
  # Allow filtering Groups based on these parameters
119
119
  config.queryable_group_attributes = {
120
- displayName: :name
120
+ displayName: :name,
121
121
  }
122
122
 
123
123
  # List of attributes on a Group that can be updated through SCIM
@@ -131,7 +131,7 @@ ScimRails.configure do |config|
131
131
  # include all attributes listed in
132
132
  # config.mutable_group_attributes.
133
133
  config.mutable_group_attributes_schema = {
134
- displayName: :name
134
+ displayName: :name,
135
135
  }
136
136
 
137
137
  # The User relation's IDs field name on the Group model.
@@ -143,18 +143,124 @@ ScimRails.configure do |config|
143
143
  config.group_member_relation_schema = { value: :user_ids }
144
144
 
145
145
  config.group_schema = {
146
- schemas: ["urn:ietf:params:scim:schemas:core:2.0:Group"],
146
+ schemas: ['urn:ietf:params:scim:schemas:core:2.0:Group'],
147
147
  id: :id,
148
148
  displayName: :name,
149
- members: :users
149
+ members: :users,
150
150
  }
151
151
 
152
152
  config.group_abbreviated_schema = {
153
153
  value: :id,
154
- display: :name
154
+ display: :name,
155
155
  }
156
156
 
157
157
  # Set group_destroy_method to a method on the Group model
158
158
  # to be called on a destroy request
159
159
  # config.group_destroy_method = :destroy!
160
+
161
+ # /Schemas settings.
162
+ # These settings are not used in /Users and /Groups for now.
163
+ # Configure this only when you need Schemas endpoint.
164
+ # Schemas endpoint returns the configured values as-is.
165
+ config.schemas = [
166
+ # Define User schemas
167
+ {
168
+ # Normally you don't have to change schemas/id/name/description
169
+ schemas: ['urn:ietf:params:scim:schemas:core:2.0:Schema'],
170
+ id: 'urn:ietf:params:scim:schemas:core:2.0:User',
171
+ name: 'User',
172
+ description: 'User Account',
173
+
174
+ # Configure 'attributes' as it corresponds with other configurations and your model
175
+ attributes: [
176
+ {
177
+ # Name of SCIM attribute. It must be configured in "user_schema"
178
+ name: 'userName',
179
+
180
+ # "type" must be string/boolan/decimal/integer/dateTime/reference
181
+ # "complex" value is not supported now
182
+ type: 'string',
183
+
184
+ # Multi value attribute is not supported, must be false
185
+ multiValued: false,
186
+
187
+ description: 'Unique identifier for the User. REQUIRED.',
188
+
189
+ # Specify true when you require this attribute
190
+ required: true,
191
+
192
+ # In this Library, String value is always handled as case exact
193
+ caseExact: true,
194
+
195
+ # "mutability" must be readOnly/readWrite/writeOnly
196
+ # "immutable" is not supported.
197
+ # readOnly: attribute is defined in queryable_user_attributes but not in mutable_user_attributes and user_schema
198
+ # readWrite: attribute is defined in queryable_user_attributes, mutable_user_attributes and user_schema
199
+ # writeOnly: attribute is defined in mutable_user_attributes, and user_schema but not in queryable_user_attributes
200
+ mutability: 'readWrite',
201
+
202
+ # "returned" must be always/never. default and request are not supported
203
+ # always: attribute is defined in user_schema
204
+ # never: attribute is not defined in user_schema
205
+ returned: 'always',
206
+
207
+ # "uniqueness" must be none/server/global. It's dependent on your service
208
+ uniqueness: 'server',
209
+ }
210
+ ],
211
+ meta: {
212
+ resourceType: 'Schema',
213
+ location:
214
+ '/v2/Schemas/urn:ietf:params:scim:schemas:core:2.0:User',
215
+ },
216
+ },
217
+ # define Group schemas
218
+ {
219
+ schemas: ['urn:ietf:params:scim:schemas:core:2.0:Schema'],
220
+ id: 'urn:ietf:params:scim:schemas:core:2.0:Group',
221
+ name: 'Group',
222
+ description: 'Group',
223
+ attributes: [
224
+ {
225
+ # Same as the User attributes
226
+ name: 'displayName',
227
+ type: 'string',
228
+ multiValued: false,
229
+ description: 'A human-readable name for the Group. REQUIRED.',
230
+ required: true,
231
+ caseExact: true,
232
+ mutability: 'readWrite',
233
+ returned: 'always',
234
+ uniqueness: 'none',
235
+ },
236
+ {
237
+ name: 'members',
238
+
239
+ # Only "members" can be configured as a complex and multivalued attribute
240
+ type: 'complex',
241
+ multiValued: true,
242
+
243
+ description: 'A list of members of the Group.',
244
+ required: false,
245
+ subAttributes: [
246
+ {
247
+ name: 'value',
248
+ type: 'string',
249
+ multiValued: false,
250
+ description: 'Identifier of the member of this Group.',
251
+ required: false,
252
+ caseExact: true,
253
+ mutability: 'immutable',
254
+ returned: 'default',
255
+ uniqueness: 'none',
256
+ }
257
+ ],
258
+ }
259
+ ],
260
+ meta: {
261
+ resourceType: 'Schema',
262
+ location: '/v2/Schemas/urn:ietf:params:scim:schemas:core:2.0:Group',
263
+ },
264
+ }
265
+ ]
160
266
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module ScimRails
3
+ module Scimaenaga
4
4
  class << self
5
5
  def configure
6
6
  yield config
@@ -11,9 +11,9 @@ module ScimRails
11
11
  end
12
12
  end
13
13
 
14
- # Class containing configuration of ScimRails
14
+ # Class containing configuration of Scimaenaga
15
15
  class Config
16
- ALGO_NONE = "none"
16
+ ALGO_NONE = 'none'
17
17
 
18
18
  attr_writer \
19
19
  :basic_auth_model,
@@ -45,20 +45,22 @@ module ScimRails
45
45
  :user_schema,
46
46
  :group_schema,
47
47
  :user_destroy_method,
48
- :group_destroy_method
48
+ :group_destroy_method,
49
+ :schemas
49
50
 
50
51
  def initialize
51
- @basic_auth_model = "Company"
52
+ @basic_auth_model = 'Company'
52
53
  @scim_users_list_order = :id
53
- @scim_users_model = "User"
54
+ @scim_users_model = 'User'
54
55
  @scim_groups_list_order = :id
55
- @scim_groups_model = "Group"
56
+ @scim_groups_model = 'Group'
56
57
  @signing_algorithm = ALGO_NONE
57
58
  @user_schema = {}
58
59
  @user_attributes = []
59
60
  @user_abbreviated_schema = {}
60
61
  @group_schema = {}
61
62
  @group_abbreviated_schema = {}
63
+ @schemas = []
62
64
  end
63
65
 
64
66
  def mutable_user_attributes_schema
@@ -0,0 +1,27 @@
1
+ require 'jwt'
2
+
3
+ module Scimaenaga
4
+ module Encoder
5
+ extend self
6
+
7
+ def encode(company)
8
+ payload = {
9
+ iat: Time.current.to_i,
10
+ Scimaenaga.config.basic_auth_model_searchable_attribute =>
11
+ company.public_send(Scimaenaga.config.basic_auth_model_searchable_attribute),
12
+ }
13
+
14
+ JWT.encode(payload, Scimaenaga.config.signing_secret,
15
+ Scimaenaga.config.signing_algorithm)
16
+ end
17
+
18
+ def decode(token)
19
+ verify = Scimaenaga.config.signing_algorithm != Scimaenaga::Config::ALGO_NONE
20
+
21
+ JWT.decode(token, Scimaenaga.config.signing_secret, verify,
22
+ algorithm: Scimaenaga.config.signing_algorithm).first
23
+ rescue JWT::VerificationError, JWT::DecodeError
24
+ raise Scimaenaga::ExceptionHandler::InvalidCredentials
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,12 @@
1
+ module Scimaenaga
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace Scimaenaga
4
+
5
+ config.generators do |g|
6
+ g.test_framework :rspec, fixture: false
7
+ g.fixture_replacement :factory_bot, dir: 'spec/factories'
8
+ g.assets false
9
+ g.helper false
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Scimaenaga
4
+ VERSION = '0.9.1'
5
+ end
data/lib/scimaenaga.rb ADDED
@@ -0,0 +1,6 @@
1
+ require 'scimaenaga/engine'
2
+ require 'scimaenaga/config'
3
+ require 'scimaenaga/encoder'
4
+
5
+ module Scimaenaga
6
+ end
@@ -1,4 +1,4 @@
1
1
  # desc "Explaining what the task does"
2
- # task :scim_rails do
2
+ # task :scimaenaga do
3
3
  # # Task goes here
4
4
  # end
@@ -2,10 +2,10 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- RSpec.describe ScimRails::ScimGroupsController, type: :controller do
5
+ RSpec.describe Scimaenaga::ScimGroupsController, type: :controller do
6
6
  include AuthHelper
7
7
 
8
- routes { ScimRails::Engine.routes }
8
+ routes { Scimaenaga::Engine.routes }
9
9
 
10
10
  describe 'index' do
11
11
  let(:company) { create(:company) }
@@ -86,7 +86,7 @@ RSpec.describe ScimRails::ScimGroupsController, type: :controller do
86
86
  end
87
87
 
88
88
  it 'paginates results by configurable scim_groups_list_order' do
89
- allow(ScimRails.config).to(
89
+ allow(Scimaenaga.config).to(
90
90
  receive(:scim_groups_list_order).and_return(created_at: :desc)
91
91
  )
92
92
 
@@ -417,8 +417,8 @@ RSpec.describe ScimRails::ScimGroupsController, type: :controller do
417
417
  Operations: [{
418
418
  op: 'Replace',
419
419
  path: 'displayName',
420
- value: 'changed'
421
- }]
420
+ value: 'changed',
421
+ }],
422
422
  }, as: :json
423
423
  end.to change { group.reload.name }.to('changed')
424
424
 
@@ -543,7 +543,7 @@ RSpec.describe ScimRails::ScimGroupsController, type: :controller do
543
543
 
544
544
  context 'when Group destroy method is not configured' do
545
545
  it 'does not delete Group' do
546
- allow(ScimRails.config).to(
546
+ allow(Scimaenaga.config).to(
547
547
  receive(:group_destroy_method).and_return(nil)
548
548
  )
549
549
 
@@ -557,7 +557,7 @@ RSpec.describe ScimRails::ScimGroupsController, type: :controller do
557
557
 
558
558
  context 'when Group destroy method is invalid' do
559
559
  it 'does not delete Group' do
560
- allow(ScimRails.config).to(
560
+ allow(Scimaenaga.config).to(
561
561
  receive(:group_destroy_method).and_return('destory!')
562
562
  )
563
563
 
@@ -572,7 +572,7 @@ RSpec.describe ScimRails::ScimGroupsController, type: :controller do
572
572
  context 'whenr target Group is not found' do
573
573
  it 'return 404 not found' do
574
574
  expect do
575
- delete :destroy, params: { id: 999999 }, as: :json
575
+ delete :destroy, params: { id: 999_999 }, as: :json
576
576
  end.not_to change { company.groups.reload.count }.from(1)
577
577
 
578
578
  expect(response.status).to eq 404
@@ -1,42 +1,42 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "spec_helper"
3
+ require 'spec_helper'
4
4
 
5
- RSpec.describe ScimRails::ScimGroupsController, type: :request do
5
+ RSpec.describe Scimaenaga::ScimGroupsController, type: :request do
6
6
  let(:company) { create(:company) }
7
7
  let(:credentials) do
8
8
  Base64.encode64("#{company.subdomain}:#{company.api_token}")
9
9
  end
10
10
  let(:authorization) { "Basic #{credentials}" }
11
11
 
12
- def post_request(content_type = "application/scim+json")
13
- post "/scim/v2/Groups",
12
+ def post_request(content_type = 'application/scim+json')
13
+ post '/scim/v2/Groups',
14
14
  params: {
15
- displayName: "Dummy Group",
16
- members: []
15
+ displayName: 'Dummy Group',
16
+ members: [],
17
17
  }.to_json,
18
18
  headers: {
19
19
  Authorization: authorization,
20
- 'Content-Type': content_type
20
+ 'Content-Type': content_type,
21
21
  }
22
22
  end
23
23
 
24
- describe "Content-Type" do
25
- it "accepts scim+json" do
24
+ describe 'Content-Type' do
25
+ it 'accepts scim+json' do
26
26
  expect(company.groups.count).to eq 0
27
27
 
28
- post_request("application/scim+json")
28
+ post_request('application/scim+json')
29
29
 
30
30
  expect(request.params).to include :displayName
31
31
  expect(response.status).to eq 201
32
- expect(response.media_type).to eq "application/scim+json"
32
+ expect(response.media_type).to eq 'application/scim+json'
33
33
  expect(company.groups.count).to eq 1
34
34
  end
35
35
 
36
- it "can not parse unfamiliar content types" do
36
+ it 'can not parse unfamiliar content types' do
37
37
  expect(company.groups.count).to eq 0
38
38
 
39
- post_request("text/csv")
39
+ post_request('text/csv')
40
40
 
41
41
  expect(request.params).not_to include :displayName
42
42
  expect(response.status).to eq 422
@@ -44,21 +44,21 @@ RSpec.describe ScimRails::ScimGroupsController, type: :request do
44
44
  end
45
45
  end
46
46
 
47
- context "OAuth Bearer Authorization" do
48
- context "with valid token" do
47
+ context 'OAuth Bearer Authorization' do
48
+ context 'with valid token' do
49
49
  let(:authorization) { "Bearer #{company.api_token}" }
50
50
 
51
- it "supports OAuth bearer authorization and succeeds" do
51
+ it 'supports OAuth bearer authorization and succeeds' do
52
52
  expect { post_request }.to change(company.groups, :count).from(0).to(1)
53
53
 
54
54
  expect(response.status).to eq 201
55
55
  end
56
56
  end
57
57
 
58
- context "with invalid token" do
58
+ context 'with invalid token' do
59
59
  let(:authorization) { "Bearer #{SecureRandom.hex}" }
60
60
 
61
- it "The request fails" do
61
+ it 'The request fails' do
62
62
  expect { post_request }.not_to change(company.groups, :count)
63
63
 
64
64
  expect(response.status).to eq 401