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