cucumber-rest-bdd 0.5.3 → 0.6.0.pre.183
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/lib/cucumber-rest-bdd/data.rb +52 -0
- data/lib/cucumber-rest-bdd/level.rb +8 -3
- data/lib/cucumber-rest-bdd/list.rb +144 -0
- data/lib/cucumber-rest-bdd/steps/functional.rb +6 -11
- data/lib/cucumber-rest-bdd/steps/resource.rb +36 -43
- data/lib/cucumber-rest-bdd/steps/response.rb +107 -132
- data/lib/cucumber-rest-bdd/steps/status.rb +54 -15
- data/lib/cucumber-rest-bdd/types.rb +129 -83
- data/lib/cucumber-rest-bdd/url.rb +4 -1
- metadata +33 -31
- data/.gitignore +0 -50
- data/.travis.yml +0 -23
- data/Dockerfile +0 -24
- data/LICENSE +0 -21
- data/Makefile +0 -15
- data/README.md +0 -338
- data/STEPS.md +0 -257
- data/cucumber-rest-bdd.gemspec +0 -19
- data/docker-compose.yml +0 -23
- data/features/errors.feature +0 -23
- data/features/functional.feature +0 -25
- data/features/grabs.feature +0 -21
- data/features/headers.feature +0 -16
- data/features/levels.feature +0 -121
- data/features/methods.feature +0 -101
- data/features/response.feature +0 -103
- data/features/status.feature +0 -18
- data/features/support/env.rb +0 -2
- data/features/types.feature +0 -48
- data/server/db.json +0 -41044
- data/server/error.js +0 -14
- data/server/routes.json +0 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 2ace80d0cd81cb18bfbb26e4dc2dfe20ee084cd95408382020d8030f9b9a574b
|
4
|
+
data.tar.gz: 86de8eb49558ed6688b5326571eb8440966a565adca95024e72c432e327f1b95
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c36991b0161ea4f86cade6e3aa163b5996feca2990114ca69ca54756c1763087fcf7fc50f0893fc4f1e05ca4062412d048a9d7fe8fb9610812c6cd91582a5677
|
7
|
+
data.tar.gz: 286eeddd1565590b32fd528e8e40b0c4ad183bdb78eccee72fa3af9c6e53fc67e5b2db848c2f7406a2869dc8b22a7fc62ecac76195e9b4683bda4367f7a2dcd9
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'cucumber-rest-bdd/types'
|
2
|
+
|
3
|
+
# gets the relevant key for the response based on the first key element
|
4
|
+
def get_key(grouping)
|
5
|
+
errorKey = ENV['error_key']
|
6
|
+
if errorKey && !errorKey.empty? && grouping.count > 1 && grouping[-2][:key].singularize == errorKey then
|
7
|
+
return "$."
|
8
|
+
else
|
9
|
+
return get_root_data_key()
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
# top level has 2 children with an item containing at most three fish with attributes:
|
14
|
+
#
|
15
|
+
# nesting = [{key=fish,count=3,count_mod='<=',type=multiple},{key=item,type=single},{key=children,type=multiple,count=2,count_mod='='},{root=true,type=single}]
|
16
|
+
#
|
17
|
+
# returns true if the expected data is contained within the data based on the nesting information
|
18
|
+
def nest_match_attributes(data, nesting, expected, matchValue)
|
19
|
+
return false if !data
|
20
|
+
return data.deep_include?(expected) if !matchValue && nesting.size == 0
|
21
|
+
return data.include?(expected) if matchValue && nesting.size == 0
|
22
|
+
|
23
|
+
local_nesting = nesting.dup
|
24
|
+
level = local_nesting.pop
|
25
|
+
child_data = get_child_data(level, data)
|
26
|
+
|
27
|
+
case level[:type]
|
28
|
+
when 'single' then
|
29
|
+
return nest_match_attributes(child_data, local_nesting, expected, matchValue)
|
30
|
+
when 'multiple' then
|
31
|
+
matched = child_data.select { |item| nest_match_attributes(item, local_nesting, expected, matchValue) }
|
32
|
+
return level[:comparison].compare(matched.count)
|
33
|
+
when 'list' then
|
34
|
+
return child_data.is_a?(Array) && (!level.has_key?(:comparison) || level[:comparison].compare(child_data.count))
|
35
|
+
else
|
36
|
+
raise %/Unknown nested data type: #{level[:type]}/
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def get_child_data(level, data)
|
41
|
+
if (level[:root]) then
|
42
|
+
return data.dup
|
43
|
+
else
|
44
|
+
levelKey = case level[:type]
|
45
|
+
when 'single' then get_field(level[:key])
|
46
|
+
when 'multiple' then get_list_field(level[:key])
|
47
|
+
when 'list' then get_list_field(level[:key])
|
48
|
+
end
|
49
|
+
raise %/Key not found: #{level[:key]} as #{levelKey} in #{data}/ if data.is_a?(Array) || !data[levelKey]
|
50
|
+
return data[levelKey]
|
51
|
+
end
|
52
|
+
end
|
@@ -1,7 +1,12 @@
|
|
1
1
|
require 'cucumber-rest-bdd/types'
|
2
2
|
require 'active_support/inflector'
|
3
3
|
|
4
|
-
|
4
|
+
ParameterType(
|
5
|
+
name: 'levels',
|
6
|
+
regexp: /((?: (?:for|in|on) (?:#{RESOURCE_NAME_SYNONYM})(?: with (?:key|id))? "[^"]*")*)/,
|
7
|
+
transformer: -> (levels) { Level.new(levels) },
|
8
|
+
use_for_snippets: false
|
9
|
+
)
|
5
10
|
|
6
11
|
class Level
|
7
12
|
@urls = []
|
@@ -26,14 +31,14 @@ class Level
|
|
26
31
|
|
27
32
|
def hash
|
28
33
|
hash = {}
|
29
|
-
@urls.each{ |l| hash[
|
34
|
+
@urls.each{ |l| hash[get_field("#{get_field(l[:resource]).singularize}_id")] = l[:id] }
|
30
35
|
hash
|
31
36
|
end
|
32
37
|
|
33
38
|
def last_hash
|
34
39
|
last = @urls.last
|
35
40
|
if !last.nil?
|
36
|
-
key =
|
41
|
+
key = get_field("#{get_field(last[:resource]).singularize}_id")
|
37
42
|
return {
|
38
43
|
key => last[:id]
|
39
44
|
}
|
@@ -0,0 +1,144 @@
|
|
1
|
+
require 'cucumber-rest-bdd/types'
|
2
|
+
|
3
|
+
FEWER_MORE_THAN_SYNONYM = %q{(?:fewer|less|more) than|at (?:least|most)}
|
4
|
+
INT_AS_WORDS_SYNONYM = %q{zero|one|two|three|four|five|six|seven|eight|nine|ten}
|
5
|
+
|
6
|
+
ParameterType(
|
7
|
+
name: 'list_has_count',
|
8
|
+
regexp: /a|an|(?:(?:#{FEWER_MORE_THAN_SYNONYM})\s+)?(?:#{INT_AS_WORDS_SYNONYM}|\d+)/,
|
9
|
+
transformer: -> (match) {
|
10
|
+
matches = /(?:(#{FEWER_MORE_THAN_SYNONYM})\s+)?(#{INT_AS_WORDS_SYNONYM}|\d+)/.match(match)
|
11
|
+
return ListCountComparison.new(matches[1], matches[2])
|
12
|
+
},
|
13
|
+
use_for_snippets: false
|
14
|
+
)
|
15
|
+
|
16
|
+
ParameterType(
|
17
|
+
name: 'list_nesting',
|
18
|
+
regexp: %r{(?:(?:#{HAVE_ALTERNATION.split('/').join('|')})?\s*(?:a list of\s+)?(?:a|an|(?:(?:#{FEWER_MORE_THAN_SYNONYM})\s+)?(?:#{INT_AS_WORDS_SYNONYM}|\d+))\s+(?:#{FIELD_NAME_SYNONYM})\s*)+},
|
19
|
+
transformer: -> (match) { ListNesting.new(match) },
|
20
|
+
use_for_snippets: false
|
21
|
+
)
|
22
|
+
|
23
|
+
class ListNesting
|
24
|
+
def initialize(match)
|
25
|
+
@match = match
|
26
|
+
# gets an array in the nesting format that nest_match_attributes understands to interrogate nested object and array data
|
27
|
+
grouping = []
|
28
|
+
nesting = match
|
29
|
+
|
30
|
+
minimalListRegex = %r{(?:#{HAVE_ALTERNATION.split('/').join('|')})?\s*(?:(a list of)\s+)?(?:a|an|(?:(#{FEWER_MORE_THAN_SYNONYM})\s+)?(#{INT_AS_WORDS_SYNONYM}|\d+))\s+(#{FIELD_NAME_SYNONYM})}
|
31
|
+
maximalListRegex = %r{(?:#{HAVE_ALTERNATION.split('/').join('|')})?\s*(?:(a list of)\s+)?(?:a|an|(?:(#{FEWER_MORE_THAN_SYNONYM})\s+)?(#{INT_AS_WORDS_SYNONYM}|\d+))\s+(#{MAXIMAL_FIELD_NAME_SYNONYM})}
|
32
|
+
while matches = minimalListRegex.match(nesting)
|
33
|
+
nextMatches = minimalListRegex.match(nesting[matches.end(0), nesting.length])
|
34
|
+
matches = maximalListRegex.match(nextMatches.nil? ? nesting : nesting[0, matches.end(0) + nextMatches.begin(0)])
|
35
|
+
nesting = nesting[matches.end(0), nesting.length]
|
36
|
+
|
37
|
+
if matches[1].nil? then
|
38
|
+
if matches[3].nil? then
|
39
|
+
level = {
|
40
|
+
type: 'single',
|
41
|
+
key: matches[4],
|
42
|
+
root: false
|
43
|
+
}
|
44
|
+
else
|
45
|
+
level = {
|
46
|
+
type: 'multiple',
|
47
|
+
key: matches[4],
|
48
|
+
comparison: ListCountComparison.new(matches[2], matches[3]),
|
49
|
+
root: false
|
50
|
+
}
|
51
|
+
end
|
52
|
+
else
|
53
|
+
level = {
|
54
|
+
type: 'list',
|
55
|
+
key: matches[4],
|
56
|
+
comparison: ListCountComparison.new(matches[2], matches[3]),
|
57
|
+
root: false
|
58
|
+
}
|
59
|
+
end
|
60
|
+
grouping.push(level)
|
61
|
+
end
|
62
|
+
@grouping = grouping.reverse
|
63
|
+
end
|
64
|
+
|
65
|
+
def push(node)
|
66
|
+
@grouping.push(node)
|
67
|
+
end
|
68
|
+
|
69
|
+
def match
|
70
|
+
return @match
|
71
|
+
end
|
72
|
+
|
73
|
+
def grouping
|
74
|
+
@grouping
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
class ListCountComparison
|
79
|
+
|
80
|
+
def initialize(type, amount)
|
81
|
+
@type = type.nil? ? CMP_EQUALS : to_compare(type)
|
82
|
+
@amount = amount.nil? ? 1 : to_num(amount)
|
83
|
+
end
|
84
|
+
|
85
|
+
def compare(actual)
|
86
|
+
case @type
|
87
|
+
when CMP_LESS_THAN then actual < @amount
|
88
|
+
when CMP_MORE_THAN then actual > @amount
|
89
|
+
when CMP_AT_MOST then actual <= @amount
|
90
|
+
when CMP_AT_LEAST then actual >= @amount
|
91
|
+
when CMP_EQUALS then actual == @amount
|
92
|
+
else actual == @amount
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def type
|
97
|
+
return @type
|
98
|
+
end
|
99
|
+
|
100
|
+
def amount
|
101
|
+
return amount
|
102
|
+
end
|
103
|
+
|
104
|
+
# turn a comparison into a string
|
105
|
+
def compare_to_string()
|
106
|
+
case @type
|
107
|
+
when CMP_LESS_THAN then 'fewer than '
|
108
|
+
when CMP_MORE_THAN then 'more than '
|
109
|
+
when CMP_AT_LEAST then 'at least '
|
110
|
+
when CMP_AT_MOST then 'at most '
|
111
|
+
when CMP_EQUALS then 'exactly '
|
112
|
+
else ''
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def to_string()
|
117
|
+
return compare_to_string() + ' ' + @amount.to_s
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
CMP_LESS_THAN = '<'
|
122
|
+
CMP_MORE_THAN = '>'
|
123
|
+
CMP_AT_LEAST = '>='
|
124
|
+
CMP_AT_MOST = '<='
|
125
|
+
CMP_EQUALS = '='
|
126
|
+
|
127
|
+
# take a number modifier string (fewer than, less than, etc) and return an operator '<', etc
|
128
|
+
def to_compare(compare)
|
129
|
+
return case compare
|
130
|
+
when 'fewer than' then CMP_LESS_THAN
|
131
|
+
when 'less than' then CMP_LESS_THAN
|
132
|
+
when 'more than' then CMP_MORE_THAN
|
133
|
+
when 'at least' then CMP_AT_LEAST
|
134
|
+
when 'at most' then CMP_AT_MOST
|
135
|
+
else CMP_EQUALS
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
def to_num(num)
|
140
|
+
if /^(?:zero|one|two|three|four|five|six|seven|eight|nine|ten)$/.match(num)
|
141
|
+
return %w(zero one two three four five six seven eight nine ten).index(num)
|
142
|
+
end
|
143
|
+
return num.to_i
|
144
|
+
end
|
@@ -1,8 +1,9 @@
|
|
1
1
|
require 'cucumber-api/response'
|
2
2
|
require 'cucumber-api/steps'
|
3
3
|
require 'cucumber-rest-bdd/types'
|
4
|
+
require 'cucumber-rest-bdd/list'
|
4
5
|
|
5
|
-
Then(
|
6
|
+
Then("the response (should )have/has (a/the )header {string} #{HAVE_ALTERNATION} (a/the )value {string}") do |header, value|
|
6
7
|
p_value = resolve(value)
|
7
8
|
p_header = header.parameterize
|
8
9
|
raise %/Required header: #{header} not found\n#{@response.raw_headers.inspect}/ if !@response.raw_headers.key?(p_header)
|
@@ -10,23 +11,17 @@ Then(/^the response (?:should have|has a|has the) header "([^"]*)" with (?:a |th
|
|
10
11
|
raise %/Expect #{p_value} in #{header} (#{p_header})\n#{@response.raw_headers.inspect}/ if !exists
|
11
12
|
end
|
12
13
|
|
13
|
-
Then(
|
14
|
+
Then("the JSON response should have {string} of type array #{HAVE_ALTERNATION} {list_has_count} entry/entries") do |json_path, list_comparison|
|
14
15
|
list = @response.get_as_type json_path, 'array'
|
15
|
-
raise %/Expected #{
|
16
|
+
raise %/Expected #{list_comparison.to_string()} entries in array for path '#{json_path}', found: #{list.count}\n#{@response.to_json_s}/ if !list_comparison.compare(list.count)
|
16
17
|
end
|
17
18
|
|
18
|
-
Then(
|
19
|
-
list = @response.get_as_type json_path, 'array'
|
20
|
-
raise %/Expected #{count_mod} #{number} items in array for path '#{json_path}', found: #{list.count}\n#{@response.to_json_s}/ \
|
21
|
-
if !num_compare(count_mod, list.count, number.to_i)
|
22
|
-
end
|
23
|
-
|
24
|
-
Then(/^the JSON response should have "([^"]*)" of type (.+) that matches "(.+)"$/) do |json_path, type, regex|
|
19
|
+
Then("the JSON response should have {string} of type {word} that matches {string}") do |json_path, type, regex|
|
25
20
|
value = @response.get_as_type json_path, type
|
26
21
|
raise %/Expected #{json_path} value '#{value}' to match regex: #{regex}\n#{@response.to_json_s}/ if (Regexp.new(regex) =~ value).nil?
|
27
22
|
end
|
28
23
|
|
29
|
-
Then(
|
24
|
+
Then("the JSON response should have {string} of type nill/null/nil") do |json_path|
|
30
25
|
value = @response.get_as_type_or_null json_path, 'string'
|
31
26
|
raise %/Expected #{json_path} to be nil, was: #{value.class}\n#{@response.to_json_s}/ if !value.nil?
|
32
27
|
end
|
@@ -7,41 +7,44 @@ require 'cucumber-rest-bdd/level'
|
|
7
7
|
require 'cucumber-rest-bdd/hash'
|
8
8
|
require 'easy_diff'
|
9
9
|
|
10
|
-
|
10
|
+
GET_TYPES = %{(?:an?(?! list)|the)}%
|
11
|
+
WITH_ID = %{(?: with (?:key|id))? "([^"]*)"}%
|
12
|
+
|
13
|
+
Given("I am a client") do
|
11
14
|
steps %Q{
|
12
15
|
Given I send "application/json" and accept JSON
|
13
16
|
}
|
14
17
|
end
|
15
18
|
|
19
|
+
Given("I am issuing requests for {resource_name}") do |resource|
|
20
|
+
@urlbasepath = resource
|
21
|
+
end
|
22
|
+
|
16
23
|
# GET
|
17
24
|
|
18
|
-
When(
|
19
|
-
|
20
|
-
url = get_url("#{Level.new(levels).url}#{resource_name}/#{id}")
|
25
|
+
When("I request the {resource_name} (with key/id ){string}{levels}") do |resource, id, levels|
|
26
|
+
url = get_url("#{levels.url}#{resource}/#{id}")
|
21
27
|
steps %Q{When I send a GET request to "#{url}"}
|
22
28
|
end
|
23
29
|
|
24
|
-
When(
|
25
|
-
|
26
|
-
url = get_url("#{Level.new(levels).url}#{resource_name}/#{id}")
|
30
|
+
When("I request the {resource_name} (with key/id ){string}{levels} with:") do |resource, id, levels, params|
|
31
|
+
url = get_url("#{levels.url}#{resource}/#{id}")
|
27
32
|
unless params.raw.empty?
|
28
|
-
query = params.raw.map{|key, value| %/#{
|
33
|
+
query = params.raw.map{|key, value| %/#{get_field(key)}=#{resolve(value)}/}.join("&")
|
29
34
|
url = "#{url}?#{query}"
|
30
35
|
end
|
31
36
|
steps %Q{When I send a GET request to "#{url}"}
|
32
37
|
end
|
33
38
|
|
34
|
-
When(
|
35
|
-
|
36
|
-
url = get_url("#{Level.new(levels).url}#{resource_name}")
|
39
|
+
When("I request a list of {resource_name}{levels}") do |resource, levels|
|
40
|
+
url = get_url("#{levels.url}#{resource}")
|
37
41
|
steps %Q{When I send a GET request to "#{url}"}
|
38
42
|
end
|
39
43
|
|
40
|
-
When(
|
41
|
-
|
42
|
-
url = get_url("#{Level.new(levels).url}#{resource_name}")
|
44
|
+
When("I request a list of {resource_name}{levels} with:") do |resource, levels, params|
|
45
|
+
url = get_url("#{levels.url}#{resource}")
|
43
46
|
unless params.raw.empty?
|
44
|
-
query = params.raw.map{|key, value| %/#{
|
47
|
+
query = params.raw.map{|key, value| %/#{get_field(key)}=#{resolve(value)}/}.join("&")
|
45
48
|
url = "#{url}?#{query}"
|
46
49
|
end
|
47
50
|
steps %Q{When I send a GET request to "#{url}"}
|
@@ -49,19 +52,16 @@ end
|
|
49
52
|
|
50
53
|
# DELETE
|
51
54
|
|
52
|
-
When(
|
53
|
-
|
54
|
-
url = get_url("#{Level.new(levels).url}#{resource_name}/#{id}")
|
55
|
+
When("I request to delete/remove a/an/the {resource_name} (with key/id ){string}{levels}") do |resource, id, levels|
|
56
|
+
url = get_url("#{levels.url}#{resource}/#{id}")
|
55
57
|
steps %Q{When I send a DELETE request to "#{url}"}
|
56
58
|
end
|
57
59
|
|
58
60
|
# POST
|
59
61
|
|
60
|
-
When(
|
61
|
-
resource_name = get_resource(resource)
|
62
|
-
level = Level.new(levels)
|
62
|
+
When("I request to create a/an/the {resource_name}{levels}") do |resource, levels|
|
63
63
|
if ENV['set_parent_id'] == 'true'
|
64
|
-
json = MultiJson.dump(
|
64
|
+
json = MultiJson.dump(levels.last_hash)
|
65
65
|
steps %Q{
|
66
66
|
When I set JSON request body to:
|
67
67
|
"""
|
@@ -69,17 +69,15 @@ When(/^I request to create an? ([^:]+?)(#{LEVELS})?$/) do |resource, levels|
|
|
69
69
|
"""
|
70
70
|
}
|
71
71
|
end
|
72
|
-
url = get_url("#{
|
72
|
+
url = get_url("#{levels.url}#{resource}")
|
73
73
|
steps %Q{When I send a POST request to "#{url}"}
|
74
74
|
end
|
75
75
|
|
76
|
-
When(
|
77
|
-
resource_name = get_resource(resource)
|
76
|
+
When("I request to create a/an/the {resource_name}{levels} with:") do |resource, levels, params|
|
78
77
|
request_hash = get_attributes(params.hashes)
|
79
|
-
|
80
|
-
request_hash = request_hash.merge(level.last_hash) if ENV['set_parent_id'] == 'true'
|
78
|
+
request_hash = request_hash.merge(levels.last_hash) if ENV['set_parent_id'] == 'true'
|
81
79
|
json = MultiJson.dump(request_hash)
|
82
|
-
url = get_url("#{
|
80
|
+
url = get_url("#{levels.url}#{resource}")
|
83
81
|
steps %Q{
|
84
82
|
When I set JSON request body to:
|
85
83
|
"""
|
@@ -91,11 +89,9 @@ end
|
|
91
89
|
|
92
90
|
# PUT
|
93
91
|
|
94
|
-
When(
|
95
|
-
resource_name = get_resource(resource)
|
96
|
-
level = Level.new(levels)
|
92
|
+
When("I request to replace/set a/an/the {resource_name} (with key/id ){string}{levels}") do |resource, id, levels|
|
97
93
|
if ENV['set_parent_id'] == 'true'
|
98
|
-
json = MultiJson.dump(
|
94
|
+
json = MultiJson.dump(levels.last_hash)
|
99
95
|
steps %Q{
|
100
96
|
When I set JSON request body to:
|
101
97
|
"""
|
@@ -103,19 +99,17 @@ When(/^I request to (?:create|replace|set) (?:an?|the) ((?![^"]+?(?: for | in |
|
|
103
99
|
"""
|
104
100
|
}
|
105
101
|
end
|
106
|
-
url = get_url("#{
|
102
|
+
url = get_url("#{levels.url}#{resource}/#{id}")
|
107
103
|
steps %Q{
|
108
104
|
When I send a PUT request to "#{url}"
|
109
105
|
}
|
110
106
|
end
|
111
107
|
|
112
|
-
When(
|
113
|
-
resource_name = get_resource(resource)
|
108
|
+
When("I request to replace/set a/an/the {resource_name} (with key/id ){string}{levels} with:") do |resource, id, levels, params|
|
114
109
|
request_hash = get_attributes(params.hashes)
|
115
|
-
|
116
|
-
request_hash = request_hash.merge(level.last_hash) if ENV['set_parent_id'] == 'true'
|
110
|
+
request_hash = request_hash.merge(levels.last_hash) if ENV['set_parent_id'] == 'true'
|
117
111
|
json = MultiJson.dump(request_hash)
|
118
|
-
url = get_url("#{
|
112
|
+
url = get_url("#{levels.url}#{resource}/#{id}")
|
119
113
|
steps %Q{
|
120
114
|
When I set JSON request body to:
|
121
115
|
"""
|
@@ -127,11 +121,10 @@ end
|
|
127
121
|
|
128
122
|
# PATCH
|
129
123
|
|
130
|
-
When(
|
131
|
-
resource_name = get_resource(resource)
|
124
|
+
When("I request to modify/update a/an/the {resource_name} (with key/id ){string}{levels} with:") do |resource, id, levels, params|
|
132
125
|
request_hash = get_attributes(params.hashes)
|
133
126
|
json = MultiJson.dump(request_hash)
|
134
|
-
url = get_url("#{
|
127
|
+
url = get_url("#{levels.url}#{resource}/#{id}")
|
135
128
|
steps %Q{
|
136
129
|
When I set JSON request body to:
|
137
130
|
"""
|
@@ -143,10 +136,10 @@ end
|
|
143
136
|
|
144
137
|
# value capture
|
145
138
|
|
146
|
-
When(
|
139
|
+
When("I save (attribute ){string}") do |attribute|
|
147
140
|
steps %Q{When I grab "#{get_json_path(attribute)}" as "#{attribute}"}
|
148
141
|
end
|
149
142
|
|
150
|
-
When(
|
143
|
+
When("I save (attribute ){string} to {string}") do |attribute, ref|
|
151
144
|
steps %Q{When I grab "#{get_json_path(attribute)}" as "#{ref}"}
|
152
145
|
end
|