webspicy 0.1.0.pre.rc3 → 0.1.0.pre.rc4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b6894d4163e21f8309c91e1befcf39ce59423e04
4
- data.tar.gz: 61bc6deca7423852bea6daa1d5c2aacf7ec17c57
3
+ metadata.gz: db22eea722029a231a0b460ab4984c5c0b4fb04a
4
+ data.tar.gz: d4138fb451e46da2c76bb49009ec64a31f32f15a
5
5
  SHA512:
6
- metadata.gz: c403e240151fd262ee1982e0dbc4d839bdfcbf33e6682f5c0384fbd034b900de76871d3b6360284ee7ee29a4ad4281f57a329bb67ee053fe9e88c364d5dfbe59
7
- data.tar.gz: 815d5fed96020fc8cc1db42443f1eaee72357793408c05f304801a34f4b5cdd7d8e0dca5883602c92eda0c94aaee11d671e6cbc33092d6871a88072b4d5e12d7
6
+ metadata.gz: b464b7b066f6d8d07033261e16e579d3609e339b189328561eb58fe2d741ee110d878bfda870def3c7210723cca6d2b5fd1b53c57cd2140422cb2604ec7059f7
7
+ data.tar.gz: b529dea8cfe6b724b02b16fb414b675403e9def355795b6a5b904508626a66b924955e77b817db72c0d25928394f38f437c6f4d8d32486485c2545c454a09c62
@@ -1,10 +1,11 @@
1
1
  PATH
2
2
  remote: ../..
3
3
  specs:
4
- webspicy (0.1.0.pre.rc2)
4
+ webspicy (0.1.0.pre.rc3)
5
5
  finitio (~> 0.5.2)
6
6
  http (~> 0.5)
7
7
  path (~> 1.3)
8
+ rack-test (~> 0.7)
8
9
  rspec (~> 3.6)
9
10
 
10
11
  GEM
@@ -33,6 +34,8 @@ GEM
33
34
  rack (2.0.3)
34
35
  rack-protection (2.0.0)
35
36
  rack
37
+ rack-test (0.7.0)
38
+ rack (>= 1.0, < 3)
36
39
  rake (10.5.0)
37
40
  rspec (3.6.0)
38
41
  rspec-core (~> 3.6.0)
@@ -1,21 +1,40 @@
1
+ $LOAD_PATH.unshift File.expand_path("..", __FILE__)
2
+ require 'app'
1
3
  require 'webspicy'
2
4
 
3
5
  namespace :webspicy do
4
6
 
5
- config = Webspicy::Configuration.new do |c|
6
- c.host = "http://127.0.0.1:4567"
7
- c.add_folder Path.dir/"webspicy"
8
- end
9
-
10
7
  task :check do
8
+ config = Webspicy::Configuration.new do |c|
9
+ c.add_folder Path.dir/"webspicy"
10
+ end
11
11
  Webspicy::Checker.new(config).call
12
12
  end
13
13
 
14
- task :test do
14
+ task :testrack do
15
+ config = Webspicy::Configuration.new do |c|
16
+ c.add_folder Path.dir/"webspicy"
17
+ c.client = Webspicy::RackTestClient.for(::Sinatra::Application)
18
+ c.before_each do |_,_,_,client|
19
+ client.api.post "/reset"
20
+ end
21
+ end
22
+ Webspicy::Tester.new(config).call
23
+ end
24
+
25
+ task :testreal do
26
+ config = Webspicy::Configuration.new do |c|
27
+ c.host = "http://127.0.0.1:4567"
28
+ c.add_folder Path.dir/"webspicy"
29
+ c.client = Webspicy::HttpClient
30
+ c.before_each do |_,_,_,client|
31
+ client.api.post "http://127.0.0.1:4567/reset"
32
+ end
33
+ end
15
34
  Webspicy::Tester.new(config).call
16
35
  end
17
36
 
18
37
  end
19
38
 
20
- task :test => :"webspicy:test"
39
+ task :test => [:"webspicy:check", :"webspicy:testrack"]
21
40
  task :default => :test
@@ -19,19 +19,27 @@ TODOLIST = [
19
19
  disable :show_exceptions
20
20
  enable :raise_errors
21
21
 
22
+ set :todolist, TODOLIST.dup
23
+
24
+ post '/reset' do
25
+ settings.todolist = TODOLIST.dup
26
+ status 200
27
+ ""
28
+ end
29
+
22
30
  get '/todo/' do
23
31
  content_type :json
24
- TODOLIST.to_json
32
+ settings.todolist.to_json
25
33
  end
26
34
 
27
35
  post '/todo/' do
28
36
  content_type :json
29
37
  todo = SCHEMA["Todo"].dress(JSON.load(request.body.read))
30
- if TODOLIST.find{|t| t[:id] == todo[:id] }
38
+ if settings.todolist.find{|t| t[:id] == todo[:id] }
31
39
  status 409
32
40
  {error: "Identifier already in use"}.to_json
33
41
  else
34
- TODOLIST << todo
42
+ settings.todolist << todo
35
43
  status 201
36
44
  todo.to_json
37
45
  end
@@ -39,7 +47,7 @@ end
39
47
 
40
48
  get '/todo/:id' do |id|
41
49
  content_type :json
42
- todo = TODOLIST.find{|todo| todo[:id] == Integer(id) }
50
+ todo = settings.todolist.find{|todo| todo[:id] == Integer(id) }
43
51
  if todo.nil?
44
52
  status 404
45
53
  {error: "No such todo"}.to_json
@@ -1,6 +1,12 @@
1
1
  module Webspicy
2
2
  class HttpClient < Client
3
3
 
4
+ def initialize(scope)
5
+ super(scope)
6
+ @api = Api.new
7
+ end
8
+ attr_reader :api
9
+
4
10
  def call(test_case, service, resource)
5
11
  # Instantiate the parameters
6
12
  headers = test_case.headers
@@ -13,7 +19,6 @@ module Webspicy
13
19
  url = scope.to_real_url(url)
14
20
 
15
21
  # Invoke the service now
16
- api = Api.new
17
22
  api.public_send(service.method.to_s.downcase.to_sym, url, params, headers)
18
23
 
19
24
  # Return the result
@@ -24,46 +29,33 @@ module Webspicy
24
29
 
25
30
  attr_reader :last_response
26
31
 
27
- def get(url, params, headers = nil)
28
- headers, url = headers_and_url_for(url, params, headers)
29
-
32
+ def get(url, params = {}, headers = nil)
30
33
  Webspicy.info("GET #{url} -- #{params.inspect}")
31
34
 
32
- @last_response = HTTP[headers].get(url, params: params)
35
+ @last_response = HTTP[headers || {}].get(url, params: params)
33
36
 
34
37
  Webspicy.debug("Headers: #{@last_response.headers.to_hash}")
35
38
  Webspicy.debug("Response: #{@last_response.body}")
36
39
  end
37
40
 
38
- def post(url, params, headers = nil)
39
- headers, url = headers_and_url_for(url, params, headers)
40
-
41
+ def post(url, params = {}, headers = nil)
41
42
  Webspicy.info("POST #{url} -- #{params.inspect}")
42
43
 
43
- @last_response = HTTP[headers].post(url, body: params.to_json)
44
+ @last_response = HTTP[headers || {}].post(url, body: params.to_json)
44
45
 
45
46
  Webspicy.debug("Headers: #{@last_response.headers.to_hash}")
46
47
  Webspicy.debug("Response: #{@last_response.body}")
47
48
  end
48
49
 
49
- def post_form(url, params, headers = nil)
50
- headers, url = headers_and_url_for(url, params, headers)
51
-
50
+ def post_form(url, params = {}, headers = nil)
52
51
  Webspicy.info("POST #{url} -- #{params.inspect}")
53
52
 
54
- @last_response = HTTP[headers].post(url, form: params)
53
+ @last_response = HTTP[headers || {}].post(url, form: params)
55
54
 
56
55
  Webspicy.debug("Headers: #{@last_response.headers.to_hash}")
57
56
  Webspicy.debug("Response: #{@last_response.body}")
58
57
  end
59
58
 
60
- private
61
-
62
- def headers_and_url_for(url, params, headers)
63
- headers = headers || {}
64
- [ headers, url ]
65
- end
66
-
67
59
  end
68
60
 
69
61
  end
@@ -0,0 +1,105 @@
1
+ module Webspicy
2
+ class RackTestClient < Client
3
+
4
+ def self.for(app)
5
+ Factory.new(app)
6
+ end
7
+
8
+ def initialize(scope, app)
9
+ super(scope)
10
+ @api = Api.new(app)
11
+ end
12
+ attr_reader :api
13
+
14
+ def call(test_case, service, resource)
15
+ # Instantiate the parameters
16
+ headers = test_case.headers
17
+ params = test_case.dress_params? ? service.dress_params(test_case.params) : test_case.params
18
+
19
+ # Instantiate the url and strip parameters
20
+ url, params = resource.instantiate_url(params)
21
+
22
+ # Invoke the service now
23
+ api.public_send(service.method.to_s.downcase.to_sym, url, params, headers)
24
+
25
+ # Return the result
26
+ Resource::Service::Invocation.new(service, test_case, api.last_response)
27
+ end
28
+
29
+ class Factory
30
+
31
+ def initialize(app)
32
+ @app = app
33
+ end
34
+ attr_reader :app
35
+
36
+ def new(scope)
37
+ RackTestClient.new(scope, app)
38
+ end
39
+
40
+ end # class Factory
41
+
42
+ class RackHandler
43
+ include Rack::Test::Methods
44
+
45
+ def initialize(app)
46
+ @app = app
47
+ end
48
+ attr_reader :app
49
+
50
+ end # class RackHandler
51
+
52
+ class Api
53
+
54
+ attr_reader :last_response
55
+
56
+ def initialize(app)
57
+ @handler = RackHandler.new(app)
58
+ end
59
+ attr_reader :handler
60
+
61
+ def get(url, params = {}, headers = nil)
62
+ Webspicy.info("GET #{url} -- #{params.inspect}")
63
+
64
+ install_headers(headers) if headers
65
+ handler.get(url, params)
66
+ @last_response = handler.last_response
67
+
68
+ Webspicy.debug("Headers: #{@last_response.headers.to_hash}")
69
+ Webspicy.debug("Response: #{@last_response.body}")
70
+ end
71
+
72
+ def post(url, params = {}, headers = nil)
73
+ Webspicy.info("POST #{url} -- #{params.inspect}")
74
+
75
+ install_headers(headers) if headers
76
+ handler.post(url, params.to_json, {"CONTENT_TYPE" => "application/json"})
77
+ @last_response = handler.last_response
78
+
79
+ Webspicy.debug("Headers: #{@last_response.headers.to_hash}")
80
+ Webspicy.debug("Response: #{@last_response.body}")
81
+ end
82
+
83
+ def post_form(url, params = {}, headers = nil)
84
+ Webspicy.info("POST #{url} -- #{params.inspect}")
85
+
86
+ install_headers(headers) if headers
87
+ handler.post(url, params)
88
+ @last_response = handler.last_response
89
+
90
+ Webspicy.debug("Headers: #{@last_response.headers.to_hash}")
91
+ Webspicy.debug("Response: #{@last_response.body}")
92
+ end
93
+
94
+ private
95
+
96
+ def install_headers(hs)
97
+ hs.each_pair do |k,v|
98
+ handler.header(k,v)
99
+ end
100
+ end
101
+
102
+ end # class Api
103
+
104
+ end # class RackTestClient
105
+ end # module Webspicy
@@ -12,6 +12,7 @@ module Webspicy
12
12
 
13
13
  def before(*args, &bl)
14
14
  config.before_listeners.each do |beach|
15
+ args << self
15
16
  beach.call(*args, &bl)
16
17
  end
17
18
  end
@@ -19,7 +19,8 @@ module Webspicy
19
19
  raise "Folder `#{folder}` does not exists" unless folder.exists? && folder.directory?
20
20
  @folders << folder
21
21
  end
22
- attr_reader :folders
22
+ attr_accessor :folders
23
+ protected :folders=
23
24
 
24
25
  # Sets whether counter examples have to be ran or not.
25
26
  def run_counterexamples=(run_counterexamples)
@@ -137,6 +138,8 @@ module Webspicy
137
138
  def before_listeners
138
139
  @before_listeners
139
140
  end
141
+ attr_writer :before_listeners
142
+ protected :before_listeners=
140
143
 
141
144
  # Allows setting the options passed at RSpec, which is used by both the runner
142
145
  # and checker classes.
@@ -146,7 +149,8 @@ module Webspicy
146
149
  def rspec_options=(options)
147
150
  @rspec_options = options
148
151
  end
149
- attr_reader :rspec_options
152
+ attr_accessor :rspec_options
153
+ protected :rspec_options=
150
154
 
151
155
  # Returns the default rspec options.
152
156
  #
@@ -164,5 +168,20 @@ module Webspicy
164
168
  end
165
169
  private :default_rspec_options
166
170
 
171
+ # Duplicates this configuration and yields the block with the new one,
172
+ # if a block is given.
173
+ #
174
+ # The cloned configuration has all same values as the original but shares
175
+ # nothing with it. Therefore, affecting the new one has no effect on the
176
+ # original.
177
+ def dup(&bl)
178
+ super.tap do |d|
179
+ d.folders = self.folders.dup
180
+ d.rspec_options = self.rspec_options.dup
181
+ d.before_listeners = self.before_listeners.dup
182
+ yield d if block_given?
183
+ end
184
+ end
185
+
167
186
  end
168
187
  end
@@ -11,6 +11,16 @@ module Webspicy
11
11
 
12
12
  attr_reader :service, :test_case, :response
13
13
 
14
+ ### Getters on response
15
+
16
+ def response_code
17
+ code = response.status
18
+ code = code.code unless code.is_a?(Integer)
19
+ code
20
+ end
21
+
22
+ ### Query methods
23
+
14
24
  def done?
15
25
  !response.nil?
16
26
  end
@@ -20,15 +30,15 @@ module Webspicy
20
30
  end
21
31
 
22
32
  def is_success?
23
- response.status.code >= 200 && response.status.code < 300
33
+ response_code >= 200 && response_code < 300
24
34
  end
25
35
 
26
36
  def is_empty_response?
27
- response.status.code == 204
37
+ response_code == 204
28
38
  end
29
39
 
30
40
  def is_redirect?
31
- response.status.code >= 300 && response.status.code < 400
41
+ response_code >= 300 && response_code < 400
32
42
  end
33
43
 
34
44
  ### Check of HTTP status
@@ -47,7 +57,8 @@ module Webspicy
47
57
 
48
58
  def expected_content_type_unmet
49
59
  ect = test_case.expected_content_type
50
- got = response.content_type.mime_type.to_s
60
+ got = response.content_type
61
+ got = got.mime_type.to_s if got.respond_to?(:mime_type)
51
62
  ect == got ? nil : "#{ect} != #{got}"
52
63
  end
53
64
 
@@ -1,6 +1,6 @@
1
1
  module Webspicy
2
2
  module Version
3
- TINY = "0-rc3"
3
+ TINY = "0-rc4"
4
4
  MINOR = 1
5
5
  MAJOR = 0
6
6
  end
data/lib/webspicy.rb CHANGED
@@ -6,6 +6,7 @@ require 'logger'
6
6
  require 'ostruct'
7
7
  require 'yaml'
8
8
  require 'rspec'
9
+ require 'rack/test'
9
10
  module Webspicy
10
11
 
11
12
  ###
@@ -16,6 +17,7 @@ module Webspicy
16
17
  require 'webspicy/scope'
17
18
  require 'webspicy/client'
18
19
  require 'webspicy/client/http_client'
20
+ require 'webspicy/client/rack_test_client'
19
21
  require 'webspicy/resource'
20
22
  require 'webspicy/checker'
21
23
  require 'webspicy/tester'
@@ -80,5 +80,39 @@ module Webspicy
80
80
  end
81
81
  end
82
82
 
83
+ describe 'dup' do
84
+
85
+ let(:original) do
86
+ Configuration.new do |c|
87
+ c.add_folder Path.dir/'resource'
88
+ c.host = "http://127.0.0.1"
89
+ end
90
+ end
91
+
92
+ it 'lets duplicate a configuration' do
93
+ duped = original.dup do |d|
94
+ d.host = "http://127.0.0.1:4567"
95
+ end
96
+ expect(duped.host).to eql("http://127.0.0.1:4567")
97
+ expect(original.host).to eql("http://127.0.0.1")
98
+ end
99
+
100
+ it 'duplicates the internal arrays to' do
101
+ duped = original.dup do |d|
102
+ d.add_folder Path.dir/'scope'
103
+ d.rspec_options << "--hello"
104
+ d.before_each do end
105
+ end
106
+ expect(duped.folders.size).to eql(2)
107
+ expect(original.folders.size).to eql(1)
108
+
109
+ expect(duped.rspec_options.last).to eq("--hello")
110
+ expect(original.rspec_options.last).not_to eq("--hello")
111
+
112
+ expect(duped.before_listeners.size).to eq(1)
113
+ expect(original.before_listeners.size).to eq(0)
114
+ end
115
+ end
116
+
83
117
  end
84
118
  end
data/tasks/test.rake CHANGED
@@ -15,7 +15,9 @@ namespace :test do
15
15
  test_name = file.basename.to_s.to_sym
16
16
  desc "Runs the integration tests on the #{file.basename} example"
17
17
  task(test_name) do
18
- system("cd #{file} && rake")
18
+ Bundler.with_original_env do
19
+ system("cd #{file} && rake")
20
+ end
19
21
  end
20
22
  tests << test_name
21
23
  end
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.1.0.pre.rc3
4
+ version: 0.1.0.pre.rc4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bernard Lambeau
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '10'
27
+ - !ruby/object:Gem::Dependency
28
+ name: sinatra
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: rspec
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -38,6 +52,20 @@ dependencies:
38
52
  - - "~>"
39
53
  - !ruby/object:Gem::Version
40
54
  version: '3.6'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rack-test
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.7'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.7'
41
69
  - !ruby/object:Gem::Dependency
42
70
  name: finitio
43
71
  requirement: !ruby/object:Gem::Requirement
@@ -102,6 +130,7 @@ files:
102
130
  - lib/webspicy/checker.rb
103
131
  - lib/webspicy/client.rb
104
132
  - lib/webspicy/client/http_client.rb
133
+ - lib/webspicy/client/rack_test_client.rb
105
134
  - lib/webspicy/configuration.rb
106
135
  - lib/webspicy/formaldoc.fio
107
136
  - lib/webspicy/resource.rb