webspicy 0.5.0 → 0.6.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.
- checksums.yaml +4 -4
- data/examples/restful/Gemfile.lock +1 -1
- data/examples/restful/app.rb +34 -8
- data/examples/restful/webspicy/todo/postCsv.yml +42 -0
- data/lib/webspicy/client/http_client.rb +19 -8
- data/lib/webspicy/client/rack_test_client.rb +14 -7
- data/lib/webspicy/formaldoc.fio +1 -0
- data/lib/webspicy/resource/service/test_case.rb +4 -0
- data/lib/webspicy/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 03f975ac99f95fc2b6ce4bc70b1bebd93ca6052f
|
4
|
+
data.tar.gz: 59ab9a40fc6f3f8aa076b762aff29507cba7a3af
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b5c0a7794268c727152a95a58c9af9c9cf52a6126bee5e3c00af7659e221511e14ac3e3565bbfee58db8683b57149b4647780d2b164c70041cc1addfc781b00c
|
7
|
+
data.tar.gz: 52eeff05d0809f8946591c6a81d456f6da89fa1203b23023f3ec96ebbd741a2b175955f3d136c89352f4d3e2f3f17982f0c221a84e6ef0c69c09134dc3b359c5
|
data/examples/restful/app.rb
CHANGED
@@ -3,6 +3,7 @@ require 'json'
|
|
3
3
|
require 'path'
|
4
4
|
require 'finitio'
|
5
5
|
require 'rack/robustness'
|
6
|
+
require 'csv'
|
6
7
|
|
7
8
|
SCHEMA = Finitio::DEFAULT_SYSTEM.parse (Path.dir/'webspicy/schema.fio').read
|
8
9
|
|
@@ -44,14 +45,25 @@ end
|
|
44
45
|
|
45
46
|
post '/todo/' do
|
46
47
|
content_type :json
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
48
|
+
case todos = loaded_body
|
49
|
+
when Array
|
50
|
+
n = 0
|
51
|
+
todos.each do |todo|
|
52
|
+
settings.todolist << todo
|
53
|
+
n += 1
|
54
|
+
end
|
53
55
|
status 201
|
54
|
-
|
56
|
+
{ count: n }.to_json
|
57
|
+
when Hash
|
58
|
+
todo = SCHEMA["Todo"].dress(todos)
|
59
|
+
if settings.todolist.find{|t| t[:id] == todo[:id] }
|
60
|
+
status 409
|
61
|
+
{error: "Identifier already in use"}.to_json
|
62
|
+
else
|
63
|
+
settings.todolist << todo
|
64
|
+
status 201
|
65
|
+
todo.to_json
|
66
|
+
end
|
55
67
|
end
|
56
68
|
end
|
57
69
|
|
@@ -73,7 +85,7 @@ patch '/todo/:id' do |id|
|
|
73
85
|
status 404
|
74
86
|
{error: "No such todo"}.to_json
|
75
87
|
else
|
76
|
-
patch = SCHEMA["TodoPatch"].dress(
|
88
|
+
patch = SCHEMA["TodoPatch"].dress(loaded_body)
|
77
89
|
patched = todo.merge(patch)
|
78
90
|
settings.todolist = settings.todolist.reject{|todo| todo[:id] == Integer(id) }
|
79
91
|
settings.todolist << patched
|
@@ -92,4 +104,18 @@ delete '/todo/:id' do |id|
|
|
92
104
|
status 204
|
93
105
|
content_type "text/plain"
|
94
106
|
end
|
107
|
+
end
|
108
|
+
|
109
|
+
###
|
110
|
+
|
111
|
+
def loaded_body
|
112
|
+
case ctype = request.content_type
|
113
|
+
when /json/
|
114
|
+
JSON.load(request.body.read)
|
115
|
+
when /csv/
|
116
|
+
csv = ::CSV.new(request.body.read, :headers => true, :header_converters => :symbol)
|
117
|
+
csv.map {|row| row.to_hash }
|
118
|
+
else
|
119
|
+
halt [415,{},["Unsupported content type"]]
|
120
|
+
end
|
95
121
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
---
|
2
|
+
name: |-
|
3
|
+
Todo
|
4
|
+
|
5
|
+
url: |-
|
6
|
+
/todo/
|
7
|
+
|
8
|
+
services:
|
9
|
+
- method: |-
|
10
|
+
POST
|
11
|
+
|
12
|
+
description: |-
|
13
|
+
Creates new todo items through a CSV import
|
14
|
+
|
15
|
+
preconditions: |-
|
16
|
+
|
17
|
+
input_schema: |-
|
18
|
+
{}
|
19
|
+
|
20
|
+
output_schema: |-
|
21
|
+
{ count: Integer }
|
22
|
+
|
23
|
+
error_schema: |-
|
24
|
+
ErrorSchema
|
25
|
+
|
26
|
+
examples:
|
27
|
+
|
28
|
+
- description: |-
|
29
|
+
when requested with a valid CSV
|
30
|
+
params: {}
|
31
|
+
headers:
|
32
|
+
Content-Type: text/csv
|
33
|
+
body: |-
|
34
|
+
id,description
|
35
|
+
10,Write documentation
|
36
|
+
11,Create website
|
37
|
+
12,Add smart tools
|
38
|
+
expected:
|
39
|
+
content_type: application/json
|
40
|
+
status: 201
|
41
|
+
assert:
|
42
|
+
- "pathFD('', count: 3)"
|
@@ -21,7 +21,7 @@ module Webspicy
|
|
21
21
|
url = scope.to_real_url(url)
|
22
22
|
|
23
23
|
# Invoke the service now
|
24
|
-
api.public_send(service.method.to_s.downcase.to_sym, url, params, headers)
|
24
|
+
api.public_send(service.method.to_s.downcase.to_sym, url, params, headers, test_case.body)
|
25
25
|
|
26
26
|
# Return the result
|
27
27
|
Resource::Service::Invocation.new(service, test_case, api.last_response, self)
|
@@ -31,7 +31,7 @@ module Webspicy
|
|
31
31
|
|
32
32
|
attr_reader :last_response
|
33
33
|
|
34
|
-
def get(url, params = {}, headers = nil)
|
34
|
+
def get(url, params = {}, headers = nil, body = nil)
|
35
35
|
Webspicy.info("GET #{url} -- #{params.inspect}")
|
36
36
|
|
37
37
|
@last_response = HTTP[headers || {}].get(url, params: params)
|
@@ -42,10 +42,19 @@ module Webspicy
|
|
42
42
|
@last_response
|
43
43
|
end
|
44
44
|
|
45
|
-
def post(url, params = {}, headers = nil)
|
45
|
+
def post(url, params = {}, headers = nil, body = nil)
|
46
46
|
Webspicy.info("POST #{url} -- #{params.inspect}")
|
47
47
|
|
48
|
-
|
48
|
+
url = url + "?" + Rack::Utils.build_query(params) if body && !params.empty?
|
49
|
+
|
50
|
+
headers ||= {}
|
51
|
+
headers['Content-Type'] ||= 'application/json'
|
52
|
+
|
53
|
+
if body
|
54
|
+
@last_response = HTTP[headers].post(url, body: body)
|
55
|
+
else
|
56
|
+
@last_response = HTTP[headers].post(url, body: params.to_json)
|
57
|
+
end
|
49
58
|
|
50
59
|
Webspicy.debug("Headers: #{@last_response.headers.to_hash}")
|
51
60
|
Webspicy.debug("Response: #{@last_response.body}")
|
@@ -53,10 +62,12 @@ module Webspicy
|
|
53
62
|
@last_response
|
54
63
|
end
|
55
64
|
|
56
|
-
def patch(url, params = {}, headers = nil)
|
65
|
+
def patch(url, params = {}, headers = nil, body = nil)
|
57
66
|
Webspicy.info("PATCH #{url} -- #{params.inspect}")
|
58
67
|
|
59
|
-
|
68
|
+
headers ||= {}
|
69
|
+
headers['Content-Type'] ||= 'application/json'
|
70
|
+
@last_response = HTTP[headers].patch(url, body: params.to_json)
|
60
71
|
|
61
72
|
Webspicy.debug("Headers: #{@last_response.headers.to_hash}")
|
62
73
|
Webspicy.debug("Response: #{@last_response.body}")
|
@@ -64,7 +75,7 @@ module Webspicy
|
|
64
75
|
@last_response
|
65
76
|
end
|
66
77
|
|
67
|
-
def post_form(url, params = {}, headers = nil)
|
78
|
+
def post_form(url, params = {}, headers = nil, body = nil)
|
68
79
|
Webspicy.info("POST #{url} -- #{params.inspect}")
|
69
80
|
|
70
81
|
@last_response = HTTP[headers || {}].post(url, form: params)
|
@@ -75,7 +86,7 @@ module Webspicy
|
|
75
86
|
@last_response
|
76
87
|
end
|
77
88
|
|
78
|
-
def delete(url, params = {}, headers = nil)
|
89
|
+
def delete(url, params = {}, headers = nil, body = nil)
|
79
90
|
Webspicy.info("DELETE #{url} -- #{params.inspect}")
|
80
91
|
|
81
92
|
@last_response = HTTP[headers || {}].delete(url, body: params.to_json)
|
@@ -17,13 +17,14 @@ module Webspicy
|
|
17
17
|
# Instantiate the parameters
|
18
18
|
headers = test_case.headers.dup
|
19
19
|
params = test_case.dress_params? ? service.dress_params(test_case.params) : test_case.params
|
20
|
+
body = test_case.body
|
20
21
|
|
21
22
|
# Instantiate the url and strip parameters
|
22
23
|
url, params = resource.instantiate_url(params)
|
23
24
|
url = scope.to_real_url(url){ url }
|
24
25
|
|
25
26
|
# Invoke the service now
|
26
|
-
api.public_send(service.method.to_s.downcase.to_sym, url, params, headers)
|
27
|
+
api.public_send(service.method.to_s.downcase.to_sym, url, params, headers, body)
|
27
28
|
|
28
29
|
# Return the result
|
29
30
|
Resource::Service::Invocation.new(service, test_case, api.last_response, self)
|
@@ -60,7 +61,7 @@ module Webspicy
|
|
60
61
|
@app = app
|
61
62
|
end
|
62
63
|
|
63
|
-
def get(url, params = {}, headers = nil)
|
64
|
+
def get(url, params = {}, headers = nil, body = nil)
|
64
65
|
handler = get_handler(headers)
|
65
66
|
|
66
67
|
Webspicy.info("GET #{url} -- #{params.inspect} -- #{headers.inspect}")
|
@@ -74,12 +75,18 @@ module Webspicy
|
|
74
75
|
@last_response
|
75
76
|
end
|
76
77
|
|
77
|
-
def post(url, params = {}, headers = nil)
|
78
|
+
def post(url, params = {}, headers = nil, body = nil)
|
78
79
|
handler = get_handler(headers)
|
79
80
|
|
81
|
+
url = url + "?" + Rack::Utils.build_query(params) if body && !params.empty?
|
82
|
+
|
80
83
|
Webspicy.info("POST #{url} -- #{params.inspect} -- #{headers.inspect}")
|
81
84
|
|
82
|
-
|
85
|
+
if body
|
86
|
+
handler.post(url, body)
|
87
|
+
else
|
88
|
+
handler.post(url, params.to_json, {"CONTENT_TYPE" => "application/json"})
|
89
|
+
end
|
83
90
|
@last_response = handler.last_response
|
84
91
|
|
85
92
|
Webspicy.debug("Headers: #{@last_response.headers.to_hash}")
|
@@ -88,7 +95,7 @@ module Webspicy
|
|
88
95
|
@last_response
|
89
96
|
end
|
90
97
|
|
91
|
-
def patch(url, params = {}, headers = nil)
|
98
|
+
def patch(url, params = {}, headers = nil, body = nil)
|
92
99
|
handler = get_handler(headers)
|
93
100
|
|
94
101
|
Webspicy.info("PATCH #{url} -- #{params.inspect} -- #{headers.inspect}")
|
@@ -102,7 +109,7 @@ module Webspicy
|
|
102
109
|
@last_response
|
103
110
|
end
|
104
111
|
|
105
|
-
def post_form(url, params = {}, headers = nil)
|
112
|
+
def post_form(url, params = {}, headers = nil, body = nil)
|
106
113
|
handler = get_handler(headers)
|
107
114
|
|
108
115
|
Webspicy.info("POST #{url} -- #{params.inspect} -- #{headers.inspect}")
|
@@ -116,7 +123,7 @@ module Webspicy
|
|
116
123
|
@last_response
|
117
124
|
end
|
118
125
|
|
119
|
-
def delete(url, params = {}, headers = nil)
|
126
|
+
def delete(url, params = {}, headers = nil, body = nil)
|
120
127
|
handler = get_handler(headers)
|
121
128
|
|
122
129
|
Webspicy.info("DELETE #{url} -- #{params.inspect} -- #{headers.inspect}")
|
data/lib/webspicy/formaldoc.fio
CHANGED
data/lib/webspicy/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: webspicy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bernard Lambeau
|
@@ -144,6 +144,7 @@ files:
|
|
144
144
|
- examples/restful/webspicy/todo/getTodo.yml
|
145
145
|
- examples/restful/webspicy/todo/getTodos.yml
|
146
146
|
- examples/restful/webspicy/todo/patchTodo.yml
|
147
|
+
- examples/restful/webspicy/todo/postCsv.yml
|
147
148
|
- examples/restful/webspicy/todo/postTodos.yml
|
148
149
|
- lib/webspicy.rb
|
149
150
|
- lib/webspicy/checker.rb
|
@@ -193,7 +194,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
193
194
|
version: '0'
|
194
195
|
requirements: []
|
195
196
|
rubyforge_project:
|
196
|
-
rubygems_version: 2.
|
197
|
+
rubygems_version: 2.5.1
|
197
198
|
signing_key:
|
198
199
|
specification_version: 4
|
199
200
|
summary: Webspicy helps testing web services as software operation black boxes!
|