cucumber-rest-bdd 0.3.4.pre.alpha.pre.86
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 +7 -0
- data/.gitignore +50 -0
- data/.travis.yml +15 -0
- data/Dockerfile +17 -0
- data/Dockerfile.dev +22 -0
- data/LICENSE +21 -0
- data/Makefile +15 -0
- data/README.md +267 -0
- data/STEPS.md +199 -0
- data/cucumber-rest-bdd.gemspec +19 -0
- data/docker-compose.yml +22 -0
- data/features/functional.feature +21 -0
- data/features/grabs.feature +21 -0
- data/features/headers.feature +16 -0
- data/features/methods.feature +101 -0
- data/features/response.feature +103 -0
- data/features/status.feature +18 -0
- data/features/support/env.rb +2 -0
- data/features/types.feature +48 -0
- data/lib/cucumber-rest-bdd/hash.rb +9 -0
- data/lib/cucumber-rest-bdd/steps/functional.rb +25 -0
- data/lib/cucumber-rest-bdd/steps/resource.rb +127 -0
- data/lib/cucumber-rest-bdd/steps/response.rb +156 -0
- data/lib/cucumber-rest-bdd/steps/status.rb +59 -0
- data/lib/cucumber-rest-bdd/steps.rb +4 -0
- data/lib/cucumber-rest-bdd/types.rb +138 -0
- data/lib/cucumber-rest-bdd/url.rb +4 -0
- data/lib/cucumber-rest-bdd.rb +1 -0
- data/server/db.json +41044 -0
- metadata +114 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 354ca6b1520bfe6005fb8021e4a392b6c5e98f5c
|
4
|
+
data.tar.gz: 5d5e38d996f3d5766b641e1a9b1cb41db0c2edae
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 7f3d861a146be7a1365d626948b92d922a55b64dc1bd767921446c06541f51fd71ea53844f1dba5f95515561bca5d2f82cfbcfadcdf254deab2a65362546e1b5
|
7
|
+
data.tar.gz: 7b0c99880dff53a71d2df02542f813cfd583ef31c08a2b91063283a650abcd03b1775d17d14fbd55e4be5a1e78ecb8313eedd65c69f6ea53bd989e9d2791024c
|
data/.gitignore
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
/.config
|
4
|
+
/coverage/
|
5
|
+
/InstalledFiles
|
6
|
+
/pkg/
|
7
|
+
/spec/reports/
|
8
|
+
/spec/examples.txt
|
9
|
+
/test/tmp/
|
10
|
+
/test/version_tmp/
|
11
|
+
/tmp/
|
12
|
+
|
13
|
+
# Used by dotenv library to load environment variables.
|
14
|
+
# .env
|
15
|
+
|
16
|
+
## Specific to RubyMotion:
|
17
|
+
.dat*
|
18
|
+
.repl_history
|
19
|
+
build/
|
20
|
+
*.bridgesupport
|
21
|
+
build-iPhoneOS/
|
22
|
+
build-iPhoneSimulator/
|
23
|
+
|
24
|
+
## Specific to RubyMotion (use of CocoaPods):
|
25
|
+
#
|
26
|
+
# We recommend against adding the Pods directory to your .gitignore. However
|
27
|
+
# you should judge for yourself, the pros and cons are mentioned at:
|
28
|
+
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
|
29
|
+
#
|
30
|
+
# vendor/Pods/
|
31
|
+
|
32
|
+
## Documentation cache and generated files:
|
33
|
+
/.yardoc/
|
34
|
+
/_yardoc/
|
35
|
+
/doc/
|
36
|
+
/rdoc/
|
37
|
+
|
38
|
+
## Environment normalization:
|
39
|
+
/.bundle/
|
40
|
+
/vendor/bundle
|
41
|
+
/lib/bundler/man/
|
42
|
+
|
43
|
+
# for a library or gem, you might want to ignore these files since the code is
|
44
|
+
# intended to run in multiple environments; otherwise, check them in:
|
45
|
+
# Gemfile.lock
|
46
|
+
# .ruby-version
|
47
|
+
# .ruby-gemset
|
48
|
+
|
49
|
+
# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
|
50
|
+
.rvmrc
|
data/.travis.yml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
language: shell
|
2
|
+
sudo: required
|
3
|
+
services:
|
4
|
+
- docker
|
5
|
+
install:
|
6
|
+
- make build
|
7
|
+
script:
|
8
|
+
- make test
|
9
|
+
deploy:
|
10
|
+
provider: rubygems
|
11
|
+
api_key:
|
12
|
+
secure: obDis+hzVaV8Dk0i2V9bd3QiFhjdEpMZ6SxmTWDnbLcnYuhJyY7VPO3Jk9hINAWZPxH//uByVT+5p2r3YpmKUQxxoMtqJ7R8+aybfvlrDC9ZNoyE6lYF/Ysnj03pXMA5qwfqXt5ZVZuMvqAUj8J3sQBRSFwq7f/tlsAQdG1nowPL9lkxqOE++z+WvMvzkTs4x2RosrBg81eFNiCe0XKUXQGFbIneUA34Xjf/Mg+dls0UckyKBJO/3yoq3aCjYAaMGeA0UtfXwVqBdv7xhv8edzuJwbwrnstgQmwk6pR6XVIPff8wqHvRMHRXcFlPvRYv9WW4/CIxi6nvdpSlgeVXs9q1I22Z7f5sJy0As41wLoG95NVokqb2tFRz7ZwZU6tFNsJvK2tO8Bas0Gx6KTTThb2NTNdWQFczYBI/ERtYUB9qVRVlPDsK+iLRmFLi71H50aSbwnuXGEAfinXRmXvpLgPe1ZMYxMq+uz/ETBpCBfD26FQm3ieXIEb92GG7eswbIyv/LktCglEhNXR6FImqf1Ni2OOSXskJH+DTGnOkDHVFq5AhGQ8MtvJdsnJdm4p3PKzddzMPJ58cTwDOEd4uq7uNR/PGtE1w5FE3FNVIXr5ny1f9CpDwMpLL9xQ/AbgV9bJxBzqseBvXhn3HondJyZld1rfiUopvz/XGrydRvAo=
|
13
|
+
gem: cucumber-rest-bdd
|
14
|
+
on:
|
15
|
+
repo: graze/cucumber-rest-bdd
|
data/Dockerfile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
FROM ruby
|
2
|
+
|
3
|
+
MAINTAINER "Harry Bragg <harry.bragg@graze.com>"
|
4
|
+
LABEL version="0.3.4" \
|
5
|
+
license="MIT"
|
6
|
+
|
7
|
+
RUN gem install cucumber-rest-bdd
|
8
|
+
|
9
|
+
WORKDIR /opt/src
|
10
|
+
|
11
|
+
ENV field_separator=_
|
12
|
+
ENV field_camel=false
|
13
|
+
ENV resource_single=false
|
14
|
+
ENV cucumber_api_verbose=false
|
15
|
+
ENV data_key=
|
16
|
+
|
17
|
+
CMD ["cucumber"]
|
data/Dockerfile.dev
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
FROM ruby
|
2
|
+
|
3
|
+
MAINTAINER "Harry Bragg <harry.bragg@graze.com>"
|
4
|
+
LABEL version="0.3.4" \
|
5
|
+
license="MIT"
|
6
|
+
|
7
|
+
COPY . /usr/local/cucumber-rest-bdd
|
8
|
+
WORKDIR /usr/local/cucumber-rest-bdd
|
9
|
+
|
10
|
+
RUN gem build cucumber-rest-bdd.gemspec \
|
11
|
+
&& gem install cucumber-rest-bdd-*.gem \
|
12
|
+
&& rm -rf /usr/local/cucumber-rest-bdd
|
13
|
+
|
14
|
+
WORKDIR /opt/src
|
15
|
+
|
16
|
+
ENV field_separator=_
|
17
|
+
ENV field_camel=false
|
18
|
+
ENV resource_single=false
|
19
|
+
ENV cucumber_api_verbose=false
|
20
|
+
ENV data_key=
|
21
|
+
|
22
|
+
CMD ["cucumber"]
|
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2016 graze.com
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
data/Makefile
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
TAG := graze/cucumber-rest-bdd
|
2
|
+
RUN := docker run --rm -it -v $(PWD):/opt/src -w /opt/src ${TAG}
|
3
|
+
|
4
|
+
build:
|
5
|
+
docker-compose build runner
|
6
|
+
|
7
|
+
test: start-test-server
|
8
|
+
docker-compose run --rm runner cucumber --order random
|
9
|
+
make stop-test-server > /dev/null 2>&1 &
|
10
|
+
|
11
|
+
start-test-server: stop-test-server
|
12
|
+
docker-compose up -d test-server
|
13
|
+
|
14
|
+
stop-test-server:
|
15
|
+
docker-compose stop test-server
|
data/README.md
ADDED
@@ -0,0 +1,267 @@
|
|
1
|
+
# Cucumber Rest BDD
|
2
|
+
|
3
|
+
[](https://travis-ci.org/graze/cucumber-rest-bdd)
|
4
|
+
[](https://microbadger.com/images/graze/cucumber-rest-bdd "Get your own image badge on microbadger.com")
|
5
|
+
[](https://microbadger.com/images/graze/cucumber-rest-bdd "Get your own version badge on microbadger.com")
|
6
|
+
[](https://microbadger.com/images/graze/cucumber-rest-bdd "Get your own license badge on microbadger.com")
|
7
|
+
|
8
|
+
A set of Behavioural tests that can be run against a REST API.
|
9
|
+
|
10
|
+

|
11
|
+
|
12
|
+
This is based from: http://gregbee.ch/blog/effective-api-testing-with-cucumber
|
13
|
+
|
14
|
+
A list of [Steps](STEPS.md) shows the comparison between Behavioural and Functional tests provided by this package.
|
15
|
+
|
16
|
+
## Configuration
|
17
|
+
|
18
|
+
The following environment variables modify how this will operate:
|
19
|
+
|
20
|
+
- `endpoint` - (string) the base url to call for each request
|
21
|
+
- `data_key` - (string) the root data key (if applicable) (for example: `"data"` if all responses have a `{"data":{}}` field)
|
22
|
+
- `field_separator` - (string) the separator used between words by the api
|
23
|
+
- `field_camel` - (bool [`true`|`false`]) does this endpoint use camelCase for fields (default: `false`)
|
24
|
+
- `resource_single` - (bool [`true`|`false`]) if each resource should be singularized or not (default: `false`)
|
25
|
+
|
26
|
+
## Examples
|
27
|
+
|
28
|
+
- For a full list of steps see: [STEPS](STEPS.md)
|
29
|
+
- These examples are taken from the test [features](features)
|
30
|
+
|
31
|
+
### Retrieve items
|
32
|
+
|
33
|
+
```gherkin
|
34
|
+
Given I am a client
|
35
|
+
When I request the post "1"
|
36
|
+
Then the request was successful
|
37
|
+
And the response has the following attributes:
|
38
|
+
| attribute | type | value |
|
39
|
+
| User Id | numeric | 1 |
|
40
|
+
| Id | numeric | 1 |
|
41
|
+
| Title | string | sunt aut facere repellat provident occaecati excepturi optio reprehenderit |
|
42
|
+
| Body | string | quia et suscipit\\nsuscipit recusandae consequuntur expedita et cum\\nreprehenderit molestiae ut ut quas totam\\nnostrum rerum est autem sunt rem eveniet architecto |
|
43
|
+
```
|
44
|
+
|
45
|
+
```gherkin
|
46
|
+
Given I am a client
|
47
|
+
When I request a list of posts with:
|
48
|
+
| User Id | 2 |
|
49
|
+
Then the request is successful
|
50
|
+
And the response is a list of at least 2 posts
|
51
|
+
And one response has the following attributes:
|
52
|
+
| attribute | type | value |
|
53
|
+
| User Id | numeric | 2 |
|
54
|
+
| Id | numeric | 11 |
|
55
|
+
| Title | string | et ea vero quia laudantium autem |
|
56
|
+
| Body | string | delectus reiciendis molestiae occaecati non minima eveniet qui voluptatibus\\naccusamus in eum beatae sit\\nvel qui neque voluptates ut commodi qui incidunt\nut animi commodi |
|
57
|
+
```
|
58
|
+
|
59
|
+
You can inspect child objects by using `:` in between the names
|
60
|
+
|
61
|
+
```gherkin
|
62
|
+
Given I am a client
|
63
|
+
When I request the comment "1" with:
|
64
|
+
| `_expand` | post |
|
65
|
+
Then the response has the following attributes:
|
66
|
+
| attribute | type | value |
|
67
|
+
| name | string | id labore ex et quam laborum |
|
68
|
+
| email | string | Eliseo@gardner.biz |
|
69
|
+
| body | string | laudantium enim quasi est quidem magnam voluptate ipsam eos\\ntempora quo necessitatibus\\ndolor quam autem quasi\\nreiciendis et nam sapiente accusantium |
|
70
|
+
| post : title | string | sunt aut facere repellat provident occaecati excepturi optio reprehenderit |
|
71
|
+
| post : body | string | quia et suscipit\\nsuscipit recusandae consequuntur expedita et cum\\nreprehenderit molestiae ut ut quas totam\\nnostrum rerum est autem sunt rem eveniet architecto |
|
72
|
+
```
|
73
|
+
|
74
|
+
Alternatively you can inspect child arrays and objects by describing the path of the object with attributes
|
75
|
+
|
76
|
+
```gherkin
|
77
|
+
Given I am a client
|
78
|
+
When I set JSON request body to:
|
79
|
+
"""
|
80
|
+
{"title":"test","body":"multiple",
|
81
|
+
"comments":[
|
82
|
+
{"common":1,"id":1,"title":"fish","body":"cake","image":{"href":"some_url"}},
|
83
|
+
{"common":1,"id":2,"title":"foo","body":"bar","image":{"href":"some_url"}}
|
84
|
+
]}
|
85
|
+
"""
|
86
|
+
And I send a POST request to "http://test-server/posts"
|
87
|
+
Then the response has the attributes:
|
88
|
+
| attribute | type | value |
|
89
|
+
| title | string | test |
|
90
|
+
| body | string | multiple |
|
91
|
+
And the response has a list of comments
|
92
|
+
And the response has a list of 2 comments
|
93
|
+
And the response has two comments with attributes:
|
94
|
+
| attribute | type | value |
|
95
|
+
| common | integer | 1 |
|
96
|
+
And the response has two comments with an image with attributes:
|
97
|
+
| attribute | type | value |
|
98
|
+
| href | string | some_url |
|
99
|
+
And the response has one comment with attributes:
|
100
|
+
| attribute | type | value |
|
101
|
+
| Id | integer | 1 |
|
102
|
+
| Title | string | fish |
|
103
|
+
| Body | string | cake |
|
104
|
+
And the response has one comment with attributes:
|
105
|
+
| attribute | type | value |
|
106
|
+
| Id | integer | 2 |
|
107
|
+
| Title | string | foo |
|
108
|
+
| Body | string | bar |
|
109
|
+
```
|
110
|
+
|
111
|
+
Each numeric request can be prefixed with a modifier to modify the number specified
|
112
|
+
|
113
|
+
```gherkin
|
114
|
+
Given I am a client
|
115
|
+
When I request a list of posts with:
|
116
|
+
| `_embed` | comments |
|
117
|
+
Then the response is a list of posts
|
118
|
+
Then the response is a list of more than 5 posts
|
119
|
+
Then the response is a list of at least 10 posts
|
120
|
+
Then more than three posts have the attributes:
|
121
|
+
| attribute | type | value |
|
122
|
+
| User Id | integer | 5 |
|
123
|
+
Then less than 200 posts have more than four comments
|
124
|
+
Then more than 50 posts have less than six comments
|
125
|
+
Then more than 80 posts have a list of comments
|
126
|
+
Then at least 90 posts have a list of five comments
|
127
|
+
Then more than 10 posts have five comments
|
128
|
+
Then less than 200 posts have five comments
|
129
|
+
```
|
130
|
+
|
131
|
+
### Creation
|
132
|
+
|
133
|
+
```gherkin
|
134
|
+
Given I am a client
|
135
|
+
When I request to create a post with:
|
136
|
+
| attribute | type | value |
|
137
|
+
| Title | string | foo |
|
138
|
+
| Body | string | bar |
|
139
|
+
| User Id | numeric | 1 |
|
140
|
+
Then the request is successful and a post was created
|
141
|
+
And the response has the following attributes:
|
142
|
+
| attribute | type | value |
|
143
|
+
| User Id | numeric | 1 |
|
144
|
+
| Title | string | foo |
|
145
|
+
| Body | string | bar |
|
146
|
+
```
|
147
|
+
|
148
|
+
### Removal
|
149
|
+
|
150
|
+
```gherkin
|
151
|
+
Given I am a client
|
152
|
+
When I request to remove the post "20"
|
153
|
+
Then the request is successful
|
154
|
+
```
|
155
|
+
|
156
|
+
### Modification
|
157
|
+
|
158
|
+
```gherkin
|
159
|
+
Given I am a client
|
160
|
+
When I request to modify the post "21" with:
|
161
|
+
| attribute | type | value |
|
162
|
+
| Title | string | foo |
|
163
|
+
Then the request is successful
|
164
|
+
And the response has the following attributes:
|
165
|
+
| attribute | type | value |
|
166
|
+
| User Id | numeric | 3 |
|
167
|
+
| Title | string | foo |
|
168
|
+
| Body | string | repellat aliquid praesentium dolorem quo\\nsed totam minus non itaque\\nnihil labore molestiae sunt dolor eveniet hic recusandae veniam\\ntempora et tenetur expedita sunt |
|
169
|
+
```
|
170
|
+
|
171
|
+
### Multiple Requests
|
172
|
+
|
173
|
+
```gherkin
|
174
|
+
Given I am a client
|
175
|
+
When I request to create a post with:
|
176
|
+
| attribute | type | value |
|
177
|
+
| Title | string | foo |
|
178
|
+
| Body | string | bar |
|
179
|
+
| User Id | integer | 12 |
|
180
|
+
Then the request is successful
|
181
|
+
When I save "id"
|
182
|
+
And I request the post "{id}"
|
183
|
+
Then the request is successful
|
184
|
+
And the response has the following attributes:
|
185
|
+
| attribute | type | value |
|
186
|
+
| Title | string | foo |
|
187
|
+
| Body | string | bar |
|
188
|
+
| User Id | numeric | 12 |
|
189
|
+
| Id | numeric | {id} |
|
190
|
+
```
|
191
|
+
|
192
|
+
## Resources
|
193
|
+
|
194
|
+
A resource "name" is attempted to be retrieved from the given name of the item to be retrieved. This pluralises, ensures everything is lower case, removes any unparameterisable characters and uses a `-` separator.
|
195
|
+
|
196
|
+
```
|
197
|
+
Token -> tokens
|
198
|
+
User -> users
|
199
|
+
Big Life -> big-lifes
|
200
|
+
octopus -> octopi
|
201
|
+
```
|
202
|
+
|
203
|
+
If the environment variable: `resource_single` is set to `true` then it will not attempt to pluralise the resources.
|
204
|
+
|
205
|
+
```
|
206
|
+
Token -> token
|
207
|
+
User -> user
|
208
|
+
```
|
209
|
+
|
210
|
+
You can directly pass what you want using:
|
211
|
+
```
|
212
|
+
`field`
|
213
|
+
```
|
214
|
+
this will not modify the field.
|
215
|
+
|
216
|
+
## Attributes
|
217
|
+
|
218
|
+
### Types
|
219
|
+
|
220
|
+
Attribute types:
|
221
|
+
The following types are supported:
|
222
|
+
|
223
|
+
| type | other names | example |
|
224
|
+
|---------|-----------------------|-----------|
|
225
|
+
| integer | numeric, number, long | 12 |
|
226
|
+
| float | double, decimal | 4.8 |
|
227
|
+
| string | text | "text" |
|
228
|
+
| array | array | ["a"] |
|
229
|
+
| object | object | {"a":"b"} |
|
230
|
+
| null | nil | |
|
231
|
+
| bool | boolean | true |
|
232
|
+
|
233
|
+
### Name conversion
|
234
|
+
|
235
|
+
attributes are converted into singular parametrised versions of the provided name:
|
236
|
+
|
237
|
+
The conversion is based on the provided environment variables `field_camel` and `field_separator`
|
238
|
+
|
239
|
+
**Default**
|
240
|
+
```
|
241
|
+
field_camel=false
|
242
|
+
field_separator=_
|
243
|
+
|
244
|
+
Someid -> someid
|
245
|
+
Product Id -> product_id
|
246
|
+
Bodies -> body
|
247
|
+
```
|
248
|
+
|
249
|
+
**CamelCase**
|
250
|
+
```
|
251
|
+
field_camel=true
|
252
|
+
field_separator=_
|
253
|
+
|
254
|
+
Someid -> someid
|
255
|
+
Product Id -> productId
|
256
|
+
Bodies -> body
|
257
|
+
```
|
258
|
+
|
259
|
+
**Other separator**
|
260
|
+
```
|
261
|
+
field_camel=false
|
262
|
+
field_separator=-
|
263
|
+
|
264
|
+
Someid -> someid
|
265
|
+
Product Id -> product-id
|
266
|
+
Bodies -> body
|
267
|
+
```
|
data/STEPS.md
ADDED
@@ -0,0 +1,199 @@
|
|
1
|
+
# Gherkin Steps
|
2
|
+
|
3
|
+
This test suite introduces behavioural test steps on top of functional REST API steps from [cucumber-api](https://github.com/hidroh/cucumber-api)
|
4
|
+
|
5
|
+
The following is a list of steps, and their equivalent functional step
|
6
|
+
|
7
|
+
## Setup
|
8
|
+
|
9
|
+
```
|
10
|
+
Behavioural Functional
|
11
|
+
--------------------------------------------------- --------------------------------------------------------------
|
12
|
+
Given I am a client Given I send and accept JSON
|
13
|
+
```
|
14
|
+
|
15
|
+
## Retrieval
|
16
|
+
|
17
|
+
```
|
18
|
+
Behavioural Functional
|
19
|
+
--------------------------------------------------- --------------------------------------------------------------
|
20
|
+
When I request an item "2" When I send a GET request to "http://url/items/2"
|
21
|
+
|
22
|
+
When I request a list of items When I send a GET request to "http://url/items"
|
23
|
+
|
24
|
+
When I request a list of items with: When I send a GET request to "http://url/items" with:
|
25
|
+
| User Id | 12 | | userId |
|
26
|
+
| 12 |
|
27
|
+
```
|
28
|
+
|
29
|
+
## Creation
|
30
|
+
|
31
|
+
```
|
32
|
+
Behavioural Functional
|
33
|
+
--------------------------------------------------- --------------------------------------------------------------
|
34
|
+
When I request to create an item When I send a POST request to "http://url/items"
|
35
|
+
|
36
|
+
When I request to create an item with: When I set JSON request body to:
|
37
|
+
| attribute | type | value | """
|
38
|
+
| User Id | integer | 12 | {"userId":12,"title":"foo"}
|
39
|
+
| Title | string | foo | """
|
40
|
+
And I send a POST request to "http://url/items"
|
41
|
+
|
42
|
+
When I request to create an item with id "4" When I send a PUT request to "http://url/items/4"
|
43
|
+
|
44
|
+
When I request to replace the item "4" with: When I set JSON request body to:
|
45
|
+
| attribute | type | value | """
|
46
|
+
| User Id | integer | 7 | {"userId":7,"title":"foo"}
|
47
|
+
| Title | string | foo | """
|
48
|
+
And I send a PUT request to "http://url/items/4"
|
49
|
+
```
|
50
|
+
|
51
|
+
## Modification
|
52
|
+
|
53
|
+
```
|
54
|
+
Behavioural Functional
|
55
|
+
--------------------------------------------------- --------------------------------------------------------------
|
56
|
+
When I request to modify the item "4" with: When I set JSON request body to:
|
57
|
+
| attribute | type | value | """
|
58
|
+
| Body | string | bar | {"body":"bar"}
|
59
|
+
"""
|
60
|
+
And I send a PATCH request to "http://url/items/4"
|
61
|
+
```
|
62
|
+
|
63
|
+
## Status Inspection
|
64
|
+
|
65
|
+
```
|
66
|
+
Behavioural Functional
|
67
|
+
--------------------------------------------------- --------------------------------------------------------------
|
68
|
+
Then the request is successful Then the response status should be "200"
|
69
|
+
|
70
|
+
Then the request was redirected <N/A> (response status between "300" and "400")
|
71
|
+
|
72
|
+
Then the request failed <N/A> (response status between "400" and "600")
|
73
|
+
|
74
|
+
Then the request was successful and an item was Then the response status should be "201"
|
75
|
+
created
|
76
|
+
|
77
|
+
Then the request was successfully accepted Then the response status should be "202"
|
78
|
+
|
79
|
+
Then the request was successful and no response Then the response status should be "204"
|
80
|
+
body is returned
|
81
|
+
|
82
|
+
Then the request failed because it was invalid Then the response status should be "400"
|
83
|
+
|
84
|
+
Then the request failed because I am unauthorised Then the response status should be "401"
|
85
|
+
|
86
|
+
Then the request failed because it was forbidden Then the response status should be "403"
|
87
|
+
|
88
|
+
Then the request failed because the item was not Then the response status should be "404"
|
89
|
+
found
|
90
|
+
|
91
|
+
Then the request failed because it was not allowed Then the response status should be "405"
|
92
|
+
|
93
|
+
Then the request failed because there was a Then the response status should be "409"
|
94
|
+
conflict
|
95
|
+
|
96
|
+
Then the request failed because the item has gone Then the response status should be "410"
|
97
|
+
|
98
|
+
Then the request failed because it was not Then the response status should be "501"
|
99
|
+
implemented
|
100
|
+
```
|
101
|
+
|
102
|
+
## Response Inspection
|
103
|
+
|
104
|
+
```
|
105
|
+
Behavioural Functional
|
106
|
+
--------------------------------------------------- --------------------------------------------------------------
|
107
|
+
Then the response has the following attributes: Then the JSON response should have "userId" of type numeric
|
108
|
+
| attribute | type | value | with value "12"
|
109
|
+
| User Id | integer | 12 | Then the JSON response should have "title" of type numeric
|
110
|
+
| Title | string | foo | with value "foo"
|
111
|
+
| Body | string | bar | Then the JSON response should have "body" of type numeric with
|
112
|
+
value "bar"
|
113
|
+
|
114
|
+
Then the response is a list of 12 items Then the JSON response should have "$." of type array with 12
|
115
|
+
entries
|
116
|
+
|
117
|
+
Then the response is a list of at least 12 items Then the JSON response should have "$." of type array with at
|
118
|
+
least 12 entries
|
119
|
+
Then the response is a list of at most 12 items <N/A>
|
120
|
+
Then the response is a list of fewer than 12 items <N/A>
|
121
|
+
Then the response is a list of more than 12 items <N/A>
|
122
|
+
|
123
|
+
Then two items have have the following attributes: <N/A>
|
124
|
+
| attribute | type | value |
|
125
|
+
| User Id | integer | 12 |
|
126
|
+
| Title | string | foo |
|
127
|
+
| Body | string | bar |
|
128
|
+
|
129
|
+
Then more than two items have have the following <N/A>
|
130
|
+
attributes:
|
131
|
+
| attribute | type | value |
|
132
|
+
| User Id | integer | 12 |
|
133
|
+
| Title | string | foo |
|
134
|
+
| Body | string | bar |
|
135
|
+
|
136
|
+
<N/A> Then the JSON response should follow "schema.json"
|
137
|
+
|
138
|
+
<N/A> Then the response has the header "Content Type" with value
|
139
|
+
"application/json"
|
140
|
+
```
|
141
|
+
|
142
|
+
### Attribute saving and re-use
|
143
|
+
|
144
|
+
```
|
145
|
+
Behavioural Functional
|
146
|
+
--------------------------------------------------- --------------------------------------------------------------
|
147
|
+
When I save "User Id" as "user" When I grab "$.userId" as "user"
|
148
|
+
And I request the user "{user}" And I send a GET request to "http://url/users/{user}"
|
149
|
+
```
|
150
|
+
|
151
|
+
### Nested responses
|
152
|
+
|
153
|
+
```
|
154
|
+
Behavioural Functional
|
155
|
+
--------------------------------------------------- --------------------------------------------------------------
|
156
|
+
Then the response has the following attributes: Then the JSON response should have "userId" of type numeric
|
157
|
+
| attribute | type | value | with value "12"
|
158
|
+
| User Id | integer | 12 | Then the JSON response should have "title" of type numeric
|
159
|
+
| Title | string | foo | with value "foo"
|
160
|
+
| Body | string | bar | Then the JSON response should have "body" of type numeric with
|
161
|
+
| Post : Title | string | baz | value "bar"
|
162
|
+
| Post : Body | string | boo | Then the JSON response should have "post.title" of type string
|
163
|
+
with value "baz"
|
164
|
+
Then the JSON response should have "post.body" of type string
|
165
|
+
with value "boo"
|
166
|
+
|
167
|
+
Then the response has a list of comments Then the JSON response should have "comments" of type array
|
168
|
+
|
169
|
+
Then the response has a list of 2 comments Then the JSON response should have "comments" of type array with
|
170
|
+
2 entries
|
171
|
+
Then the response has a list of at least Then the JSON response should have "comments" of type array with
|
172
|
+
2 comments at least 2 entries
|
173
|
+
|
174
|
+
Then the response has a post with two comments <N/A>
|
175
|
+
with attributes:
|
176
|
+
| attribute | type | value |
|
177
|
+
| Title | string | foo |
|
178
|
+
| Body | string | bar |
|
179
|
+
|
180
|
+
Then two items contains two posts with three <N/A>
|
181
|
+
comments with an image with attributes:
|
182
|
+
| attribute | type | value |
|
183
|
+
| Href | string | some_url |
|
184
|
+
|
185
|
+
Then more than two items contains fewer than two <N/A>
|
186
|
+
posts with at least three comments with an
|
187
|
+
image with attributes:
|
188
|
+
| attribute | type | value |
|
189
|
+
| Href | string | some_url |
|
190
|
+
|
191
|
+
Then the response has a post with a list of Then the JSON response should have "post.comments" of type array
|
192
|
+
comments
|
193
|
+
|
194
|
+
Then the response has a post with a list of more Then the JSON response should have "post.comments" of type array
|
195
|
+
than 3 comments with at least 4 comments
|
196
|
+
|
197
|
+
Then more than three posts have less than two <N/A>
|
198
|
+
comments
|
199
|
+
```
|
@@ -0,0 +1,19 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = 'cucumber-rest-bdd'
|
3
|
+
s.version = '0.3.4'
|
4
|
+
s.version = "#{s.version}-alpha-#{ENV['TRAVIS_BUILD_NUMBER']}" if ENV['TRAVIS'] && ENV['TRAVIS_TAG'] == ''
|
5
|
+
s.platform = Gem::Platform::RUBY
|
6
|
+
s.date = '2017-01-10'
|
7
|
+
s.summary = 'BDD Rest API specifics for cucumber'
|
8
|
+
s.description = 'Series of BDD cucumber rules for testing API endpoints'
|
9
|
+
s.authors = ["Harry Bragg"]
|
10
|
+
s.email = ["harry.bragg@graze.com"]
|
11
|
+
s.files = `git ls-files`.split("\n")
|
12
|
+
s.require_paths = ["lib"]
|
13
|
+
s.homepage = 'http://github.com/graze/cucumber-rest-bdd'
|
14
|
+
s.license = 'MIT'
|
15
|
+
|
16
|
+
s.add_dependency('cucumber-api', '~> 0.4')
|
17
|
+
s.add_dependency('activesupport', '~> 5.0')
|
18
|
+
s.add_dependency('easy_diff', '~> 1.0')
|
19
|
+
end
|
data/docker-compose.yml
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
version: '2'
|
2
|
+
services:
|
3
|
+
test-server:
|
4
|
+
image: clue/json-server
|
5
|
+
volumes:
|
6
|
+
- ./server/db.json:/data/db.json:ro
|
7
|
+
|
8
|
+
runner:
|
9
|
+
image: graze/cucumber-rest-bdd
|
10
|
+
build:
|
11
|
+
context: .
|
12
|
+
dockerfile: Dockerfile.dev
|
13
|
+
volumes:
|
14
|
+
- .:/opt/src
|
15
|
+
working_dir: /opt/src
|
16
|
+
environment:
|
17
|
+
- endpoint=http://test-server/
|
18
|
+
- cucumber_api_verbose=false
|
19
|
+
- field_separator=_
|
20
|
+
- field_camel=true
|
21
|
+
- resource_single=false
|
22
|
+
- data_key=
|