Commit e19a625

mo <mo@mokhan.ca>
2019-05-09 20:17:23
start to add rudimentary pagination
1 parent 06d2e61
Changed files (3)
app
controllers
views
scim
spec
requests
app/controllers/scim/v2/users_controller.rb
@@ -10,8 +10,10 @@ module Scim
       end
 
       def index
-        @page = 0
-        @users = User.all.limit(PAGE_SIZE)
+        @page = params.fetch(:startIndex, 0).to_i
+        @page_size = params.fetch(:count, Scim::V2::UsersController::PAGE_SIZE).to_i
+        @total = User.count
+        @users = User.offset(@page).limit(@page_size)
         render formats: :scim, status: :ok
       end
 
app/views/scim/v2/users/index.scim.jbuilder
@@ -1,9 +1,9 @@
 # frozen_string_literal: true
 
 json.schemas [Scim::Kit::V2::Messages::LIST_RESPONSE]
-json.totalResults @users.count
+json.totalResults @total
 json.startIndex @page
-json.itemsPerPage Scim::V2::UsersController::PAGE_SIZE
+json.itemsPerPage @page_size
 json.Resources do
   json.array! @users do |user|
     json.partial! user, as: :user
spec/requests/scim/v2/users_spec.rb
@@ -132,6 +132,21 @@ describe '/scim/v2/users' do
       specify { expect(json[:Resources][0][:meta]).to be_present }
     end
 
+    context "when paginating users" do
+      let(:json) { JSON.parse(response.body, symbolize_names: true) }
+      let!(:users) { create_list(:user, 10) }
+
+      before { get "/scim/v2/users", params: { startIndex: 1, count: 1 }, headers: headers }
+
+      specify { expect(response).to have_http_status(:ok) }
+      specify { expect(response.headers['Content-Type']).to eql('application/scim+json') }
+      specify { expect(response.body).to be_present }
+      specify { expect(json[:schemas]).to match_array([Scim::Kit::V2::Messages::LIST_RESPONSE]) }
+      specify { expect(json[:totalResults]).to be(users.count + 1) }
+      specify { expect(json[:startIndex]).to eql(1) }
+      specify { expect(json[:itemsPerPage]).to eql(1) }
+    end
+
     xcontext "when fetching specific attributes" do
       let!(:user) { create(:user) }
       let(:json) { JSON.parse(response.body, symbolize_names: true) }