Commit d3148e9

mo <mo.khan@gmail.com>
2019-05-31 04:38:12
add support for pr (presence) operator
1 parent c418ac7
Changed files (3)
app/models/scim/visitor.rb
@@ -31,6 +31,8 @@ module Scim
         @clazz.where("#{attr_for(node)} < ?", cast_value_from(node))
       when :le
         @clazz.where("#{attr_for(node)} <= ?", cast_value_from(node))
+      when :pr
+        @clazz.where.not(attr_for(node) => nil)
       else
         @clazz.none
       end
spec/models/user_spec.rb
@@ -12,6 +12,7 @@ RSpec.describe User do
   end
 
   describe ".scim_filter_for" do
+    subject { described_class }
     let!(:users) { create_list(:user, 10) }
     let(:random_user) { users.sample }
     let(:parser) { Scim::Kit::V2::Filter.new }
@@ -21,27 +22,33 @@ RSpec.describe User do
     end
 
     specify do
-      results = described_class.scim_filter_for(tree_for("userName eq \"#{random_user.email}\""))
+      results = subject.scim_filter_for(tree_for("userName pr"))
+      expect(results.to_sql).to eql(subject.where.not(email: nil).to_sql)
+      expect(results).to match_array(users)
+    end
+
+    specify do
+      results = subject.scim_filter_for(tree_for("userName eq \"#{random_user.email}\""))
       expect(results).to match_array([random_user])
     end
 
     specify do
-      results = described_class.scim_filter_for(tree_for("userName ne \"#{random_user.email}\""))
+      results = subject.scim_filter_for(tree_for("userName ne \"#{random_user.email}\""))
       expect(results.pluck(:email)).not_to include(random_user.email)
     end
 
     specify do
-      results = described_class.scim_filter_for(tree_for("userName co \"#{random_user.email[1..-2]}\""))
+      results = subject.scim_filter_for(tree_for("userName co \"#{random_user.email[1..-2]}\""))
       expect(results).to match_array([random_user])
     end
 
     specify do
-      results = described_class.scim_filter_for(tree_for("userName sw \"#{random_user.email[0..3]}\""))
+      results = subject.scim_filter_for(tree_for("userName sw \"#{random_user.email[0..3]}\""))
       expect(results).to match_array([random_user])
     end
 
     specify do
-      results = described_class.scim_filter_for(tree_for("userName ew \"#{random_user.email[-8..-1]}\""))
+      results = subject.scim_filter_for(tree_for("userName ew \"#{random_user.email[-8..-1]}\""))
       expect(results).to match_array([random_user])
     end
 
@@ -49,7 +56,7 @@ RSpec.describe User do
       freeze_time
       random_user.update!(updated_at: 10.minutes.from_now)
 
-      results = described_class.scim_filter_for(tree_for("meta.lastModified gt \"#{Time.now.iso8601}\""))
+      results = subject.scim_filter_for(tree_for("meta.lastModified gt \"#{Time.now.iso8601}\""))
       expect(results).to match_array([random_user])
     end
 
@@ -57,7 +64,7 @@ RSpec.describe User do
       freeze_time
       random_user.update!(updated_at: 10.minutes.from_now)
 
-      results = described_class.scim_filter_for(tree_for("meta.lastModified ge \"#{random_user.updated_at.iso8601}\""))
+      results = subject.scim_filter_for(tree_for("meta.lastModified ge \"#{random_user.updated_at.iso8601}\""))
       expect(results).to match_array([random_user])
     end
 
@@ -65,7 +72,7 @@ RSpec.describe User do
       freeze_time
       random_user.update!(updated_at: 10.minutes.from_now)
 
-      results = described_class.scim_filter_for(tree_for("meta.lastModified lt \"#{Time.now.iso8601}\""))
+      results = subject.scim_filter_for(tree_for("meta.lastModified lt \"#{Time.now.iso8601}\""))
       expect(results).to match_array(users - [random_user])
     end
 
@@ -73,7 +80,7 @@ RSpec.describe User do
       freeze_time
       random_user.update!(updated_at: 10.minutes.ago)
 
-      results = described_class.scim_filter_for(tree_for("meta.lastModified le \"#{random_user.updated_at.iso8601}\""))
+      results = subject.scim_filter_for(tree_for("meta.lastModified le \"#{random_user.updated_at.iso8601}\""))
       expect(results).to match_array([random_user])
     end
 
Gemfile.lock
@@ -1,6 +1,6 @@
 GIT
   remote: https://github.com/mokhan/scim-kit.git
-  revision: 38f5077e882180aebeaeb3553bf196107561bc69
+  revision: 55ab23972bc21d8fe3823a8b081ac417949033db
   specs:
     scim-kit (0.3.2)
       activemodel (>= 5.2.0)