scimitar 2.2.0 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -5,11 +5,21 @@ RSpec.describe Scimitar::ActiveRecordBackedResourcesController do
5
5
  before :each do
6
6
  allow_any_instance_of(Scimitar::ApplicationController).to receive(:authenticated?).and_return(true)
7
7
 
8
+ # If a sort order is unspecified, the controller defaults to ID ascending.
9
+ # With UUID based IDs, testing life is made easier by ensuring that the
10
+ # creation order matches an ascending UUID sort order (which is what would
11
+ # happen if we were using integer primary keys).
12
+ #
8
13
  lmt = Time.parse("2023-01-09 14:25:00 +1300")
14
+ ids = 3.times.map { SecureRandom.uuid }.sort()
9
15
 
10
- @u1 = MockUser.create(username: '1', first_name: 'Foo', last_name: 'Ark', home_email_address: 'home_1@test.com', scim_uid: '001', created_at: lmt, updated_at: lmt + 1)
11
- @u2 = MockUser.create(username: '2', first_name: 'Foo', last_name: 'Bar', home_email_address: 'home_2@test.com', scim_uid: '002', created_at: lmt, updated_at: lmt + 2)
12
- @u3 = MockUser.create(username: '3', first_name: 'Foo', home_email_address: 'home_3@test.com', scim_uid: '003', created_at: lmt, updated_at: lmt + 3)
16
+ @u1 = MockUser.create(primary_key: ids.shift(), username: '1', first_name: 'Foo', last_name: 'Ark', home_email_address: 'home_1@test.com', scim_uid: '001', created_at: lmt, updated_at: lmt + 1)
17
+ @u2 = MockUser.create(primary_key: ids.shift(), username: '2', first_name: 'Foo', last_name: 'Bar', home_email_address: 'home_2@test.com', scim_uid: '002', created_at: lmt, updated_at: lmt + 2)
18
+ @u3 = MockUser.create(primary_key: ids.shift(), username: '3', first_name: 'Foo', home_email_address: 'home_3@test.com', scim_uid: '003', created_at: lmt, updated_at: lmt + 3)
19
+
20
+ @g1 = MockGroup.create!(display_name: 'Group 1')
21
+ @g2 = MockGroup.create!(display_name: 'Group 2')
22
+ @g3 = MockGroup.create!(display_name: 'Group 3')
13
23
  end
14
24
 
15
25
  # ===========================================================================
@@ -32,21 +42,41 @@ RSpec.describe Scimitar::ActiveRecordBackedResourcesController do
32
42
  end # "context 'with no items' do"
33
43
 
34
44
  context 'with items' do
35
- it 'returns all items' do
36
- get '/Users', params: { format: :scim }
45
+ context 'with a UUID, renamed primary key column' do
46
+ it 'returns all items' do
47
+ get '/Users', params: { format: :scim }
37
48
 
38
- expect(response.status).to eql(200)
39
- result = JSON.parse(response.body)
49
+ expect(response.status).to eql(200)
50
+ result = JSON.parse(response.body)
40
51
 
41
- expect(result['totalResults']).to eql(3)
42
- expect(result['Resources'].size).to eql(3)
52
+ expect(result['totalResults']).to eql(3)
53
+ expect(result['Resources'].size).to eql(3)
43
54
 
44
- ids = result['Resources'].map { |resource| resource['id'] }
45
- expect(ids).to match_array([@u1.id.to_s, @u2.id.to_s, @u3.id.to_s])
55
+ ids = result['Resources'].map { |resource| resource['id'] }
56
+ expect(ids).to match_array([@u1.primary_key.to_s, @u2.primary_key.to_s, @u3.primary_key.to_s])
46
57
 
47
- usernames = result['Resources'].map { |resource| resource['userName'] }
48
- expect(usernames).to match_array(['1', '2', '3'])
49
- end
58
+ usernames = result['Resources'].map { |resource| resource['userName'] }
59
+ expect(usernames).to match_array(['1', '2', '3'])
60
+ end
61
+ end # "context 'with a UUID, renamed primary key column' do"
62
+
63
+ context 'with an integer, conventionally named primary key column' do
64
+ it 'returns all items' do
65
+ get '/Groups', params: { format: :scim }
66
+
67
+ expect(response.status).to eql(200)
68
+ result = JSON.parse(response.body)
69
+
70
+ expect(result['totalResults']).to eql(3)
71
+ expect(result['Resources'].size).to eql(3)
72
+
73
+ ids = result['Resources'].map { |resource| resource['id'] }
74
+ expect(ids).to match_array([@g1.id.to_s, @g2.id.to_s, @g3.id.to_s])
75
+
76
+ usernames = result['Resources'].map { |resource| resource['displayName'] }
77
+ expect(usernames).to match_array(['Group 1', 'Group 2', 'Group 3'])
78
+ end
79
+ end # "context 'with an integer, conventionally named primary key column' do"
50
80
 
51
81
  it 'applies a filter, with case-insensitive value comparison' do
52
82
  get '/Users', params: {
@@ -61,7 +91,7 @@ RSpec.describe Scimitar::ActiveRecordBackedResourcesController do
61
91
  expect(result['Resources'].size).to eql(1)
62
92
 
63
93
  ids = result['Resources'].map { |resource| resource['id'] }
64
- expect(ids).to match_array([@u2.id.to_s])
94
+ expect(ids).to match_array([@u2.primary_key.to_s])
65
95
 
66
96
  usernames = result['Resources'].map { |resource| resource['userName'] }
67
97
  expect(usernames).to match_array(['2'])
@@ -80,7 +110,7 @@ RSpec.describe Scimitar::ActiveRecordBackedResourcesController do
80
110
  expect(result['Resources'].size).to eql(1)
81
111
 
82
112
  ids = result['Resources'].map { |resource| resource['id'] }
83
- expect(ids).to match_array([@u2.id.to_s])
113
+ expect(ids).to match_array([@u2.primary_key.to_s])
84
114
 
85
115
  usernames = result['Resources'].map { |resource| resource['userName'] }
86
116
  expect(usernames).to match_array(['2'])
@@ -93,7 +123,7 @@ RSpec.describe Scimitar::ActiveRecordBackedResourcesController do
93
123
  it 'applies a filter on primary keys, using direct comparison (rather than e.g. case-insensitive operators)' do
94
124
  get '/Users', params: {
95
125
  format: :scim,
96
- filter: "id eq \"#{@u3.id}\""
126
+ filter: "id eq \"#{@u3.primary_key}\""
97
127
  }
98
128
 
99
129
  expect(response.status).to eql(200)
@@ -103,7 +133,7 @@ RSpec.describe Scimitar::ActiveRecordBackedResourcesController do
103
133
  expect(result['Resources'].size).to eql(1)
104
134
 
105
135
  ids = result['Resources'].map { |resource| resource['id'] }
106
- expect(ids).to match_array([@u3.id.to_s])
136
+ expect(ids).to match_array([@u3.primary_key.to_s])
107
137
 
108
138
  usernames = result['Resources'].map { |resource| resource['userName'] }
109
139
  expect(usernames).to match_array(['3'])
@@ -122,7 +152,7 @@ RSpec.describe Scimitar::ActiveRecordBackedResourcesController do
122
152
  expect(result['Resources'].size).to eql(1)
123
153
 
124
154
  ids = result['Resources'].map { |resource| resource['id'] }
125
- expect(ids).to match_array([@u2.id.to_s])
155
+ expect(ids).to match_array([@u2.primary_key.to_s])
126
156
 
127
157
  usernames = result['Resources'].map { |resource| resource['userName'] }
128
158
  expect(usernames).to match_array(['2'])
@@ -141,7 +171,7 @@ RSpec.describe Scimitar::ActiveRecordBackedResourcesController do
141
171
  expect(result['Resources'].size).to eql(1)
142
172
 
143
173
  ids = result['Resources'].map { |resource| resource['id'] }
144
- expect(ids).to match_array([@u3.id.to_s])
174
+ expect(ids).to match_array([@u3.primary_key.to_s])
145
175
 
146
176
  usernames = result['Resources'].map { |resource| resource['userName'] }
147
177
  expect(usernames).to match_array(['3'])
@@ -161,7 +191,7 @@ RSpec.describe Scimitar::ActiveRecordBackedResourcesController do
161
191
  expect(result['Resources'].size).to eql(2)
162
192
 
163
193
  ids = result['Resources'].map { |resource| resource['id'] }
164
- expect(ids).to match_array([@u1.id.to_s, @u2.id.to_s])
194
+ expect(ids).to match_array([@u1.primary_key.to_s, @u2.primary_key.to_s])
165
195
 
166
196
  usernames = result['Resources'].map { |resource| resource['userName'] }
167
197
  expect(usernames).to match_array(['1', '2'])
@@ -180,7 +210,7 @@ RSpec.describe Scimitar::ActiveRecordBackedResourcesController do
180
210
  expect(result['Resources'].size).to eql(2)
181
211
 
182
212
  ids = result['Resources'].map { |resource| resource['id'] }
183
- expect(ids).to match_array([@u2.id.to_s, @u3.id.to_s])
213
+ expect(ids).to match_array([@u2.primary_key.to_s, @u3.primary_key.to_s])
184
214
 
185
215
  usernames = result['Resources'].map { |resource| resource['userName'] }
186
216
  expect(usernames).to match_array(['2', '3'])
@@ -204,18 +234,34 @@ RSpec.describe Scimitar::ActiveRecordBackedResourcesController do
204
234
  # ===========================================================================
205
235
 
206
236
  context '#show' do
207
- it 'shows an item' do
208
- expect_any_instance_of(MockUsersController).to receive(:show).once.and_call_original
209
- get "/Users/#{@u2.id}", params: { format: :scim }
237
+ context 'with a UUID, renamed primary key column' do
238
+ it 'shows an item' do
239
+ expect_any_instance_of(MockUsersController).to receive(:show).once.and_call_original
240
+ get "/Users/#{@u2.primary_key}", params: { format: :scim }
210
241
 
211
- expect(response.status).to eql(200)
212
- result = JSON.parse(response.body)
242
+ expect(response.status).to eql(200)
243
+ result = JSON.parse(response.body)
213
244
 
214
- expect(result['id']).to eql(@u2.id.to_s) # Note - ID was converted String; not Integer
215
- expect(result['userName']).to eql('2')
216
- expect(result['name']['familyName']).to eql('Bar')
217
- expect(result['meta']['resourceType']).to eql('User')
218
- end
245
+ expect(result['id']).to eql(@u2.primary_key.to_s)
246
+ expect(result['userName']).to eql('2')
247
+ expect(result['name']['familyName']).to eql('Bar')
248
+ expect(result['meta']['resourceType']).to eql('User')
249
+ end
250
+ end # "context 'with a UUID, renamed primary key column' do"
251
+
252
+ context 'with an integer, conventionally named primary key column' do
253
+ it 'shows an item' do
254
+ expect_any_instance_of(MockGroupsController).to receive(:show).once.and_call_original
255
+ get "/Groups/#{@g2.id}", params: { format: :scim }
256
+
257
+ expect(response.status).to eql(200)
258
+ result = JSON.parse(response.body)
259
+
260
+ expect(result['id']).to eql(@g2.id.to_s) # Note - ID was converted String; not Integer
261
+ expect(result['displayName']).to eql('Group 2')
262
+ expect(result['meta']['resourceType']).to eql('Group')
263
+ end
264
+ end # "context 'with an integer, conventionally named primary key column' do"
219
265
 
220
266
  it 'renders 404' do
221
267
  get '/Users/xyz', params: { format: :scim }
@@ -234,7 +280,7 @@ RSpec.describe Scimitar::ActiveRecordBackedResourcesController do
234
280
  it 'with minimal parameters' do
235
281
  mock_before = MockUser.all.to_a
236
282
 
237
- attributes = { userName: '4' } # Minimum required by schema
283
+ attributes = { userName: '4' } # Minimum required by schema
238
284
  attributes = spec_helper_hupcase(attributes) if force_upper_case
239
285
 
240
286
  expect_any_instance_of(MockUsersController).to receive(:create).once.and_call_original
@@ -248,7 +294,7 @@ RSpec.describe Scimitar::ActiveRecordBackedResourcesController do
248
294
  expect(response.status).to eql(201)
249
295
  result = JSON.parse(response.body)
250
296
 
251
- expect(result['id']).to eql(new_mock.id.to_s)
297
+ expect(result['id']).to eql(new_mock.primary_key.to_s)
252
298
  expect(result['meta']['resourceType']).to eql('User')
253
299
  expect(new_mock.username).to eql('4')
254
300
  end
@@ -363,13 +409,13 @@ RSpec.describe Scimitar::ActiveRecordBackedResourcesController do
363
409
 
364
410
  expect_any_instance_of(MockUsersController).to receive(:replace).once.and_call_original
365
411
  expect {
366
- put "/Users/#{@u2.id}", params: attributes.merge(format: :scim)
412
+ put "/Users/#{@u2.primary_key}", params: attributes.merge(format: :scim)
367
413
  }.to_not change { MockUser.count }
368
414
 
369
415
  expect(response.status).to eql(200)
370
416
  result = JSON.parse(response.body)
371
417
 
372
- expect(result['id']).to eql(@u2.id.to_s)
418
+ expect(result['id']).to eql(@u2.primary_key.to_s)
373
419
  expect(result['meta']['resourceType']).to eql('User')
374
420
 
375
421
  @u2.reload
@@ -391,7 +437,7 @@ RSpec.describe Scimitar::ActiveRecordBackedResourcesController do
391
437
 
392
438
  it 'notes schema validation failures' do
393
439
  expect {
394
- put "/Users/#{@u2.id}", params: {
440
+ put "/Users/#{@u2.primary_key}", params: {
395
441
  format: :scim
396
442
  # userName parameter is required by schema, but missing
397
443
  }
@@ -470,13 +516,13 @@ RSpec.describe Scimitar::ActiveRecordBackedResourcesController do
470
516
 
471
517
  expect_any_instance_of(MockUsersController).to receive(:update).once.and_call_original
472
518
  expect {
473
- patch "/Users/#{@u2.id}", params: payload.merge(format: :scim)
519
+ patch "/Users/#{@u2.primary_key}", params: payload.merge(format: :scim)
474
520
  }.to_not change { MockUser.count }
475
521
 
476
522
  expect(response.status).to eql(200)
477
523
  result = JSON.parse(response.body)
478
524
 
479
- expect(result['id']).to eql(@u2.id.to_s)
525
+ expect(result['id']).to eql(@u2.primary_key.to_s)
480
526
  expect(result['meta']['resourceType']).to eql('User')
481
527
 
482
528
  @u2.reload
@@ -507,13 +553,13 @@ RSpec.describe Scimitar::ActiveRecordBackedResourcesController do
507
553
 
508
554
  expect_any_instance_of(MockUsersController).to receive(:update).once.and_call_original
509
555
  expect {
510
- patch "/Users/#{@u2.id}", params: payload.merge(format: :scim)
556
+ patch "/Users/#{@u2.primary_key}", params: payload.merge(format: :scim)
511
557
  }.to_not change { MockUser.count }
512
558
 
513
559
  expect(response.status).to eql(200)
514
560
  result = JSON.parse(response.body)
515
561
 
516
- expect(result['id']).to eql(@u2.id.to_s)
562
+ expect(result['id']).to eql(@u2.primary_key.to_s)
517
563
  expect(result['meta']['resourceType']).to eql('User')
518
564
 
519
565
  @u2.reload
@@ -539,13 +585,13 @@ RSpec.describe Scimitar::ActiveRecordBackedResourcesController do
539
585
 
540
586
  expect_any_instance_of(MockUsersController).to receive(:update).once.and_call_original
541
587
  expect {
542
- patch "/Users/#{@u2.id}", params: payload.merge(format: :scim)
588
+ patch "/Users/#{@u2.primary_key}", params: payload.merge(format: :scim)
543
589
  }.to_not change { MockUser.count }
544
590
 
545
591
  expect(response.status).to eql(200)
546
592
  result = JSON.parse(response.body)
547
593
 
548
- expect(result['id']).to eql(@u2.id.to_s)
594
+ expect(result['id']).to eql(@u2.primary_key.to_s)
549
595
  expect(result['meta']['resourceType']).to eql('User')
550
596
 
551
597
  @u2.reload
@@ -571,13 +617,13 @@ RSpec.describe Scimitar::ActiveRecordBackedResourcesController do
571
617
 
572
618
  expect_any_instance_of(MockUsersController).to receive(:update).once.and_call_original
573
619
  expect {
574
- patch "/Users/#{@u2.id}", params: payload.merge(format: :scim)
620
+ patch "/Users/#{@u2.primary_key}", params: payload.merge(format: :scim)
575
621
  }.to_not change { MockUser.count }
576
622
 
577
623
  expect(response.status).to eql(200)
578
624
  result = JSON.parse(response.body)
579
625
 
580
- expect(result['id']).to eql(@u2.id.to_s)
626
+ expect(result['id']).to eql(@u2.primary_key.to_s)
581
627
  expect(result['meta']['resourceType']).to eql('User')
582
628
 
583
629
  @u2.reload
@@ -601,7 +647,7 @@ RSpec.describe Scimitar::ActiveRecordBackedResourcesController do
601
647
 
602
648
  it 'notes Rails validation failures' do
603
649
  expect {
604
- patch "/Users/#{@u2.id}", params: {
650
+ patch "/Users/#{@u2.primary_key}", params: {
605
651
  format: :scim,
606
652
  Operations: [
607
653
  {
@@ -645,6 +691,142 @@ RSpec.describe Scimitar::ActiveRecordBackedResourcesController do
645
691
  result = JSON.parse(response.body)
646
692
  expect(result['status']).to eql('404')
647
693
  end
694
+
695
+ context 'when removing users from groups' do
696
+ before :each do
697
+ @g1.mock_users << @u1
698
+ @g1.mock_users << @u2
699
+ @g1.mock_users << @u3
700
+
701
+ # (Self-check) Verify group representation
702
+ #
703
+ get "/Groups/#{@g1.id}", params: { format: :scim }
704
+
705
+ expect(response.status).to eql(200)
706
+ result = JSON.parse(response.body)
707
+
708
+ expect(result['members'].map { |m| m['value'] }.sort()).to eql(MockUser.pluck(:primary_key).sort())
709
+ end
710
+
711
+ it 'can remove all users' do
712
+ expect {
713
+ expect {
714
+ patch "/Groups/#{@g1.id}", params: {
715
+ format: :scim,
716
+ Operations: [
717
+ {
718
+ op: 'remove',
719
+ path: 'members'
720
+ }
721
+ ]
722
+ }
723
+ }.to_not change { MockUser.count }
724
+ }.to_not change { MockGroup.count }
725
+
726
+ get "/Groups/#{@g1.id}", params: { format: :scim }
727
+
728
+ expect(response.status).to eql(200)
729
+ result = JSON.parse(response.body)
730
+
731
+ expect(result['members']).to be_empty
732
+ expect(@g1.reload().mock_users).to be_empty
733
+ end
734
+
735
+ # Define via 'let':
736
+ #
737
+ # * Hash 'payload', to send via 'patch'
738
+ # * MockUser 'removed_user', which is the user that should be removed
739
+ #
740
+ shared_examples 'a user remover' do
741
+ it 'which removes the identified user' do
742
+ expect {
743
+ expect {
744
+ patch "/Groups/#{@g1.id}", params: payload()
745
+ }.to_not change { MockUser.count }
746
+ }.to_not change { MockGroup.count }
747
+
748
+ expected_remaining_user_ids = MockUser
749
+ .where.not(primary_key: removed_user().id)
750
+ .pluck(:primary_key)
751
+ .sort()
752
+
753
+ get "/Groups/#{@g1.id}", params: { format: :scim }
754
+
755
+ expect(response.status).to eql(200)
756
+ result = JSON.parse(response.body)
757
+
758
+ expect(result['members'].map { |m| m['value'] }.sort()).to eql(expected_remaining_user_ids)
759
+ expect(@g1.reload().mock_users.map(&:primary_key).sort()).to eql(expected_remaining_user_ids)
760
+ end
761
+ end
762
+
763
+ # https://www.rfc-editor.org/rfc/rfc7644#section-3.5.2.2
764
+ #
765
+ context 'and using an RFC-compliant payload' do
766
+ let(:removed_user) { @u2 }
767
+ let(:payload) do
768
+ {
769
+ format: :scim,
770
+ Operations: [
771
+ {
772
+ op: 'remove',
773
+ path: "members[value eq \"#{removed_user().primary_key}\"]",
774
+ }
775
+ ]
776
+ }
777
+ end
778
+
779
+ it_behaves_like 'a user remover'
780
+ end # context 'and using an RFC-compliant payload' do
781
+
782
+ # https://learn.microsoft.com/en-us/azure/active-directory/app-provisioning/use-scim-to-provision-users-and-groups#update-group-remove-members
783
+ #
784
+ context 'and using a Microsoft variant payload' do
785
+ let(:removed_user) { @u2 }
786
+ let(:payload) do
787
+ {
788
+ format: :scim,
789
+ Operations: [
790
+ {
791
+ op: 'remove',
792
+ path: 'members',
793
+ value: [{
794
+ '$ref' => nil,
795
+ 'value' => removed_user().primary_key
796
+ }]
797
+ }
798
+ ]
799
+ }
800
+ end
801
+
802
+ it_behaves_like 'a user remover'
803
+ end # context 'and using a Microsoft variant payload' do
804
+
805
+ # https://help.salesforce.com/s/articleView?id=sf.identity_scim_manage_groups.htm&type=5
806
+ #
807
+ context 'and using a Salesforce variant payload' do
808
+ let(:removed_user) { @u2 }
809
+ let(:payload) do
810
+ {
811
+ format: :scim,
812
+ Operations: [
813
+ {
814
+ op: 'remove',
815
+ path: 'members',
816
+ value: {
817
+ 'members' => [{
818
+ '$ref' => nil,
819
+ 'value' => removed_user().primary_key
820
+ }]
821
+ }
822
+ }
823
+ ]
824
+ }
825
+ end
826
+
827
+ it_behaves_like 'a user remover'
828
+ end # context 'and using a Salesforce variant payload' do
829
+ end # "context 'when removing users from groups' do"
648
830
  end # "context '#update' do"
649
831
 
650
832
  # ===========================================================================
@@ -654,7 +836,7 @@ RSpec.describe Scimitar::ActiveRecordBackedResourcesController do
654
836
  expect_any_instance_of(MockUsersController).to receive(:destroy).once.and_call_original
655
837
  expect_any_instance_of(MockUser).to receive(:destroy!).once.and_call_original
656
838
  expect {
657
- delete "/Users/#{@u2.id}", params: { format: :scim }
839
+ delete "/Users/#{@u2.primary_key}", params: { format: :scim }
658
840
  }.to change { MockUser.count }.by(-1)
659
841
 
660
842
  expect(response.status).to eql(204)
@@ -666,7 +848,7 @@ RSpec.describe Scimitar::ActiveRecordBackedResourcesController do
666
848
  expect_any_instance_of(MockUser).to_not receive(:destroy!)
667
849
 
668
850
  expect {
669
- delete "/CustomDestroyUsers/#{@u2.id}", params: { format: :scim }
851
+ delete "/CustomDestroyUsers/#{@u2.primary_key}", params: { format: :scim }
670
852
  }.to_not change { MockUser.count }
671
853
 
672
854
  expect(response.status).to eql(204)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scimitar
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.0
4
+ version: 2.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - RIPA Global
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2023-01-13 00:00:00.000000000 Z
12
+ date: 2023-01-27 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -211,7 +211,6 @@ files:
211
211
  - spec/apps/dummy/db/migrate/20210304014602_create_mock_users.rb
212
212
  - spec/apps/dummy/db/migrate/20210308020313_create_mock_groups.rb
213
213
  - spec/apps/dummy/db/migrate/20210308044214_create_join_table_mock_groups_mock_users.rb
214
- - spec/apps/dummy/db/migrate/20230109012729_add_timestamps_to_mock_user.rb
215
214
  - spec/apps/dummy/db/schema.rb
216
215
  - spec/controllers/scimitar/application_controller_spec.rb
217
216
  - spec/controllers/scimitar/resource_types_controller_spec.rb
@@ -261,7 +260,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
261
260
  - !ruby/object:Gem::Version
262
261
  version: '0'
263
262
  requirements: []
264
- rubygems_version: 3.4.1
263
+ rubygems_version: 3.4.4
265
264
  signing_key:
266
265
  specification_version: 4
267
266
  summary: SCIM v2 for Rails
@@ -283,7 +282,6 @@ test_files:
283
282
  - spec/apps/dummy/db/migrate/20210304014602_create_mock_users.rb
284
283
  - spec/apps/dummy/db/migrate/20210308020313_create_mock_groups.rb
285
284
  - spec/apps/dummy/db/migrate/20210308044214_create_join_table_mock_groups_mock_users.rb
286
- - spec/apps/dummy/db/migrate/20230109012729_add_timestamps_to_mock_user.rb
287
285
  - spec/apps/dummy/db/schema.rb
288
286
  - spec/controllers/scimitar/application_controller_spec.rb
289
287
  - spec/controllers/scimitar/resource_types_controller_spec.rb
@@ -1,5 +0,0 @@
1
- class AddTimestampsToMockUser < ActiveRecord::Migration[7.0]
2
- def change
3
- add_timestamps :mock_users
4
- end
5
- end