Commit 4eed381

mo <mo@mokhan.ca>
2019-06-15 16:12:59
change subject under test to Scim::Search
1 parent 810957a
Changed files (3)
app
spec
models
app/models/scim/search.rb
@@ -42,7 +42,7 @@ module Scim
       end
     end
 
-    def self.results_for(filter, clazz, mapper)
+    def self.for(filter, clazz, mapper)
       node = Scim::Search::Node.parse(filter)
       node.accept(Scim::Visitor.new(clazz, mapper))
     end
app/models/user.rb
@@ -13,7 +13,7 @@ class User < ApplicationRecord
   validates :timezone, inclusion: VALID_TIMEZONES
   validates :locale, inclusion: VALID_LOCALES
 
-  scope :scim_search, ->(filter) { Scim::Search.results_for(filter, User, SCIM::User::ATTRIBUTES) }
+  scope :scim_search, ->(filter) { Scim::Search.for(filter, User, SCIM::User::ATTRIBUTES) }
 
   def name_id_for(name_id_format)
     Saml::Kit::Namespaces::PERSISTENT == name_id_format ? id : email
spec/models/scim/visitor_spec.rb → spec/models/scim/search_spec.rb
@@ -2,46 +2,47 @@
 
 require 'rails_helper'
 
-RSpec.describe ::Scim::Visitor do
-  subject { described_class.new(User, SCIM::User::ATTRIBUTES) }
+RSpec.describe ::Scim::Search do
+  subject { described_class }
+  let(:mapper) { SCIM::User::ATTRIBUTES }
 
   describe "#visit" do
     let!(:users) { create_list(:user, 10) }
     let(:random_user) { users.sample }
 
     specify do
-      results = Scim::Search::Node.parse("userName pr").accept(subject)
+      results = subject.for("userName pr", User, mapper)
       expect(results.to_sql).to eql(User.where.not(email: nil).to_sql)
       expect(results).to match_array(users)
     end
 
     pending do
-      results = Scim::Search::Node.parse("userName pr and not (userName eq \"#{random_user.email}\")").accept(subject)
+      results = subject.for("userName pr and not (userName eq \"#{random_user.email}\")", User, mapper)
       expect(results).to match_array(users - [random_user])
     end
 
     specify do
-      results = Scim::Search::Node.parse("userName eq \"#{random_user.email}\"").accept(subject)
+      results = subject.for("userName eq \"#{random_user.email}\"", User, mapper)
       expect(results).to match_array([random_user])
     end
 
     specify do
-      results = Scim::Search::Node.parse("userName ne \"#{random_user.email}\"").accept(subject)
+      results = subject.for("userName ne \"#{random_user.email}\"", User, mapper)
       expect(results.pluck(:email)).not_to include(random_user.email)
     end
 
     specify do
-      results = Scim::Search::Node.parse("userName co \"#{random_user.email[1..-2]}\"").accept(subject)
+      results = subject.for("userName co \"#{random_user.email[1..-2]}\"", User, mapper)
       expect(results).to match_array([random_user])
     end
 
     specify do
-      results = Scim::Search::Node.parse("userName sw \"#{random_user.email[0..3]}\"").accept(subject)
+      results = subject.for("userName sw \"#{random_user.email[0..3]}\"", User, mapper)
       expect(results).to match_array([random_user])
     end
 
     specify do
-      results = Scim::Search::Node.parse("userName ew \"#{random_user.email[-8..-1]}\"").accept(subject)
+      results = subject.for("userName ew \"#{random_user.email[-8..-1]}\"", User, mapper)
       expect(results).to match_array([random_user])
     end
 
@@ -49,7 +50,7 @@ RSpec.describe ::Scim::Visitor do
       freeze_time
       random_user.update!(updated_at: 10.minutes.from_now)
 
-      results = Scim::Search::Node.parse("meta.lastModified gt \"#{Time.now.iso8601}\"").accept(subject)
+      results = subject.for("meta.lastModified gt \"#{Time.now.iso8601}\"", User, mapper)
       expect(results).to match_array([random_user])
     end
 
@@ -57,7 +58,7 @@ RSpec.describe ::Scim::Visitor do
       freeze_time
       random_user.update!(updated_at: 10.minutes.from_now)
 
-      results = Scim::Search::Node.parse("meta.lastModified ge \"#{random_user.updated_at.iso8601}\"").accept(subject)
+      results = subject.for("meta.lastModified ge \"#{random_user.updated_at.iso8601}\"", User, mapper)
       expect(results).to match_array([random_user])
     end
 
@@ -65,7 +66,7 @@ RSpec.describe ::Scim::Visitor do
       freeze_time
       random_user.update!(updated_at: 10.minutes.from_now)
 
-      results = Scim::Search::Node.parse("meta.lastModified lt \"#{Time.now.iso8601}\"").accept(subject)
+      results = subject.for("meta.lastModified lt \"#{Time.now.iso8601}\"", User, mapper)
       expect(results).to match_array(users - [random_user])
     end
 
@@ -73,14 +74,14 @@ RSpec.describe ::Scim::Visitor do
       freeze_time
       random_user.update!(updated_at: 10.minutes.ago)
 
-      results = Scim::Search::Node.parse("meta.lastModified le \"#{random_user.updated_at.iso8601}\"").accept(subject)
+      results = subject.for("meta.lastModified le \"#{random_user.updated_at.iso8601}\"", User, mapper)
       expect(results).to match_array([random_user])
     end
 
     context "when searching for condition a OR condition b" do
       let(:first_user) { users.first }
       let(:second_user) { users.last }
-      let(:results) { Scim::Search::Node.parse(%(userName eq "#{first_user.email}" or userName eq "#{second_user.email}")).accept(subject) }
+      let(:results) { subject.for(%(userName eq "#{first_user.email}" or userName eq "#{second_user.email}"), User, mapper) }
 
       specify { expect(results.pluck(:email)).to match_array([first_user.email, second_user.email]) }
     end
@@ -88,7 +89,7 @@ RSpec.describe ::Scim::Visitor do
     context "when searching for condition a AND condition b" do
       let(:first_user) { users.first }
       let(:second_user) { users.last }
-      let(:results) { Scim::Search::Node.parse(%(meta.lastModified gt "#{10.minutes.from_now.iso8601}" and meta.lastModified lt "#{15.minutes.from_now.iso8601}")).accept(subject) }
+      let(:results) { subject.for(%(meta.lastModified gt "#{10.minutes.from_now.iso8601}" and meta.lastModified lt "#{15.minutes.from_now.iso8601}"), User, mapper) }
 
       before do
         freeze_time