cucumber-rest-bdd 0.3.4.pre.alpha.pre.86
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
[![Build Status](https://travis-ci.org/graze/cucumber-rest-bdd.svg?branch=master)](https://travis-ci.org/graze/cucumber-rest-bdd)
|
4
|
+
[![](https://images.microbadger.com/badges/image/graze/cucumber-rest-bdd.svg)](https://microbadger.com/images/graze/cucumber-rest-bdd "Get your own image badge on microbadger.com")
|
5
|
+
[![](https://images.microbadger.com/badges/version/graze/cucumber-rest-bdd.svg)](https://microbadger.com/images/graze/cucumber-rest-bdd "Get your own version badge on microbadger.com")
|
6
|
+
[![](https://images.microbadger.com/badges/license/graze/cucumber-rest-bdd.svg)](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
|
+
![Giphy](https://media3.giphy.com/media/Tv7VPg6Os488g/giphy.gif)
|
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=
|