Commit 6085a69

mokha <mokha@cisco.com>
2018-01-24 02:11:39
add search endpoint.
1 parent 26b35c3
Changed files (4)
app
controllers
config
spec
requests
app/controllers/scim/v2/users_controller.rb
@@ -4,7 +4,7 @@ module Scim
       def index
         response.headers['Content-Type'] = 'application/scim+json'
         render json: {
-          schemas: [Scim::Shady::Messages::LIST],
+          schemas: [Scim::Shady::Messages::LIST_RESPONSE],
           totalResults: 0,
           Resources: [],
         }.to_json, status: :ok
config/initializers/mime_types.rb
@@ -2,3 +2,9 @@
 
 # Add new mime types for use in respond_to blocks:
 # Mime::Type.register "text/richtext", :rtf
+Mime::Type.register "application/scim+json", :scim
+
+scim_parser = ActionDispatch::Request.parameter_parsers[:json]
+original_parsers = ActionDispatch::Request.parameter_parsers
+ActionDispatch::Request.parameter_parsers =
+  original_parsers.merge(Mime[:scim].symbol => scim_parser)
config/routes.rb
@@ -9,7 +9,11 @@ Rails.application.routes.draw do
 
   namespace :scim do
     namespace :v2, defaults: { format: 'json' } do
-      resources :users, only: [:index, :show, :create, :update, :destroy]
+      resources :users, only: [:index, :show, :create, :update, :destroy] do
+        collection do
+          post ".search", to: "users#index"
+        end
+      end
       get :ServiceProviderConfig, to: "service_providers#index"
       #resources :groups
       resources :resource_types, only: [:index]
spec/requests/scim/v2/users_spec.rb
@@ -5,8 +5,8 @@ describe '/scim/v2/users' do
   let(:headers) do
     {
       'Authorization' => "Bearer #{token}",
-      'Accept' => 'application/json',
-      'Content-Type' => 'application/json',
+      'Accept' => 'application/scim+json',
+      'Content-Type' => 'application/scim+json',
     }
   end
 
@@ -67,7 +67,29 @@ describe '/scim/v2/users' do
       expect(response.body).to be_present
 
       json = JSON.parse(response.body, symbolize_names: true)
-      expect(json[:schemas]).to match_array([Scim::Shady::Messages::LIST])
+      expect(json[:schemas]).to match_array([Scim::Shady::Messages::LIST_RESPONSE])
+      expect(json[:totalResults]).to be_zero
+      expect(json[:Resources]).to be_empty
+    end
+  end
+
+  describe "POST /scim/v2/users/.search" do
+    it 'returns an empty set of results' do
+      body = {
+        "schemas": [Scim::Shady::Messages::SEARCH_REQUEST],
+        "attributes": ["displayName", "userName"],
+        "filter": "displayName sw \"smith\"",
+        "startIndex": 1,
+        "count": 10
+      }
+      post "/scim/v2/users/.search", headers: headers, params: body.to_json
+
+      expect(response).to have_http_status(:ok)
+      expect(response.headers['Content-Type']).to eql('application/scim+json')
+      expect(response.body).to be_present
+
+      json = JSON.parse(response.body, symbolize_names: true)
+      expect(json[:schemas]).to match_array([Scim::Shady::Messages::LIST_RESPONSE])
       expect(json[:totalResults]).to be_zero
       expect(json[:Resources]).to be_empty
     end