jsonapi-consumer 0.1.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.circleci/config.yml +27 -0
- data/.gitignore +1 -0
- data/Gemfile +6 -4
- data/README.md +9 -38
- data/Rakefile +17 -6
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/jsonapi-consumer.gemspec +10 -11
- data/lib/jsonapi/consumer/associations/base_association.rb +26 -0
- data/lib/jsonapi/consumer/associations/belongs_to.rb +30 -0
- data/lib/jsonapi/consumer/associations/has_many.rb +26 -0
- data/lib/jsonapi/consumer/associations/has_one.rb +19 -0
- data/lib/jsonapi/consumer/connection.rb +36 -0
- data/lib/jsonapi/consumer/error_collector.rb +91 -0
- data/lib/jsonapi/consumer/errors.rb +34 -76
- data/lib/jsonapi/consumer/formatter.rb +145 -0
- data/lib/jsonapi/consumer/helpers/callbacks.rb +27 -0
- data/lib/jsonapi/consumer/helpers/dirty.rb +71 -0
- data/lib/jsonapi/consumer/helpers/dynamic_attributes.rb +83 -0
- data/lib/jsonapi/consumer/helpers/uri.rb +9 -0
- data/lib/jsonapi/consumer/implementation.rb +12 -0
- data/lib/jsonapi/consumer/included_data.rb +49 -0
- data/lib/jsonapi/consumer/linking/links.rb +22 -0
- data/lib/jsonapi/consumer/linking/top_level_links.rb +39 -0
- data/lib/jsonapi/consumer/meta_data.rb +19 -0
- data/lib/jsonapi/consumer/middleware/json_request.rb +26 -0
- data/lib/jsonapi/consumer/middleware/parse_json.rb +22 -23
- data/lib/jsonapi/consumer/middleware/status.rb +41 -0
- data/lib/jsonapi/consumer/paginating/paginator.rb +89 -0
- data/lib/jsonapi/consumer/parsers/parser.rb +113 -0
- data/lib/jsonapi/consumer/query/builder.rb +212 -0
- data/lib/jsonapi/consumer/query/requestor.rb +67 -0
- data/lib/jsonapi/consumer/relationships/relations.rb +56 -0
- data/lib/jsonapi/consumer/relationships/top_level_relations.rb +30 -0
- data/lib/jsonapi/consumer/resource.rb +514 -54
- data/lib/jsonapi/consumer/result_set.rb +25 -0
- data/lib/jsonapi/consumer/schema.rb +153 -0
- data/lib/jsonapi/consumer/utils.rb +28 -0
- data/lib/jsonapi/consumer/version.rb +1 -1
- data/lib/jsonapi/consumer.rb +59 -34
- metadata +51 -111
- data/.rspec +0 -2
- data/CHANGELOG.md +0 -36
- data/lib/jsonapi/consumer/middleware/raise_error.rb +0 -21
- data/lib/jsonapi/consumer/middleware/request_headers.rb +0 -20
- data/lib/jsonapi/consumer/middleware/request_timeout.rb +0 -9
- data/lib/jsonapi/consumer/middleware.rb +0 -5
- data/lib/jsonapi/consumer/parser.rb +0 -75
- data/lib/jsonapi/consumer/query/base.rb +0 -34
- data/lib/jsonapi/consumer/query/create.rb +0 -9
- data/lib/jsonapi/consumer/query/delete.rb +0 -10
- data/lib/jsonapi/consumer/query/find.rb +0 -16
- data/lib/jsonapi/consumer/query/new.rb +0 -15
- data/lib/jsonapi/consumer/query/update.rb +0 -11
- data/lib/jsonapi/consumer/query.rb +0 -5
- data/lib/jsonapi/consumer/resource/association_concern.rb +0 -203
- data/lib/jsonapi/consumer/resource/attributes_concern.rb +0 -70
- data/lib/jsonapi/consumer/resource/connection_concern.rb +0 -99
- data/lib/jsonapi/consumer/resource/finders_concern.rb +0 -28
- data/lib/jsonapi/consumer/resource/object_build_concern.rb +0 -28
- data/lib/jsonapi/consumer/resource/serializer_concern.rb +0 -63
- data/spec/fixtures/.gitkeep +0 -0
- data/spec/fixtures/resources.rb +0 -45
- data/spec/fixtures/responses.rb +0 -64
- data/spec/jsonapi/consumer/associations_spec.rb +0 -166
- data/spec/jsonapi/consumer/attributes_spec.rb +0 -27
- data/spec/jsonapi/consumer/connection_spec.rb +0 -147
- data/spec/jsonapi/consumer/error_handling_spec.rb +0 -37
- data/spec/jsonapi/consumer/object_build_spec.rb +0 -20
- data/spec/jsonapi/consumer/parser_spec.rb +0 -39
- data/spec/jsonapi/consumer/resource_spec.rb +0 -62
- data/spec/jsonapi/consumer/serializer_spec.rb +0 -41
- data/spec/spec_helper.rb +0 -97
- data/spec/support/.gitkeep +0 -0
- data/spec/support/load_fixtures.rb +0 -4
data/spec/fixtures/resources.rb
DELETED
@@ -1,45 +0,0 @@
|
|
1
|
-
class Base
|
2
|
-
include JSONAPI::Consumer::Resource
|
3
|
-
|
4
|
-
self.host = 'http://localhost:3000/api/'
|
5
|
-
end
|
6
|
-
|
7
|
-
|
8
|
-
class BasicResource < Base
|
9
|
-
|
10
|
-
end
|
11
|
-
|
12
|
-
class BuildRequest < Base
|
13
|
-
self.request_new_object_on_build = true
|
14
|
-
end
|
15
|
-
|
16
|
-
|
17
|
-
# BEGIN - Blog example
|
18
|
-
module Blog
|
19
|
-
class Author < Base
|
20
|
-
has_many :posts, class_name: 'Blog::Post'
|
21
|
-
end
|
22
|
-
|
23
|
-
class Post < Base
|
24
|
-
has_one :user, class_name: 'Blog::User'
|
25
|
-
has_many :comments, class_name: 'Blog::Comment'
|
26
|
-
end
|
27
|
-
|
28
|
-
class User < Base
|
29
|
-
|
30
|
-
end
|
31
|
-
|
32
|
-
class Comment < Base
|
33
|
-
# belongs_to :post, class_name: 'Blog::Post'
|
34
|
-
# has_one :author, class_name: 'Blog::Author'
|
35
|
-
end
|
36
|
-
end
|
37
|
-
# END - Blog example
|
38
|
-
|
39
|
-
|
40
|
-
class NotCalled < Faraday::Response::Middleware
|
41
|
-
class ::NotCalledError < StandardError; end
|
42
|
-
def parse(body)
|
43
|
-
raise NotCalledError, "this should not be called"
|
44
|
-
end
|
45
|
-
end
|
data/spec/fixtures/responses.rb
DELETED
@@ -1,64 +0,0 @@
|
|
1
|
-
module Responses
|
2
|
-
def self.sideload
|
3
|
-
{
|
4
|
-
posts: [
|
5
|
-
{
|
6
|
-
links: {
|
7
|
-
comments: [
|
8
|
-
"82083863-bba9-480e-a281-f5d34e7dc0ca",
|
9
|
-
"3b402e8a-7c35-4915-8c72-07ea7779ab76"
|
10
|
-
],
|
11
|
-
user: "6a45992f-cd20-497a-a753-21b2a1a82356"
|
12
|
-
},
|
13
|
-
id: "e6d1b7ac-80d8-40dd-877d-f5bd40feabfb",
|
14
|
-
title: "Friday Post",
|
15
|
-
created_at: "2014-10-19T22:32:52.913Z",
|
16
|
-
updated_at: "2014-10-19T22:32:52.967Z"
|
17
|
-
},
|
18
|
-
{
|
19
|
-
links: {
|
20
|
-
comments: [
|
21
|
-
"9c9ba83b-024c-4d4c-9573-9fd41b95fc14",
|
22
|
-
"27fcf6e8-24b0-41db-94b1-812046a10f54"
|
23
|
-
],
|
24
|
-
user: "d65dda70-73eb-461a-bb34-5484e6e8c194"
|
25
|
-
},
|
26
|
-
id: "ea006f14-6d05-4e87-bfe7-ee8ae3358840",
|
27
|
-
title: "Monday Post",
|
28
|
-
created_at: "2014-10-19T22:32:52.933Z",
|
29
|
-
updated_at: "2014-10-19T22:32:52.969Z"
|
30
|
-
}
|
31
|
-
],
|
32
|
-
linked: {
|
33
|
-
users: [
|
34
|
-
{
|
35
|
-
id: "6a45992f-cd20-497a-a753-21b2a1a82356",
|
36
|
-
name: "Jane Smith"
|
37
|
-
},
|
38
|
-
{
|
39
|
-
id: "d65dda70-73eb-461a-bb34-5484e6e8c194",
|
40
|
-
name: "Jim Bob"
|
41
|
-
}
|
42
|
-
],
|
43
|
-
comments: [
|
44
|
-
{
|
45
|
-
id: "82083863-bba9-480e-a281-f5d34e7dc0ca",
|
46
|
-
content: "Awesome article",
|
47
|
-
created_at: "2014-10-19T22:32:52.933Z",
|
48
|
-
updated_at: "2014-10-19T22:32:52.969Z"
|
49
|
-
},
|
50
|
-
{
|
51
|
-
id: "3b402e8a-7c35-4915-8c72-07ea7779ab76",
|
52
|
-
content: "Hated it",
|
53
|
-
created_at: "2014-10-19T22:32:52.933Z",
|
54
|
-
updated_at: "2014-10-19T22:32:52.969Z"
|
55
|
-
}
|
56
|
-
]
|
57
|
-
},
|
58
|
-
links: {
|
59
|
-
:"posts.comments" => "http://localhost:3000/api/comments/{posts.comments}",
|
60
|
-
:"posts.user" => "http://localhost:3000/api/comments/{posts.user}"
|
61
|
-
}
|
62
|
-
}.with_indifferent_access
|
63
|
-
end
|
64
|
-
end
|
@@ -1,166 +0,0 @@
|
|
1
|
-
RSpec.describe 'Associations', 'has_many' do
|
2
|
-
let(:user_class) do
|
3
|
-
User ||= Class.new do
|
4
|
-
include JSONAPI::Consumer::Resource
|
5
|
-
|
6
|
-
has_many :posts, class_name: 'Post'
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
let!(:post_class) do
|
11
|
-
Post ||= Class.new do
|
12
|
-
include JSONAPI::Consumer::Resource
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
subject(:user_instance) { user_class.new(username: 'foobar') }
|
17
|
-
|
18
|
-
it 'lists association names in #association_names' do
|
19
|
-
expect(user_instance.association_names).to eql([:posts])
|
20
|
-
end
|
21
|
-
|
22
|
-
describe 'defined accessors for assocation' do
|
23
|
-
it { is_expected.to respond_to(:posts) }
|
24
|
-
it { is_expected.to respond_to(:posts=) }
|
25
|
-
end
|
26
|
-
|
27
|
-
describe 'adding objects to array' do
|
28
|
-
it 'can be added as a single value' do
|
29
|
-
expect {
|
30
|
-
user_instance.posts = '1'
|
31
|
-
}.to change{user_instance.post_ids}.from(nil).to(['1'])
|
32
|
-
end
|
33
|
-
|
34
|
-
it 'can be added as a list of items' do
|
35
|
-
expect {
|
36
|
-
user_instance.posts = ['1','2','3']
|
37
|
-
}.to change{user_instance.post_ids}.from(nil).to(['1','2','3'])
|
38
|
-
end
|
39
|
-
|
40
|
-
it 'can be blanked out' do
|
41
|
-
user_instance.posts = '1'
|
42
|
-
expect {
|
43
|
-
user_instance.posts = nil
|
44
|
-
}.to change{user_instance.post_ids}.from(['1']).to(nil)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
describe 'the links payload' do
|
49
|
-
subject(:payload_hash) { user_instance.serializable_hash }
|
50
|
-
|
51
|
-
describe 'when populated' do
|
52
|
-
before do
|
53
|
-
user_instance.posts = ['1']
|
54
|
-
end
|
55
|
-
|
56
|
-
it 'has links in output, if present' do
|
57
|
-
expect(payload_hash).to have_key(:links)
|
58
|
-
expect(payload_hash[:links]).to eql({posts: ['1']})
|
59
|
-
expect(payload_hash[:links][:posts]).to eql(["1"])
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
describe 'when empty' do
|
64
|
-
it 'has no links in output' do
|
65
|
-
expect(payload_hash).to_not have_key(:links)
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
describe 'when persisted and empty' do
|
70
|
-
before do
|
71
|
-
allow(user_instance).to receive(:persisted?).and_return(true)
|
72
|
-
end
|
73
|
-
|
74
|
-
it 'has a links hash in the output' do
|
75
|
-
expect(payload_hash).to have_key(:links)
|
76
|
-
expect(payload_hash[:links]).to eql({posts: []})
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
RSpec.describe 'Associations', 'belongs_to' do
|
83
|
-
let(:comment_class) do
|
84
|
-
Comment ||= Class.new do
|
85
|
-
include JSONAPI::Consumer::Resource
|
86
|
-
|
87
|
-
# belongs_to :comment, class_name: 'Comment'
|
88
|
-
belongs_to :user, class_name: 'User'
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
let!(:user_class) do
|
93
|
-
User ||= Class.new do
|
94
|
-
include JSONAPI::Consumer::Resource
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
subject(:comment_instance) { comment_class.new }
|
99
|
-
|
100
|
-
it 'lists association names in #association_names' do
|
101
|
-
expect(comment_instance.association_names).to eql([:user])
|
102
|
-
end
|
103
|
-
|
104
|
-
describe 'defined accessors for assocation' do
|
105
|
-
it { is_expected.to respond_to(:user) }
|
106
|
-
it { is_expected.to respond_to(:user=) }
|
107
|
-
end
|
108
|
-
|
109
|
-
describe 'adding objects to belongs_to relationship' do
|
110
|
-
it 'can be added as a single value' do
|
111
|
-
expect {
|
112
|
-
comment_instance.user = '1'
|
113
|
-
}.to change{comment_instance.user_id}.from(nil).to('1')
|
114
|
-
end
|
115
|
-
|
116
|
-
it 'can be blanked out' do
|
117
|
-
comment_instance.user = '1'
|
118
|
-
expect {
|
119
|
-
comment_instance.user = nil
|
120
|
-
}.to change{comment_instance.user_id}.from('1').to(nil)
|
121
|
-
end
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
RSpec.describe 'Associations', 'has_one' do
|
126
|
-
let(:post_class) do
|
127
|
-
Poster ||= Class.new do
|
128
|
-
include JSONAPI::Consumer::Resource
|
129
|
-
|
130
|
-
has_one :author, class_name: 'Customer'
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
let!(:user_class) do
|
135
|
-
Customer ||= Class.new do
|
136
|
-
include JSONAPI::Consumer::Resource
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
|
-
subject(:post_instance) { post_class.new }
|
141
|
-
|
142
|
-
it 'lists association names in #association_names' do
|
143
|
-
expect(post_instance.association_names).to eql([:author])
|
144
|
-
end
|
145
|
-
|
146
|
-
describe 'defined accessors for assocation' do
|
147
|
-
it { is_expected.to respond_to(:author) }
|
148
|
-
it { is_expected.to respond_to(:author=) }
|
149
|
-
end
|
150
|
-
|
151
|
-
describe 'adding objects to belongs_to relationship' do
|
152
|
-
it 'can be added as a single value' do
|
153
|
-
expect {
|
154
|
-
post_instance.author = '1'
|
155
|
-
}.to change{post_instance.author_id}.from(nil).to('1')
|
156
|
-
end
|
157
|
-
|
158
|
-
it 'can be blanked out' do
|
159
|
-
post_instance.author = '1'
|
160
|
-
expect {
|
161
|
-
post_instance.author = nil
|
162
|
-
}.to change{post_instance.author_id}.from('1').to(nil)
|
163
|
-
end
|
164
|
-
end
|
165
|
-
end
|
166
|
-
|
@@ -1,27 +0,0 @@
|
|
1
|
-
RSpec.describe 'Attributes' do
|
2
|
-
let(:test_class) do
|
3
|
-
Class.new do
|
4
|
-
include JSONAPI::Consumer::Resource
|
5
|
-
end
|
6
|
-
end
|
7
|
-
|
8
|
-
subject(:obj) { test_class.new }
|
9
|
-
|
10
|
-
its(:primary_key) { is_expected.to eql(:id) }
|
11
|
-
|
12
|
-
describe 'changing the primary key' do
|
13
|
-
it 'is updatable on the class' do
|
14
|
-
expect {
|
15
|
-
obj.class.primary_key = :name
|
16
|
-
}.to change{obj.primary_key}.to(:name)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
describe '#persisted?' do
|
21
|
-
it 'uses the primary key to decide' do
|
22
|
-
expect {
|
23
|
-
obj.id = '8'
|
24
|
-
}.to change{obj.persisted?}.from(false).to(true)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
@@ -1,147 +0,0 @@
|
|
1
|
-
RSpec.describe 'Connection' do
|
2
|
-
let(:test_class) do
|
3
|
-
Record ||= Class.new do
|
4
|
-
include JSONAPI::Consumer::Resource
|
5
|
-
self.host = 'http://localhost:3000/api/'
|
6
|
-
|
7
|
-
has_one :domain
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
let(:obj) { test_class.new(name: 'jsonapi.example') }
|
12
|
-
|
13
|
-
describe 'custom connection middleware' do
|
14
|
-
|
15
|
-
it 'handles custom middleware' do
|
16
|
-
stub_request(:get, "http://localhost:3000/api/basic_resources")
|
17
|
-
.with(headers: {accept: 'application/json'})
|
18
|
-
.to_return(headers: {content_type: "application/json"}, body: {
|
19
|
-
basic_resources: [
|
20
|
-
{id: '1'}
|
21
|
-
]
|
22
|
-
}.to_json)
|
23
|
-
|
24
|
-
expect { BasicResource.all }.to_not raise_error
|
25
|
-
|
26
|
-
BasicResource.middleware do |conn|
|
27
|
-
conn.use NotCalled
|
28
|
-
end
|
29
|
-
|
30
|
-
expect { BasicResource.all }.to raise_error(NotCalledError)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
describe '.all' do
|
35
|
-
it 'returns all results as objects' do
|
36
|
-
stub_request(:get, "http://localhost:3000/api/records")
|
37
|
-
.with(headers: {accept: 'application/json'})
|
38
|
-
.to_return(headers: {content_type: "application/json"}, body: {
|
39
|
-
records: [
|
40
|
-
{id: '1', name: "foo.example"},
|
41
|
-
{id: '2', name: "bar.example"},
|
42
|
-
{id: '3', name: "baz.example"}
|
43
|
-
]
|
44
|
-
}.to_json)
|
45
|
-
|
46
|
-
records = test_class.all
|
47
|
-
expect(records.size).to eql(3)
|
48
|
-
|
49
|
-
record = records.first
|
50
|
-
expect(record).to be_a(Record)
|
51
|
-
end
|
52
|
-
|
53
|
-
it 'accepts additional params' do
|
54
|
-
stub_request(:get, "http://localhost:3000/api/records")
|
55
|
-
.with(headers: {accept: 'application/json'})
|
56
|
-
.to_return(headers: {content_type: "application/json"}, body: {
|
57
|
-
records: []
|
58
|
-
}.to_json) # This should not get called.
|
59
|
-
|
60
|
-
stub_request(:get, "http://localhost:3000/api/records?name=foo&email=bar@example.com")
|
61
|
-
.with(headers: {accept: 'application/json'})
|
62
|
-
.to_return(headers: {content_type: "application/json"}, body: {
|
63
|
-
records: [
|
64
|
-
{id: '1', name: 'bar', email: "bar.example"},
|
65
|
-
{id: '2', name: 'foo', email: "bar.example"},
|
66
|
-
]
|
67
|
-
}.to_json)
|
68
|
-
|
69
|
-
records = test_class.all(name: 'foo', email: 'bar@example.com')
|
70
|
-
expect(records.size).to eql(2)
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
describe '.find' do
|
75
|
-
it 'returns proper objects' do
|
76
|
-
stub_request(:get, "http://localhost:3000/api/records/1")
|
77
|
-
.with(headers: {accept: 'application/json'})
|
78
|
-
.to_return(headers: {content_type: "application/json"}, body: {
|
79
|
-
records: [
|
80
|
-
{id: '1', name: "foobar.example"}
|
81
|
-
]
|
82
|
-
}.to_json)
|
83
|
-
|
84
|
-
records = test_class.find(1)
|
85
|
-
expect(records.size).to eql(1)
|
86
|
-
|
87
|
-
record = records.first
|
88
|
-
expect(record).to be_a(Record)
|
89
|
-
expect(record.id).to eql('1')
|
90
|
-
expect(record.name).to eql('foobar.example')
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
describe '#save' do
|
95
|
-
it 'can save successfully if called on a new item' do
|
96
|
-
stub_request(:post, "http://localhost:3000/api/records")
|
97
|
-
.with(headers: {accept: 'application/json', content_type: "application/json"})
|
98
|
-
.to_return(headers: {content_type: "application/json"}, status: 201, body: {
|
99
|
-
records: [
|
100
|
-
{id: '1', name: "foobar.example", created_at: "2014-10-16T18:49:40Z", updated_at: "2014-10-18T18:59:40Z"}
|
101
|
-
]
|
102
|
-
}.to_json)
|
103
|
-
|
104
|
-
expect(obj.save).to eql(true)
|
105
|
-
|
106
|
-
expect(obj.id).to eql('1')
|
107
|
-
expect(obj.name).to eql('foobar.example')
|
108
|
-
|
109
|
-
expect(obj.created_at).to eql('2014-10-16T18:49:40Z')
|
110
|
-
expect(obj.updated_at).to eql('2014-10-18T18:59:40Z')
|
111
|
-
|
112
|
-
expect(obj).to respond_to(:created_at)
|
113
|
-
expect(obj).to respond_to(:updated_at)
|
114
|
-
expect(obj.persisted?).to eql(true)
|
115
|
-
end
|
116
|
-
|
117
|
-
it 'can update when called on an existing item' do
|
118
|
-
stub_request(:put, "http://localhost:3000/api/records/1")
|
119
|
-
.with(headers: {accept: 'application/json', content_type: "application/json"})
|
120
|
-
.to_return(headers: {content_type: "application/json"}, body: {
|
121
|
-
records: [
|
122
|
-
{id: '1', name: "foobar.example", created_at: "2014-10-16T18:49:40Z", updated_at: "2016-10-18T18:59:40Z"}
|
123
|
-
]
|
124
|
-
}.to_json)
|
125
|
-
|
126
|
-
obj.id = '1'
|
127
|
-
obj.updated_at = "2014-10-18T18:59:40Z"
|
128
|
-
expect(obj.updated_at).to eql("2014-10-18T18:59:40Z")
|
129
|
-
|
130
|
-
expect(obj.save).to eql(true)
|
131
|
-
expect(obj.updated_at).to eql("2016-10-18T18:59:40Z")
|
132
|
-
end
|
133
|
-
end
|
134
|
-
|
135
|
-
describe '#destroy' do
|
136
|
-
before { obj.id = '1' }
|
137
|
-
|
138
|
-
it 'returns true when successful' do
|
139
|
-
stub_request(:delete, "http://localhost:3000/api/records/1")
|
140
|
-
.with(headers: {accept: "application/json"})
|
141
|
-
.to_return(status: 204, body: nil)
|
142
|
-
|
143
|
-
expect(obj.destroy).to eql(true)
|
144
|
-
end
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
@@ -1,37 +0,0 @@
|
|
1
|
-
RSpec.describe 'Error handling' do
|
2
|
-
let(:test_class) do
|
3
|
-
Record ||= Class.new do
|
4
|
-
include JSONAPI::Consumer::Resource
|
5
|
-
self.host = 'http://localhost:3000/api/'
|
6
|
-
|
7
|
-
has_one :domain
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
let(:obj) { test_class.new(name: 'jsonapi.example') }
|
12
|
-
|
13
|
-
context 'on model' do
|
14
|
-
it 'adds to the errors object on the model' do
|
15
|
-
stub_request(:post, "http://localhost:3000/api/records")
|
16
|
-
.to_return(headers: {content_type: "application/json"}, status: 400, body: {
|
17
|
-
errors: [
|
18
|
-
{title: 'cannot be blank', path: "/name", detail: 'name cannot be blank'},
|
19
|
-
{title: 'is invalid', path: '/type', detail: 'type is invalid'}
|
20
|
-
]
|
21
|
-
}.to_json)
|
22
|
-
|
23
|
-
expect(obj.save).to eql(false)
|
24
|
-
expect(obj.is_valid?).to eql(false)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
context 'in general' do
|
29
|
-
it 'handles timeout errors' do
|
30
|
-
stub_request(:any, "http://localhost:3000/api/records").to_timeout
|
31
|
-
|
32
|
-
expect {
|
33
|
-
obj.save
|
34
|
-
}.to raise_error(JSONAPI::Consumer::Errors::ServerNotResponding)
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
RSpec.describe 'Object building' do
|
2
|
-
let(:class_name) { BuildRequest }
|
3
|
-
|
4
|
-
subject(:obj) { class_name.build }
|
5
|
-
|
6
|
-
it 'returns an object with populated items' do
|
7
|
-
stub_request(:get, "http://localhost:3000/api/build_requests/new")
|
8
|
-
.to_return(headers: {content_type: "application/json"}, body: {
|
9
|
-
build_requests: [
|
10
|
-
{name: "", title: "default value"}
|
11
|
-
]
|
12
|
-
}.to_json)
|
13
|
-
|
14
|
-
expect(obj).to respond_to(:name)
|
15
|
-
expect(obj).to respond_to(:title)
|
16
|
-
|
17
|
-
expect(obj.name).to be_blank
|
18
|
-
expect(obj.title).to eql("default value")
|
19
|
-
end
|
20
|
-
end
|
@@ -1,39 +0,0 @@
|
|
1
|
-
RSpec.describe 'Response Parsing' do
|
2
|
-
let(:response) { OpenStruct.new(body: Responses.sideload) }
|
3
|
-
let(:parser) { JSONAPI::Consumer::Parser.new(Blog::Post, response) }
|
4
|
-
|
5
|
-
subject(:results) { parser.build }
|
6
|
-
|
7
|
-
it 'can handle linked associations' do
|
8
|
-
stub_request(:get, 'http://localhost:3000/api/comments/9c9ba83b-024c-4d4c-9573-9fd41b95fc14')
|
9
|
-
.to_return(headers: {content_type: "application/json"}, body: {
|
10
|
-
comments: [
|
11
|
-
{
|
12
|
-
id: '9c9ba83b-024c-4d4c-9573-9fd41b95fc14',
|
13
|
-
content: "i found this useful."
|
14
|
-
}
|
15
|
-
]
|
16
|
-
}.to_json)
|
17
|
-
|
18
|
-
stub_request(:get, 'http://localhost:3000/api/comments/27fcf6e8-24b0-41db-94b1-812046a10f54')
|
19
|
-
.to_return(headers: {content_type: "application/json"}, body: {
|
20
|
-
comments: [
|
21
|
-
{
|
22
|
-
id: '27fcf6e8-24b0-41db-94b1-812046a10f54',
|
23
|
-
content: "i found this useful too."
|
24
|
-
}
|
25
|
-
]
|
26
|
-
}.to_json)
|
27
|
-
|
28
|
-
expect(results.size).to eql(2)
|
29
|
-
|
30
|
-
result = results.first
|
31
|
-
expect(result.comments.size).to eql(2)
|
32
|
-
expect(result.user).to be_a(Blog::User)
|
33
|
-
|
34
|
-
last = results.last
|
35
|
-
expect(last.comments.first).to be_a(Blog::Comment)
|
36
|
-
expect(last.comments.first.id).to eql("9c9ba83b-024c-4d4c-9573-9fd41b95fc14")
|
37
|
-
expect(last.comments.first.content).to eql("i found this useful.")
|
38
|
-
end
|
39
|
-
end
|
@@ -1,62 +0,0 @@
|
|
1
|
-
RSpec.describe 'Resource' do
|
2
|
-
let(:sample_attrs) {
|
3
|
-
{
|
4
|
-
id: SecureRandom.uuid,
|
5
|
-
name: 'foo',
|
6
|
-
content: 'bar'
|
7
|
-
}
|
8
|
-
}
|
9
|
-
|
10
|
-
subject(:test_class) do
|
11
|
-
Paper ||= Class.new do
|
12
|
-
include JSONAPI::Consumer::Resource
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
it 'it errors on undefined methods' do
|
17
|
-
obj = test_class.new
|
18
|
-
expect {
|
19
|
-
obj.paper
|
20
|
-
}.to raise_error(NoMethodError)
|
21
|
-
end
|
22
|
-
|
23
|
-
describe 'accepts any passed in params through #attributes=' do
|
24
|
-
subject(:instance) { test_class.new }
|
25
|
-
|
26
|
-
before do
|
27
|
-
instance.attributes = sample_attrs
|
28
|
-
end
|
29
|
-
|
30
|
-
it { is_expected.to respond_to(:id) }
|
31
|
-
it { is_expected.to respond_to(:name) }
|
32
|
-
it { is_expected.to respond_to(:content) }
|
33
|
-
end
|
34
|
-
|
35
|
-
describe 'accepts attributes through .new' do
|
36
|
-
subject(:instance) { test_class.new(sample_attrs) }
|
37
|
-
|
38
|
-
it { is_expected.to respond_to(:id) }
|
39
|
-
it { is_expected.to respond_to(:name) }
|
40
|
-
it { is_expected.to respond_to(:content) }
|
41
|
-
end
|
42
|
-
|
43
|
-
describe '#serializable_hash' do
|
44
|
-
subject(:obj_hash) { test_class.new(sample_attrs).serializable_hash }
|
45
|
-
|
46
|
-
it 'has proper keys' do
|
47
|
-
expect(obj_hash).to have_key(:id)
|
48
|
-
expect(obj_hash).to have_key(:name)
|
49
|
-
expect(obj_hash).to have_key(:content)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
describe '#to_json' do
|
54
|
-
subject(:obj_hash) { test_class.new(sample_attrs).to_json }
|
55
|
-
|
56
|
-
it 'has all attributes root key' do
|
57
|
-
json_hash = JSON.parse(obj_hash)
|
58
|
-
expect(json_hash.keys).to eql(['id', 'name', 'content'])
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
end
|
@@ -1,41 +0,0 @@
|
|
1
|
-
RSpec.describe 'Serializer' do
|
2
|
-
let(:test_class) do
|
3
|
-
SerializerTestClass ||= Class.new do
|
4
|
-
include JSONAPI::Consumer::Resource
|
5
|
-
|
6
|
-
has_many :users, class_name: 'Account'
|
7
|
-
has_one :owner, class_name: 'Owner'
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
let(:owner) {
|
12
|
-
Owner ||= Class.new do
|
13
|
-
include JSONAPI::Consumer::Resource
|
14
|
-
|
15
|
-
def to_param
|
16
|
-
1
|
17
|
-
end
|
18
|
-
end
|
19
|
-
}
|
20
|
-
|
21
|
-
let(:user) {
|
22
|
-
Account ||= Class.new do
|
23
|
-
include JSONAPI::Consumer::Resource
|
24
|
-
end
|
25
|
-
}
|
26
|
-
|
27
|
-
subject(:obj_hash) { test_class.new(id: '76', owner: owner.new, users: [user.new(id: 'a'), user.new(id: 'b')]).serializable_hash }
|
28
|
-
|
29
|
-
it 'outputs the associated has_one' do
|
30
|
-
expect(obj_hash).to have_key(:links)
|
31
|
-
expect(obj_hash[:links]).to have_key(:owner)
|
32
|
-
expect(obj_hash[:links][:owner]).to eql(1)
|
33
|
-
end
|
34
|
-
|
35
|
-
it 'outputs the associated has_many' do
|
36
|
-
expect(obj_hash).to have_key(:links)
|
37
|
-
expect(obj_hash[:links]).to have_key(:users)
|
38
|
-
expect(obj_hash[:links][:users]).to eql(['a', 'b'])
|
39
|
-
end
|
40
|
-
|
41
|
-
end
|