brine-dsl 0.8.1 → 0.9.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.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-gemset +1 -0
  3. data/Gemfile.lock +24 -75
  4. data/Rakefile +5 -29
  5. data/brine-dsl.gemspec +3 -5
  6. data/feature_setup.rb +17 -0
  7. data/lib/brine/requester.rb +27 -2
  8. data/lib/brine/step_definitions/request_construction.rb +5 -0
  9. data/lib/brine/test_steps.rb +8 -2
  10. data/lib/brine/type_checks.rb +2 -1
  11. data/lib/brine/util.rb +13 -3
  12. metadata +6 -145
  13. data/.gitignore +0 -3
  14. data/.travis.yml +0 -11
  15. data/CHANGELOG.md +0 -170
  16. data/Guardfile +0 -12
  17. data/LICENSE +0 -21
  18. data/README.adoc +0 -29
  19. data/config/cucumber.yml +0 -2
  20. data/docs/build.gradle +0 -19
  21. data/docs/cookbook.html +0 -643
  22. data/docs/gradle/wrapper/gradle-wrapper.jar +0 -0
  23. data/docs/gradle/wrapper/gradle-wrapper.properties +0 -6
  24. data/docs/gradlew +0 -172
  25. data/docs/gradlew.bat +0 -84
  26. data/docs/guide.html +0 -1220
  27. data/docs/index.html +0 -486
  28. data/docs/specs.html +0 -2066
  29. data/docs/src/cookbook.adoc +0 -160
  30. data/docs/src/guide.adoc +0 -524
  31. data/docs/src/index.adoc +0 -28
  32. data/docs/src/spec.erb +0 -121
  33. data/docs/src/specs.adoc +0 -37
  34. data/features/argument_transforms/boolean.feature +0 -37
  35. data/features/argument_transforms/datetime.feature +0 -45
  36. data/features/argument_transforms/integer.feature +0 -41
  37. data/features/argument_transforms/list.feature +0 -46
  38. data/features/argument_transforms/object.feature +0 -66
  39. data/features/argument_transforms/quoted.feature +0 -41
  40. data/features/argument_transforms/regex.feature +0 -40
  41. data/features/argument_transforms/template.feature +0 -46
  42. data/features/argument_transforms/whitespace.feature +0 -51
  43. data/features/assertions/is_a_valid.feature +0 -184
  44. data/features/assertions/is_empty.feature +0 -67
  45. data/features/assertions/is_equal_to.feature +0 -60
  46. data/features/assertions/is_including.feature +0 -34
  47. data/features/assertions/is_matching.feature +0 -35
  48. data/features/assertions/is_of_length.feature +0 -43
  49. data/features/assignment/parameter.feature +0 -20
  50. data/features/assignment/random.feature +0 -25
  51. data/features/assignment/response_attribute.feature +0 -33
  52. data/features/assignment/timestamp.feature +0 -33
  53. data/features/deprecations/replaced_with.feature +0 -53
  54. data/features/request_construction/basic.feature +0 -29
  55. data/features/request_construction/body.feature +0 -26
  56. data/features/request_construction/clearing.feature +0 -46
  57. data/features/request_construction/headers.feature +0 -94
  58. data/features/request_construction/params.feature +0 -60
  59. data/features/resource_cleanup/cleanup.feature +0 -86
  60. data/features/selectors/all.feature +0 -55
  61. data/features/selectors/any.feature +0 -48
  62. data/features/step_definitions/test_steps.rb +0 -5
  63. data/features/support/env.rb +0 -10
  64. data/tutorial/missing.feature +0 -5
  65. data/tutorial/post_matching.feature +0 -12
  66. data/tutorial/post_status.feature +0 -10
  67. data/tutorial/support/env.rb +0 -2
@@ -1,2066 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8">
5
- <!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge"><![endif]-->
6
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
- <meta name="generator" content="Asciidoctor 1.5.0">
8
- <meta name="description" content="Specifications for Brine">
9
- <meta name="keywords" content="Brine, Cucumber, RESt, DSL">
10
- <meta name="author" content="Matt Whipple">
11
- <title>Brine Specifications</title>
12
- <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic|Noto+Serif:400,400italic,700,700italic|Droid+Sans+Mono:400">
13
- <style>
14
- /* Asciidoctor default stylesheet | MIT License | http://asciidoctor.org */
15
- /* Remove the comments around the @import statement below when using this as a custom stylesheet */
16
- /*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic|Noto+Serif:400,400italic,700,700italic|Droid+Sans+Mono:400";*/
17
- article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}
18
- audio,canvas,video{display:inline-block}
19
- audio:not([controls]){display:none;height:0}
20
- [hidden],template{display:none}
21
- script{display:none!important}
22
- html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}
23
- body{margin:0}
24
- a{background:transparent}
25
- a:focus{outline:thin dotted}
26
- a:active,a:hover{outline:0}
27
- h1{font-size:2em;margin:.67em 0}
28
- abbr[title]{border-bottom:1px dotted}
29
- b,strong{font-weight:bold}
30
- dfn{font-style:italic}
31
- hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}
32
- mark{background:#ff0;color:#000}
33
- code,kbd,pre,samp{font-family:monospace;font-size:1em}
34
- pre{white-space:pre-wrap}
35
- q{quotes:"\201C" "\201D" "\2018" "\2019"}
36
- small{font-size:80%}
37
- sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
38
- sup{top:-.5em}
39
- sub{bottom:-.25em}
40
- img{border:0}
41
- svg:not(:root){overflow:hidden}
42
- figure{margin:0}
43
- fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
44
- legend{border:0;padding:0}
45
- button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
46
- button,input{line-height:normal}
47
- button,select{text-transform:none}
48
- button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}
49
- button[disabled],html input[disabled]{cursor:default}
50
- input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}
51
- input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}
52
- input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}
53
- button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
54
- textarea{overflow:auto;vertical-align:top}
55
- table{border-collapse:collapse;border-spacing:0}
56
- *,*:before,*:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
57
- html,body{font-size:100%}
58
- body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto}
59
- a:hover{cursor:pointer}
60
- img,object,embed{max-width:100%;height:auto}
61
- object,embed{height:100%}
62
- img{-ms-interpolation-mode:bicubic}
63
- #map_canvas img,#map_canvas embed,#map_canvas object,.map_canvas img,.map_canvas embed,.map_canvas object{max-width:none!important}
64
- .left{float:left!important}
65
- .right{float:right!important}
66
- .text-left{text-align:left!important}
67
- .text-right{text-align:right!important}
68
- .text-center{text-align:center!important}
69
- .text-justify{text-align:justify!important}
70
- .hide{display:none}
71
- .antialiased,body{-webkit-font-smoothing:antialiased}
72
- img{display:inline-block;vertical-align:middle}
73
- textarea{height:auto;min-height:50px}
74
- select{width:100%}
75
- p.lead,.paragraph.lead>p,#preamble>.sectionbody>.paragraph:first-of-type p{font-size:1.21875em;line-height:1.6}
76
- .subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
77
- div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0;direction:ltr}
78
- a{color:#2156a5;text-decoration:underline;line-height:inherit}
79
- a:hover,a:focus{color:#1d4b8f}
80
- a img{border:none}
81
- p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
82
- p aside{font-size:.875em;line-height:1.35;font-style:italic}
83
- h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
84
- h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
85
- h1{font-size:2.125em}
86
- h2{font-size:1.6875em}
87
- h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
88
- h4,h5{font-size:1.125em}
89
- h6{font-size:1em}
90
- hr{border:solid #ddddd8;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0}
91
- em,i{font-style:italic;line-height:inherit}
92
- strong,b{font-weight:bold;line-height:inherit}
93
- small{font-size:60%;line-height:inherit}
94
- code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
95
- ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
96
- ul,ol,ul.no-bullet,ol.no-bullet{margin-left:1.5em}
97
- ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em}
98
- ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}
99
- ul.square{list-style-type:square}
100
- ul.circle{list-style-type:circle}
101
- ul.disc{list-style-type:disc}
102
- ul.no-bullet{list-style:none}
103
- ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
104
- dl dt{margin-bottom:.3125em;font-weight:bold}
105
- dl dd{margin-bottom:1.25em}
106
- abbr,acronym{text-transform:uppercase;font-size:90%;color:rgba(0,0,0,.8);border-bottom:1px dotted #ddd;cursor:help}
107
- abbr{text-transform:none}
108
- blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
109
- blockquote cite{display:block;font-size:.9375em;color:rgba(0,0,0,.6)}
110
- blockquote cite:before{content:"\2014 \0020"}
111
- blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,.6)}
112
- blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
113
- @media only screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
114
- h1{font-size:2.75em}
115
- h2{font-size:2.3125em}
116
- h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
117
- h4{font-size:1.4375em}}table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede}
118
- table thead,table tfoot{background:#f7f8f7;font-weight:bold}
119
- table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
120
- table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
121
- table tr.even,table tr.alt,table tr:nth-of-type(even){background:#f8f8f7}
122
- table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{display:table-cell;line-height:1.6}
123
- h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
124
- h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
125
- .clearfix:before,.clearfix:after,.float-group:before,.float-group:after{content:" ";display:table}
126
- .clearfix:after,.float-group:after{clear:both}
127
- *:not(pre)>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background-color:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed}
128
- pre,pre>code{line-height:1.45;color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;text-rendering:optimizeSpeed}
129
- .keyseq{color:rgba(51,51,51,.8)}
130
- kbd{display:inline-block;color:rgba(0,0,0,.8);font-size:.75em;line-height:1.4;background-color:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:-.15em .15em 0 .15em;padding:.2em .6em .2em .5em;vertical-align:middle;white-space:nowrap}
131
- .keyseq kbd:first-child{margin-left:0}
132
- .keyseq kbd:last-child{margin-right:0}
133
- .menuseq,.menu{color:rgba(0,0,0,.8)}
134
- b.button:before,b.button:after{position:relative;top:-1px;font-weight:400}
135
- b.button:before{content:"[";padding:0 3px 0 2px}
136
- b.button:after{content:"]";padding:0 2px 0 3px}
137
- p a>code:hover{color:rgba(0,0,0,.9)}
138
- #header,#content,#footnotes,#footer{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
139
- #header:before,#header:after,#content:before,#content:after,#footnotes:before,#footnotes:after,#footer:before,#footer:after{content:" ";display:table}
140
- #header:after,#content:after,#footnotes:after,#footer:after{clear:both}
141
- #content{margin-top:1.25em}
142
- #content:before{content:none}
143
- #header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
144
- #header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #ddddd8}
145
- #header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #ddddd8;padding-bottom:8px}
146
- #header .details{border-bottom:1px solid #ddddd8;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap}
147
- #header .details span:first-child{margin-left:-.125em}
148
- #header .details span.email a{color:rgba(0,0,0,.85)}
149
- #header .details br{display:none}
150
- #header .details br+span:before{content:"\00a0\2013\00a0"}
151
- #header .details br+span.author:before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
152
- #header .details br+span#revremark:before{content:"\00a0|\00a0"}
153
- #header #revnumber{text-transform:capitalize}
154
- #header #revnumber:after{content:"\00a0"}
155
- #content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #ddddd8;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
156
- #toc{border-bottom:1px solid #efefed;padding-bottom:.5em}
157
- #toc>ul{margin-left:.125em}
158
- #toc ul.sectlevel0>li>a{font-style:italic}
159
- #toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
160
- #toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
161
- #toc a{text-decoration:none}
162
- #toc a:active{text-decoration:underline}
163
- #toctitle{color:#7a2518;font-size:1.2em}
164
- @media only screen and (min-width:768px){#toctitle{font-size:1.375em}
165
- body.toc2{padding-left:15em;padding-right:0}
166
- #toc.toc2{margin-top:0!important;background-color:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #efefed;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
167
- #toc.toc2 #toctitle{margin-top:0;font-size:1.2em}
168
- #toc.toc2>ul{font-size:.9em;margin-bottom:0}
169
- #toc.toc2 ul ul{margin-left:0;padding-left:1em}
170
- #toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
171
- body.toc2.toc-right{padding-left:0;padding-right:15em}
172
- body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #efefed;left:auto;right:0}}@media only screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
173
- #toc.toc2{width:20em}
174
- #toc.toc2 #toctitle{font-size:1.375em}
175
- #toc.toc2>ul{font-size:.95em}
176
- #toc.toc2 ul ul{padding-left:1.25em}
177
- body.toc2.toc-right{padding-left:0;padding-right:20em}}#content #toc{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
178
- #content #toc>:first-child{margin-top:0}
179
- #content #toc>:last-child{margin-bottom:0}
180
- #footer{max-width:100%;background-color:rgba(0,0,0,.8);padding:1.25em}
181
- #footer-text{color:rgba(255,255,255,.8);line-height:1.44}
182
- .sect1{padding-bottom:.625em}
183
- @media only screen and (min-width:768px){.sect1{padding-bottom:1.25em}}.sect1+.sect1{border-top:1px solid #efefed}
184
- #content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
185
- #content h1>a.anchor:before,h2>a.anchor:before,h3>a.anchor:before,#toctitle>a.anchor:before,.sidebarblock>.content>.title>a.anchor:before,h4>a.anchor:before,h5>a.anchor:before,h6>a.anchor:before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
186
- #content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
187
- #content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
188
- #content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
189
- .audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
190
- .admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
191
- table.tableblock>caption.title{white-space:nowrap;overflow:visible;max-width:0}
192
- .paragraph.lead>p,#preamble>.sectionbody>.paragraph:first-of-type p{color:rgba(0,0,0,.85)}
193
- table.tableblock #preamble>.sectionbody>.paragraph:first-of-type p{font-size:inherit}
194
- .admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
195
- .admonitionblock>table td.icon{text-align:center;width:80px}
196
- .admonitionblock>table td.icon img{max-width:none}
197
- .admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
198
- .admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #ddddd8;color:rgba(0,0,0,.6)}
199
- .admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
200
- .exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px}
201
- .exampleblock>.content>:first-child{margin-top:0}
202
- .exampleblock>.content>:last-child{margin-bottom:0}
203
- .sidebarblock{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
204
- .sidebarblock>:first-child{margin-top:0}
205
- .sidebarblock>:last-child{margin-bottom:0}
206
- .sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
207
- .exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
208
- .literalblock pre,.listingblock pre:not(.highlight),.listingblock pre[class="highlight"],.listingblock pre[class^="highlight "],.listingblock pre.CodeRay,.listingblock pre.prettyprint{background:#f7f7f8}
209
- .sidebarblock .literalblock pre,.sidebarblock .listingblock pre:not(.highlight),.sidebarblock .listingblock pre[class="highlight"],.sidebarblock .listingblock pre[class^="highlight "],.sidebarblock .listingblock pre.CodeRay,.sidebarblock .listingblock pre.prettyprint{background:#f2f1f1}
210
- .literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{-webkit-border-radius:4px;border-radius:4px;word-wrap:break-word;padding:1em;font-size:.8125em}
211
- .literalblock pre.nowrap,.literalblock pre[class].nowrap,.listingblock pre.nowrap,.listingblock pre[class].nowrap{overflow-x:auto;white-space:pre;word-wrap:normal}
212
- @media only screen and (min-width:768px){.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:.90625em}}@media only screen and (min-width:1280px){.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:1em}}.literalblock.output pre{color:#f7f7f8;background-color:rgba(0,0,0,.9)}
213
- .listingblock pre.highlightjs{padding:0}
214
- .listingblock pre.highlightjs>code{padding:1em;-webkit-border-radius:4px;border-radius:4px}
215
- .listingblock pre.prettyprint{border-width:0}
216
- .listingblock>.content{position:relative}
217
- .listingblock code[data-lang]:before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:#999}
218
- .listingblock:hover code[data-lang]:before{display:block}
219
- .listingblock.terminal pre .command:before{content:attr(data-prompt);padding-right:.5em;color:#999}
220
- .listingblock.terminal pre .command:not([data-prompt]):before{content:"$"}
221
- table.pyhltable{border-collapse:separate;border:0;margin-bottom:0;background:none}
222
- table.pyhltable td{vertical-align:top;padding-top:0;padding-bottom:0}
223
- table.pyhltable td.code{padding-left:.75em;padding-right:0}
224
- pre.pygments .lineno,table.pyhltable td:not(.code){color:#999;padding-left:0;padding-right:.5em;border-right:1px solid #ddddd8}
225
- pre.pygments .lineno{display:inline-block;margin-right:.25em}
226
- table.pyhltable .linenodiv{background:none!important;padding-right:0!important}
227
- .quoteblock{margin:0 1em 1.25em 1.5em;display:table}
228
- .quoteblock>.title{margin-left:-1.5em;margin-bottom:.75em}
229
- .quoteblock blockquote,.quoteblock blockquote p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
230
- .quoteblock blockquote{margin:0;padding:0;border:0}
231
- .quoteblock blockquote:before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
232
- .quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
233
- .quoteblock .attribution{margin-top:.5em;margin-right:.5ex;text-align:right}
234
- .quoteblock .quoteblock{margin-left:0;margin-right:0;padding:.5em 0;border-left:3px solid rgba(0,0,0,.6)}
235
- .quoteblock .quoteblock blockquote{padding:0 0 0 .75em}
236
- .quoteblock .quoteblock blockquote:before{display:none}
237
- .verseblock{margin:0 1em 1.25em 1em}
238
- .verseblock pre{font-family:"Open Sans","DejaVu Sans",sans;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
239
- .verseblock pre strong{font-weight:400}
240
- .verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
241
- .quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
242
- .quoteblock .attribution br,.verseblock .attribution br{display:none}
243
- .quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.05em;color:rgba(0,0,0,.6)}
244
- .quoteblock.abstract{margin:0 0 1.25em 0;display:block}
245
- .quoteblock.abstract blockquote,.quoteblock.abstract blockquote p{text-align:left;word-spacing:0}
246
- .quoteblock.abstract blockquote:before,.quoteblock.abstract blockquote p:first-of-type:before{display:none}
247
- table.tableblock{max-width:100%;border-collapse:separate}
248
- table.tableblock td>.paragraph:last-child p>p:last-child,table.tableblock th>p:last-child,table.tableblock td>p:last-child{margin-bottom:0}
249
- table.spread{width:100%}
250
- table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
251
- table.grid-all th.tableblock,table.grid-all td.tableblock{border-width:0 1px 1px 0}
252
- table.grid-all tfoot>tr>th.tableblock,table.grid-all tfoot>tr>td.tableblock{border-width:1px 1px 0 0}
253
- table.grid-cols th.tableblock,table.grid-cols td.tableblock{border-width:0 1px 0 0}
254
- table.grid-all *>tr>.tableblock:last-child,table.grid-cols *>tr>.tableblock:last-child{border-right-width:0}
255
- table.grid-rows th.tableblock,table.grid-rows td.tableblock{border-width:0 0 1px 0}
256
- table.grid-all tbody>tr:last-child>th.tableblock,table.grid-all tbody>tr:last-child>td.tableblock,table.grid-all thead:last-child>tr>th.tableblock,table.grid-rows tbody>tr:last-child>th.tableblock,table.grid-rows tbody>tr:last-child>td.tableblock,table.grid-rows thead:last-child>tr>th.tableblock{border-bottom-width:0}
257
- table.grid-rows tfoot>tr>th.tableblock,table.grid-rows tfoot>tr>td.tableblock{border-width:1px 0 0 0}
258
- table.frame-all{border-width:1px}
259
- table.frame-sides{border-width:0 1px}
260
- table.frame-topbot{border-width:1px 0}
261
- th.halign-left,td.halign-left{text-align:left}
262
- th.halign-right,td.halign-right{text-align:right}
263
- th.halign-center,td.halign-center{text-align:center}
264
- th.valign-top,td.valign-top{vertical-align:top}
265
- th.valign-bottom,td.valign-bottom{vertical-align:bottom}
266
- th.valign-middle,td.valign-middle{vertical-align:middle}
267
- table thead th,table tfoot th{font-weight:bold}
268
- tbody tr th{display:table-cell;line-height:1.6;background:#f7f8f7}
269
- tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
270
- p.tableblock>code:only-child{background:none;padding:0}
271
- p.tableblock{font-size:1em}
272
- td>div.verse{white-space:pre}
273
- ol{margin-left:1.75em}
274
- ul li ol{margin-left:1.5em}
275
- dl dd{margin-left:1.125em}
276
- dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
277
- ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
278
- ul.unstyled,ol.unnumbered,ul.checklist,ul.none{list-style-type:none}
279
- ul.unstyled,ol.unnumbered,ul.checklist{margin-left:.625em}
280
- ul.checklist li>p:first-child>.fa-check-square-o:first-child,ul.checklist li>p:first-child>input[type="checkbox"]:first-child{margin-right:.25em}
281
- ul.checklist li>p:first-child>input[type="checkbox"]:first-child{position:relative;top:1px}
282
- ul.inline{margin:0 auto .625em auto;margin-left:-1.375em;margin-right:0;padding:0;list-style:none;overflow:hidden}
283
- ul.inline>li{list-style:none;float:left;margin-left:1.375em;display:block}
284
- ul.inline>li>*{display:block}
285
- .unstyled dl dt{font-weight:400;font-style:normal}
286
- ol.arabic{list-style-type:decimal}
287
- ol.decimal{list-style-type:decimal-leading-zero}
288
- ol.loweralpha{list-style-type:lower-alpha}
289
- ol.upperalpha{list-style-type:upper-alpha}
290
- ol.lowerroman{list-style-type:lower-roman}
291
- ol.upperroman{list-style-type:upper-roman}
292
- ol.lowergreek{list-style-type:lower-greek}
293
- .hdlist>table,.colist>table{border:0;background:none}
294
- .hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
295
- td.hdlist1{padding-right:.75em;font-weight:bold}
296
- td.hdlist1,td.hdlist2{vertical-align:top}
297
- .literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
298
- .colist>table tr>td:first-of-type{padding:0 .75em;line-height:1}
299
- .colist>table tr>td:last-of-type{padding:.25em 0}
300
- .thumb,.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd}
301
- .imageblock.left,.imageblock[style*="float: left"]{margin:.25em .625em 1.25em 0}
302
- .imageblock.right,.imageblock[style*="float: right"]{margin:.25em 0 1.25em .625em}
303
- .imageblock>.title{margin-bottom:0}
304
- .imageblock.thumb,.imageblock.th{border-width:6px}
305
- .imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
306
- .image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
307
- .image.left{margin-right:.625em}
308
- .image.right{margin-left:.625em}
309
- a.image{text-decoration:none}
310
- span.footnote,span.footnoteref{vertical-align:super;font-size:.875em}
311
- span.footnote a,span.footnoteref a{text-decoration:none}
312
- span.footnote a:active,span.footnoteref a:active{text-decoration:underline}
313
- #footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
314
- #footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em 0;border-width:1px 0 0 0}
315
- #footnotes .footnote{padding:0 .375em;line-height:1.3;font-size:.875em;margin-left:1.2em;text-indent:-1.2em;margin-bottom:.2em}
316
- #footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none}
317
- #footnotes .footnote:last-of-type{margin-bottom:0}
318
- #content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
319
- .gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0}
320
- .gist .file-data>table td.line-data{width:99%}
321
- div.unbreakable{page-break-inside:avoid}
322
- .big{font-size:larger}
323
- .small{font-size:smaller}
324
- .underline{text-decoration:underline}
325
- .overline{text-decoration:overline}
326
- .line-through{text-decoration:line-through}
327
- .aqua{color:#00bfbf}
328
- .aqua-background{background-color:#00fafa}
329
- .black{color:#000}
330
- .black-background{background-color:#000}
331
- .blue{color:#0000bf}
332
- .blue-background{background-color:#0000fa}
333
- .fuchsia{color:#bf00bf}
334
- .fuchsia-background{background-color:#fa00fa}
335
- .gray{color:#606060}
336
- .gray-background{background-color:#7d7d7d}
337
- .green{color:#006000}
338
- .green-background{background-color:#007d00}
339
- .lime{color:#00bf00}
340
- .lime-background{background-color:#00fa00}
341
- .maroon{color:#600000}
342
- .maroon-background{background-color:#7d0000}
343
- .navy{color:#000060}
344
- .navy-background{background-color:#00007d}
345
- .olive{color:#606000}
346
- .olive-background{background-color:#7d7d00}
347
- .purple{color:#600060}
348
- .purple-background{background-color:#7d007d}
349
- .red{color:#bf0000}
350
- .red-background{background-color:#fa0000}
351
- .silver{color:#909090}
352
- .silver-background{background-color:#bcbcbc}
353
- .teal{color:#006060}
354
- .teal-background{background-color:#007d7d}
355
- .white{color:#bfbfbf}
356
- .white-background{background-color:#fafafa}
357
- .yellow{color:#bfbf00}
358
- .yellow-background{background-color:#fafa00}
359
- span.icon>.fa{cursor:default}
360
- .admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
361
- .admonitionblock td.icon .icon-note:before{content:"\f05a";color:#19407c}
362
- .admonitionblock td.icon .icon-tip:before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
363
- .admonitionblock td.icon .icon-warning:before{content:"\f071";color:#bf6900}
364
- .admonitionblock td.icon .icon-caution:before{content:"\f06d";color:#bf3400}
365
- .admonitionblock td.icon .icon-important:before{content:"\f06a";color:#bf0000}
366
- .conum[data-value]{display:inline-block;color:#fff!important;background-color:rgba(0,0,0,.8);-webkit-border-radius:100px;border-radius:100px;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
367
- .conum[data-value] *{color:#fff!important}
368
- .conum[data-value]+b{display:none}
369
- .conum[data-value]:after{content:attr(data-value)}
370
- pre .conum[data-value]{position:relative;top:-.125em}
371
- b.conum *{color:inherit!important}
372
- .conum:not([data-value]):empty{display:none}
373
- h1,h2{letter-spacing:-.01em}
374
- dt,th.tableblock,td.content{text-rendering:optimizeLegibility}
375
- p,td.content{letter-spacing:-.01em}
376
- p strong,td.content strong{letter-spacing:-.005em}
377
- p,blockquote,dt,td.content{font-size:1.0625rem}
378
- p{margin-bottom:1.25rem}
379
- .sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
380
- .exampleblock>.content{background-color:#fffef7;border-color:#e0e0dc;-webkit-box-shadow:0 1px 4px #e0e0dc;box-shadow:0 1px 4px #e0e0dc}
381
- .print-only{display:none!important}
382
- @media print{@page{margin:1.25cm .75cm}
383
- *{-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important}
384
- a{color:inherit!important;text-decoration:underline!important}
385
- a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
386
- a[href^="http:"]:not(.bare):after,a[href^="https:"]:not(.bare):after,a[href^="mailto:"]:not(.bare):after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
387
- abbr[title]:after{content:" (" attr(title) ")"}
388
- pre,blockquote,tr,img{page-break-inside:avoid}
389
- thead{display:table-header-group}
390
- img{max-width:100%!important}
391
- p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
392
- h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
393
- #toc,.sidebarblock,.exampleblock>.content{background:none!important}
394
- #toc{border-bottom:1px solid #ddddd8!important;padding-bottom:0!important}
395
- .sect1{padding-bottom:0!important}
396
- .sect1+.sect1{border:0!important}
397
- #header>h1:first-child{margin-top:1.25rem}
398
- body.book #header{text-align:center}
399
- body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em 0}
400
- body.book #header .details{border:0!important;display:block;padding:0!important}
401
- body.book #header .details span:first-child{margin-left:0!important}
402
- body.book #header .details br{display:block}
403
- body.book #header .details br+span:before{content:none!important}
404
- body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
405
- body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
406
- .listingblock code[data-lang]:before{display:block}
407
- #footer{background:none!important;padding:0 .9375em}
408
- #footer-text{color:rgba(0,0,0,.6)!important;font-size:.9em}
409
- .hide-on-print{display:none!important}
410
- .print-only{display:block!important}
411
- .hide-for-print{display:none!important}
412
- .show-for-print{display:inherit!important}}
413
- </style>
414
- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.1.0/css/font-awesome.min.css">
415
- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/8.1/styles/github.min.css">
416
- <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/8.1/highlight.min.js"></script>
417
- <script>hljs.initHighlightingOnLoad()</script>
418
- </head>
419
- <body class="article toc2 toc-right">
420
- <div id="header">
421
- <h1><span class="icon"><i class="fa fa-cogs"></i></span> Brine Specifications</h1>
422
- <div class="details">
423
- <span id="author" class="author">Matt Whipple</span><br>
424
- <span id="email" class="email"><a href="http://github.com/mwhipple">@mwhipple</a></span><br>
425
- </div>
426
- <div id="toc" class="toc2">
427
- <div id="toctitle">Table of Contents</div>
428
- <ul class="sectlevel1">
429
- <li><a href="#_request_construction">Request Construction</a>
430
- <ul class="sectlevel2">
431
- <li><a href="#__span_class_feature_name_basic_request_construction_span"><span class="feature name">Basic Request Construction</span></a></li>
432
- <li><a href="#__span_class_feature_name_assigning_a_request_body_span"><span class="feature name">Assigning a Request Body</span></a></li>
433
- <li><a href="#__span_class_feature_name_adding_query_parameters_span"><span class="feature name">Adding Query Parameters</span></a></li>
434
- <li><a href="#__span_class_feature_name_adding_headers_span"><span class="feature name">Adding Headers</span></a></li>
435
- <li><a href="#__span_class_feature_name_cleared_after_sent_span"><span class="feature name">Cleared After Sent</span></a></li>
436
- </ul>
437
- </li>
438
- <li><a href="#_resource_cleanup">Resource Cleanup</a>
439
- <ul class="sectlevel2">
440
- <li><a href="#__span_class_feature_name_resource_cleanup_span"><span class="feature name">Resource Cleanup</span></a></li>
441
- </ul>
442
- </li>
443
- <li><a href="#_assignment">Assignment</a>
444
- <ul class="sectlevel2">
445
- <li><a href="#__span_class_feature_name_a_parameter_span"><span class="feature name">A Parameter</span></a></li>
446
- <li><a href="#__span_class_feature_name_a_random_string_span"><span class="feature name">A Random String</span></a></li>
447
- <li><a href="#__span_class_feature_name_a_timestamp_span"><span class="feature name">A Timestamp</span></a></li>
448
- <li><a href="#__span_class_feature_name_a_value_from_a_response_attribute_span"><span class="feature name">A Value From A Response Attribute.</span></a></li>
449
- </ul>
450
- </li>
451
- <li><a href="#_selection">Selection</a>
452
- <ul class="sectlevel2">
453
- <li><a href="#__span_class_feature_name_any_element_span"><span class="feature name">Any Element</span></a></li>
454
- <li><a href="#__span_class_feature_name_all_elements_span"><span class="feature name">All Elements</span></a></li>
455
- </ul>
456
- </li>
457
- <li><a href="#_assertion">Assertion</a>
458
- <ul class="sectlevel2">
459
- <li><a href="#__span_class_feature_name_equal_to_span"><span class="feature name">Equal to</span></a></li>
460
- <li><a href="#__span_class_feature_name_matching_span"><span class="feature name">Matching</span></a></li>
461
- <li><a href="#__span_class_feature_name_including_span"><span class="feature name">Including</span></a></li>
462
- <li><a href="#__span_class_feature_name_empty_span"><span class="feature name">Empty</span></a></li>
463
- <li><a href="#__span_class_feature_name_of_length_span"><span class="feature name">Of Length</span></a></li>
464
- <li><a href="#__span_class_feature_name_a_valid_span"><span class="feature name">A valid &#8230;&#8203;</span></a></li>
465
- </ul>
466
- </li>
467
- </ul>
468
- </div>
469
- </div>
470
- <div id="content">
471
- <div class="sect1">
472
- <h2 id="_request_construction">Request Construction</h2>
473
- <div class="sectionbody">
474
- <div class="sect2">
475
- <h3 id="__span_class_feature_name_basic_request_construction_span"><span class="feature name">Basic Request Construction</span></h3>
476
- <div class="paragraph">
477
- <p>A simple request with a specified method and path can be sent.</p>
478
- </div>
479
- <div class="sect3">
480
- <h4 id="__span_class_scenario_name_varying_methods_span"><span class="scenario name">Varying Methods</span></h4>
481
- <div class="ulist step-list">
482
- <ul>
483
- <li>
484
- <p><strong>Given</strong> a file named "features/basic_requests.feature" with:</p>
485
- </li>
486
- </ul>
487
- </div>
488
- <div class="listingblock">
489
- <div class="content">
490
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">Feature: Sending a method
491
- Scenario: Basic URL
492
- Given expected &lt;method&gt; sent to `/profile`
493
-
494
- When a &lt;method&gt; is sent to `/profile`
495
- Then expected calls are verified</code></pre>
496
- </div>
497
- </div>
498
- <div class="ulist">
499
- <ul>
500
- <li>
501
- <p><strong>When</strong> I run <code>cucumber features/basic_requests.feature</code></p>
502
- </li>
503
- <li>
504
- <p><strong>Then</strong> the output should contain:</p>
505
- </li>
506
- </ul>
507
- </div>
508
- <div class="listingblock">
509
- <div class="content">
510
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">1 passed</code></pre>
511
- </div>
512
- </div>
513
- <div class="ulist">
514
- <ul>
515
- <li>
516
- <p><strong>And</strong> it should pass</p>
517
- </li>
518
- </ul>
519
- </div>
520
- <div class="sect4">
521
- <h5 id="__example_name_examples">[example name]#Examples #</h5>
522
- <table class="tableblock frame-all grid-all spread">
523
- <colgroup>
524
- <col style="width: 100%;">
525
- </colgroup>
526
- <tbody>
527
- <tr>
528
- <td class="tableblock halign-left valign-top"><p class="tableblock">method</p></td>
529
- </tr>
530
- <tr>
531
- <td class="tableblock halign-left valign-top"><p class="tableblock">GET</p></td>
532
- </tr>
533
- <tr>
534
- <td class="tableblock halign-left valign-top"><p class="tableblock">POST</p></td>
535
- </tr>
536
- <tr>
537
- <td class="tableblock halign-left valign-top"><p class="tableblock">PATCH</p></td>
538
- </tr>
539
- <tr>
540
- <td class="tableblock halign-left valign-top"><p class="tableblock">DELETE</p></td>
541
- </tr>
542
- <tr>
543
- <td class="tableblock halign-left valign-top"><p class="tableblock">PUT</p></td>
544
- </tr>
545
- </tbody>
546
- </table>
547
- </div>
548
- </div>
549
- </div>
550
- <div class="sect2">
551
- <h3 id="__span_class_feature_name_assigning_a_request_body_span"><span class="feature name">Assigning a Request Body</span></h3>
552
- <div class="sect3">
553
- <h4 id="__span_class_scenario_name_request_with_body_span"><span class="scenario name">Request With Body</span></h4>
554
- <div class="ulist step-list">
555
- <ul>
556
- <li>
557
- <p><strong>Given</strong> a file named "features/request_body.feature" with:</p>
558
- </li>
559
- </ul>
560
- </div>
561
- <div class="listingblock">
562
- <div class="content">
563
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">Feature: Passing a body
564
- Scenario: Basic URL
565
- Given expected request body:
566
- """
567
- {"request":1}
568
- """
569
- And expected PUT sent to `/store`
570
-
571
- When the request body is assigned:
572
- """
573
- {"request":1}
574
- """
575
- When a PUT is sent to `/store`
576
- Then expected calls are verified</code></pre>
577
- </div>
578
- </div>
579
- <div class="ulist">
580
- <ul>
581
- <li>
582
- <p><strong>When</strong> I run <code>cucumber features/request_body.feature</code></p>
583
- </li>
584
- <li>
585
- <p><strong>Then</strong> the output should contain:</p>
586
- </li>
587
- </ul>
588
- </div>
589
- <div class="listingblock">
590
- <div class="content">
591
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">5 passed</code></pre>
592
- </div>
593
- </div>
594
- <div class="ulist">
595
- <ul>
596
- <li>
597
- <p><strong>And</strong> it should pass</p>
598
- </li>
599
- </ul>
600
- </div>
601
- </div>
602
- </div>
603
- <div class="sect2">
604
- <h3 id="__span_class_feature_name_adding_query_parameters_span"><span class="feature name">Adding Query Parameters</span></h3>
605
- <div class="sect3">
606
- <h4 id="__span_class_scenario_name_query_parameters_are_added_to_requests_span"><span class="scenario name">Query parameters are added to requests.</span></h4>
607
- <div class="ulist step-list">
608
- <ul>
609
- <li>
610
- <p><strong>Given</strong> a file named "features/params.feature" with:</p>
611
- </li>
612
- </ul>
613
- </div>
614
- <div class="listingblock">
615
- <div class="content">
616
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">Feature: Request query parameters can be specified.
617
- Scenario: A single parameter is appended to the URL.
618
- Given expected GET sent to `/query?foo=bar`
619
-
620
- When the request query parameter `foo` is assigned `bar`
621
- And a GET is sent to `/query`
622
-
623
- Then expected calls are verified
624
-
625
- Scenario: Multiple parameters are appended to the URL with proper formatting.
626
- Given expected GET sent to `/query?foo=bar&amp;baz=1`
627
-
628
- When the request query parameter `foo` is assigned `bar`
629
- And the request query parameter `baz` is assigned `1`
630
- And a GET is sent to `/query`
631
-
632
- Then expected calls are verified
633
-
634
- Scenario Outline: Values are encoded appropriately.
635
- Given expected GET sent to `/query?foo=&lt;encoded&gt;`
636
-
637
- When the request query parameter `foo` is assigned `&lt;input&gt;`
638
- And a GET is sent to `/query`
639
-
640
- Then expected calls are verified
641
- Examples:
642
- | input | encoded |
643
- | bar &amp; grill | bar+%26+grill |
644
- | + + | %2B+%2B |
645
- | (imbalance)) | %28imbalance%29%29 |
646
-
647
- Scenario Outline: Parametes are added regardless of HTTP method.
648
- Given expected &lt;method&gt; sent to `/query?foo=bar`
649
-
650
- When the request query parameter `foo` is assigned `bar`
651
- And a &lt;method&gt; is sent to `/query`
652
-
653
- Then expected calls are verified
654
- Examples:
655
- | method |
656
- | POST |
657
- | PUT |
658
- | DELETE |
659
- | HEAD |
660
- | OPTIONS |</code></pre>
661
- </div>
662
- </div>
663
- <div class="ulist">
664
- <ul>
665
- <li>
666
- <p><strong>When</strong> I run <code>cucumber features/params.feature</code></p>
667
- </li>
668
- <li>
669
- <p><strong>Then</strong> the output should contain:</p>
670
- </li>
671
- </ul>
672
- </div>
673
- <div class="listingblock">
674
- <div class="content">
675
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">10 passed</code></pre>
676
- </div>
677
- </div>
678
- <div class="ulist">
679
- <ul>
680
- <li>
681
- <p><strong>And</strong> it should pass</p>
682
- </li>
683
- </ul>
684
- </div>
685
- </div>
686
- </div>
687
- <div class="sect2">
688
- <h3 id="__span_class_feature_name_adding_headers_span"><span class="feature name">Adding Headers</span></h3>
689
- <div class="sect3">
690
- <h4 id="__span_class_scenario_name_headers_are_added_to_requests_span"><span class="scenario name">Headers are added to requests.</span></h4>
691
- <div class="ulist step-list">
692
- <ul>
693
- <li>
694
- <p><strong>Given</strong> a file named "features/headers.feature" with:</p>
695
- </li>
696
- </ul>
697
- </div>
698
- <div class="listingblock">
699
- <div class="content">
700
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">Feature: Request headers can be specified.
701
- Scenario: A new header with a single value is added to request.
702
- Given expected request headers:
703
- """
704
- {"foo":"bar"}
705
- """
706
- And expected GET sent to `/query`
707
-
708
- When the request header `foo` is assigned `bar`
709
- And a GET is sent to `/query`
710
-
711
- Then expected calls are verified
712
-
713
- Scenario: Default headers are present in requests.
714
- Given expected request headers:
715
- """
716
- {"Content-Type": "application/json"}
717
- """
718
- And expected GET sent to `/query`
719
-
720
- When a GET is sent to `/query`
721
-
722
- Then expected calls are verified
723
-
724
- Scenario: Default headers can be overridden.
725
- Given expected request headers:
726
- """
727
- {"Content-Type": "text/plain"}
728
- """
729
- And expected GET sent to `/query`
730
-
731
- When the request header `Content-Type` is assigned `text/plain`
732
- And a GET is sent to `/query`
733
-
734
- Then expected calls are verified
735
-
736
- Scenario: Array header values are added to requests.
737
- Given expected request headers:
738
- """
739
- {"X-Array": "1, 2, 3"}
740
- """
741
- And expected GET sent to `/query`
742
-
743
- When the request header `X-Array` is assigned `[1, 2, 3]`
744
- And a GET is sent to `/query`
745
-
746
- Then expected calls are verified
747
-
748
- Scenario: The last set value for a given header wins.
749
- Given expected request headers:
750
- """
751
- {"foo":"baz"}
752
- """
753
- And expected GET sent to `/query`
754
-
755
- When the request header `foo` is assigned `bar`
756
- And the request header `foo` is assigned `baz`
757
- And a GET is sent to `/query`
758
-
759
- Then expected calls are verified
760
-
761
- Scenario Outline: Header is added regardless of HTTP method.
762
- Given expected request headers:
763
- """
764
- {"foo":"bar"}
765
- """
766
- And expected &lt;method&gt; sent to `/query`
767
-
768
- When the request header `foo` is assigned `bar`
769
- And a &lt;method&gt; is sent to `/query`
770
-
771
- Then expected calls are verified
772
-
773
- Examples:
774
- | method |
775
- | POST |
776
- | PUT |
777
- | DELETE |
778
- | HEAD |
779
- | OPTIONS |</code></pre>
780
- </div>
781
- </div>
782
- <div class="ulist">
783
- <ul>
784
- <li>
785
- <p><strong>When</strong> I run <code>cucumber features/headers.feature</code></p>
786
- </li>
787
- <li>
788
- <p><strong>Then</strong> the output should contain:</p>
789
- </li>
790
- </ul>
791
- </div>
792
- <div class="listingblock">
793
- <div class="content">
794
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">10 passed</code></pre>
795
- </div>
796
- </div>
797
- <div class="ulist">
798
- <ul>
799
- <li>
800
- <p><strong>And</strong> it should pass</p>
801
- </li>
802
- </ul>
803
- </div>
804
- </div>
805
- </div>
806
- <div class="sect2">
807
- <h3 id="__span_class_feature_name_cleared_after_sent_span"><span class="feature name">Cleared After Sent</span></h3>
808
- <div class="paragraph">
809
- <p>After a request is sent, any values that were added to that request
810
- are cleared and will not be present in subsequent requests.</p>
811
- </div>
812
- <div class="sect3">
813
- <h4 id="__span_class_scenario_name_request_is_cleared_before_second_send_span"><span class="scenario name">Request is Cleared Before Second Send</span></h4>
814
- <div class="ulist step-list">
815
- <ul>
816
- <li>
817
- <p><strong>Given</strong> a file named "features/request_clearing.feature" with:</p>
818
- </li>
819
- </ul>
820
- </div>
821
- <div class="listingblock">
822
- <div class="content">
823
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">Feature: Clearing the request.
824
- Scenario: Request body is cleared.
825
- Given expected request body:
826
- """
827
- {"request":1}
828
- """
829
- And expected PUT sent to `/profile`
830
- Given expected request body:
831
- """
832
- """
833
- And expected PUT sent to `/store`
834
-
835
- When the request body is assigned:
836
- """
837
- {"request":1}
838
- """
839
- And a PUT is sent to `/profile`
840
- And a PUT is sent to `/store`
841
-
842
- Then expected calls are verified
843
-
844
- Scenario: Request parameter
845
- Given expected GET sent to `/query?foo=bar`
846
- And expected GET sent to `/resource`
847
-
848
- Given the request query parameter `foo` is assigned `bar`
849
- And a GET is sent to `/query`
850
-
851
- When a GET is sent to `/resource`
852
- Then expected calls are verified</code></pre>
853
- </div>
854
- </div>
855
- <div class="ulist">
856
- <ul>
857
- <li>
858
- <p><strong>When</strong> I run <code>cucumber features/request_clearing.feature</code></p>
859
- </li>
860
- <li>
861
- <p><strong>Then</strong> the output should contain:</p>
862
- </li>
863
- </ul>
864
- </div>
865
- <div class="listingblock">
866
- <div class="content">
867
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">2 passed</code></pre>
868
- </div>
869
- </div>
870
- <div class="ulist">
871
- <ul>
872
- <li>
873
- <p><strong>And</strong> it should pass</p>
874
- </li>
875
- </ul>
876
- </div>
877
- </div>
878
- </div>
879
- </div>
880
- </div>
881
- <div class="sect1">
882
- <h2 id="_resource_cleanup">Resource Cleanup</h2>
883
- <div class="sectionbody">
884
- <div class="sect2">
885
- <h3 id="__span_class_feature_name_resource_cleanup_span"><span class="feature name">Resource Cleanup</span></h3>
886
- <div class="paragraph">
887
- <p>Resources created during testing can be marked for deletion.</p>
888
- </div>
889
- <div class="sect3">
890
- <h4 id="__span_class_scenario_name_initial_success_span"><span class="scenario name">Initial Success</span></h4>
891
- <div class="ulist step-list">
892
- <ul>
893
- <li>
894
- <p><strong>Given</strong> a file named "features/cleanup.feature" with:</p>
895
- </li>
896
- </ul>
897
- </div>
898
- <div class="listingblock">
899
- <div class="content">
900
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">Feature: Resource Cleanup
901
-
902
- Scenario: Successful Basic Deletion
903
- Given expected DELETE sent to `/some/path`
904
-
905
- When a resource is created at `/some/path`</code></pre>
906
- </div>
907
- </div>
908
- <div class="ulist">
909
- <ul>
910
- <li>
911
- <p><strong>When</strong> I run <code>cucumber --strict features/cleanup.feature</code></p>
912
- </li>
913
- <li>
914
- <p><strong>Then</strong> the output should match %r&lt;delete <a href="http://www.example.com/some/path&gt" class="bare">http://www.example.com/some/path&gt</a>;</p>
915
- </li>
916
- <li>
917
- <p><strong>And</strong> the output should not contain:</p>
918
- </li>
919
- </ul>
920
- </div>
921
- <div class="listingblock">
922
- <div class="content">
923
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">ERROR</code></pre>
924
- </div>
925
- </div>
926
- <div class="ulist">
927
- <ul>
928
- <li>
929
- <p><strong>And</strong> it should pass</p>
930
- </li>
931
- </ul>
932
- </div>
933
- </div>
934
- <div class="sect3">
935
- <h4 id="__span_class_scenario_name_returned_4xx_span"><span class="scenario name">Returned 4xx</span></h4>
936
- <div class="ulist step-list">
937
- <ul>
938
- <li>
939
- <p><strong>Given</strong> a file named "features/cleanup_failure.feature" with:</p>
940
- </li>
941
- </ul>
942
- </div>
943
- <div class="listingblock">
944
- <div class="content">
945
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">Feature: Resource Cleanup
946
-
947
- Scenario: Failed Deletion
948
- Given expected response status of `409`
949
- And expected DELETE sent to `/some/path`
950
-
951
- When a resource is created at `/some/path`</code></pre>
952
- </div>
953
- </div>
954
- <div class="ulist">
955
- <ul>
956
- <li>
957
- <p><strong>When</strong> I run <code>cucumber --strict features/cleanup_failure.feature</code></p>
958
- </li>
959
- <li>
960
- <p><strong>Then</strong> the output should match %r&lt;(?:.<strong>delete <a href="http://www.example.com/some/path" class="bare">http://www.example.com/some/path</a>.</strong>){3}&gt;</p>
961
- </li>
962
- <li>
963
- <p><strong>And</strong> the output should contain:</p>
964
- </li>
965
- </ul>
966
- </div>
967
- <div class="listingblock">
968
- <div class="content">
969
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">ERROR</code></pre>
970
- </div>
971
- </div>
972
- <div class="ulist">
973
- <ul>
974
- <li>
975
- <p><strong>And</strong> it should pass</p>
976
- </li>
977
- </ul>
978
- </div>
979
- </div>
980
- <div class="sect3">
981
- <h4 id="__span_class_scenario_name_success_upon_retry_span"><span class="scenario name">Success Upon Retry</span></h4>
982
- <div class="ulist step-list">
983
- <ul>
984
- <li>
985
- <p><strong>Given</strong> a file named "features/cleanup_retried.feature" with:</p>
986
- </li>
987
- </ul>
988
- </div>
989
- <div class="listingblock">
990
- <div class="content">
991
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">Feature: Resource Cleanup
992
-
993
- Scenario: Success Upon Retry
994
- Given expected response status sequence of `[504, 200]`
995
- And expected DELETE sent to `/some/path`
996
-
997
- When a resource is created at `/some/path`</code></pre>
998
- </div>
999
- </div>
1000
- <div class="ulist">
1001
- <ul>
1002
- <li>
1003
- <p><strong>When</strong> I run <code>cucumber --strict -o ../../out.log features/cleanup_retried.feature</code></p>
1004
- </li>
1005
- <li>
1006
- <p><strong>Then</strong> the output should match %r&lt;(?:.<strong>delete <a href="http://www.example.com/some/path" class="bare">http://www.example.com/some/path</a>.</strong>){2}&gt;</p>
1007
- </li>
1008
- <li>
1009
- <p><strong>And</strong> the output should not contain:</p>
1010
- </li>
1011
- </ul>
1012
- </div>
1013
- <div class="listingblock">
1014
- <div class="content">
1015
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">ERROR</code></pre>
1016
- </div>
1017
- </div>
1018
- <div class="ulist">
1019
- <ul>
1020
- <li>
1021
- <p><strong>And</strong> it should pass</p>
1022
- </li>
1023
- </ul>
1024
- </div>
1025
- </div>
1026
- <div class="sect3">
1027
- <h4 id="__span_class_scenario_name_unreached_success_span"><span class="scenario name">Unreached Success</span></h4>
1028
- <div class="ulist step-list">
1029
- <ul>
1030
- <li>
1031
- <p><strong>Given</strong> a file named "features/cleanup_unreached.feature" with:</p>
1032
- </li>
1033
- </ul>
1034
- </div>
1035
- <div class="listingblock">
1036
- <div class="content">
1037
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">Feature: Resource Cleanup
1038
-
1039
- Scenario: Unreached Success
1040
- Given expected response status sequence of `[504, 504, 504, 200]`
1041
- And expected DELETE sent to `/some/path`
1042
-
1043
- When a resource is created at `/some/path`</code></pre>
1044
- </div>
1045
- </div>
1046
- <div class="ulist">
1047
- <ul>
1048
- <li>
1049
- <p><strong>When</strong> I run <code>cucumber --strict -o ../../out.log features/cleanup_unreached.feature</code></p>
1050
- </li>
1051
- <li>
1052
- <p><strong>Then</strong> the output should match %r&lt;(?:.<strong>delete <a href="http://www.example.com/some/path" class="bare">http://www.example.com/some/path</a>.</strong>){3}&gt;</p>
1053
- </li>
1054
- <li>
1055
- <p><strong>And</strong> the output should contain:</p>
1056
- </li>
1057
- </ul>
1058
- </div>
1059
- <div class="listingblock">
1060
- <div class="content">
1061
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">ERROR</code></pre>
1062
- </div>
1063
- </div>
1064
- <div class="ulist">
1065
- <ul>
1066
- <li>
1067
- <p><strong>And</strong> it should pass</p>
1068
- </li>
1069
- </ul>
1070
- </div>
1071
- </div>
1072
- </div>
1073
- </div>
1074
- </div>
1075
- <div class="sect1">
1076
- <h2 id="_assignment">Assignment</h2>
1077
- <div class="sectionbody">
1078
- <div class="sect2">
1079
- <h3 id="__span_class_feature_name_a_parameter_span"><span class="feature name">A Parameter</span></h3>
1080
- <div class="paragraph">
1081
- <p>An identifier can be assigned the value of the provided parameter.</p>
1082
- </div>
1083
- <div class="sect3">
1084
- <h4 id="__span_class_scenario_name_parameter_assignment_span"><span class="scenario name">Parameter assignment.</span></h4>
1085
- <div class="ulist step-list">
1086
- <ul>
1087
- <li>
1088
- <p><strong>Given</strong> a file named "features/parameter.feature" with:</p>
1089
- </li>
1090
- </ul>
1091
- </div>
1092
- <div class="listingblock">
1093
- <div class="content">
1094
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">Feature: Parameter Assignment.
1095
- Scenario: Simple assignment.
1096
- Given `foo` is assigned `bar`
1097
- When the response body is assigned `{{ foo }}`
1098
- Then the value of the response body is equal to `bar`</code></pre>
1099
- </div>
1100
- </div>
1101
- <div class="ulist">
1102
- <ul>
1103
- <li>
1104
- <p><strong>When</strong> I run <code>cucumber --strict features/parameter.feature</code></p>
1105
- </li>
1106
- <li>
1107
- <p><strong>Then</strong> the output should contain:</p>
1108
- </li>
1109
- </ul>
1110
- </div>
1111
- <div class="listingblock">
1112
- <div class="content">
1113
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">1 passed</code></pre>
1114
- </div>
1115
- </div>
1116
- <div class="ulist">
1117
- <ul>
1118
- <li>
1119
- <p><strong>And</strong> it should pass</p>
1120
- </li>
1121
- </ul>
1122
- </div>
1123
- </div>
1124
- </div>
1125
- <div class="sect2">
1126
- <h3 id="__span_class_feature_name_a_random_string_span"><span class="feature name">A Random String</span></h3>
1127
- <div class="paragraph">
1128
- <p>An identifier can be assigned a random string with decent entropy.</p>
1129
- </div>
1130
- <div class="sect3">
1131
- <h4 id="__span_class_scenario_name_random_string_assignment_span"><span class="scenario name">Random string assignment.</span></h4>
1132
- <div class="ulist step-list">
1133
- <ul>
1134
- <li>
1135
- <p><strong>Given</strong> a file named "features/random.feature" with:</p>
1136
- </li>
1137
- </ul>
1138
- </div>
1139
- <div class="listingblock">
1140
- <div class="content">
1141
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">Feature: Random Assignment.
1142
- Scenario: Several unique variables.
1143
- Given `v1` is assigned a random string
1144
- And `v2` is assigned a random string
1145
- And `v3` is assigned a random string
1146
- When the response body is assigned `[ "{{ v1 }}","{{ v2 }}","{{ v3 }}" ]`
1147
- Then the value of the response body does not have any element that is empty
1148
- And the value of the response body child `.[0]` is equal to `{{ v1 }}`
1149
- And the value of the response body children `.[1:2]` does not have any element that is equal to `{{ v1 }}`
1150
- And the value of the response body child `.[2]` is not equal to `{{ v2 }}`</code></pre>
1151
- </div>
1152
- </div>
1153
- <div class="ulist">
1154
- <ul>
1155
- <li>
1156
- <p><strong>When</strong> I run <code>cucumber --strict features/random.feature</code></p>
1157
- </li>
1158
- <li>
1159
- <p><strong>Then</strong> the output should contain:</p>
1160
- </li>
1161
- </ul>
1162
- </div>
1163
- <div class="listingblock">
1164
- <div class="content">
1165
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">8 passed</code></pre>
1166
- </div>
1167
- </div>
1168
- <div class="ulist">
1169
- <ul>
1170
- <li>
1171
- <p><strong>And</strong> it should pass</p>
1172
- </li>
1173
- </ul>
1174
- </div>
1175
- </div>
1176
- </div>
1177
- <div class="sect2">
1178
- <h3 id="__span_class_feature_name_a_timestamp_span"><span class="feature name">A Timestamp</span></h3>
1179
- <div class="paragraph">
1180
- <p>An identifier can be assigned a current timestamp.</p>
1181
- </div>
1182
- <div class="sect3">
1183
- <h4 id="__span_class_scenario_name_timestamp_assignment_span"><span class="scenario name">Timestamp assignment.</span></h4>
1184
- <div class="ulist step-list">
1185
- <ul>
1186
- <li>
1187
- <p><strong>Given</strong> a file named "features/timestamp.feature" with:</p>
1188
- </li>
1189
- </ul>
1190
- </div>
1191
- <div class="listingblock">
1192
- <div class="content">
1193
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">Feature: Timestamp Assignment.
1194
- Scenario: Newer than some old date.
1195
- Given `v1` is assigned a timestamp
1196
- When the response body is assigned `{{ v1 }}`
1197
- Then value of the response body is greater than `2018-06-17T12:00:00Z`
1198
-
1199
- Scenario: Values increase.
1200
- Given `v1` is assigned a timestamp
1201
- When the response body is assigned `{{ v1 }}`
1202
- Then the value of the response body is not empty
1203
-
1204
- When `v2` is assigned a timestamp
1205
- And the response body is assigned `{{ v2 }}`
1206
- Then the value of the response body is greater than or equal to `{{ v1 }}`
1207
-
1208
- When `v3` is assigned a timestamp
1209
- And the response body is assigned `{{ v3 }}`
1210
- Then the value of the response body is greater than or equal to `{{ v1 }}`
1211
- And the value of the response body is greater than or equal to `{{ v2 }}`</code></pre>
1212
- </div>
1213
- </div>
1214
- <div class="ulist">
1215
- <ul>
1216
- <li>
1217
- <p><strong>When</strong> I run <code>cucumber --strict features/timestamp.feature</code></p>
1218
- </li>
1219
- <li>
1220
- <p><strong>Then</strong> the output should contain:</p>
1221
- </li>
1222
- </ul>
1223
- </div>
1224
- <div class="listingblock">
1225
- <div class="content">
1226
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">2 passed</code></pre>
1227
- </div>
1228
- </div>
1229
- </div>
1230
- </div>
1231
- <div class="sect2">
1232
- <h3 id="__span_class_feature_name_a_value_from_a_response_attribute_span"><span class="feature name">A Value From A Response Attribute.</span></h3>
1233
- <div class="paragraph">
1234
- <p>An identifier can be assigned a value extracted from a response attribute.</p>
1235
- </div>
1236
- <div class="sect3">
1237
- <h4 id="__span_class_scenario_name_assorted_attribute_extractions_span"><span class="scenario name">Assorted attribute extractions.</span></h4>
1238
- <div class="ulist step-list">
1239
- <ul>
1240
- <li>
1241
- <p><strong>Given</strong> a file named "features/response_attribute.feature" with:</p>
1242
- </li>
1243
- </ul>
1244
- </div>
1245
- <div class="listingblock">
1246
- <div class="content">
1247
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">Feature: Reponse Attribute Path Assignment.
1248
- Scenario: Response body.
1249
- Given the response body is assigned `foo`
1250
- When `myVar` is assigned the response body
1251
- And the response body is assigned `{{ myVar }}`
1252
- Then the value of the response body is equal to `foo`
1253
-
1254
- Scenario: Response body child.
1255
- Given the response body is assigned `{"response": "foo"}`
1256
- When `myVar` is assigned the response body child `.response`
1257
- And the response body is assigned `{{ myVar }}`
1258
- Then the value of the response body is equal to `foo`
1259
-
1260
- Scenario: Response body children.
1261
- Given the response body is assigned `{"response": "foo"}`
1262
- When `myVar` is assigned the response body children `.response`
1263
- And the response body is assigned `{{{ myVar }}}`
1264
- Then the value of the response body is equal to `["foo"]`</code></pre>
1265
- </div>
1266
- </div>
1267
- <div class="ulist">
1268
- <ul>
1269
- <li>
1270
- <p><strong>When</strong> I run <code>cucumber --strict features/response_attribute.feature</code></p>
1271
- </li>
1272
- <li>
1273
- <p><strong>Then</strong> the output should contain:</p>
1274
- </li>
1275
- </ul>
1276
- </div>
1277
- <div class="listingblock">
1278
- <div class="content">
1279
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">3 passed</code></pre>
1280
- </div>
1281
- </div>
1282
- <div class="ulist">
1283
- <ul>
1284
- <li>
1285
- <p><strong>And</strong> it should pass</p>
1286
- </li>
1287
- </ul>
1288
- </div>
1289
- </div>
1290
- </div>
1291
- </div>
1292
- </div>
1293
- <div class="sect1">
1294
- <h2 id="_selection">Selection</h2>
1295
- <div class="sectionbody">
1296
- <div class="sect2">
1297
- <h3 id="__span_class_feature_name_any_element_span"><span class="feature name">Any Element</span></h3>
1298
- <div class="paragraph">
1299
- <p>Assertions can be done against any element of a structure.</p>
1300
- </div>
1301
- <div class="sect3">
1302
- <h4 id="__span_class_scenario_name_assorted_positive_and_negative_assertions_span"><span class="scenario name">Assorted positive and negative assertions.</span></h4>
1303
- <div class="ulist step-list">
1304
- <ul>
1305
- <li>
1306
- <p><strong>Given</strong> a file named "features/any.feature" with:</p>
1307
- </li>
1308
- </ul>
1309
- </div>
1310
- <div class="listingblock">
1311
- <div class="content">
1312
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">Feature: Allow selection of any structure element
1313
- Scenario: List in response body
1314
- When the response body is assigned:
1315
- """
1316
- ["a", "b", "c"]
1317
- """
1318
- Then the value of the response body does have any element that is equal to `a`
1319
- And the value of the response body does not have any element that is equal to `d`
1320
-
1321
- Scenario: Nested list in response body
1322
- When the response body is assigned:
1323
- """
1324
- {"letters": ["a", "b", "c"]}
1325
- """
1326
- Then the value of the response body child `letters` does have any element that is equal to `a`
1327
- And the value of the response body child `letters` does not have any element that is equal to `d`
1328
-
1329
- Scenario: Map matches entries
1330
- When the response body is assigned:
1331
- """
1332
- {"a": 1, "b": 2}
1333
- """
1334
- #Equality will match keys
1335
- Then the value of the response body does have any element that is equal to `a`
1336
- And the value of the response body does not have any element that is equal to `d`
1337
-
1338
- Scenario: Spread nested lists
1339
- When the response body is assigned:
1340
- """
1341
- [{"val":"foo"},{"val":"bar"}]
1342
- """
1343
- Then the value of the response body children `..val` does have any element that is equal to `foo`
1344
- And the value of the response body children `..val` does not have any element that is equal to `other`</code></pre>
1345
- </div>
1346
- </div>
1347
- <div class="ulist">
1348
- <ul>
1349
- <li>
1350
- <p><strong>When</strong> I run <code>cucumber --strict features/any.feature</code></p>
1351
- </li>
1352
- <li>
1353
- <p><strong>Then</strong> the output should contain:</p>
1354
- </li>
1355
- </ul>
1356
- </div>
1357
- <div class="listingblock">
1358
- <div class="content">
1359
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">4 passed</code></pre>
1360
- </div>
1361
- </div>
1362
- <div class="ulist">
1363
- <ul>
1364
- <li>
1365
- <p><strong>And</strong> it should pass</p>
1366
- </li>
1367
- </ul>
1368
- </div>
1369
- </div>
1370
- </div>
1371
- <div class="sect2">
1372
- <h3 id="__span_class_feature_name_all_elements_span"><span class="feature name">All Elements</span></h3>
1373
- <div class="paragraph">
1374
- <p>Assertions can be done against all elements of a structure.</p>
1375
- </div>
1376
- <div class="sect3">
1377
- <h4 id="__span_class_scenario_name_assorted_positive_and_negative_assertions_span_2"><span class="scenario name">Assorted positive and negative assertions.</span></h4>
1378
- <div class="ulist step-list">
1379
- <ul>
1380
- <li>
1381
- <p><strong>Given</strong> a file named "features/all.feature" with:</p>
1382
- </li>
1383
- </ul>
1384
- </div>
1385
- <div class="listingblock">
1386
- <div class="content">
1387
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">Feature: Allow selection of all structure elements
1388
- Scenario: List in response body
1389
- When the response body is assigned:
1390
- """
1391
- ["a", "bb", "ccc"]
1392
- """
1393
- Then the value of the response body has elements which are all matching `/\w+/`
1394
-
1395
- Scenario: Spread nested lists
1396
- When the response body is assigned:
1397
- """
1398
- [{"val": "foo"},{"val": "foo"}]
1399
- """
1400
- Then the value of the response body children `..val` has elements which are all equal to `foo`</code></pre>
1401
- </div>
1402
- </div>
1403
- <div class="ulist">
1404
- <ul>
1405
- <li>
1406
- <p><strong>When</strong> I run <code>cucumber --strict features/all.feature</code></p>
1407
- </li>
1408
- <li>
1409
- <p><strong>Then</strong> the output should contain:</p>
1410
- </li>
1411
- </ul>
1412
- </div>
1413
- <div class="listingblock">
1414
- <div class="content">
1415
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">4 passed</code></pre>
1416
- </div>
1417
- </div>
1418
- <div class="ulist">
1419
- <ul>
1420
- <li>
1421
- <p><strong>And</strong> it should pass</p>
1422
- </li>
1423
- </ul>
1424
- </div>
1425
- </div>
1426
- <div class="sect3">
1427
- <h4 id="__span_class_scenario_name_failing_tests_since_negation_isn_t_available_yet_span"><span class="scenario name">Failing tests since negation isn&#8217;t available yet.</span></h4>
1428
- <div class="ulist step-list">
1429
- <ul>
1430
- <li>
1431
- <p><strong>Given</strong> a file named "features/all.feature" with:</p>
1432
- </li>
1433
- </ul>
1434
- </div>
1435
- <div class="listingblock">
1436
- <div class="content">
1437
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">Feature: Allow selection of all structure elements
1438
- Scenario: List in response body
1439
- When the response body is assigned:
1440
- """
1441
- ["a", "bb", "ccc"]
1442
- """
1443
- Then the value of the response body has elements which are all matching `/^\w$/`
1444
-
1445
- Scenario: Spread nested lists
1446
- When the response body is assigned:
1447
- """
1448
- [{"val": "foo"},{"val": "fob"}]
1449
- """
1450
- Then the value of the response body children `..val` has elements which are all equal to `foo`</code></pre>
1451
- </div>
1452
- </div>
1453
- <div class="ulist">
1454
- <ul>
1455
- <li>
1456
- <p><strong>When</strong> I run <code>cucumber --strict features/all.feature</code></p>
1457
- </li>
1458
- <li>
1459
- <p><strong>Then</strong> the output should contain:</p>
1460
- </li>
1461
- </ul>
1462
- </div>
1463
- <div class="listingblock">
1464
- <div class="content">
1465
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">2 failed</code></pre>
1466
- </div>
1467
- </div>
1468
- </div>
1469
- </div>
1470
- </div>
1471
- </div>
1472
- <div class="sect1">
1473
- <h2 id="_assertion">Assertion</h2>
1474
- <div class="sectionbody">
1475
- <div class="sect2">
1476
- <h3 id="__span_class_feature_name_equal_to_span"><span class="feature name">Equal to</span></h3>
1477
- <div class="paragraph">
1478
- <p>It can be asserted that a value is equal to another value.</p>
1479
- </div>
1480
- <div class="sect3">
1481
- <h4 id="__span_class_scenario_name_assorted_positive_and_negative_assertions_pass_span"><span class="scenario name">Assorted positive and negative assertions pass.</span></h4>
1482
- <div class="ulist step-list">
1483
- <ul>
1484
- <li>
1485
- <p><strong>Given</strong> a file named "features/is_equal_to.feature" with:</p>
1486
- </li>
1487
- </ul>
1488
- </div>
1489
- <div class="listingblock">
1490
- <div class="content">
1491
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">Feature: Assert value equality
1492
- Scenario: String in response body
1493
- When the response body is assigned:
1494
- """
1495
- foo
1496
- """
1497
- Then the value of the response body is equal to `foo`
1498
- And the value of the response body is not equal to `foot`
1499
-
1500
- Scenario: Response Status
1501
- When the response status is assigned `404`
1502
- Then the value of the response status is equal to `404`
1503
- And the value of the response status is not equal to `200`
1504
-
1505
- Scenario: Object in response body
1506
- When the response body is assigned:
1507
- """
1508
- {
1509
- "foo": "bar"
1510
- }
1511
- """
1512
- Then the value of the response body is equal to:
1513
- """
1514
- {"foo":"bar"}
1515
- """
1516
- And the value of the response body is not equal to:
1517
- """
1518
- {"foo": "baz"}
1519
- """
1520
-
1521
- Scenario: List in response body
1522
- When the response body is assigned `[1, "foo", true]`
1523
- Then the value of the response body is equal to `[1, "foo", true]`
1524
- And the value of the response body is not equal to `[1, "bar", true]`
1525
-
1526
- Scenario Outline: Objects must match completely
1527
- When the response body is assigned `{"foo": "bar", "baz": 1}`
1528
- Then the value of the response body is not equal to `&lt;comparison&gt;`
1529
-
1530
- Examples:
1531
- | comparison |
1532
- | {} |
1533
- | {"foo": "bar"} |
1534
- | {"foo": "bar", "baz": 1, "extra": 2} |
1535
- | {"foo": "bar", "baz": 2} |</code></pre>
1536
- </div>
1537
- </div>
1538
- <div class="ulist">
1539
- <ul>
1540
- <li>
1541
- <p><strong>When</strong> I run <code>cucumber --strict features/is_equal_to.feature</code></p>
1542
- </li>
1543
- <li>
1544
- <p><strong>Then</strong> the output should contain:</p>
1545
- </li>
1546
- </ul>
1547
- </div>
1548
- <div class="listingblock">
1549
- <div class="content">
1550
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">8 passed</code></pre>
1551
- </div>
1552
- </div>
1553
- <div class="ulist">
1554
- <ul>
1555
- <li>
1556
- <p><strong>And</strong> it should pass</p>
1557
- </li>
1558
- </ul>
1559
- </div>
1560
- </div>
1561
- </div>
1562
- <div class="sect2">
1563
- <h3 id="__span_class_feature_name_matching_span"><span class="feature name">Matching</span></h3>
1564
- <div class="paragraph">
1565
- <p>It can be asserted that a value matches another string or regex.</p>
1566
- </div>
1567
- <div class="sect3">
1568
- <h4 id="__span_class_scenario_name_assorted_positive_and_negative_assertions_span_3"><span class="scenario name">Assorted positive and negative assertions.</span></h4>
1569
- <div class="ulist step-list">
1570
- <ul>
1571
- <li>
1572
- <p><strong>Given</strong> a file named "features/is_matching.feature" with:</p>
1573
- </li>
1574
- </ul>
1575
- </div>
1576
- <div class="listingblock">
1577
- <div class="content">
1578
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">Feature: Assert value matchiness.
1579
- Scenario: String in response body is matched against a regex.
1580
- When the response body is assigned:
1581
- """
1582
- http://www.github.com?var=val
1583
- """
1584
- Then the value of the response body is matching `/github/`
1585
- And the value of the response body is matching `/git.*\?.*=/`
1586
- And the value of the response body is not matching `/gh/`
1587
- And the value of the response body is not matching `/^github/`
1588
-
1589
- Scenario: Regex in response body matched against a string
1590
- When the response body is assigned:
1591
- """
1592
- /(.+)\1/
1593
- """
1594
- Then the value of the response body is matching `blahblah`
1595
- And the value of the response body is matching `boo`
1596
- And the value of the response body is not matching `blah blah`
1597
- And the value of the response body is not matching `blah`</code></pre>
1598
- </div>
1599
- </div>
1600
- <div class="ulist">
1601
- <ul>
1602
- <li>
1603
- <p><strong>When</strong> I run <code>cucumber --strict features/is_matching.feature</code></p>
1604
- </li>
1605
- <li>
1606
- <p><strong>Then</strong> the output should contain:</p>
1607
- </li>
1608
- </ul>
1609
- </div>
1610
- <div class="listingblock">
1611
- <div class="content">
1612
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">2 passed</code></pre>
1613
- </div>
1614
- </div>
1615
- <div class="ulist">
1616
- <ul>
1617
- <li>
1618
- <p><strong>And</strong> it should pass</p>
1619
- </li>
1620
- </ul>
1621
- </div>
1622
- </div>
1623
- </div>
1624
- <div class="sect2">
1625
- <h3 id="__span_class_feature_name_including_span"><span class="feature name">Including</span></h3>
1626
- <div class="paragraph">
1627
- <p>It can be asserted that a value is a superset of another value.</p>
1628
- </div>
1629
- <div class="sect3">
1630
- <h4 id="__span_class_scenario_name_includes_span"><span class="scenario name">Includes</span></h4>
1631
- <div class="ulist step-list">
1632
- <ul>
1633
- <li>
1634
- <p><strong>Given</strong> a file named "features/includes.feature" with:</p>
1635
- </li>
1636
- </ul>
1637
- </div>
1638
- <div class="listingblock">
1639
- <div class="content">
1640
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">Feature: Includes
1641
- Scenario: Basic object membership
1642
- When the response body is assigned:
1643
- """
1644
- {"foo":"bar",
1645
- "baz": 1,
1646
- "other": "blah"}
1647
- """
1648
- Then the value of the response body is including:
1649
- """
1650
- {"baz":1}
1651
- """
1652
- And the value of the response body is not including:
1653
- """
1654
- {"missing":"value"}
1655
- """
1656
- And the value of the response body is including `other`
1657
- And the value of the response body is not including `brother`
1658
- And the value of the response body is not including `value`</code></pre>
1659
- </div>
1660
- </div>
1661
- <div class="ulist">
1662
- <ul>
1663
- <li>
1664
- <p><strong>When</strong> I run <code>cucumber features/includes.feature</code></p>
1665
- </li>
1666
- <li>
1667
- <p><strong>Then</strong> the output should contain:</p>
1668
- </li>
1669
- </ul>
1670
- </div>
1671
- <div class="listingblock">
1672
- <div class="content">
1673
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">1 passed</code></pre>
1674
- </div>
1675
- </div>
1676
- <div class="ulist">
1677
- <ul>
1678
- <li>
1679
- <p><strong>And</strong> it should pass</p>
1680
- </li>
1681
- </ul>
1682
- </div>
1683
- </div>
1684
- </div>
1685
- <div class="sect2">
1686
- <h3 id="__span_class_feature_name_empty_span"><span class="feature name">Empty</span></h3>
1687
- <div class="paragraph">
1688
- <p>It can be asserted that a value is empty.</p>
1689
- </div>
1690
- <div class="sect3">
1691
- <h4 id="__span_class_scenario_name_assorted_positive_and_negative_assertions_pass_span_2"><span class="scenario name">Assorted positive and negative assertions pass.</span></h4>
1692
- <div class="ulist step-list">
1693
- <ul>
1694
- <li>
1695
- <p><strong>Given</strong> a file named "features/is_empty.feature" with:</p>
1696
- </li>
1697
- </ul>
1698
- </div>
1699
- <div class="listingblock">
1700
- <div class="content">
1701
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">Feature: Assert emptiness for multiple types.
1702
- Scenario: Empty body is empty.
1703
- When the response body is assigned ``
1704
- Then the value of the response body is empty
1705
-
1706
- Scenario: Whitespace-only body is empty.
1707
- When the response body is assigned:
1708
- """
1709
-
1710
- """
1711
- Then the value of the response body is empty
1712
-
1713
- Scenario: Empty string is empty.
1714
- When the response body is assigned `""`
1715
- Then the value of the response body is empty
1716
-
1717
- Scenario: Non-empty string is not empty.
1718
- When the response body is assigned `blah`
1719
- Then the value of the response body is not empty
1720
-
1721
- Scenario: Quoted whitespace is not empty.
1722
- When the response body is assigned `" "`
1723
- Then the value of the response body is not empty
1724
-
1725
- Scenario: Empty arrays are empty.
1726
- When the response body is assigned `[]`
1727
- Then the value of the response body is empty
1728
-
1729
- Scenario: Non-empty arrays are not empty.
1730
- When the response body is assigned `[[]]`
1731
- Then the value of the response body is not empty
1732
-
1733
- Scenario: Empty objects are empty.
1734
- When the response body is assigned `{}`
1735
- Then the value of the response body is empty
1736
-
1737
- Scenario: Non-empty objects are not empty.
1738
- When the response body is assigned `{"foo":{}}`
1739
- Then the value of the response body is not empty
1740
-
1741
- Scenario: Null values are empty.
1742
- When the response body is assigned `{"foo": null}`
1743
- Then the value of the response body child `foo` is empty
1744
-
1745
- Scenario: False is not empty.
1746
- When the response body is assigned `false`
1747
- Then the value of the response body is not empty
1748
-
1749
- Scenario: 0 is not empty.
1750
- When the response body is assigned `0`
1751
- Then the value of the response body is not empty</code></pre>
1752
- </div>
1753
- </div>
1754
- <div class="ulist">
1755
- <ul>
1756
- <li>
1757
- <p><strong>When</strong> I run <code>cucumber --strict features/is_empty.feature</code></p>
1758
- </li>
1759
- <li>
1760
- <p><strong>Then</strong> the output should contain:</p>
1761
- </li>
1762
- </ul>
1763
- </div>
1764
- <div class="listingblock">
1765
- <div class="content">
1766
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">12 passed</code></pre>
1767
- </div>
1768
- </div>
1769
- <div class="ulist">
1770
- <ul>
1771
- <li>
1772
- <p><strong>And</strong> it should pass</p>
1773
- </li>
1774
- </ul>
1775
- </div>
1776
- </div>
1777
- </div>
1778
- <div class="sect2">
1779
- <h3 id="__span_class_feature_name_of_length_span"><span class="feature name">Of Length</span></h3>
1780
- <div class="paragraph">
1781
- <p>It can be asserted that a value has a provided length.</p>
1782
- </div>
1783
- <div class="sect3">
1784
- <h4 id="__span_class_scenario_name_has_length_span"><span class="scenario name">Has Length</span></h4>
1785
- <div class="ulist step-list">
1786
- <ul>
1787
- <li>
1788
- <p><strong>Given</strong> a file named "features/has_length.feature" with:</p>
1789
- </li>
1790
- </ul>
1791
- </div>
1792
- <div class="listingblock">
1793
- <div class="content">
1794
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">Feature: Has Length
1795
- Scenario: String
1796
- When the response body is assigned:
1797
- """
1798
- blah
1799
- """
1800
- Then the value of the response body is of length `4`
1801
-
1802
- Scenario: Array
1803
- When the response body is assigned:
1804
- """
1805
- ["foo", "blah"]
1806
- """
1807
- Then the value of the response body is of length `2`
1808
-
1809
- Scenario: Map
1810
- When the response body is assigned:
1811
- """
1812
- {"foo": "blah"}
1813
- """
1814
- Then the value of the response body is of length `1`
1815
-
1816
- Scenario: Value without length attribute
1817
- When the response body is assigned:
1818
- """
1819
- true
1820
- """
1821
- Then the value of the response body is not of length `1`</code></pre>
1822
- </div>
1823
- </div>
1824
- <div class="ulist">
1825
- <ul>
1826
- <li>
1827
- <p><strong>When</strong> I run <code>cucumber features/has_length.feature</code></p>
1828
- </li>
1829
- <li>
1830
- <p><strong>Then</strong> the output should contain:</p>
1831
- </li>
1832
- </ul>
1833
- </div>
1834
- <div class="listingblock">
1835
- <div class="content">
1836
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">4 passed</code></pre>
1837
- </div>
1838
- </div>
1839
- <div class="ulist">
1840
- <ul>
1841
- <li>
1842
- <p><strong>And</strong> it should pass</p>
1843
- </li>
1844
- </ul>
1845
- </div>
1846
- </div>
1847
- </div>
1848
- <div class="sect2">
1849
- <h3 id="__span_class_feature_name_a_valid_span"><span class="feature name">A valid &#8230;&#8203;</span></h3>
1850
- <div class="sect3">
1851
- <h4 id="__span_class_scenario_name_positive_and_negative_assertions_for_json_types_span"><span class="scenario name">Positive and negative assertions for JSON types.</span></h4>
1852
- <div class="ulist step-list">
1853
- <ul>
1854
- <li>
1855
- <p><strong>Given</strong> a file named "features/is_a_valid.feature" with:</p>
1856
- </li>
1857
- </ul>
1858
- </div>
1859
- <div class="listingblock">
1860
- <div class="content">
1861
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">Feature: Assert type validity
1862
- Scenario: String in response body is only a valid String.
1863
- When the response body is assigned:
1864
- """
1865
- foo
1866
- """
1867
- Then the value of the response body is a valid `String`
1868
- And the value of the response body is not a valid `Number`
1869
- And the value of the response body is not a valid `Integer`
1870
- And the value of the response body is not a valid `Object`
1871
- And the value of the response body is not a valid `Array`
1872
- And the value of the response body is not a valid `Boolean`
1873
-
1874
- Scenario: Integer in response body is a valid Integer and Number.
1875
- When the response body is assigned:
1876
- """
1877
- 1
1878
- """
1879
- Then the value of the response body is not a valid `String`
1880
- And the value of the response body is a valid `Number`
1881
- And the value of the response body is a valid `Integer`
1882
- And the value of the response body is not a valid `Object`
1883
- And the value of the response body is not a valid `Array`
1884
- And the value of the response body is not a valid `Boolean`
1885
-
1886
- Scenario: Quoted Number in response body is only a valid String.
1887
- When the response body is assigned:
1888
- """
1889
- "1"
1890
- """
1891
- Then the value of the response body is a valid `String`
1892
- And the value of the response body is not a valid `Number`
1893
- And the value of the response body is not a valid `Integer`
1894
- And the value of the response body is not a valid `Object`
1895
- And the value of the response body is not a valid `Array`
1896
- And the value of the response body is not a valid `Boolean`
1897
-
1898
- Scenario: Empty Object in response body is only a valid Object.
1899
- When the response body is assigned:
1900
- """
1901
- {}
1902
- """
1903
- Then the value of the response body is not a valid `String`
1904
- And the value of the response body is not a valid `Number`
1905
- And the value of the response body is not a valid `Integer`
1906
- And the value of the response body is a valid `Object`
1907
- And the value of the response body is not a valid `Array`
1908
- And the value of the response body is not a valid `Boolean`
1909
-
1910
- Scenario: Object in response body is only a valid Object.
1911
- When the response body is assigned:
1912
- """
1913
- {"foo": 1}
1914
- """
1915
- Then the value of the response body is not a valid `String`
1916
- And the value of the response body is not a valid `Number`
1917
- And the value of the response body is not a valid `Integer`
1918
- And the value of the response body is a valid `Object`
1919
- And the value of the response body is not a valid `Array`
1920
- And the value of the response body is not a valid `Boolean`
1921
-
1922
- Scenario: Quoted Object in response body is only a valid String.
1923
- When the response body is assigned:
1924
- """
1925
- "{"foo": 1}"
1926
- """
1927
- Then the value of the response body is a valid `String`
1928
- And the value of the response body is not a valid `Number`
1929
- And the value of the response body is not a valid `Integer`
1930
- And the value of the response body is not a valid `Object`
1931
- And the value of the response body is not a valid `Array`
1932
- And the value of the response body is not a valid `Boolean`
1933
-
1934
-
1935
- Scenario: Empty Array in response body is only a valid Array.
1936
- When the response body is assigned:
1937
- """
1938
- []
1939
- """
1940
- Then the value of the response body is not a valid `String`
1941
- And the value of the response body is not a valid `Number`
1942
- And the value of the response body is not a valid `Integer`
1943
- And the value of the response body is not a valid `Object`
1944
- And the value of the response body is a valid `Array`
1945
- And the value of the response body is not a valid `Boolean`
1946
-
1947
- Scenario: Array in response body is only a valid Array.
1948
- When the response body is assigned:
1949
- """
1950
- [1, "foo"]
1951
- """
1952
- Then the value of the response body is not a valid `String`
1953
- And the value of the response body is not a valid `Number`
1954
- And the value of the response body is not a valid `Integer`
1955
- And the value of the response body is not a valid `Object`
1956
- And the value of the response body is a valid `Array`
1957
- And the value of the response body is not a valid `Boolean`
1958
-
1959
- Scenario: true in response body is only a valid Boolean.
1960
- When the response body is assigned:
1961
- """
1962
- true
1963
- """
1964
- Then the value of the response body is not a valid `String`
1965
- And the value of the response body is not a valid `Number`
1966
- And the value of the response body is not a valid `Integer`
1967
- And the value of the response body is not a valid `Object`
1968
- And the value of the response body is not a valid `Array`
1969
- And the value of the response body is a valid `Boolean`
1970
-
1971
- Scenario: false in response body is only a valid Boolean.
1972
- When the response body is assigned:
1973
- """
1974
- false
1975
- """
1976
- Then the value of the response body is not a valid `String`
1977
- And the value of the response body is not a valid `Number`
1978
- And the value of the response body is not a valid `Integer`
1979
- And the value of the response body is not a valid `Object`
1980
- And the value of the response body is not a valid `Array`
1981
- And the value of the response body is a valid `Boolean`
1982
-
1983
- Scenario: null in response body is not any valid type.
1984
- When the response body is assigned:
1985
- """
1986
- [null]
1987
- """
1988
- Then the value of the response body child `[0]` is not a valid `String`
1989
- And the value of the response body child `[0]` is not a valid `Number`
1990
- And the value of the response body child `[0]` is not a valid `Integer`
1991
- And the value of the response body child `[0]` is not a valid `Object`
1992
- And the value of the response body child `[0]` is not a valid `Array`
1993
- And the value of the response body child `[0]` is not a valid `Boolean`
1994
-
1995
- Scenario: Selected Array child is a valid Array.
1996
- When the response body is assigned:
1997
- """
1998
- {"val": [1, 2, 3]}
1999
- """
2000
- Then the value of the response body child `val` is a valid `Array`
2001
-
2002
- Scenario: Selected Array child member is a valid String.
2003
- When the response body is assigned:
2004
- """
2005
- {"val": [1, 2, 3]}
2006
- """
2007
- Then the value of the response body child `val[0]` is a valid `Number`
2008
- Then the value of the response body child `val[0]` is a valid `Integer`
2009
-
2010
- Scenario: Selected nested children are a valid Array.
2011
- When the response body is assigned:
2012
- """
2013
- [{"val": 1},{"val": 2}]
2014
- """
2015
- Then the value of the response body children `.val` is a valid `Array`
2016
-
2017
- Scenario: Selected nested children can be tested for type.
2018
- When the response body is assigned:
2019
- """
2020
- [{"val": 1},{"val": 2}]
2021
- """
2022
- Then the value of the response body children `.val` has elements which are all a valid `Number`
2023
- Then the value of the response body children `.val` has elements which are all a valid `Integer`
2024
-
2025
- Scenario: Selected nested children can be tested for type when Arrays.
2026
- When the response body is assigned:
2027
- """
2028
- [{"val": [1]},{"val": [2]}]
2029
- """
2030
- Then the value of the response body children `.val` has elements which are all a valid `Array`</code></pre>
2031
- </div>
2032
- </div>
2033
- <div class="ulist">
2034
- <ul>
2035
- <li>
2036
- <p><strong>When</strong> I run <code>cucumber --strict features/is_a_valid.feature</code></p>
2037
- </li>
2038
- <li>
2039
- <p><strong>Then</strong> the output should contain:</p>
2040
- </li>
2041
- </ul>
2042
- </div>
2043
- <div class="listingblock">
2044
- <div class="content">
2045
- <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">16 passed</code></pre>
2046
- </div>
2047
- </div>
2048
- <div class="ulist">
2049
- <ul>
2050
- <li>
2051
- <p><strong>And</strong> it should pass</p>
2052
- </li>
2053
- </ul>
2054
- </div>
2055
- </div>
2056
- </div>
2057
- </div>
2058
- </div>
2059
- </div>
2060
- <div id="footer">
2061
- <div id="footer-text">
2062
- Last updated 2018-06-17 22:22:57 EDT
2063
- </div>
2064
- </div>
2065
- </body>
2066
- </html>