Commit 0497343
Changed files (3)
app
controllers
scim
models
scim
spec
models
app/controllers/scim/v2/users_controller.rb
@@ -10,11 +10,19 @@ module Scim
end
def index
- if params[:filter].present?
- @users = paginate(apply_filter_to(User.order(:created_at), params[:filter]), page: page - 1, page_size: page_size)
- else
- @users = paginate(User.order(:created_at), page: page - 1, page_size: page_size)
- end
+ @users =
+ if params[:filter].present?
+ paginate(
+ apply_filter_to(User.order(:created_at), params[:filter]),
+ page: page - 1,
+ page_size: page_size
+ )
+ else
+ paginate(
+ User.order(:created_at),
+ page: page - 1, page_size: page_size
+ )
+ end
render formats: :scim, status: :ok
end
@@ -59,9 +67,9 @@ module Scim
page_param(:count, default: 25, bottom: 0, top: 25)
end
- def apply_filter_to(scope, _raw_filter)
+ def apply_filter_to(scope, raw_filter)
parser = Scim::Kit::V2::Filter.new
- parse_tree = parser.parse(params[:filter])
+ parse_tree = parser.parse(raw_filter)
scope.scim_filter_for(parse_tree)
end
end
app/models/scim/visitor.rb
@@ -3,7 +3,9 @@
module Scim
class Visitor
def self.result_for(tree)
- attr = SCIM::User::ATTRIBUTES[tree[:attribute].to_s] || tree[:attribute].to_s
+ attribute = tree[:attribute].to_s
+ attr = SCIM::User::ATTRIBUTES[attribute] || attribute
+
case tree[:operator].to_s
when 'and'
result_for(tree[:left]).merge(result_for(tree[:right]))
spec/models/user_spec.rb
@@ -77,29 +77,26 @@ RSpec.describe User do
expect(results).to match_array([random_user])
end
- specify do
- first_user = users.sample
- second_user = users.sample
- results = described_class.scim_filter_for(
- tree_for(%(userName eq "#{first_user.email}" or userName eq "#{second_user.email}"))
- )
- expect(results.pluck(:email)).to match_array([first_user.email, second_user.email])
+ context "when searching for condition a OR condition b" do
+ let(:first_user) { users.sample }
+ let(:second_user) { users.sample }
+ let(:results) { described_class.scim_filter_for(tree_for(%(userName eq "#{first_user.email}" or userName eq "#{second_user.email}"))) }
+
+ specify { expect(results.pluck(:email)).to match_array([first_user.email, second_user.email]) }
end
context "when searching for condition a AND condition b" do
- specify do
- freeze_time
- first_user = users.sample
- second_user = users.sample
+ let(:first_user) { users.sample }
+ let(:second_user) { users.sample }
+ let(:results) { described_class.scim_filter_for(tree_for(%(meta.lastModified gt "#{10.minutes.from_now.iso8601}" and meta.lastModified lt "#{15.minutes.from_now.iso8601}"))) }
+ before do
+ freeze_time
first_user.update!(updated_at: 11.minutes.from_now)
second_user.update!(updated_at: 12.minutes.from_now)
-
- results = described_class.scim_filter_for(
- tree_for(%(meta.lastModified gt "#{10.minutes.from_now.iso8601}" and meta.lastModified lt "#{15.minutes.from_now.iso8601}"))
- )
- expect(results).to match_array([first_user, second_user])
end
+
+ specify { expect(results).to match_array([first_user, second_user]) }
end
end
end