Skip to content

Commit e496357

Browse files
committed
Add tests.
1 parent ac98273 commit e496357

File tree

4 files changed

+270
-158
lines changed

4 files changed

+270
-158
lines changed

spec/action_controller_spec.rb

Lines changed: 0 additions & 158 deletions
This file was deleted.

spec/deserialization_spec.rb

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
require 'rails_helper'
2+
3+
describe ActionController::Base, '.deserializable_resource',
4+
type: :controller do
5+
let(:payload) do
6+
{
7+
_jsonapi: {
8+
'data' => {
9+
'type' => 'users',
10+
'attributes' => { 'name' => 'Lucas' }
11+
}
12+
}
13+
}
14+
end
15+
16+
context 'when using default deserializer' do
17+
controller do
18+
deserializable_resource :user
19+
20+
def create
21+
render plain: 'ok'
22+
end
23+
end
24+
25+
it 'makes the deserialized resource available in params' do
26+
post :create, params: payload
27+
28+
expected = { 'type' => 'users', 'name' => 'Lucas' }
29+
expect(controller.params[:user]).to eq(expected)
30+
end
31+
32+
it 'makes the deserialization mapping available via #jsonapi_pointers' do
33+
post :create, params: payload
34+
35+
expected = { name: '/data/attributes/name',
36+
type: '/data/type' }
37+
expect(controller.jsonapi_pointers).to eq(expected)
38+
end
39+
end
40+
41+
context 'when using a customized deserializer' do
42+
controller do
43+
deserializable_resource :user do
44+
attribute(:name) do |val|
45+
{ 'first_name'.to_sym => val }
46+
end
47+
end
48+
49+
def create
50+
render plain: 'ok'
51+
end
52+
end
53+
54+
it 'makes the deserialized resource available in params' do
55+
post :create, params: payload
56+
57+
expected = { 'type' => 'users', 'first_name' => 'Lucas' }
58+
expect(controller.params[:user]).to eq(expected)
59+
end
60+
61+
it 'makes the deserialization mapping available via #jsonapi_pointers' do
62+
post :create, params: payload
63+
64+
expected = { first_name: '/data/attributes/name',
65+
type: '/data/type' }
66+
expect(controller.jsonapi_pointers).to eq(expected)
67+
end
68+
end
69+
70+
context 'when using a customized deserializer with key_format' do
71+
controller do
72+
deserializable_resource :user do
73+
key_format(&:capitalize)
74+
end
75+
76+
def create
77+
render plain: 'ok'
78+
end
79+
end
80+
81+
it 'makes the deserialized resource available in params' do
82+
post :create, params: payload
83+
84+
expected = { 'type' => 'users', 'Name' => 'Lucas' }
85+
expect(controller.params[:user]).to eq(expected)
86+
end
87+
88+
it 'makes the deserialization mapping available via #jsonapi_pointers' do
89+
post :create, params: payload
90+
91+
expected = { Name: '/data/attributes/name',
92+
type: '/data/type' }
93+
expect(controller.jsonapi_pointers).to eq(expected)
94+
end
95+
end
96+
end

spec/render_jsonapi_errors_spec.rb

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
require 'rails_helper'
2+
3+
describe ActionController::Base, '#render', type: :controller do
4+
let(:serialized_errors) do
5+
{
6+
'errors' => [{
7+
'detail' => 'Name can\'t be blank',
8+
'title' => 'Invalid name',
9+
'source' => { 'pointer' => '/data/attributes/name' }
10+
},
11+
{
12+
'detail' => 'Email must be a valid email',
13+
'title' => 'Invalid email',
14+
'source' => { 'pointer' => '/data/attributes/email' }
15+
}]
16+
}
17+
end
18+
19+
context 'when rendering ActiveModel::Errors' do
20+
class User < ActiveRecord::Base
21+
validates :name, presence: true
22+
validates :email, format: { with: /@/, message: 'must be a valid email' }
23+
end
24+
25+
controller do
26+
def create
27+
user = User.new(email: 'lucas')
28+
29+
unless user.valid?
30+
render jsonapi_errors: user.errors
31+
end
32+
end
33+
34+
def jsonapi_pointers
35+
{
36+
name: '/data/attributes/name',
37+
email: '/data/attributes/email'
38+
}
39+
end
40+
end
41+
42+
subject { JSON.parse(response.body) }
43+
44+
it 'renders a JSON API error document' do
45+
post :create
46+
47+
expect(response.content_type).to eq('application/vnd.api+json')
48+
is_expected.to eq(serialized_errors)
49+
end
50+
end
51+
52+
context 'when rendering JSONAPI::Serializable::Error' do
53+
controller do
54+
def create
55+
errors = [
56+
JSONAPI::Serializable::Error.create(
57+
detail: 'Name can\'t be blank',
58+
title: 'Invalid name',
59+
source: { pointer: "/data/attributes/name" }
60+
),
61+
JSONAPI::Serializable::Error.create(
62+
detail: 'Email must be a valid email',
63+
title: 'Invalid email',
64+
source: { pointer: "/data/attributes/email" }
65+
)
66+
]
67+
68+
render jsonapi_errors: errors
69+
end
70+
end
71+
72+
subject { JSON.parse(response.body) }
73+
74+
it 'renders a JSON API error document' do
75+
post :create
76+
77+
expect(response.content_type).to eq('application/vnd.api+json')
78+
is_expected.to eq(serialized_errors)
79+
end
80+
end
81+
82+
83+
context 'when rendering error hashes' do
84+
controller do
85+
def create
86+
errors = [
87+
{
88+
detail: 'Name can\'t be blank',
89+
title: 'Invalid name',
90+
source: { pointer: "/data/attributes/name" }
91+
},
92+
{
93+
detail: 'Email must be a valid email',
94+
title: 'Invalid email',
95+
source: { pointer: "/data/attributes/email" }
96+
}
97+
]
98+
99+
render jsonapi_errors: errors
100+
end
101+
end
102+
103+
subject { JSON.parse(response.body) }
104+
105+
it 'renders a JSON API error document' do
106+
post :create
107+
108+
expect(response.content_type).to eq('application/vnd.api+json')
109+
is_expected.to eq(serialized_errors)
110+
end
111+
end
112+
end

0 commit comments

Comments
 (0)