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