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