brine-dsl 0.11.0 → 0.12.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/Gemfile.lock +38 -19
- data/brine-dsl.gemspec +8 -8
- data/lib/brine.rb +12 -25
- data/lib/brine/assertions.rb +123 -0
- data/lib/brine/cleaning_up.rb +28 -18
- data/lib/brine/client_building.rb +22 -22
- data/lib/brine/coercing.rb +15 -15
- data/lib/brine/hooks.rb +1 -1
- data/lib/brine/mustache_expanding.rb +54 -23
- data/lib/brine/performing.rb +51 -25
- data/lib/brine/requesting.rb +97 -26
- data/lib/brine/selecting.rb +239 -35
- data/lib/brine/test_steps.rb +16 -19
- data/lib/brine/transforming.rb +30 -24
- data/lib/brine/type_checking.rb +25 -14
- metadata +7 -14
- data/lib/brine/rest_steps.rb +0 -119
- data/lib/brine/step_definitions/assertions.rb +0 -50
- data/lib/brine/step_definitions/assignment.rb +0 -42
- data/lib/brine/step_definitions/cleanup.rb +0 -4
- data/lib/brine/step_definitions/perform.rb +0 -16
- data/lib/brine/step_definitions/request_construction.rb +0 -28
- data/lib/brine/step_definitions/selection.rb +0 -49
- data/lib/brine/util.rb +0 -46
data/lib/brine/coercing.rb
CHANGED
@@ -1,35 +1,35 @@
|
|
1
1
|
##
|
2
2
|
# @file coering.rb
|
3
|
-
#
|
3
|
+
# Coerce types to support assertions.
|
4
4
|
##
|
5
5
|
|
6
6
|
module Brine
|
7
7
|
|
8
8
|
##
|
9
|
-
#
|
9
|
+
# Provide type coercion.
|
10
10
|
##
|
11
11
|
module Coercing
|
12
12
|
|
13
13
|
##
|
14
|
-
# Coerces the types of
|
14
|
+
# Coerces the types of provided objects to support assertion evaluation.
|
15
15
|
#
|
16
16
|
# Coercion is used to support handling richer data types in Brine without
|
17
17
|
# introducing noisy type information to the language.
|
18
|
-
#
|
18
|
+
# Transformation code can be used to convert input provided directly
|
19
19
|
# to a Brine step, however data extracted from JSON will by default be
|
20
20
|
# limited to the small amount of JSON supported data types. As normally
|
21
21
|
# the data extracted from JSON will only be directly present on one side
|
22
22
|
# of the assertion (most likely the left), the simpler JSON data types can
|
23
23
|
# be coerced to a richer type based on the right hand side.
|
24
24
|
#
|
25
|
-
# A standard example (and
|
25
|
+
# A standard example (and one which is supported in this file) is date/time
|
26
26
|
# values. When testing an API that returns such values it is likely desirable to
|
27
27
|
# perform assertions with proper date/time semantics, and the coercer allows
|
28
28
|
# such assertions against a value retrieved out of a JSON structure.
|
29
29
|
#
|
30
|
-
# The combination of
|
31
|
-
# allow for user defined types to seemlessly exist within the
|
32
|
-
#
|
30
|
+
# The combination of transforming of ParameterType inputs and the Coercer can
|
31
|
+
# also effectively allow for user defined types to seemlessly exist within the
|
32
|
+
# Brine tests.
|
33
33
|
#
|
34
34
|
# Implementation (Most of the non-implementation info should later be moved).
|
35
35
|
# ---
|
@@ -62,9 +62,9 @@ module Brine
|
|
62
62
|
#
|
63
63
|
# Looks up and invokes the associated coercion function.
|
64
64
|
#
|
65
|
-
# @param [Object]
|
66
|
-
# @param [Object]
|
67
|
-
# @return [Array]
|
65
|
+
# @param first [Object] Provide the first operand.
|
66
|
+
# @param second [Object] Provide the second operand.
|
67
|
+
# @return [Array] Return the coerced [first, second] values.
|
68
68
|
##
|
69
69
|
def coerce(first, second)
|
70
70
|
@map[[first.class, second.class]].call(first, second)
|
@@ -73,11 +73,11 @@ module Brine
|
|
73
73
|
end
|
74
74
|
|
75
75
|
##
|
76
|
-
#
|
76
|
+
# Expose a Coercer as a property.
|
77
77
|
#
|
78
|
-
#
|
78
|
+
# A Coercer will be instantiated as needed on first access.
|
79
79
|
#
|
80
|
-
# @return [Coercer]
|
80
|
+
# @return [Coercer] Return the object which will be used to handle coercions.
|
81
81
|
##
|
82
82
|
def coercer
|
83
83
|
@coercer ||= Coercer.new
|
@@ -86,7 +86,7 @@ module Brine
|
|
86
86
|
end
|
87
87
|
|
88
88
|
##
|
89
|
-
#
|
89
|
+
# Mix the Coercing module functionality into the main Brine module.
|
90
90
|
##
|
91
91
|
include Coercing
|
92
92
|
end
|
data/lib/brine/hooks.rb
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
##
|
2
2
|
# @file mustache_expanding.rb
|
3
|
-
# Support
|
3
|
+
# Support expanding Mustache templates with a provided binding.
|
4
4
|
##
|
5
5
|
module Brine
|
6
6
|
|
7
7
|
##
|
8
|
-
#
|
8
|
+
# Provide a binding environment and template expansion that can use such an environment.
|
9
9
|
##
|
10
10
|
module MustacheExpanding
|
11
11
|
require 'mustache'
|
12
12
|
|
13
13
|
##
|
14
|
-
#
|
14
|
+
# Furnish a mutable hash to serve as a binding environment.
|
15
15
|
#
|
16
|
-
# @return [Hash<String, Object>]
|
16
|
+
# @return [Hash<String, Object>] Return the active binding environment.
|
17
17
|
##
|
18
18
|
def binding
|
19
19
|
@binding ||= {}
|
@@ -22,8 +22,8 @@ module Brine
|
|
22
22
|
##
|
23
23
|
# Assign `value' to `key' within binding,
|
24
24
|
#
|
25
|
-
# @param [String]
|
26
|
-
# @param [Object]
|
25
|
+
# @param key [String] Specify the key in the binding to which `value` will be assigned.
|
26
|
+
# @param value [Object] Specify the value to assign to ``key` within the binding.
|
27
27
|
##
|
28
28
|
def bind(key, value)
|
29
29
|
STDERR.puts "Assigning #{value} to #{key}" if ENV['BRINE_LOG_BINDING']
|
@@ -31,32 +31,30 @@ module Brine
|
|
31
31
|
end
|
32
32
|
|
33
33
|
##
|
34
|
-
#
|
34
|
+
# Provide an expandable Mustache template using binding environment.
|
35
35
|
#
|
36
36
|
# This exists to support latent expansion and template retrieval.
|
37
|
-
#
|
38
|
-
# @param [String] template Template content to expand with binding.
|
39
|
-
# @return [String] The contents of `template` with any expansions done using `binding`.
|
40
37
|
##
|
41
38
|
class BrineTemplate < Mustache
|
42
39
|
|
43
40
|
##
|
44
|
-
# Instantiate a
|
41
|
+
# Instantiate a BrineTemplate.
|
45
42
|
#
|
46
|
-
# @param tmpl [String]
|
47
|
-
# @param binding [Hash] A reference to the (mutable) binding.
|
43
|
+
# @param tmpl [String] Define the string content of the template.
|
48
44
|
##
|
49
|
-
def initialize(tmpl
|
45
|
+
def initialize(tmpl)
|
50
46
|
@template = tmpl
|
51
|
-
@binding = binding
|
52
47
|
end
|
53
48
|
|
54
49
|
##
|
55
|
-
# Expand the template using the
|
50
|
+
# Expand the template using the provided bindings.
|
51
|
+
#
|
52
|
+
# @param binding [Hash] Provide bound values to use within the template.
|
53
|
+
# @return [String] Return the contents of this template applied against `binding`.
|
56
54
|
##
|
57
|
-
def expand
|
55
|
+
def expand(binding)
|
58
56
|
begin
|
59
|
-
context.push(
|
57
|
+
context.push(binding)
|
60
58
|
render
|
61
59
|
ensure
|
62
60
|
context.pop
|
@@ -66,22 +64,55 @@ module Brine
|
|
66
64
|
##
|
67
65
|
# Stringify as template contents.
|
68
66
|
#
|
69
|
-
# This supports cases such as dynamic steps
|
70
|
-
#
|
71
|
-
# be expanded.
|
67
|
+
# This supports cases such as dynamic steps where a string is expected
|
68
|
+
# but the template should not yet be expanded.
|
72
69
|
##
|
73
70
|
def to_s
|
74
71
|
@template
|
75
72
|
end
|
76
73
|
end
|
77
74
|
|
75
|
+
##
|
76
|
+
# Allow retrieval of BrineTemplates for provided template content.
|
77
|
+
#
|
78
|
+
# @param str [String] Define the string contents for the returned template.
|
79
|
+
# @return [BrineTemplate] Return a BrineTemplate with the provided content.
|
80
|
+
##
|
78
81
|
def as_template(str)
|
79
|
-
BrineTemplate.new(str
|
82
|
+
BrineTemplate.new(str)
|
80
83
|
end
|
81
84
|
end
|
82
85
|
|
83
86
|
##
|
84
|
-
#
|
87
|
+
# Mix the MustacheExpanding module functionality into the main Brine module.
|
85
88
|
##
|
86
89
|
include MustacheExpanding
|
87
90
|
end
|
91
|
+
|
92
|
+
##
|
93
|
+
# Assign the provided value to the specified identifier.
|
94
|
+
#
|
95
|
+
# @param name [Object] Specify the identifier to which the value will be bound.
|
96
|
+
# @param value [Object} Provide the value to bind to the identifier.
|
97
|
+
##
|
98
|
+
When('{grave_param} is assigned {grave_param}') do |name, value|
|
99
|
+
perform { bind(expand(name, binding), value) }
|
100
|
+
end
|
101
|
+
|
102
|
+
##
|
103
|
+
# Assign a random string (UUID) to the specified identifier.
|
104
|
+
#
|
105
|
+
# @param name [Object] Specify the identifier to which a random string will be bound.
|
106
|
+
##
|
107
|
+
When('{grave_param} is assigned a random string') do |name|
|
108
|
+
perform { bind(expand(name, binding), SecureRandom.uuid) }
|
109
|
+
end
|
110
|
+
|
111
|
+
##
|
112
|
+
# Assign a current timestamp to the specified identifier.
|
113
|
+
#
|
114
|
+
# @param name [Object] Specify the identifier to which the timestamp will be bound.
|
115
|
+
##
|
116
|
+
When('{grave_param} is assigned a timestamp') do |name|
|
117
|
+
perform { bind(expand(name, binding), DateTime.now) }
|
118
|
+
end
|
data/lib/brine/performing.rb
CHANGED
@@ -1,27 +1,26 @@
|
|
1
1
|
##
|
2
2
|
# @file performing.rb
|
3
|
-
#
|
3
|
+
# Perform potentially deferred actions.
|
4
4
|
##
|
5
|
-
|
6
5
|
module Brine
|
7
6
|
|
8
7
|
##
|
9
|
-
#
|
8
|
+
# Support either immediate or defered evaluation of logic.
|
10
9
|
##
|
11
10
|
module Performing
|
12
11
|
|
13
12
|
##
|
14
|
-
#
|
13
|
+
# Immediately invoke provided actions.
|
15
14
|
#
|
16
15
|
# This has no instance state and therefore a Flyweight could be used,
|
17
|
-
# but too few instances are expected to warrant even the minor
|
16
|
+
# but too few instances are expected to warrant even the minor specialization.
|
18
17
|
##
|
19
18
|
class ImmediatePerformer
|
20
19
|
|
21
20
|
##
|
22
21
|
# Perform the provided actions immediately.
|
23
22
|
#
|
24
|
-
# @param [Proc]
|
23
|
+
# @param [Proc] Provide actions to be performed.
|
25
24
|
##
|
26
25
|
def perform(actions)
|
27
26
|
actions.call
|
@@ -29,7 +28,7 @@ module Brine
|
|
29
28
|
end
|
30
29
|
|
31
30
|
##
|
32
|
-
#
|
31
|
+
# Collect actions to be evaluated later.
|
33
32
|
##
|
34
33
|
class CollectingPerformer
|
35
34
|
|
@@ -41,9 +40,9 @@ module Brine
|
|
41
40
|
end
|
42
41
|
|
43
42
|
##
|
44
|
-
# Collect provided actions
|
43
|
+
# Collect provided actions.
|
45
44
|
#
|
46
|
-
# @param [Proc]
|
45
|
+
# @param actions [Proc] Provide actions to collect.
|
47
46
|
##
|
48
47
|
def perform(actions)
|
49
48
|
@actions << actions
|
@@ -59,11 +58,11 @@ module Brine
|
|
59
58
|
end
|
60
59
|
|
61
60
|
##
|
62
|
-
#
|
61
|
+
# Expose the currently active Performer as a property.
|
63
62
|
#
|
64
63
|
# The default implementation will be wired as needed upon first access.
|
65
64
|
#
|
66
|
-
# @return [Performer, #perform]
|
65
|
+
# @return [Performer, #perform] Return the Performer to which actions will be sent.
|
67
66
|
##
|
68
67
|
def performer
|
69
68
|
@performer || reset_performer
|
@@ -72,16 +71,16 @@ module Brine
|
|
72
71
|
##
|
73
72
|
# Reset the Performer instance to the default implementation.
|
74
73
|
#
|
75
|
-
# @return [Performer, #perform]
|
74
|
+
# @return [Performer, #perform] Return the default implementation which will now be the active Performer.
|
76
75
|
##
|
77
76
|
def reset_performer
|
78
77
|
@performer = ImmediatePerformer.new
|
79
78
|
end
|
80
79
|
|
81
80
|
##
|
82
|
-
# Pass the actions to the
|
81
|
+
# Pass the actions to the active Performer instance.
|
83
82
|
#
|
84
|
-
# @param [Proc] The
|
83
|
+
# @param actions [Proc] The actions to pass to the Performer.
|
85
84
|
##
|
86
85
|
def perform(&actions)
|
87
86
|
performer.perform(actions)
|
@@ -95,12 +94,12 @@ module Brine
|
|
95
94
|
end
|
96
95
|
|
97
96
|
##
|
98
|
-
#
|
97
|
+
# Determine the number of seconds between polling attempts.
|
99
98
|
#
|
100
|
-
#
|
101
|
-
#
|
99
|
+
# This can be provided by the `BRINE_POLL_INTERVAL_SECONDS` environment variable
|
100
|
+
# (defaults to `0.5`).
|
102
101
|
#
|
103
|
-
# @return [Number]
|
102
|
+
# @return [Number] Return the number of seconds to sleep between poll attempts.
|
104
103
|
##
|
105
104
|
def poll_interval_seconds
|
106
105
|
ENV['BRINE_POLL_INTERVAL_SECONDS'] || 0.25
|
@@ -113,11 +112,11 @@ module Brine
|
|
113
112
|
# will be returned, if any exception is thrown it will be
|
114
113
|
# retried until the period elapses.
|
115
114
|
#
|
116
|
-
# @param [Number]
|
117
|
-
# @param [Number]
|
118
|
-
# @param [Block]
|
115
|
+
# @param seconds [Number] Define the period (in seconds) for which the block will be retried.
|
116
|
+
# @param interval [Number] Define how long to sleep between polling attempts (defaults to `#poll_interval_seconds`).
|
117
|
+
# @param [Block] Provide the logic to retry within the defined period.
|
119
118
|
# @return [Object] The result of the block if successfully evaluated.
|
120
|
-
# @throws [Exception]
|
119
|
+
# @throws [Exception] Re-throws the most recent exception thrown from the block if never successfully evaluated.
|
121
120
|
##
|
122
121
|
def poll_for(seconds, interval=poll_interval_seconds)
|
123
122
|
failure = nil
|
@@ -134,13 +133,13 @@ module Brine
|
|
134
133
|
end
|
135
134
|
|
136
135
|
##
|
137
|
-
#
|
136
|
+
# Retrieve the duration in seconds for the given handle.
|
138
137
|
#
|
139
138
|
# Currently this only supports values provided through environment variables
|
140
139
|
# of the format BRINE_DURATION_SECONDS_{handle}.
|
141
140
|
#
|
142
|
-
# @param[String]
|
143
|
-
# @return [Number]
|
141
|
+
# @param duration [String] Identify the duration whose length should be returned.
|
142
|
+
# @return [Number] Return the number of seconds defined for the requested duration.
|
144
143
|
##
|
145
144
|
def retrieve_duration(duration)
|
146
145
|
if ENV["BRINE_DURATION_SECONDS_#{duration}"]
|
@@ -157,3 +156,30 @@ module Brine
|
|
157
156
|
##
|
158
157
|
include Performing
|
159
158
|
end
|
159
|
+
|
160
|
+
require 'brine/selecting.rb'
|
161
|
+
|
162
|
+
##
|
163
|
+
# Collect actions rather than immediately evaluating them.
|
164
|
+
##
|
165
|
+
When('actions are defined such that') do
|
166
|
+
collect_actions
|
167
|
+
end
|
168
|
+
|
169
|
+
##
|
170
|
+
# Evaluate collected actions for the provided period.
|
171
|
+
#
|
172
|
+
# This will pass if any evaluation is successful within the specified time.
|
173
|
+
#
|
174
|
+
# @param negated [Boolean] Specify whether the assertion should be expected to fail.
|
175
|
+
# @param period [Object] Specify the period length as returned by #retrieve_duration.
|
176
|
+
##
|
177
|
+
Then('the actions are{maybe_not} successful within a {grave_param} period') do |negated, period|
|
178
|
+
method = negated ? :to : :to_not
|
179
|
+
expect do
|
180
|
+
poll_for(retrieve_duration(expand(period, binding))) do
|
181
|
+
performer.evaluate
|
182
|
+
end
|
183
|
+
end.send(method, raise_error)
|
184
|
+
reset_performer
|
185
|
+
end
|
data/lib/brine/requesting.rb
CHANGED
@@ -1,19 +1,18 @@
|
|
1
1
|
##
|
2
2
|
# @file requesting.rb
|
3
|
-
#
|
3
|
+
# Provide request construction and response storage.
|
4
4
|
##
|
5
|
-
|
6
5
|
module Brine
|
7
6
|
|
8
7
|
##
|
9
|
-
#
|
8
|
+
# Support constructing requests and saving responses.
|
10
9
|
##
|
11
10
|
module Requesting
|
12
11
|
require 'faraday_middleware'
|
13
12
|
require 'brine/client_building'
|
14
13
|
|
15
14
|
##
|
16
|
-
#
|
15
|
+
# Retrieve the root url to which Brine will send requests.
|
17
16
|
#
|
18
17
|
# This will normally be the value of ENV['BRINE_ROOT_URL'],
|
19
18
|
# and that value should be directly usable after older
|
@@ -21,7 +20,7 @@ module Brine
|
|
21
20
|
#
|
22
21
|
# @brine_root_url is used if set to allow setting this value more programmatically.
|
23
22
|
#
|
24
|
-
# @return [String]
|
23
|
+
# @return [String] Return the root URL to use or nil if none is provided.
|
25
24
|
##
|
26
25
|
def brine_root_url
|
27
26
|
if @brine_root_url
|
@@ -37,8 +36,8 @@ module Brine
|
|
37
36
|
##
|
38
37
|
# Normalize an HTTP method for the HTTP client library (to a lowercased symbol).
|
39
38
|
#
|
40
|
-
# @param [String]
|
41
|
-
# @return [Symbol]
|
39
|
+
# @param method [String] Provide a text representation of the HTTP method.
|
40
|
+
# @return [Symbol] Return `method` in a form potentially usable by the HTTP client library.
|
42
41
|
##
|
43
42
|
def parse_method(method)
|
44
43
|
method.downcase.to_sym
|
@@ -49,19 +48,19 @@ module Brine
|
|
49
48
|
#
|
50
49
|
# This will generally be a connection as created by the ClientBuilding module.
|
51
50
|
#
|
52
|
-
# @param [Faraday::Connection, #run_request]
|
51
|
+
# @param client [Faraday::Connection, #run_request] Provide the client which will be used to issue HTTP requests.
|
53
52
|
##
|
54
53
|
def set_client(client)
|
55
54
|
@client = client
|
56
55
|
end
|
57
56
|
|
58
57
|
##
|
59
|
-
#
|
58
|
+
# Return the currently active client which will be used to issue HTTP calls.
|
60
59
|
#
|
61
60
|
# This will be initialized as neded on first access
|
62
61
|
# to a default client constructed by the ClientBuilding module.
|
63
62
|
#
|
64
|
-
# @return [Faraday::Connection, #run_request]
|
63
|
+
# @return [Faraday::Connection, #run_request] Return the active HTTP client.
|
65
64
|
##
|
66
65
|
def client
|
67
66
|
@client ||= client_for_host(brine_root_url)
|
@@ -82,7 +81,7 @@ module Brine
|
|
82
81
|
#
|
83
82
|
# This will override any previous body value.
|
84
83
|
#
|
85
|
-
# @param [Object]
|
84
|
+
# @param obj [Object] Provide the data to place in the request body.
|
86
85
|
##
|
87
86
|
def set_request_body(obj)
|
88
87
|
@body = obj
|
@@ -99,9 +98,8 @@ module Brine
|
|
99
98
|
# methods will always be inclued in the request and therefore such data should
|
100
99
|
# be cleared using `#reset_request` if it is not desired.
|
101
100
|
#
|
102
|
-
# @param [Symbol]
|
103
|
-
#
|
104
|
-
# @param [String] url The url to which the request will be sent.
|
101
|
+
# @param method [Symbol] Provide the HTTP method for the request such as returned by #parse_method.
|
102
|
+
# @param url [String] Specify the url to which the request will be sent.
|
105
103
|
##
|
106
104
|
def send_request(method, url)
|
107
105
|
@response = client.run_request(method, url, @body, headers) do |req|
|
@@ -110,21 +108,21 @@ module Brine
|
|
110
108
|
end
|
111
109
|
|
112
110
|
##
|
113
|
-
#
|
111
|
+
# Return the response for the last sent request.
|
114
112
|
#
|
115
|
-
# @return [Faraday::Response]
|
113
|
+
# @return [Faraday::Response] Return the most recent response.
|
116
114
|
##
|
117
115
|
def response
|
118
116
|
@response
|
119
117
|
end
|
120
118
|
|
121
119
|
##
|
122
|
-
#
|
120
|
+
# Expose the headers for the request currently being built.
|
123
121
|
#
|
124
|
-
#
|
122
|
+
# This will be initialized as needed on first access,
|
125
123
|
# with a default specifying JSON content-type.
|
126
124
|
#
|
127
|
-
# @return [Hash]
|
125
|
+
# @return [Hash] Return the headers to use for the constructed request.
|
128
126
|
##
|
129
127
|
def headers
|
130
128
|
@headers ||= {content_type: 'application/json'}
|
@@ -133,8 +131,8 @@ module Brine
|
|
133
131
|
##
|
134
132
|
# Set the specified header to the provided value.
|
135
133
|
#
|
136
|
-
# @param [String]
|
137
|
-
# @param [Object]
|
134
|
+
# @param k [String] Specify the name of the header whose value will be set.
|
135
|
+
# @param v [Object] Provide the value to set for the specified header.
|
138
136
|
# This should normally be a String, but some other types may work.
|
139
137
|
##
|
140
138
|
def set_header(k, v)
|
@@ -142,11 +140,11 @@ module Brine
|
|
142
140
|
end
|
143
141
|
|
144
142
|
##
|
145
|
-
#
|
143
|
+
# Expose the query parameters which will be attached to the constructeed request.
|
146
144
|
#
|
147
|
-
#
|
145
|
+
# This will be initialized to an empty hash as needed upon first access.
|
148
146
|
#
|
149
|
-
# @return [Hash]
|
147
|
+
# @return [Hash] Return the query parameters to use for the constructed request.
|
150
148
|
##
|
151
149
|
def request_params
|
152
150
|
@request_params ||= {}
|
@@ -155,8 +153,8 @@ module Brine
|
|
155
153
|
##
|
156
154
|
# Assign the provided value to the specified request query parameter.
|
157
155
|
#
|
158
|
-
# @param [String]
|
159
|
-
# @param [Object]
|
156
|
+
# @param k [String] Specify the name of the query parameter whose value is being assigned.
|
157
|
+
# @param v [Object] Provide the value to assign the query parameter (normally a String).
|
160
158
|
##
|
161
159
|
def set_request_param(k, v)
|
162
160
|
request_params[k] = v
|
@@ -169,3 +167,76 @@ module Brine
|
|
169
167
|
##
|
170
168
|
include Requesting
|
171
169
|
end
|
170
|
+
|
171
|
+
require 'brine/selecting'
|
172
|
+
require 'brine/transforming'
|
173
|
+
|
174
|
+
##
|
175
|
+
# Define a body for the request currently under construction.
|
176
|
+
#
|
177
|
+
# @param input [String] Define the body contents to use in the request.
|
178
|
+
##
|
179
|
+
When('the request body is assigned:') do |input|
|
180
|
+
perform { set_request_body(input) }
|
181
|
+
end
|
182
|
+
|
183
|
+
##
|
184
|
+
# Define the indicated query parameter value for the request currently under construction.
|
185
|
+
#
|
186
|
+
# @param param [Object] Specify the name of the query parameter whose value will be set.
|
187
|
+
# @param value [Object] Specify the value to set for the named query parameter.
|
188
|
+
##
|
189
|
+
When('the request query parameter {grave_param} is assigned {grave_param}') do |param, value|
|
190
|
+
perform { set_request_param(param, value) }
|
191
|
+
end
|
192
|
+
|
193
|
+
##
|
194
|
+
# Define the indicated header value for the request currently under construction.
|
195
|
+
#
|
196
|
+
# @param header [Object] Specify the name of the header whose value will be set.
|
197
|
+
# @param value [Object] Specify the value to set for the named header.
|
198
|
+
##
|
199
|
+
When('the request header {grave_param} is assigned {grave_param}') do |header, value|
|
200
|
+
perform { set_header(header, value) }
|
201
|
+
end
|
202
|
+
|
203
|
+
##
|
204
|
+
# Issue a request with the provided method to the specified url.
|
205
|
+
#
|
206
|
+
# Bind the returned response.
|
207
|
+
#
|
208
|
+
# @param method [String] Specify the HTTP method to use for the request.
|
209
|
+
# @param url [Object] Specify the URL to which the request will be sent.
|
210
|
+
##
|
211
|
+
When('a(n) {http_method} is sent to {grave_param}') do |method, url|
|
212
|
+
perform do
|
213
|
+
send_request(parse_method(method), URI.escape(expand(url, binding)))
|
214
|
+
bind('response', response)
|
215
|
+
reset_request
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
##
|
220
|
+
# Attach a HTTP Basic Auth header to the request currently under construction.
|
221
|
+
#
|
222
|
+
# @param user [Object] Specify the user with which to generate the header.
|
223
|
+
# @param password [Object] Specify the password with which to generate the header.
|
224
|
+
##
|
225
|
+
When('the request credentials are set for basic auth user {grave_param} and password {grave_param}') do |user, password|
|
226
|
+
perform do
|
227
|
+
base64_combined = Base64.strict_encode64("#{expand(user, binding)}:#{expand(password, binding)}")
|
228
|
+
set_header('Authorization', "Basic #{base64_combined}")
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
232
|
+
##
|
233
|
+
# Assign a value extracted from a response attribute to the specified identifier.
|
234
|
+
#
|
235
|
+
# @param name [Object] Specify the identifier to which the value will be bound.
|
236
|
+
# @param attribute [String] Specify the attribute from which the value will be retrieved.
|
237
|
+
# @param traversal [Traversal] Provide a traversal to fetch the value out of the attribute.
|
238
|
+
##
|
239
|
+
When('{grave_param} is assigned the response {response_attribute}{traversal}') do
|
240
|
+
|name, attribute, traversal|
|
241
|
+
perform { bind(expand(name, binding), traversal.visit(response_attribute(attribute))) }
|
242
|
+
end
|