Commit 42ccaef

mokha <mokha@cisco.com>
2018-09-19 22:36:41
use jbuilder to render scim json.
1 parent a32f807
Changed files (4)
app
controllers
models
views
scim
spec
requests
app/controllers/scim/v2/users_controller.rb
@@ -12,9 +12,10 @@ module Scim
       end
 
       def show
-        user = repository.find!(params[:id])
-        response.headers['Location'] = user.meta.location
-        render json: user.to_json, status: :ok
+        @user = User.find_by!(uuid: params[:id])
+        response.headers['Location'] = scim_v2_user_url(@user)
+        fresh_when(@user)
+        render formats: :scim, status: :ok
       end
 
       def create
app/models/scim/user_mapper.rb
@@ -12,7 +12,7 @@ module SCIM
         x.username = user.email
         x.created_at = user.created_at
         x.updated_at = user.updated_at
-        x.location = @url_helpers.scim_v2_users_url(user)
+        x.location = @url_helpers.scim_v2_user_url(user)
         x.version = user.lock_version
         x.emails do |y|
           y.add(user.email, primary: true)
app/views/scim/v2/users/show.scim.jbuilder
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+json.schemas ["urn:ietf:params:scim:schemas:core:2.0:User"]
+json.id @user.uuid
+json.meta do
+  json.resourceType 'User'
+  json.created @user.created_at.iso8601
+  json.lastModified @user.updated_at.iso8601
+  json.version response.headers['ETag']
+  json.location scim_v2_user_url(id: @user.to_param)
+end
+json.userName @user.email
+json.name do
+  json.formatted @user.email
+  json.familyName @user.email
+  json.givenName @user.email
+end
+json.displayName @user.email
+json.locale @user.try(:locale)
+json.timezone @user.try(:timezone)
+json.active true
+json.emails [{ value: @user.email, primary: true }]
+json.groups [ ]
spec/requests/scim/v2/users_spec.rb
@@ -13,7 +13,7 @@ describe '/scim/v2/users' do
 
   describe "POST /scim/v2/users" do
     context "when a valid request is sent" do
-      let(:email) { FFaker::Internet.email }
+      let(:email) { generate(:email) }
 
       it 'creates a new user' do
         body = { schemas: [Scim::Shady::Schemas::USER], userName: email }
@@ -56,23 +56,27 @@ describe '/scim/v2/users' do
   describe "GET /scim/v2/users/:id" do
     let(:user) { create(:user) }
 
-    it 'returns the requested resource' do
-      get "/scim/v2/users/#{user.uuid}", headers: headers
-
-      expect(response).to have_http_status(:ok)
-      expect(response.headers['Content-Type']).to eql('application/scim+json')
-      expect(response.headers['Location']).to be_present
-      expect(response.body).to be_present
-
-      json = JSON.parse(response.body, symbolize_names: true)
-      expect(json[:schemas]).to match_array([Scim::Shady::Schemas::USER])
-      expect(json[:id]).to eql(user.uuid)
-      expect(json[:userName]).to eql(user.email)
-      expect(json[:meta][:resourceType]).to eql('User')
-      expect(json[:meta][:created]).to eql(user.created_at.iso8601)
-      expect(json[:meta][:lastModified]).to eql(user.updated_at.iso8601)
-      expect(json[:meta][:version]).to eql(user.lock_version)
-      expect(json[:meta][:location]).to eql(scim_v2_users_url(user))
+    context "when the resource is available" do
+      before { get "/scim/v2/users/#{user.uuid}", headers: headers }
+
+      specify { expect(response).to have_http_status(:ok) }
+      specify { expect(response.headers['Content-Type']).to eql('application/scim+json') }
+      specify { expect(response.headers['Location']).to eql(scim_v2_user_url(user)) }
+      specify { expect(response.headers['ETag']).to be_present }
+      specify { expect(response.body).to be_present }
+
+      let(:json) { JSON.parse(response.body, symbolize_names: true) }
+      specify { expect(json[:schemas]).to match_array([Scim::Shady::Schemas::USER]) }
+      specify { expect(json[:id]).to eql(user.uuid) }
+      specify { expect(json[:userName]).to eql(user.email) }
+      specify { expect(json[:meta][:resourceType]).to eql('User') }
+      specify { expect(json[:meta][:created]).to eql(user.created_at.iso8601) }
+      specify { expect(json[:meta][:lastModified]).to eql(user.updated_at.iso8601) }
+      specify { expect(json[:meta][:version]).to eql(response.headers['ETag']) }
+      specify { expect(json[:meta][:location]).to eql(scim_v2_user_url(user)) }
+      specify { expect(json[:name][:formatted]).to eql(user.email) }
+      specify { expect(json[:name][:familyName]).to eql(user.email) }
+      specify { expect(json[:name][:givenName]).to eql(user.email) }
     end
   end
 
@@ -101,7 +105,7 @@ describe '/scim/v2/users' do
 
       expect(response).to have_http_status(:ok)
       expect(response.headers['Content-Type']).to eql('application/scim+json')
-      expect(response.headers['Location']).to eql(scim_v2_users_url(user))
+      expect(response.headers['Location']).to eql(scim_v2_user_url(user))
       expect(response.body).to be_present
 
       json = JSON.parse(response.body, symbolize_names: true)