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