blob: b2bf13729e14cc3992fcd66ac85d827d9a6623aa (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
# frozen_string_literal: true
require 'rails_helper'
RSpec.describe User do
describe "#sessions" do
subject { create(:user) }
let!(:user_session) { create(:user_session, user: subject) }
specify { expect(subject.sessions).to match_array([user_session]) }
end
describe ".scim_search" do
subject { described_class }
let!(:users) { create_list(:user, 10) }
let(:random_user) { users.sample }
specify { expect(subject.scim_search("")).to match_array(users) }
specify { expect(subject.scim_search(nil)).to match_array(users) }
specify do
results = subject.scim_search("userName pr")
expect(results.to_sql).to eql(subject.where.not(email: nil).to_sql)
expect(results).to match_array(users)
end
specify do
results = subject.scim_search("emails.value eq \"#{random_user.email}\"")
expect(results).to match_array([random_user])
end
specify do
results = subject.scim_search("userName eq \"#{random_user.email}\"")
expect(results).to match_array([random_user])
end
specify do
results = subject.scim_search("userName ne \"#{random_user.email}\"")
expect(results.pluck(:email)).not_to include(random_user.email)
end
specify do
results = subject.scim_search("userName co \"#{random_user.email[1..-2]}\"")
expect(results).to match_array([random_user])
end
specify do
results = subject.scim_search("userName sw \"#{random_user.email[0..3]}\"")
expect(results).to match_array([random_user])
end
specify do
results = subject.scim_search("userName ew \"#{random_user.email[-8..-1]}\"")
expect(results).to match_array([random_user])
end
specify do
freeze_time
random_user.update!(updated_at: 10.minutes.from_now)
results = subject.scim_search("meta.lastModified gt \"#{Time.current.iso8601}\"")
expect(results).to match_array([random_user])
end
specify do
freeze_time
random_user.update!(updated_at: 10.minutes.from_now)
results = subject.scim_search("meta.lastModified ge \"#{random_user.updated_at.iso8601}\"")
expect(results).to match_array([random_user])
end
specify do
freeze_time
random_user.update!(updated_at: 10.minutes.from_now)
results = subject.scim_search("meta.lastModified lt \"#{Time.current.iso8601}\"")
expect(results).to match_array(users - [random_user])
end
specify do
freeze_time
random_user.update!(updated_at: 10.minutes.ago)
results = subject.scim_search("meta.lastModified le \"#{random_user.updated_at.iso8601}\"")
expect(results).to match_array([random_user])
end
context "when searching for condition a OR condition b" do
let(:first_user) { users.sample }
let(:second_user) { users.sample }
let(:results) { described_class.scim_search(%(userName eq "#{first_user.email}" or userName eq "#{second_user.email}")) }
specify { expect(results.pluck(:email).uniq).to match_array([first_user.email, second_user.email].uniq) }
end
context "when searching for condition a AND condition b" do
let(:first_user) { users.sample }
let(:second_user) { users.sample }
let(:results) { described_class.scim_search(%(meta.lastModified gt "#{10.minutes.from_now.iso8601}" and meta.lastModified lt "#{15.minutes.from_now.iso8601}")) }
before do
freeze_time
first_user.update!(updated_at: 11.minutes.from_now)
second_user.update!(updated_at: 12.minutes.from_now)
end
specify { expect(results).to match_array([first_user, second_user]) }
end
end
describe ".scim_mapper" do
subject { described_class }
specify { expect(subject.scim_mapper['emails.value']).to be(:email) }
specify { expect(subject.scim_mapper['meta.created']).to be(:created_at) }
specify { expect(subject.scim_mapper['meta.lastModified']).to be(:updated_at) }
specify { expect(subject.scim_mapper[:userName]).to be(:email) }
specify { expect(subject.scim_mapper[:user_name]).to be(:email) }
end
end
|