eipiai 0.6.0 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -4
- data/.rubocop.yml +3 -0
- data/.ruby-version +1 -0
- data/.wercker.yml +8 -1
- data/CHANGELOG.md +7 -0
- data/Gemfile +1 -0
- data/Rakefile +1 -0
- data/eipiai.gemspec +1 -0
- data/features/resources/api.feature +82 -0
- data/features/resources/collection.feature +60 -0
- data/features/resources/collection/get.feature +189 -0
- data/features/resources/collection/post.feature +230 -0
- data/features/resources/health.feature +27 -0
- data/features/resources/singular.feature +86 -0
- data/features/resources/singular/delete.feature +69 -0
- data/features/resources/singular/get.feature +146 -0
- data/features/resources/singular/post.feature +235 -0
- data/features/resources/singular/put.feature +164 -0
- data/features/step_definitions/steps.rb +10 -0
- data/features/step_definitions/webmachine_steps.rb +58 -0
- data/features/support/app.rb +14 -26
- data/features/support/env.rb +1 -0
- data/features/validation.feature +1 -0
- data/features/webmachine.feature +1 -56
- data/lib/eipiai.rb +1 -0
- data/lib/eipiai/configuration.rb +1 -0
- data/lib/eipiai/models.rb +1 -0
- data/lib/eipiai/models/collection.rb +1 -0
- data/lib/eipiai/models/representable.rb +6 -5
- data/lib/eipiai/roar.rb +1 -0
- data/lib/eipiai/roar/ext/hal.rb +3 -0
- data/lib/eipiai/roar/representers/api.rb +17 -6
- data/lib/eipiai/roar/representers/base.rb +1 -0
- data/lib/eipiai/validation.rb +1 -0
- data/lib/eipiai/validation/concerns/formatted_errors.rb +1 -0
- data/lib/eipiai/validation/validators/base.rb +2 -1
- data/lib/eipiai/validation/validators/sequel.rb +1 -0
- data/lib/eipiai/version.rb +2 -1
- data/lib/eipiai/webmachine.rb +2 -0
- data/lib/eipiai/webmachine/ext/decision.rb +1 -0
- data/lib/eipiai/webmachine/ext/request.rb +2 -1
- data/lib/eipiai/webmachine/resources/api.rb +7 -3
- data/lib/eipiai/webmachine/resources/base.rb +96 -19
- data/lib/eipiai/webmachine/resources/collection.rb +4 -18
- data/lib/eipiai/webmachine/resources/concerns/objectifiable.rb +1 -0
- data/lib/eipiai/webmachine/resources/concerns/representable.rb +69 -0
- data/lib/eipiai/webmachine/resources/health.rb +16 -10
- data/lib/eipiai/webmachine/resources/singular.rb +45 -10
- metadata +16 -4
- data/features/support/db.rb +0 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6ea1d2843bc6b4a1b1ed2e268f3a287cdb6c591d
|
4
|
+
data.tar.gz: 72f7c6c496142c5dc5caed1faf5a5c83b1bb810f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 88c91bbeb2dc81e6337069fd9053c8c5c262a0a43fd7b70a865c544dedb67061c58648ab2ec14cb93982e6bb1d1fa23df259ce2f5fe97c033fc19fbc04560747
|
7
|
+
data.tar.gz: 5a109aac02025614a11feb80a853f12ad980f6c0537e8fef5b77ea3acae12555b09df0d2fc455ab86d70d49298bd147151f4d3bdda479860ab1aa0b0f00c3c8b
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.3.1
|
data/.wercker.yml
CHANGED
@@ -1,9 +1,16 @@
|
|
1
|
-
box: ruby
|
1
|
+
box: ruby:2.3
|
2
2
|
|
3
3
|
build:
|
4
4
|
steps:
|
5
|
+
- script:
|
6
|
+
name: fix Bundler issue
|
7
|
+
code: |
|
8
|
+
gem update --system 2.6.1
|
9
|
+
gem install bundler --version $BUNDLER_VERSION
|
5
10
|
- bundle-install:
|
11
|
+
path: vendor/bundle
|
6
12
|
jobs: "8"
|
13
|
+
clean: true
|
7
14
|
- script:
|
8
15
|
name: bootstrap
|
9
16
|
code: script/bootstrap
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
# CHANGELOG
|
2
2
|
|
3
|
+
## [v0.6.0](https://github.com/blendle/eipiai/tree/v0.6.0) (2015-12-18)
|
4
|
+
[Full Changelog](https://github.com/blendle/eipiai/compare/v0.5.1...v0.6.0)
|
5
|
+
|
6
|
+
**Merged pull requests:**
|
7
|
+
|
8
|
+
- introduce representable and collection models [\#10](https://github.com/blendle/eipiai/pull/10) ([JeanMertz](https://github.com/JeanMertz))
|
9
|
+
|
3
10
|
## [v0.5.1](https://github.com/blendle/eipiai/tree/v0.5.1) (2015-12-14)
|
4
11
|
[Full Changelog](https://github.com/blendle/eipiai/compare/v0.5.0...v0.5.1)
|
5
12
|
|
data/Gemfile
CHANGED
data/Rakefile
CHANGED
data/eipiai.gemspec
CHANGED
@@ -0,0 +1,82 @@
|
|
1
|
+
Feature: Request entrypoint of API
|
2
|
+
|
3
|
+
When a collection of resources exist
|
4
|
+
I want to use Webmachine to provide API access to those resource
|
5
|
+
So that the resources can easily be retrieved in one request
|
6
|
+
|
7
|
+
Scenario: List main API endpoint
|
8
|
+
Given the following resource at "/item/:item_uid":
|
9
|
+
"""ruby
|
10
|
+
class ItemResource < Webmachine::Resource
|
11
|
+
include Eipiai::Resource
|
12
|
+
|
13
|
+
def top_level_relation?
|
14
|
+
true
|
15
|
+
end
|
16
|
+
|
17
|
+
def query_keys
|
18
|
+
%w(available)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
"""
|
22
|
+
And the following resource at "/items":
|
23
|
+
"""ruby
|
24
|
+
class ItemsResource < Webmachine::Resource
|
25
|
+
include Eipiai::Resource
|
26
|
+
|
27
|
+
def top_level_relation?
|
28
|
+
true
|
29
|
+
end
|
30
|
+
|
31
|
+
def query_keys
|
32
|
+
%w(category weight purchased)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
"""
|
36
|
+
And the following resource at "/user/:user_uid":
|
37
|
+
"""ruby
|
38
|
+
class UserResource < Webmachine::Resource
|
39
|
+
include Eipiai::Resource
|
40
|
+
|
41
|
+
def top_level_relation?
|
42
|
+
true
|
43
|
+
end
|
44
|
+
end
|
45
|
+
"""
|
46
|
+
And the following resource at "/user/:user_uid/orders":
|
47
|
+
"""ruby
|
48
|
+
class UserOrdersResource < Webmachine::Resource
|
49
|
+
include Eipiai::Resource
|
50
|
+
end
|
51
|
+
"""
|
52
|
+
|
53
|
+
When the client does a GET request to "/api"
|
54
|
+
Then the status code should be "200" (OK)
|
55
|
+
And the response should be HAL/JSON:
|
56
|
+
"""json
|
57
|
+
{
|
58
|
+
"_links": {
|
59
|
+
"self": {
|
60
|
+
"href": "https://example.org/api"
|
61
|
+
},
|
62
|
+
"api": {
|
63
|
+
"href": "https://example.org/api"
|
64
|
+
},
|
65
|
+
"health": {
|
66
|
+
"href": "https://example.org/health"
|
67
|
+
},
|
68
|
+
"item": {
|
69
|
+
"href": "https://example.org/item/{item_uid}{?available}",
|
70
|
+
"templated": true
|
71
|
+
},
|
72
|
+
"items": {
|
73
|
+
"href": "https://example.org/items{?category,weight,purchased}",
|
74
|
+
"templated": true
|
75
|
+
},
|
76
|
+
"user": {
|
77
|
+
"href": "https://example.org/user/{user_uid}",
|
78
|
+
"templated": true
|
79
|
+
}
|
80
|
+
}
|
81
|
+
}
|
82
|
+
"""
|
@@ -0,0 +1,60 @@
|
|
1
|
+
Feature: Request a collection of resources
|
2
|
+
|
3
|
+
When a collection of resources exist
|
4
|
+
I want to use Webmachine to provide API access to those resource
|
5
|
+
So that the resources can easily be retrieved in one request
|
6
|
+
|
7
|
+
Scenario: GET
|
8
|
+
Given the following top-level resource at "/items":
|
9
|
+
"""ruby
|
10
|
+
class ItemsResource < Webmachine::Resource
|
11
|
+
include Eipiai::Resource
|
12
|
+
|
13
|
+
def object
|
14
|
+
OpenStruct.new(count: 2, items: [{ hello: 'world' }, { hello: 'universe' }])
|
15
|
+
end
|
16
|
+
end
|
17
|
+
"""
|
18
|
+
When the client provides the header "Accept: application/json"
|
19
|
+
And the client does a GET request to the "items" resource
|
20
|
+
Then the status code should be "200" (OK)
|
21
|
+
And the response should be JSON:
|
22
|
+
"""json
|
23
|
+
{
|
24
|
+
"count": 2,
|
25
|
+
"items": [
|
26
|
+
{
|
27
|
+
"hello": "world"
|
28
|
+
},
|
29
|
+
{
|
30
|
+
"hello": "universe"
|
31
|
+
}
|
32
|
+
]
|
33
|
+
}
|
34
|
+
"""
|
35
|
+
|
36
|
+
Scenario: POST
|
37
|
+
Given the following top-level resource at "/items":
|
38
|
+
"""ruby
|
39
|
+
class ItemsResource < Webmachine::Resource
|
40
|
+
include Eipiai::Resource
|
41
|
+
|
42
|
+
def create_path
|
43
|
+
'/item/' + params['uid']
|
44
|
+
end
|
45
|
+
|
46
|
+
def new_object
|
47
|
+
OpenStruct.new(params)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
"""
|
51
|
+
When the client provides the header "Content-Type: application/json"
|
52
|
+
And the client does a POST request to the "items" resource with the following content:
|
53
|
+
"""json
|
54
|
+
{
|
55
|
+
"uid": "hello",
|
56
|
+
"hello": "galaxy"
|
57
|
+
}
|
58
|
+
"""
|
59
|
+
Then the status code should be "201" (Created)
|
60
|
+
And the response should contain the header "Location" with value "https://example.org/item/hello"
|
@@ -0,0 +1,189 @@
|
|
1
|
+
Feature: Working with singular resources (GET, POST, PUT, DELETE)
|
2
|
+
|
3
|
+
When a single resource exists
|
4
|
+
I want to use Webmachine to provide API access to that resource
|
5
|
+
So that the resource can easily be worked with
|
6
|
+
|
7
|
+
Scenario: Accept header "application/json" returns "200 OK" and a body of type "application/json"
|
8
|
+
Given the following top-level resource at "/items":
|
9
|
+
"""ruby
|
10
|
+
class ItemsResource < Webmachine::Resource
|
11
|
+
include Eipiai::Resource
|
12
|
+
|
13
|
+
def object
|
14
|
+
OpenStruct.new(count: 2, items: [{ hello: 'world' }, { hello: 'universe' }])
|
15
|
+
end
|
16
|
+
end
|
17
|
+
"""
|
18
|
+
|
19
|
+
When the client provides the header "Accept: application/json"
|
20
|
+
And the client does a GET request to the "items" resource
|
21
|
+
Then the status code should be "200" (OK)
|
22
|
+
And the response should be JSON:
|
23
|
+
"""json
|
24
|
+
{
|
25
|
+
"count": 2,
|
26
|
+
"items": [
|
27
|
+
{
|
28
|
+
"hello": "world"
|
29
|
+
},
|
30
|
+
{
|
31
|
+
"hello": "universe"
|
32
|
+
}
|
33
|
+
]
|
34
|
+
}
|
35
|
+
"""
|
36
|
+
|
37
|
+
Scenario: Accept header "application/hal+json" returns "200 OK" and a body of type "application/hal+json"
|
38
|
+
Given the following top-level resource at "/items":
|
39
|
+
"""ruby
|
40
|
+
class ItemsResource < Webmachine::Resource
|
41
|
+
include Eipiai::Resource
|
42
|
+
|
43
|
+
def to_hal_json
|
44
|
+
to_h.merge(_links: { self: { href: request.uri.path } }).to_json
|
45
|
+
end
|
46
|
+
|
47
|
+
def object
|
48
|
+
OpenStruct.new(count: 2, items: [{ hello: 'world' }, { hello: 'universe' }])
|
49
|
+
end
|
50
|
+
end
|
51
|
+
"""
|
52
|
+
|
53
|
+
When the client provides the header "Accept: application/hal+json"
|
54
|
+
And the client does a GET request to the "items" resource
|
55
|
+
Then the status code should be "200" (OK)
|
56
|
+
And the response should be HAL/JSON:
|
57
|
+
"""json
|
58
|
+
{
|
59
|
+
"_links": {
|
60
|
+
"self": {
|
61
|
+
"href": "/items"
|
62
|
+
}
|
63
|
+
},
|
64
|
+
"count": 2,
|
65
|
+
"items": [
|
66
|
+
{
|
67
|
+
"hello": "world"
|
68
|
+
},
|
69
|
+
{
|
70
|
+
"hello": "universe"
|
71
|
+
}
|
72
|
+
]
|
73
|
+
}
|
74
|
+
"""
|
75
|
+
|
76
|
+
Scenario: Accept header "text/xml" returns "200 OK" and a body of type "text/html"
|
77
|
+
Given the following top-level resource at "/items":
|
78
|
+
"""ruby
|
79
|
+
class ItemsResource < Webmachine::Resource
|
80
|
+
require 'active_support/core_ext/hash/conversions'
|
81
|
+
|
82
|
+
include Eipiai::Resource
|
83
|
+
|
84
|
+
def content_types_provided
|
85
|
+
[['text/xml', :to_xml]]
|
86
|
+
end
|
87
|
+
|
88
|
+
def to_xml
|
89
|
+
to_h.to_xml(root: 'items')
|
90
|
+
end
|
91
|
+
|
92
|
+
def object
|
93
|
+
OpenStruct.new(count: 2, items: [{ hello: 'world' }, { hello: 'universe' }])
|
94
|
+
end
|
95
|
+
end
|
96
|
+
"""
|
97
|
+
|
98
|
+
When the client provides the header "Accept: text/xml"
|
99
|
+
And the client does a GET request to the "items" resource
|
100
|
+
Then the status code should be "200" (OK)
|
101
|
+
And the response should be XML:
|
102
|
+
"""xml
|
103
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
104
|
+
<items>
|
105
|
+
<count type="integer">2</count>
|
106
|
+
<items type="array">
|
107
|
+
<item>
|
108
|
+
<hello>world</hello>
|
109
|
+
</item>
|
110
|
+
<item>
|
111
|
+
<hello>universe</hello>
|
112
|
+
</item>
|
113
|
+
</items>
|
114
|
+
</items>
|
115
|
+
"""
|
116
|
+
|
117
|
+
Scenario: Not providing the Accept header returns "200 OK" and uses the first in the list of acceptable response content types
|
118
|
+
Given the following top-level resource at "/items":
|
119
|
+
"""ruby
|
120
|
+
class ItemsResource < Webmachine::Resource
|
121
|
+
include Eipiai::Resource
|
122
|
+
|
123
|
+
def to_hal_json
|
124
|
+
to_h.merge(_links: { self: { href: request.uri.path } }).to_json
|
125
|
+
end
|
126
|
+
|
127
|
+
def object
|
128
|
+
OpenStruct.new(count: 2, items: [{ hello: 'world' }, { hello: 'universe' }])
|
129
|
+
end
|
130
|
+
end
|
131
|
+
"""
|
132
|
+
|
133
|
+
When the client does a GET request to the "items" resource
|
134
|
+
Then the status code should be "200" (OK)
|
135
|
+
And the response should be HAL/JSON:
|
136
|
+
"""json
|
137
|
+
{
|
138
|
+
"_links": {
|
139
|
+
"self": {
|
140
|
+
"href": "/items"
|
141
|
+
}
|
142
|
+
},
|
143
|
+
"count": 2,
|
144
|
+
"items": [
|
145
|
+
{
|
146
|
+
"hello": "world"
|
147
|
+
},
|
148
|
+
{
|
149
|
+
"hello": "universe"
|
150
|
+
}
|
151
|
+
]
|
152
|
+
}
|
153
|
+
"""
|
154
|
+
|
155
|
+
Scenario: An unknown Accept header returns "406 Not Acceptable"
|
156
|
+
Given the following top-level resource at "/items":
|
157
|
+
"""ruby
|
158
|
+
class ItemsResource < Webmachine::Resource
|
159
|
+
include Eipiai::Resource
|
160
|
+
end
|
161
|
+
"""
|
162
|
+
|
163
|
+
When the client provides the header "Accept: application/unknown"
|
164
|
+
And the client provides the header "Content-Type: application/json"
|
165
|
+
And the client does a GET request to the "items" resource
|
166
|
+
Then the status code should be "406" (Not Acceptable)
|
167
|
+
|
168
|
+
Scenario: An empty collection returns "200 OK" with an empty array
|
169
|
+
Given the following top-level resource at "/items":
|
170
|
+
"""ruby
|
171
|
+
class ItemsResource < Webmachine::Resource
|
172
|
+
include Eipiai::Resource
|
173
|
+
|
174
|
+
def object
|
175
|
+
OpenStruct.new(count: 0, items: [])
|
176
|
+
end
|
177
|
+
end
|
178
|
+
"""
|
179
|
+
|
180
|
+
When the client provides the header "Accept: application/json"
|
181
|
+
And the client does a GET request to the "items" resource
|
182
|
+
Then the status code should be "200" (OK)
|
183
|
+
And the response should be JSON:
|
184
|
+
"""json
|
185
|
+
{
|
186
|
+
"count": 0,
|
187
|
+
"items": []
|
188
|
+
}
|
189
|
+
"""
|
@@ -0,0 +1,230 @@
|
|
1
|
+
Feature: Working with singular resources (GET, POST, PUT, DELETE)
|
2
|
+
|
3
|
+
When a single resource exists
|
4
|
+
I want to use Webmachine to provide API access to that resource
|
5
|
+
So that the resource can easily be worked with
|
6
|
+
|
7
|
+
Scenario: Accept header "application/json" returns "201 Created" and a body of type "application/json"
|
8
|
+
Given the following top-level resource at "/items":
|
9
|
+
"""ruby
|
10
|
+
class ItemsResource < Webmachine::Resource
|
11
|
+
include Eipiai::Resource
|
12
|
+
|
13
|
+
def create_path
|
14
|
+
'/item/' + params['uid']
|
15
|
+
end
|
16
|
+
|
17
|
+
def new_object
|
18
|
+
OpenStruct.new(params)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
"""
|
22
|
+
|
23
|
+
When the client provides the header "Accept: application/json"
|
24
|
+
And the client provides the header "Content-Type: application/json"
|
25
|
+
And the client does a POST request to the "items" resource with the following content:
|
26
|
+
"""json
|
27
|
+
{
|
28
|
+
"uid": "hello",
|
29
|
+
"hello": "galaxy"
|
30
|
+
}
|
31
|
+
"""
|
32
|
+
Then the status code should be "201" (Created)
|
33
|
+
And the response should be JSON:
|
34
|
+
"""json
|
35
|
+
{
|
36
|
+
"uid": "hello",
|
37
|
+
"hello": "galaxy"
|
38
|
+
}
|
39
|
+
"""
|
40
|
+
|
41
|
+
Scenario: Accept header "application/hal+json" returns "201 Created" and a body of type "application/hal+json"
|
42
|
+
Given the following top-level resource at "/items":
|
43
|
+
"""ruby
|
44
|
+
class ItemsResource < Webmachine::Resource
|
45
|
+
include Eipiai::Resource
|
46
|
+
|
47
|
+
def to_hal_json
|
48
|
+
to_h.merge(_links: { self: { href: create_uri } }).to_json
|
49
|
+
end
|
50
|
+
|
51
|
+
def create_path
|
52
|
+
'/item/' + params['uid']
|
53
|
+
end
|
54
|
+
|
55
|
+
def new_object
|
56
|
+
OpenStruct.new(params)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
"""
|
60
|
+
|
61
|
+
When the client provides the header "Accept: application/hal+json"
|
62
|
+
And the client provides the header "Content-Type: application/json"
|
63
|
+
And the client does a POST request to the "items" resource with the following content:
|
64
|
+
"""json
|
65
|
+
{
|
66
|
+
"uid": "goodbye",
|
67
|
+
"hello": "galaxy"
|
68
|
+
}
|
69
|
+
"""
|
70
|
+
Then the status code should be "201" (Created)
|
71
|
+
And the response should be HAL/JSON:
|
72
|
+
"""json
|
73
|
+
{
|
74
|
+
"_links": {
|
75
|
+
"self": {
|
76
|
+
"href": "https://example.org/item/goodbye"
|
77
|
+
}
|
78
|
+
},
|
79
|
+
"uid": "goodbye",
|
80
|
+
"hello": "galaxy"
|
81
|
+
}
|
82
|
+
"""
|
83
|
+
|
84
|
+
Scenario: Accept header "text/xml" returns "201 Created" and a body of type "text/html"
|
85
|
+
Given the following top-level resource at "/items":
|
86
|
+
"""ruby
|
87
|
+
class ItemsResource < Webmachine::Resource
|
88
|
+
require 'active_support/core_ext/hash/conversions'
|
89
|
+
|
90
|
+
include Eipiai::Resource
|
91
|
+
|
92
|
+
def content_types_provided
|
93
|
+
[['text/xml', :to_xml]]
|
94
|
+
end
|
95
|
+
|
96
|
+
def to_xml
|
97
|
+
to_h.to_xml(root: 'item')
|
98
|
+
end
|
99
|
+
|
100
|
+
def create_path
|
101
|
+
'/item/' + params['uid']
|
102
|
+
end
|
103
|
+
|
104
|
+
def new_object
|
105
|
+
OpenStruct.new(params)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
"""
|
109
|
+
|
110
|
+
When the client provides the header "Accept: text/xml"
|
111
|
+
And the client provides the header "Content-Type: application/json"
|
112
|
+
And the client does a POST request to the "items" resource with the following content:
|
113
|
+
"""json
|
114
|
+
{
|
115
|
+
"uid": "hello",
|
116
|
+
"hello": "galaxy"
|
117
|
+
}
|
118
|
+
"""
|
119
|
+
Then the status code should be "201" (Created)
|
120
|
+
And the response should be XML:
|
121
|
+
"""xml
|
122
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
123
|
+
<item>
|
124
|
+
<uid>hello</uid>
|
125
|
+
<hello>galaxy</hello>
|
126
|
+
</item>
|
127
|
+
"""
|
128
|
+
|
129
|
+
Scenario: Not providing the Accept header returns "201 Created" and a "Location" header
|
130
|
+
Given the following top-level resource at "/items":
|
131
|
+
"""ruby
|
132
|
+
class ItemsResource < Webmachine::Resource
|
133
|
+
include Eipiai::Resource
|
134
|
+
|
135
|
+
def create_path
|
136
|
+
'/item/' + params['uid']
|
137
|
+
end
|
138
|
+
|
139
|
+
def new_object
|
140
|
+
OpenStruct.new(params)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
"""
|
144
|
+
|
145
|
+
When the client provides the header "Content-Type: application/json"
|
146
|
+
And the client does a POST request to the "items" resource with the following content:
|
147
|
+
"""json
|
148
|
+
{
|
149
|
+
"uid": "hi",
|
150
|
+
"hello": "galaxy"
|
151
|
+
}
|
152
|
+
"""
|
153
|
+
Then the status code should be "201" (Created)
|
154
|
+
And the response should contain the header "Location" with value "https://example.org/item/hi"
|
155
|
+
|
156
|
+
Scenario: An unknown Accept header returns "406 Not Acceptable"
|
157
|
+
Given the following top-level resource at "/items":
|
158
|
+
"""ruby
|
159
|
+
class ItemsResource < Webmachine::Resource
|
160
|
+
include Eipiai::Resource
|
161
|
+
end
|
162
|
+
"""
|
163
|
+
|
164
|
+
When the client provides the header "Accept: application/unknown"
|
165
|
+
And the client provides the header "Content-Type: application/json"
|
166
|
+
And the client does a POST request to the "items" resource with the following content:
|
167
|
+
"""json
|
168
|
+
{
|
169
|
+
"hello": "galaxy"
|
170
|
+
}
|
171
|
+
"""
|
172
|
+
Then the status code should be "406" (Not Acceptable)
|
173
|
+
|
174
|
+
Scenario: Not providing the Content-Type header returns "415 Unsupported Media Type"
|
175
|
+
Given the following top-level resource at "/items":
|
176
|
+
"""ruby
|
177
|
+
class ItemsResource < Webmachine::Resource
|
178
|
+
include Eipiai::Resource
|
179
|
+
|
180
|
+
def create_path
|
181
|
+
'/item' + params['uid']
|
182
|
+
end
|
183
|
+
|
184
|
+
def new_object
|
185
|
+
OpenStruct.new(params)
|
186
|
+
end
|
187
|
+
end
|
188
|
+
"""
|
189
|
+
|
190
|
+
When the client provides the header "Accept: application/json"
|
191
|
+
And the client does a POST request to the "items" resource with the following content:
|
192
|
+
"""json
|
193
|
+
{
|
194
|
+
"uid": "bye",
|
195
|
+
"hello": "galaxy"
|
196
|
+
}
|
197
|
+
"""
|
198
|
+
Then the status code should be "415" (Unsupported Media Type)
|
199
|
+
|
200
|
+
Scenario: Content-Type as JSON but body is not JSON returns "400 Bad Request"
|
201
|
+
Given the following top-level resource at "/items":
|
202
|
+
"""ruby
|
203
|
+
class ItemsResource < Webmachine::Resource
|
204
|
+
include Eipiai::Resource
|
205
|
+
end
|
206
|
+
"""
|
207
|
+
|
208
|
+
When the client provides the header "Accept: application/json"
|
209
|
+
And the client provides the header "Content-Type: application/json"
|
210
|
+
And the client does a POST request to the "items" resource with the following content:
|
211
|
+
"""json
|
212
|
+
{
|
213
|
+
"hello": INVALID
|
214
|
+
}
|
215
|
+
"""
|
216
|
+
Then the status code should be "400" (Bad Request)
|
217
|
+
And the response should be JSON:
|
218
|
+
"""json
|
219
|
+
{
|
220
|
+
"_errors": [
|
221
|
+
{
|
222
|
+
"id": "InvalidJson",
|
223
|
+
"message": "invalid json"
|
224
|
+
}
|
225
|
+
]
|
226
|
+
}
|
227
|
+
"""
|
228
|
+
|
229
|
+
@todo
|
230
|
+
Scenario: Providing valid JSON with invalid/unknown attributes returns "422 Unprocessable Entity"
|