brine-dsl 0.5.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 (72) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +4 -0
  3. data/.ruby-version +1 -0
  4. data/.travis.yml +11 -0
  5. data/Gemfile +3 -0
  6. data/Gemfile.lock +123 -0
  7. data/Guardfile +12 -0
  8. data/LICENSE +21 -0
  9. data/README.md +137 -0
  10. data/Rakefile +32 -0
  11. data/brine-dsl.gemspec +32 -0
  12. data/config/cucumber.yml +2 -0
  13. data/docs/build.gradle +19 -0
  14. data/docs/cookbook.html +567 -0
  15. data/docs/gradle/wrapper/gradle-wrapper.jar +0 -0
  16. data/docs/gradle/wrapper/gradle-wrapper.properties +6 -0
  17. data/docs/gradlew +172 -0
  18. data/docs/gradlew.bat +84 -0
  19. data/docs/guide.html +1149 -0
  20. data/docs/index.html +472 -0
  21. data/docs/specs.html +1672 -0
  22. data/docs/src/cookbook.adoc +87 -0
  23. data/docs/src/guide.adoc +427 -0
  24. data/docs/src/index.adoc +16 -0
  25. data/docs/src/spec.erb +121 -0
  26. data/docs/src/specs.adoc +24 -0
  27. data/features/argument_transforms/boolean.feature +37 -0
  28. data/features/argument_transforms/datetime.feature +45 -0
  29. data/features/argument_transforms/integer.feature +41 -0
  30. data/features/argument_transforms/list.feature +46 -0
  31. data/features/argument_transforms/object.feature +66 -0
  32. data/features/argument_transforms/quoted.feature +41 -0
  33. data/features/argument_transforms/regex.feature +40 -0
  34. data/features/argument_transforms/template.feature +46 -0
  35. data/features/argument_transforms/whitespace.feature +51 -0
  36. data/features/assertions/is_a_valid.feature +184 -0
  37. data/features/assertions/is_equal_to.feature +60 -0
  38. data/features/assertions/is_including.feature +29 -0
  39. data/features/assertions/is_matching.feature +35 -0
  40. data/features/deprecations/replaced_with.feature +35 -0
  41. data/features/request_construction/basic.feature +29 -0
  42. data/features/request_construction/body.feature +26 -0
  43. data/features/request_construction/clearing.feature +46 -0
  44. data/features/request_construction/headers.feature +94 -0
  45. data/features/request_construction/params.feature +60 -0
  46. data/features/resource_cleanup/cleanup.feature +86 -0
  47. data/features/selectors/all.feature +55 -0
  48. data/features/selectors/any.feature +48 -0
  49. data/features/step_definitions/test_steps.rb +5 -0
  50. data/features/support/env.rb +10 -0
  51. data/lib/brine/cleaner_upper.rb +62 -0
  52. data/lib/brine/coercer.rb +18 -0
  53. data/lib/brine/hooks.rb +4 -0
  54. data/lib/brine/mustache_binder.rb +25 -0
  55. data/lib/brine/requester.rb +125 -0
  56. data/lib/brine/rest_steps.rb +138 -0
  57. data/lib/brine/selector.rb +66 -0
  58. data/lib/brine/step_definitions/assertions.rb +37 -0
  59. data/lib/brine/step_definitions/assignment.rb +13 -0
  60. data/lib/brine/step_definitions/cleanup.rb +4 -0
  61. data/lib/brine/step_definitions/request_construction.rb +19 -0
  62. data/lib/brine/step_definitions/selection.rb +37 -0
  63. data/lib/brine/test_steps.rb +138 -0
  64. data/lib/brine/transforms.rb +81 -0
  65. data/lib/brine/type_checks.rb +35 -0
  66. data/lib/brine/util.rb +35 -0
  67. data/lib/brine.rb +39 -0
  68. data/tutorial/missing.feature +5 -0
  69. data/tutorial/post_matching.feature +12 -0
  70. data/tutorial/post_status.feature +10 -0
  71. data/tutorial/support/env.rb +2 -0
  72. metadata +306 -0
data/docs/specs.html ADDED
@@ -0,0 +1,1672 @@
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="#_selection">Selection</a>
444
+ <ul class="sectlevel2">
445
+ <li><a href="#__span_class_feature_name_any_element_span"><span class="feature name">Any Element</span></a></li>
446
+ <li><a href="#__span_class_feature_name_all_elements_span"><span class="feature name">All Elements</span></a></li>
447
+ </ul>
448
+ </li>
449
+ <li><a href="#_assertion">Assertion</a>
450
+ <ul class="sectlevel2">
451
+ <li><a href="#__span_class_feature_name_equal_to_span"><span class="feature name">Equal to</span></a></li>
452
+ <li><a href="#__span_class_feature_name_matching_span"><span class="feature name">Matching</span></a></li>
453
+ <li><a href="#__span_class_feature_name_including_span"><span class="feature name">Including</span></a></li>
454
+ <li><a href="#__span_class_feature_name_a_valid_span"><span class="feature name">A valid &#8230;&#8203;</span></a></li>
455
+ </ul>
456
+ </li>
457
+ </ul>
458
+ </div>
459
+ </div>
460
+ <div id="content">
461
+ <div class="sect1">
462
+ <h2 id="_request_construction">Request Construction</h2>
463
+ <div class="sectionbody">
464
+ <div class="sect2">
465
+ <h3 id="__span_class_feature_name_basic_request_construction_span"><span class="feature name">Basic Request Construction</span></h3>
466
+ <div class="paragraph">
467
+ <p>A simple request with a specified method and path can be sent.</p>
468
+ </div>
469
+ <div class="sect3">
470
+ <h4 id="__span_class_scenario_name_varying_methods_span"><span class="scenario name">Varying Methods</span></h4>
471
+ <div class="ulist step-list">
472
+ <ul>
473
+ <li>
474
+ <p><strong>Given</strong> a file named "features/basic_requests.feature" with:</p>
475
+ </li>
476
+ </ul>
477
+ </div>
478
+ <div class="listingblock">
479
+ <div class="content">
480
+ <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">Feature: Sending a method
481
+ Scenario: Basic URL
482
+ Given expected &lt;method&gt; sent to `/profile`
483
+
484
+ When a &lt;method&gt; is sent to `/profile`
485
+ Then expected calls are verified</code></pre>
486
+ </div>
487
+ </div>
488
+ <div class="ulist">
489
+ <ul>
490
+ <li>
491
+ <p><strong>When</strong> I run <code>cucumber features/basic_requests.feature</code></p>
492
+ </li>
493
+ <li>
494
+ <p><strong>Then</strong> the output should contain:</p>
495
+ </li>
496
+ </ul>
497
+ </div>
498
+ <div class="listingblock">
499
+ <div class="content">
500
+ <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">1 passed</code></pre>
501
+ </div>
502
+ </div>
503
+ <div class="ulist">
504
+ <ul>
505
+ <li>
506
+ <p><strong>And</strong> it should pass</p>
507
+ </li>
508
+ </ul>
509
+ </div>
510
+ <div class="sect4">
511
+ <h5 id="__example_name_examples">[example name]#Examples #</h5>
512
+ <table class="tableblock frame-all grid-all spread">
513
+ <colgroup>
514
+ <col style="width: 100%;">
515
+ </colgroup>
516
+ <tbody>
517
+ <tr>
518
+ <td class="tableblock halign-left valign-top"><p class="tableblock">method</p></td>
519
+ </tr>
520
+ <tr>
521
+ <td class="tableblock halign-left valign-top"><p class="tableblock">GET</p></td>
522
+ </tr>
523
+ <tr>
524
+ <td class="tableblock halign-left valign-top"><p class="tableblock">POST</p></td>
525
+ </tr>
526
+ <tr>
527
+ <td class="tableblock halign-left valign-top"><p class="tableblock">PATCH</p></td>
528
+ </tr>
529
+ <tr>
530
+ <td class="tableblock halign-left valign-top"><p class="tableblock">DELETE</p></td>
531
+ </tr>
532
+ <tr>
533
+ <td class="tableblock halign-left valign-top"><p class="tableblock">PUT</p></td>
534
+ </tr>
535
+ </tbody>
536
+ </table>
537
+ </div>
538
+ </div>
539
+ </div>
540
+ <div class="sect2">
541
+ <h3 id="__span_class_feature_name_assigning_a_request_body_span"><span class="feature name">Assigning a Request Body</span></h3>
542
+ <div class="sect3">
543
+ <h4 id="__span_class_scenario_name_request_with_body_span"><span class="scenario name">Request With Body</span></h4>
544
+ <div class="ulist step-list">
545
+ <ul>
546
+ <li>
547
+ <p><strong>Given</strong> a file named "features/request_body.feature" with:</p>
548
+ </li>
549
+ </ul>
550
+ </div>
551
+ <div class="listingblock">
552
+ <div class="content">
553
+ <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">Feature: Passing a body
554
+ Scenario: Basic URL
555
+ Given expected request body:
556
+ """
557
+ {"request":1}
558
+ """
559
+ And expected PUT sent to `/store`
560
+
561
+ When the request body is assigned:
562
+ """
563
+ {"request":1}
564
+ """
565
+ When a PUT is sent to `/store`
566
+ Then expected calls are verified</code></pre>
567
+ </div>
568
+ </div>
569
+ <div class="ulist">
570
+ <ul>
571
+ <li>
572
+ <p><strong>When</strong> I run <code>cucumber features/request_body.feature</code></p>
573
+ </li>
574
+ <li>
575
+ <p><strong>Then</strong> the output should contain:</p>
576
+ </li>
577
+ </ul>
578
+ </div>
579
+ <div class="listingblock">
580
+ <div class="content">
581
+ <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">5 passed</code></pre>
582
+ </div>
583
+ </div>
584
+ <div class="ulist">
585
+ <ul>
586
+ <li>
587
+ <p><strong>And</strong> it should pass</p>
588
+ </li>
589
+ </ul>
590
+ </div>
591
+ </div>
592
+ </div>
593
+ <div class="sect2">
594
+ <h3 id="__span_class_feature_name_adding_query_parameters_span"><span class="feature name">Adding Query Parameters</span></h3>
595
+ <div class="sect3">
596
+ <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>
597
+ <div class="ulist step-list">
598
+ <ul>
599
+ <li>
600
+ <p><strong>Given</strong> a file named "features/params.feature" with:</p>
601
+ </li>
602
+ </ul>
603
+ </div>
604
+ <div class="listingblock">
605
+ <div class="content">
606
+ <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">Feature: Request query parameters can be specified.
607
+ Scenario: A single parameter is appended to the URL.
608
+ Given expected GET sent to `/query?foo=bar`
609
+
610
+ When the request query parameter `foo` is assigned `bar`
611
+ And a GET is sent to `/query`
612
+
613
+ Then expected calls are verified
614
+
615
+ Scenario: Multiple parameters are appended to the URL with proper formatting.
616
+ Given expected GET sent to `/query?foo=bar&amp;baz=1`
617
+
618
+ When the request query parameter `foo` is assigned `bar`
619
+ And the request query parameter `baz` is assigned `1`
620
+ And a GET is sent to `/query`
621
+
622
+ Then expected calls are verified
623
+
624
+ Scenario Outline: Values are encoded appropriately.
625
+ Given expected GET sent to `/query?foo=&lt;encoded&gt;`
626
+
627
+ When the request query parameter `foo` is assigned `&lt;input&gt;`
628
+ And a GET is sent to `/query`
629
+
630
+ Then expected calls are verified
631
+ Examples:
632
+ | input | encoded |
633
+ | bar &amp; grill | bar+%26+grill |
634
+ | + + | %2B+%2B |
635
+ | (imbalance)) | %28imbalance%29%29 |
636
+
637
+ Scenario Outline: Parametes are added regardless of HTTP method.
638
+ Given expected &lt;method&gt; sent to `/query?foo=bar`
639
+
640
+ When the request query parameter `foo` is assigned `bar`
641
+ And a &lt;method&gt; is sent to `/query`
642
+
643
+ Then expected calls are verified
644
+ Examples:
645
+ | method |
646
+ | POST |
647
+ | PUT |
648
+ | DELETE |
649
+ | HEAD |
650
+ | OPTIONS |</code></pre>
651
+ </div>
652
+ </div>
653
+ <div class="ulist">
654
+ <ul>
655
+ <li>
656
+ <p><strong>When</strong> I run <code>cucumber features/params.feature</code></p>
657
+ </li>
658
+ <li>
659
+ <p><strong>Then</strong> the output should contain:</p>
660
+ </li>
661
+ </ul>
662
+ </div>
663
+ <div class="listingblock">
664
+ <div class="content">
665
+ <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">10 passed</code></pre>
666
+ </div>
667
+ </div>
668
+ <div class="ulist">
669
+ <ul>
670
+ <li>
671
+ <p><strong>And</strong> it should pass</p>
672
+ </li>
673
+ </ul>
674
+ </div>
675
+ </div>
676
+ </div>
677
+ <div class="sect2">
678
+ <h3 id="__span_class_feature_name_adding_headers_span"><span class="feature name">Adding Headers</span></h3>
679
+ <div class="sect3">
680
+ <h4 id="__span_class_scenario_name_headers_are_added_to_requests_span"><span class="scenario name">Headers are added to requests.</span></h4>
681
+ <div class="ulist step-list">
682
+ <ul>
683
+ <li>
684
+ <p><strong>Given</strong> a file named "features/headers.feature" with:</p>
685
+ </li>
686
+ </ul>
687
+ </div>
688
+ <div class="listingblock">
689
+ <div class="content">
690
+ <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">Feature: Request headers can be specified.
691
+ Scenario: A new header with a single value is added to request.
692
+ Given expected request headers:
693
+ """
694
+ {"foo":"bar"}
695
+ """
696
+ And expected GET sent to `/query`
697
+
698
+ When the request header `foo` is assigned `bar`
699
+ And a GET is sent to `/query`
700
+
701
+ Then expected calls are verified
702
+
703
+ Scenario: Default headers are present in requests.
704
+ Given expected request headers:
705
+ """
706
+ {"Content-Type": "application/json"}
707
+ """
708
+ And expected GET sent to `/query`
709
+
710
+ When a GET is sent to `/query`
711
+
712
+ Then expected calls are verified
713
+
714
+ Scenario: Default headers can be overridden.
715
+ Given expected request headers:
716
+ """
717
+ {"Content-Type": "text/plain"}
718
+ """
719
+ And expected GET sent to `/query`
720
+
721
+ When the request header `Content-Type` is assigned `text/plain`
722
+ And a GET is sent to `/query`
723
+
724
+ Then expected calls are verified
725
+
726
+ Scenario: Array header values are added to requests.
727
+ Given expected request headers:
728
+ """
729
+ {"X-Array": "1, 2, 3"}
730
+ """
731
+ And expected GET sent to `/query`
732
+
733
+ When the request header `X-Array` is assigned `[1, 2, 3]`
734
+ And a GET is sent to `/query`
735
+
736
+ Then expected calls are verified
737
+
738
+ Scenario: The last set value for a given header wins.
739
+ Given expected request headers:
740
+ """
741
+ {"foo":"baz"}
742
+ """
743
+ And expected GET sent to `/query`
744
+
745
+ When the request header `foo` is assigned `bar`
746
+ And the request header `foo` is assigned `baz`
747
+ And a GET is sent to `/query`
748
+
749
+ Then expected calls are verified
750
+
751
+ Scenario Outline: Header is added regardless of HTTP method.
752
+ Given expected request headers:
753
+ """
754
+ {"foo":"bar"}
755
+ """
756
+ And expected &lt;method&gt; sent to `/query`
757
+
758
+ When the request header `foo` is assigned `bar`
759
+ And a &lt;method&gt; is sent to `/query`
760
+
761
+ Then expected calls are verified
762
+
763
+ Examples:
764
+ | method |
765
+ | POST |
766
+ | PUT |
767
+ | DELETE |
768
+ | HEAD |
769
+ | OPTIONS |</code></pre>
770
+ </div>
771
+ </div>
772
+ <div class="ulist">
773
+ <ul>
774
+ <li>
775
+ <p><strong>When</strong> I run <code>cucumber features/headers.feature</code></p>
776
+ </li>
777
+ <li>
778
+ <p><strong>Then</strong> the output should contain:</p>
779
+ </li>
780
+ </ul>
781
+ </div>
782
+ <div class="listingblock">
783
+ <div class="content">
784
+ <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">10 passed</code></pre>
785
+ </div>
786
+ </div>
787
+ <div class="ulist">
788
+ <ul>
789
+ <li>
790
+ <p><strong>And</strong> it should pass</p>
791
+ </li>
792
+ </ul>
793
+ </div>
794
+ </div>
795
+ </div>
796
+ <div class="sect2">
797
+ <h3 id="__span_class_feature_name_cleared_after_sent_span"><span class="feature name">Cleared After Sent</span></h3>
798
+ <div class="paragraph">
799
+ <p>After a request is sent, any values that were added to that request
800
+ are cleared and will not be present in subsequent requests.</p>
801
+ </div>
802
+ <div class="sect3">
803
+ <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>
804
+ <div class="ulist step-list">
805
+ <ul>
806
+ <li>
807
+ <p><strong>Given</strong> a file named "features/request_clearing.feature" with:</p>
808
+ </li>
809
+ </ul>
810
+ </div>
811
+ <div class="listingblock">
812
+ <div class="content">
813
+ <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">Feature: Clearing the request.
814
+ Scenario: Request body is cleared.
815
+ Given expected request body:
816
+ """
817
+ {"request":1}
818
+ """
819
+ And expected PUT sent to `/profile`
820
+ Given expected request body:
821
+ """
822
+ """
823
+ And expected PUT sent to `/store`
824
+
825
+ When the request body is assigned:
826
+ """
827
+ {"request":1}
828
+ """
829
+ And a PUT is sent to `/profile`
830
+ And a PUT is sent to `/store`
831
+
832
+ Then expected calls are verified
833
+
834
+ Scenario: Request parameter
835
+ Given expected GET sent to `/query?foo=bar`
836
+ And expected GET sent to `/resource`
837
+
838
+ Given the request query parameter `foo` is assigned `bar`
839
+ And a GET is sent to `/query`
840
+
841
+ When a GET is sent to `/resource`
842
+ Then expected calls are verified</code></pre>
843
+ </div>
844
+ </div>
845
+ <div class="ulist">
846
+ <ul>
847
+ <li>
848
+ <p><strong>When</strong> I run <code>cucumber features/request_clearing.feature</code></p>
849
+ </li>
850
+ <li>
851
+ <p><strong>Then</strong> the output should contain:</p>
852
+ </li>
853
+ </ul>
854
+ </div>
855
+ <div class="listingblock">
856
+ <div class="content">
857
+ <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">2 passed</code></pre>
858
+ </div>
859
+ </div>
860
+ <div class="ulist">
861
+ <ul>
862
+ <li>
863
+ <p><strong>And</strong> it should pass</p>
864
+ </li>
865
+ </ul>
866
+ </div>
867
+ </div>
868
+ </div>
869
+ </div>
870
+ </div>
871
+ <div class="sect1">
872
+ <h2 id="_resource_cleanup">Resource Cleanup</h2>
873
+ <div class="sectionbody">
874
+ <div class="sect2">
875
+ <h3 id="__span_class_feature_name_resource_cleanup_span"><span class="feature name">Resource Cleanup</span></h3>
876
+ <div class="paragraph">
877
+ <p>Resources created during testing can be marked for deletion.</p>
878
+ </div>
879
+ <div class="sect3">
880
+ <h4 id="__span_class_scenario_name_initial_success_span"><span class="scenario name">Initial Success</span></h4>
881
+ <div class="ulist step-list">
882
+ <ul>
883
+ <li>
884
+ <p><strong>Given</strong> a file named "features/cleanup.feature" with:</p>
885
+ </li>
886
+ </ul>
887
+ </div>
888
+ <div class="listingblock">
889
+ <div class="content">
890
+ <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">Feature: Resource Cleanup
891
+
892
+ Scenario: Successful Basic Deletion
893
+ Given expected DELETE sent to `/some/path`
894
+
895
+ When a resource is created at `/some/path`</code></pre>
896
+ </div>
897
+ </div>
898
+ <div class="ulist">
899
+ <ul>
900
+ <li>
901
+ <p><strong>When</strong> I run <code>cucumber --strict features/cleanup.feature</code></p>
902
+ </li>
903
+ <li>
904
+ <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>
905
+ </li>
906
+ <li>
907
+ <p><strong>And</strong> the output should not contain:</p>
908
+ </li>
909
+ </ul>
910
+ </div>
911
+ <div class="listingblock">
912
+ <div class="content">
913
+ <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">ERROR</code></pre>
914
+ </div>
915
+ </div>
916
+ <div class="ulist">
917
+ <ul>
918
+ <li>
919
+ <p><strong>And</strong> it should pass</p>
920
+ </li>
921
+ </ul>
922
+ </div>
923
+ </div>
924
+ <div class="sect3">
925
+ <h4 id="__span_class_scenario_name_returned_4xx_span"><span class="scenario name">Returned 4xx</span></h4>
926
+ <div class="ulist step-list">
927
+ <ul>
928
+ <li>
929
+ <p><strong>Given</strong> a file named "features/cleanup_failure.feature" with:</p>
930
+ </li>
931
+ </ul>
932
+ </div>
933
+ <div class="listingblock">
934
+ <div class="content">
935
+ <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">Feature: Resource Cleanup
936
+
937
+ Scenario: Failed Deletion
938
+ Given expected response status of `409`
939
+ And expected DELETE sent to `/some/path`
940
+
941
+ When a resource is created at `/some/path`</code></pre>
942
+ </div>
943
+ </div>
944
+ <div class="ulist">
945
+ <ul>
946
+ <li>
947
+ <p><strong>When</strong> I run <code>cucumber --strict features/cleanup_failure.feature</code></p>
948
+ </li>
949
+ <li>
950
+ <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>
951
+ </li>
952
+ <li>
953
+ <p><strong>And</strong> the output should contain:</p>
954
+ </li>
955
+ </ul>
956
+ </div>
957
+ <div class="listingblock">
958
+ <div class="content">
959
+ <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">ERROR</code></pre>
960
+ </div>
961
+ </div>
962
+ <div class="ulist">
963
+ <ul>
964
+ <li>
965
+ <p><strong>And</strong> it should pass</p>
966
+ </li>
967
+ </ul>
968
+ </div>
969
+ </div>
970
+ <div class="sect3">
971
+ <h4 id="__span_class_scenario_name_success_upon_retry_span"><span class="scenario name">Success Upon Retry</span></h4>
972
+ <div class="ulist step-list">
973
+ <ul>
974
+ <li>
975
+ <p><strong>Given</strong> a file named "features/cleanup_retried.feature" with:</p>
976
+ </li>
977
+ </ul>
978
+ </div>
979
+ <div class="listingblock">
980
+ <div class="content">
981
+ <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">Feature: Resource Cleanup
982
+
983
+ Scenario: Success Upon Retry
984
+ Given expected response status sequence of `[504, 200]`
985
+ And expected DELETE sent to `/some/path`
986
+
987
+ When a resource is created at `/some/path`</code></pre>
988
+ </div>
989
+ </div>
990
+ <div class="ulist">
991
+ <ul>
992
+ <li>
993
+ <p><strong>When</strong> I run <code>cucumber --strict -o ../../out.log features/cleanup_retried.feature</code></p>
994
+ </li>
995
+ <li>
996
+ <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>
997
+ </li>
998
+ <li>
999
+ <p><strong>And</strong> the output should not contain:</p>
1000
+ </li>
1001
+ </ul>
1002
+ </div>
1003
+ <div class="listingblock">
1004
+ <div class="content">
1005
+ <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">ERROR</code></pre>
1006
+ </div>
1007
+ </div>
1008
+ <div class="ulist">
1009
+ <ul>
1010
+ <li>
1011
+ <p><strong>And</strong> it should pass</p>
1012
+ </li>
1013
+ </ul>
1014
+ </div>
1015
+ </div>
1016
+ <div class="sect3">
1017
+ <h4 id="__span_class_scenario_name_unreached_success_span"><span class="scenario name">Unreached Success</span></h4>
1018
+ <div class="ulist step-list">
1019
+ <ul>
1020
+ <li>
1021
+ <p><strong>Given</strong> a file named "features/cleanup_unreached.feature" with:</p>
1022
+ </li>
1023
+ </ul>
1024
+ </div>
1025
+ <div class="listingblock">
1026
+ <div class="content">
1027
+ <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">Feature: Resource Cleanup
1028
+
1029
+ Scenario: Unreached Success
1030
+ Given expected response status sequence of `[504, 504, 504, 200]`
1031
+ And expected DELETE sent to `/some/path`
1032
+
1033
+ When a resource is created at `/some/path`</code></pre>
1034
+ </div>
1035
+ </div>
1036
+ <div class="ulist">
1037
+ <ul>
1038
+ <li>
1039
+ <p><strong>When</strong> I run <code>cucumber --strict -o ../../out.log features/cleanup_unreached.feature</code></p>
1040
+ </li>
1041
+ <li>
1042
+ <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>
1043
+ </li>
1044
+ <li>
1045
+ <p><strong>And</strong> the output should contain:</p>
1046
+ </li>
1047
+ </ul>
1048
+ </div>
1049
+ <div class="listingblock">
1050
+ <div class="content">
1051
+ <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">ERROR</code></pre>
1052
+ </div>
1053
+ </div>
1054
+ <div class="ulist">
1055
+ <ul>
1056
+ <li>
1057
+ <p><strong>And</strong> it should pass</p>
1058
+ </li>
1059
+ </ul>
1060
+ </div>
1061
+ </div>
1062
+ </div>
1063
+ </div>
1064
+ </div>
1065
+ <div class="sect1">
1066
+ <h2 id="_selection">Selection</h2>
1067
+ <div class="sectionbody">
1068
+ <div class="sect2">
1069
+ <h3 id="__span_class_feature_name_any_element_span"><span class="feature name">Any Element</span></h3>
1070
+ <div class="paragraph">
1071
+ <p>Assertions can be done against any element of a structure.</p>
1072
+ </div>
1073
+ <div class="sect3">
1074
+ <h4 id="__span_class_scenario_name_assorted_positive_and_negative_assertions_span"><span class="scenario name">Assorted positive and negative assertions.</span></h4>
1075
+ <div class="ulist step-list">
1076
+ <ul>
1077
+ <li>
1078
+ <p><strong>Given</strong> a file named "features/any.feature" with:</p>
1079
+ </li>
1080
+ </ul>
1081
+ </div>
1082
+ <div class="listingblock">
1083
+ <div class="content">
1084
+ <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">Feature: Allow selection of any structure element
1085
+ Scenario: List in response body
1086
+ When the response body is assigned:
1087
+ """
1088
+ ["a", "b", "c"]
1089
+ """
1090
+ Then the value of the response body does have any element that is equal to `a`
1091
+ And the value of the response body does not have any element that is equal to `d`
1092
+
1093
+ Scenario: Nested list in response body
1094
+ When the response body is assigned:
1095
+ """
1096
+ {"letters": ["a", "b", "c"]}
1097
+ """
1098
+ Then the value of the response body child `letters` does have any element that is equal to `a`
1099
+ And the value of the response body child `letters` does not have any element that is equal to `d`
1100
+
1101
+ Scenario: Map matches entries
1102
+ When the response body is assigned:
1103
+ """
1104
+ {"a": 1, "b": 2}
1105
+ """
1106
+ #Equality will match keys
1107
+ Then the value of the response body does have any element that is equal to `a`
1108
+ And the value of the response body does not have any element that is equal to `d`
1109
+
1110
+ Scenario: Spread nested lists
1111
+ When the response body is assigned:
1112
+ """
1113
+ [{"val":"foo"},{"val":"bar"}]
1114
+ """
1115
+ Then the value of the response body children `..val` does have any element that is equal to `foo`
1116
+ And the value of the response body children `..val` does not have any element that is equal to `other`</code></pre>
1117
+ </div>
1118
+ </div>
1119
+ <div class="ulist">
1120
+ <ul>
1121
+ <li>
1122
+ <p><strong>When</strong> I run <code>cucumber --strict features/any.feature</code></p>
1123
+ </li>
1124
+ <li>
1125
+ <p><strong>Then</strong> the output should contain:</p>
1126
+ </li>
1127
+ </ul>
1128
+ </div>
1129
+ <div class="listingblock">
1130
+ <div class="content">
1131
+ <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">4 passed</code></pre>
1132
+ </div>
1133
+ </div>
1134
+ <div class="ulist">
1135
+ <ul>
1136
+ <li>
1137
+ <p><strong>And</strong> it should pass</p>
1138
+ </li>
1139
+ </ul>
1140
+ </div>
1141
+ </div>
1142
+ </div>
1143
+ <div class="sect2">
1144
+ <h3 id="__span_class_feature_name_all_elements_span"><span class="feature name">All Elements</span></h3>
1145
+ <div class="paragraph">
1146
+ <p>Assertions can be done against all elements of a structure.</p>
1147
+ </div>
1148
+ <div class="sect3">
1149
+ <h4 id="__span_class_scenario_name_assorted_positive_and_negative_assertions_span_2"><span class="scenario name">Assorted positive and negative assertions.</span></h4>
1150
+ <div class="ulist step-list">
1151
+ <ul>
1152
+ <li>
1153
+ <p><strong>Given</strong> a file named "features/all.feature" with:</p>
1154
+ </li>
1155
+ </ul>
1156
+ </div>
1157
+ <div class="listingblock">
1158
+ <div class="content">
1159
+ <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">Feature: Allow selection of all structure elements
1160
+ Scenario: List in response body
1161
+ When the response body is assigned:
1162
+ """
1163
+ ["a", "bb", "ccc"]
1164
+ """
1165
+ Then the value of the response body has elements which are all matching `/\w+/`
1166
+
1167
+ Scenario: Spread nested lists
1168
+ When the response body is assigned:
1169
+ """
1170
+ [{"val": "foo"},{"val": "foo"}]
1171
+ """
1172
+ Then the value of the response body children `..val` has elements which are all equal to `foo`</code></pre>
1173
+ </div>
1174
+ </div>
1175
+ <div class="ulist">
1176
+ <ul>
1177
+ <li>
1178
+ <p><strong>When</strong> I run <code>cucumber --strict features/all.feature</code></p>
1179
+ </li>
1180
+ <li>
1181
+ <p><strong>Then</strong> the output should contain:</p>
1182
+ </li>
1183
+ </ul>
1184
+ </div>
1185
+ <div class="listingblock">
1186
+ <div class="content">
1187
+ <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">4 passed</code></pre>
1188
+ </div>
1189
+ </div>
1190
+ <div class="ulist">
1191
+ <ul>
1192
+ <li>
1193
+ <p><strong>And</strong> it should pass</p>
1194
+ </li>
1195
+ </ul>
1196
+ </div>
1197
+ </div>
1198
+ <div class="sect3">
1199
+ <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>
1200
+ <div class="ulist step-list">
1201
+ <ul>
1202
+ <li>
1203
+ <p><strong>Given</strong> a file named "features/all.feature" with:</p>
1204
+ </li>
1205
+ </ul>
1206
+ </div>
1207
+ <div class="listingblock">
1208
+ <div class="content">
1209
+ <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">Feature: Allow selection of all structure elements
1210
+ Scenario: List in response body
1211
+ When the response body is assigned:
1212
+ """
1213
+ ["a", "bb", "ccc"]
1214
+ """
1215
+ Then the value of the response body has elements which are all matching `/^\w$/`
1216
+
1217
+ Scenario: Spread nested lists
1218
+ When the response body is assigned:
1219
+ """
1220
+ [{"val": "foo"},{"val": "fob"}]
1221
+ """
1222
+ Then the value of the response body children `..val` has elements which are all equal to `foo`</code></pre>
1223
+ </div>
1224
+ </div>
1225
+ <div class="ulist">
1226
+ <ul>
1227
+ <li>
1228
+ <p><strong>When</strong> I run <code>cucumber --strict features/all.feature</code></p>
1229
+ </li>
1230
+ <li>
1231
+ <p><strong>Then</strong> the output should contain:</p>
1232
+ </li>
1233
+ </ul>
1234
+ </div>
1235
+ <div class="listingblock">
1236
+ <div class="content">
1237
+ <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">2 failed</code></pre>
1238
+ </div>
1239
+ </div>
1240
+ </div>
1241
+ </div>
1242
+ </div>
1243
+ </div>
1244
+ <div class="sect1">
1245
+ <h2 id="_assertion">Assertion</h2>
1246
+ <div class="sectionbody">
1247
+ <div class="sect2">
1248
+ <h3 id="__span_class_feature_name_equal_to_span"><span class="feature name">Equal to</span></h3>
1249
+ <div class="paragraph">
1250
+ <p>It can be asserted that a value is equal to another value</p>
1251
+ </div>
1252
+ <div class="sect3">
1253
+ <h4 id="__span_class_scenario_name_assorted_positive_and_negative_assertions_span_3"><span class="scenario name">Assorted positive and negative assertions.</span></h4>
1254
+ <div class="ulist step-list">
1255
+ <ul>
1256
+ <li>
1257
+ <p><strong>Given</strong> a file named "features/is_equal_to.feature" with:</p>
1258
+ </li>
1259
+ </ul>
1260
+ </div>
1261
+ <div class="listingblock">
1262
+ <div class="content">
1263
+ <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">Feature: Assert value equality
1264
+ Scenario: String in response body
1265
+ When the response body is assigned:
1266
+ """
1267
+ foo
1268
+ """
1269
+ Then the value of the response body is equal to `foo`
1270
+ And the value of the response body is not equal to `foot`
1271
+
1272
+ Scenario: Response Status
1273
+ When the response status is assigned `404`
1274
+ Then the value of the response status is equal to `404`
1275
+ And the value of the response status is not equal to `200`
1276
+
1277
+ Scenario: Object in response body
1278
+ When the response body is assigned:
1279
+ """
1280
+ {
1281
+ "foo": "bar"
1282
+ }
1283
+ """
1284
+ Then the value of the response body is equal to:
1285
+ """
1286
+ {"foo":"bar"}
1287
+ """
1288
+ And the value of the response body is not equal to:
1289
+ """
1290
+ {"foo": "baz"}
1291
+ """
1292
+
1293
+ Scenario: List in response body
1294
+ When the response body is assigned `[1, "foo", true]`
1295
+ Then the value of the response body is equal to `[1, "foo", true]`
1296
+ And the value of the response body is not equal to `[1, "bar", true]`
1297
+
1298
+ Scenario Outline: Objects must match completely
1299
+ When the response body is assigned `{"foo": "bar", "baz": 1}`
1300
+ Then the value of the response body is not equal to `&lt;comparison&gt;`
1301
+
1302
+ Examples:
1303
+ | comparison |
1304
+ | {} |
1305
+ | {"foo": "bar"} |
1306
+ | {"foo": "bar", "baz": 1, "extra": 2} |
1307
+ | {"foo": "bar", "baz": 2} |</code></pre>
1308
+ </div>
1309
+ </div>
1310
+ <div class="ulist">
1311
+ <ul>
1312
+ <li>
1313
+ <p><strong>When</strong> I run <code>cucumber --strict features/is_equal_to.feature</code></p>
1314
+ </li>
1315
+ <li>
1316
+ <p><strong>Then</strong> the output should contain:</p>
1317
+ </li>
1318
+ </ul>
1319
+ </div>
1320
+ <div class="listingblock">
1321
+ <div class="content">
1322
+ <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">8 passed</code></pre>
1323
+ </div>
1324
+ </div>
1325
+ <div class="ulist">
1326
+ <ul>
1327
+ <li>
1328
+ <p><strong>And</strong> it should pass</p>
1329
+ </li>
1330
+ </ul>
1331
+ </div>
1332
+ </div>
1333
+ </div>
1334
+ <div class="sect2">
1335
+ <h3 id="__span_class_feature_name_matching_span"><span class="feature name">Matching</span></h3>
1336
+ <div class="paragraph">
1337
+ <p>It can be asserted that a value matches another string or regex</p>
1338
+ </div>
1339
+ <div class="sect3">
1340
+ <h4 id="__span_class_scenario_name_assorted_positive_and_negative_assertions_span_4"><span class="scenario name">Assorted positive and negative assertions.</span></h4>
1341
+ <div class="ulist step-list">
1342
+ <ul>
1343
+ <li>
1344
+ <p><strong>Given</strong> a file named "features/is_matching.feature" with:</p>
1345
+ </li>
1346
+ </ul>
1347
+ </div>
1348
+ <div class="listingblock">
1349
+ <div class="content">
1350
+ <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">Feature: Assert value matchiness
1351
+ Scenario: String in response body matched against a regex
1352
+ When the response body is assigned:
1353
+ """
1354
+ http://www.github.com?var=val
1355
+ """
1356
+ Then the value of the response body is matching `/github/`
1357
+ And the value of the response body is matching `/git.*\?.*=/`
1358
+ And the value of the response body is not matching `/gh/`
1359
+ And the value of the response body is not matching `/^github/`
1360
+
1361
+ Scenario: Regex in response body matched against a string
1362
+ When the response body is assigned:
1363
+ """
1364
+ /(.+)\1/
1365
+ """
1366
+ Then the value of the response body is matching `blahblah`
1367
+ And the value of the response body is matching `boo`
1368
+ And the value of the response body is not matching `blah blah`
1369
+ And the value of the response body is not matching `blah`</code></pre>
1370
+ </div>
1371
+ </div>
1372
+ <div class="ulist">
1373
+ <ul>
1374
+ <li>
1375
+ <p><strong>When</strong> I run <code>cucumber --strict features/is_matching.feature</code></p>
1376
+ </li>
1377
+ <li>
1378
+ <p><strong>Then</strong> the output should contain:</p>
1379
+ </li>
1380
+ </ul>
1381
+ </div>
1382
+ <div class="listingblock">
1383
+ <div class="content">
1384
+ <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">2 passed</code></pre>
1385
+ </div>
1386
+ </div>
1387
+ <div class="ulist">
1388
+ <ul>
1389
+ <li>
1390
+ <p><strong>And</strong> it should pass</p>
1391
+ </li>
1392
+ </ul>
1393
+ </div>
1394
+ </div>
1395
+ </div>
1396
+ <div class="sect2">
1397
+ <h3 id="__span_class_feature_name_including_span"><span class="feature name">Including</span></h3>
1398
+ <div class="paragraph">
1399
+ <p>It can be asserted that a value is a superset of another value.</p>
1400
+ </div>
1401
+ <div class="sect3">
1402
+ <h4 id="__span_class_scenario_name_equals_span"><span class="scenario name">Equals</span></h4>
1403
+ <div class="ulist step-list">
1404
+ <ul>
1405
+ <li>
1406
+ <p><strong>Given</strong> a file named "features/includes.feature" with:</p>
1407
+ </li>
1408
+ </ul>
1409
+ </div>
1410
+ <div class="listingblock">
1411
+ <div class="content">
1412
+ <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">Feature: Includes
1413
+ Scenario: Basic object membership
1414
+ When the response body is assigned:
1415
+ """
1416
+ {"foo":"bar",
1417
+ "baz": 1,
1418
+ "other": "blah"}
1419
+ """
1420
+ Then the value of the response body is including:
1421
+ """
1422
+ {"baz":1}
1423
+ """
1424
+ And the value of the response body is not including:
1425
+ """
1426
+ {"missing":"value"}
1427
+ """</code></pre>
1428
+ </div>
1429
+ </div>
1430
+ <div class="ulist">
1431
+ <ul>
1432
+ <li>
1433
+ <p><strong>When</strong> I run <code>cucumber features/includes.feature</code></p>
1434
+ </li>
1435
+ <li>
1436
+ <p><strong>Then</strong> the output should contain:</p>
1437
+ </li>
1438
+ </ul>
1439
+ </div>
1440
+ <div class="listingblock">
1441
+ <div class="content">
1442
+ <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">1 passed</code></pre>
1443
+ </div>
1444
+ </div>
1445
+ <div class="ulist">
1446
+ <ul>
1447
+ <li>
1448
+ <p><strong>And</strong> it should pass</p>
1449
+ </li>
1450
+ </ul>
1451
+ </div>
1452
+ </div>
1453
+ </div>
1454
+ <div class="sect2">
1455
+ <h3 id="__span_class_feature_name_a_valid_span"><span class="feature name">A valid &#8230;&#8203;</span></h3>
1456
+ <div class="sect3">
1457
+ <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>
1458
+ <div class="ulist step-list">
1459
+ <ul>
1460
+ <li>
1461
+ <p><strong>Given</strong> a file named "features/is_a_valid.feature" with:</p>
1462
+ </li>
1463
+ </ul>
1464
+ </div>
1465
+ <div class="listingblock">
1466
+ <div class="content">
1467
+ <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">Feature: Assert type validity
1468
+ Scenario: String in response body is only a valid String.
1469
+ When the response body is assigned:
1470
+ """
1471
+ foo
1472
+ """
1473
+ Then the value of the response body is a valid `String`
1474
+ And the value of the response body is not a valid `Number`
1475
+ And the value of the response body is not a valid `Integer`
1476
+ And the value of the response body is not a valid `Object`
1477
+ And the value of the response body is not a valid `Array`
1478
+ And the value of the response body is not a valid `Boolean`
1479
+
1480
+ Scenario: Integer in response body is a valid Integer and Number.
1481
+ When the response body is assigned:
1482
+ """
1483
+ 1
1484
+ """
1485
+ Then the value of the response body is not a valid `String`
1486
+ And the value of the response body is a valid `Number`
1487
+ And the value of the response body is a valid `Integer`
1488
+ And the value of the response body is not a valid `Object`
1489
+ And the value of the response body is not a valid `Array`
1490
+ And the value of the response body is not a valid `Boolean`
1491
+
1492
+ Scenario: Quoted Number in response body is only a valid String.
1493
+ When the response body is assigned:
1494
+ """
1495
+ "1"
1496
+ """
1497
+ Then the value of the response body is a valid `String`
1498
+ And the value of the response body is not a valid `Number`
1499
+ And the value of the response body is not a valid `Integer`
1500
+ And the value of the response body is not a valid `Object`
1501
+ And the value of the response body is not a valid `Array`
1502
+ And the value of the response body is not a valid `Boolean`
1503
+
1504
+ Scenario: Empty Object in response body is only a valid Object.
1505
+ When the response body is assigned:
1506
+ """
1507
+ {}
1508
+ """
1509
+ Then the value of the response body is not a valid `String`
1510
+ And the value of the response body is not a valid `Number`
1511
+ And the value of the response body is not a valid `Integer`
1512
+ And the value of the response body is a valid `Object`
1513
+ And the value of the response body is not a valid `Array`
1514
+ And the value of the response body is not a valid `Boolean`
1515
+
1516
+ Scenario: Object in response body is only a valid Object.
1517
+ When the response body is assigned:
1518
+ """
1519
+ {"foo": 1}
1520
+ """
1521
+ Then the value of the response body is not a valid `String`
1522
+ And the value of the response body is not a valid `Number`
1523
+ And the value of the response body is not a valid `Integer`
1524
+ And the value of the response body is a valid `Object`
1525
+ And the value of the response body is not a valid `Array`
1526
+ And the value of the response body is not a valid `Boolean`
1527
+
1528
+ Scenario: Quoted Object in response body is only a valid String.
1529
+ When the response body is assigned:
1530
+ """
1531
+ "{"foo": 1}"
1532
+ """
1533
+ Then the value of the response body is a valid `String`
1534
+ And the value of the response body is not a valid `Number`
1535
+ And the value of the response body is not a valid `Integer`
1536
+ And the value of the response body is not a valid `Object`
1537
+ And the value of the response body is not a valid `Array`
1538
+ And the value of the response body is not a valid `Boolean`
1539
+
1540
+
1541
+ Scenario: Empty Array in response body is only a valid Array.
1542
+ When the response body is assigned:
1543
+ """
1544
+ []
1545
+ """
1546
+ Then the value of the response body is not a valid `String`
1547
+ And the value of the response body is not a valid `Number`
1548
+ And the value of the response body is not a valid `Integer`
1549
+ And the value of the response body is not a valid `Object`
1550
+ And the value of the response body is a valid `Array`
1551
+ And the value of the response body is not a valid `Boolean`
1552
+
1553
+ Scenario: Array in response body is only a valid Array.
1554
+ When the response body is assigned:
1555
+ """
1556
+ [1, "foo"]
1557
+ """
1558
+ Then the value of the response body is not a valid `String`
1559
+ And the value of the response body is not a valid `Number`
1560
+ And the value of the response body is not a valid `Integer`
1561
+ And the value of the response body is not a valid `Object`
1562
+ And the value of the response body is a valid `Array`
1563
+ And the value of the response body is not a valid `Boolean`
1564
+
1565
+ Scenario: true in response body is only a valid Boolean.
1566
+ When the response body is assigned:
1567
+ """
1568
+ true
1569
+ """
1570
+ Then the value of the response body is not a valid `String`
1571
+ And the value of the response body is not a valid `Number`
1572
+ And the value of the response body is not a valid `Integer`
1573
+ And the value of the response body is not a valid `Object`
1574
+ And the value of the response body is not a valid `Array`
1575
+ And the value of the response body is a valid `Boolean`
1576
+
1577
+ Scenario: false in response body is only a valid Boolean.
1578
+ When the response body is assigned:
1579
+ """
1580
+ false
1581
+ """
1582
+ Then the value of the response body is not a valid `String`
1583
+ And the value of the response body is not a valid `Number`
1584
+ And the value of the response body is not a valid `Integer`
1585
+ And the value of the response body is not a valid `Object`
1586
+ And the value of the response body is not a valid `Array`
1587
+ And the value of the response body is a valid `Boolean`
1588
+
1589
+ Scenario: null in response body is not any valid type.
1590
+ When the response body is assigned:
1591
+ """
1592
+ [null]
1593
+ """
1594
+ Then the value of the response body child `[0]` is not a valid `String`
1595
+ And the value of the response body child `[0]` is not a valid `Number`
1596
+ And the value of the response body child `[0]` is not a valid `Integer`
1597
+ And the value of the response body child `[0]` is not a valid `Object`
1598
+ And the value of the response body child `[0]` is not a valid `Array`
1599
+ And the value of the response body child `[0]` is not a valid `Boolean`
1600
+
1601
+ Scenario: Selected Array child is a valid Array.
1602
+ When the response body is assigned:
1603
+ """
1604
+ {"val": [1, 2, 3]}
1605
+ """
1606
+ Then the value of the response body child `val` is a valid `Array`
1607
+
1608
+ Scenario: Selected Array child member is a valid String.
1609
+ When the response body is assigned:
1610
+ """
1611
+ {"val": [1, 2, 3]}
1612
+ """
1613
+ Then the value of the response body child `val[0]` is a valid `Number`
1614
+ Then the value of the response body child `val[0]` is a valid `Integer`
1615
+
1616
+ Scenario: Selected nested children are a valid Array.
1617
+ When the response body is assigned:
1618
+ """
1619
+ [{"val": 1},{"val": 2}]
1620
+ """
1621
+ Then the value of the response body children `.val` is a valid `Array`
1622
+
1623
+ Scenario: Selected nested children can be tested for type.
1624
+ When the response body is assigned:
1625
+ """
1626
+ [{"val": 1},{"val": 2}]
1627
+ """
1628
+ Then the value of the response body children `.val` has elements which are all a valid `Number`
1629
+ Then the value of the response body children `.val` has elements which are all a valid `Integer`
1630
+
1631
+ Scenario: Selected nested children can be tested for type when Arrays.
1632
+ When the response body is assigned:
1633
+ """
1634
+ [{"val": [1]},{"val": [2]}]
1635
+ """
1636
+ Then the value of the response body children `.val` has elements which are all a valid `Array`</code></pre>
1637
+ </div>
1638
+ </div>
1639
+ <div class="ulist">
1640
+ <ul>
1641
+ <li>
1642
+ <p><strong>When</strong> I run <code>cucumber --strict features/is_a_valid.feature</code></p>
1643
+ </li>
1644
+ <li>
1645
+ <p><strong>Then</strong> the output should contain:</p>
1646
+ </li>
1647
+ </ul>
1648
+ </div>
1649
+ <div class="listingblock">
1650
+ <div class="content">
1651
+ <pre class="highlightjs highlight"><code class="language-gherkin" data-lang="gherkin">16 passed</code></pre>
1652
+ </div>
1653
+ </div>
1654
+ <div class="ulist">
1655
+ <ul>
1656
+ <li>
1657
+ <p><strong>And</strong> it should pass</p>
1658
+ </li>
1659
+ </ul>
1660
+ </div>
1661
+ </div>
1662
+ </div>
1663
+ </div>
1664
+ </div>
1665
+ </div>
1666
+ <div id="footer">
1667
+ <div id="footer-text">
1668
+ Last updated 2017-11-16 16:15:35 -05:00
1669
+ </div>
1670
+ </div>
1671
+ </body>
1672
+ </html>