servme 0.0.2 → 0.0.3
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.
- data/lib/servme.rb +4 -2
- data/lib/servme/dsl.rb +1 -1
- data/lib/servme/responder.rb +61 -0
- data/lib/servme/service.rb +6 -65
- data/lib/servme/service_stubbing.rb +3 -3
- data/lib/servme/stubber.rb +39 -0
- data/lib/servme/version.rb +1 -1
- data/spec/lib/servme/responder_spec.rb +49 -0
- metadata +6 -2
data/lib/servme.rb
CHANGED
data/lib/servme/dsl.rb
CHANGED
@@ -0,0 +1,61 @@
|
|
1
|
+
module Servme
|
2
|
+
class Responder
|
3
|
+
|
4
|
+
DEFAULT_HEADERS = {
|
5
|
+
'Content-Type' => 'application/json'
|
6
|
+
}
|
7
|
+
|
8
|
+
DEFAULT_OPTIONS = {
|
9
|
+
:static_file_root_path => "dist"
|
10
|
+
}
|
11
|
+
|
12
|
+
attr_accessor :sinatra_app, :options
|
13
|
+
|
14
|
+
def initialize(sinatra_app, opts)
|
15
|
+
@sinatra_app = sinatra_app
|
16
|
+
@options = DEFAULT_OPTIONS.merge(opts)
|
17
|
+
end
|
18
|
+
|
19
|
+
def stubber
|
20
|
+
Stubber.instance
|
21
|
+
end
|
22
|
+
|
23
|
+
def respond(request)
|
24
|
+
static_file = File.join(options[:static_file_root_path], request.path)
|
25
|
+
stub = stubber.stub_for_request(request)
|
26
|
+
if (stub)
|
27
|
+
format_response(stub)
|
28
|
+
elsif(request.path == '/')
|
29
|
+
sinatra_app.send_file("#{options[:static_file_root_path]}/index.html")
|
30
|
+
elsif(File.exists?(static_file))
|
31
|
+
sinatra_app.send_file(static_file)
|
32
|
+
else
|
33
|
+
format_response(default_response(request))
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def format_response(response)
|
38
|
+
body = json?(response) ? JSON::dump(response[:data]) : response[:data]
|
39
|
+
[response[:status_code], response[:headers], body]
|
40
|
+
end
|
41
|
+
|
42
|
+
def json?(response)
|
43
|
+
response[:headers]['Content-Type'] == 'application/json'
|
44
|
+
end
|
45
|
+
|
46
|
+
def default_response(request)
|
47
|
+
{
|
48
|
+
:headers => DEFAULT_HEADERS,
|
49
|
+
:status_code => 404,
|
50
|
+
:data => {
|
51
|
+
:error => "Servme doesn't know how to respond to this request",
|
52
|
+
:request => {
|
53
|
+
:method => request.request_method.downcase.to_sym, #FIXME: duplication -- stubber.rb
|
54
|
+
:params => request.params,
|
55
|
+
:path => request.path
|
56
|
+
}
|
57
|
+
}
|
58
|
+
}
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
data/lib/servme/service.rb
CHANGED
@@ -8,79 +8,20 @@ module Servme
|
|
8
8
|
set :server, 'thin'
|
9
9
|
|
10
10
|
get '*' do
|
11
|
-
|
11
|
+
responder.respond(request)
|
12
12
|
end
|
13
13
|
|
14
14
|
post '*' do
|
15
|
-
|
15
|
+
responder.respond(request)
|
16
16
|
end
|
17
17
|
|
18
|
-
def
|
19
|
-
|
20
|
-
self.class.satisfy(
|
21
|
-
request.path,
|
22
|
-
type,
|
23
|
-
request.send(type.to_s.upcase)
|
24
|
-
)
|
25
|
-
)
|
18
|
+
def responder
|
19
|
+
@responder ||= Responder.new(self, {})
|
26
20
|
end
|
27
21
|
|
28
|
-
def format_response(response)
|
29
|
-
body = json?(response) ? JSON::dump(response[:data]) : response[:data]
|
30
|
-
[response[:status_code], response[:headers], body]
|
31
|
-
end
|
32
|
-
|
33
|
-
def json?(response)
|
34
|
-
response[:headers]['Content-Type'] == 'application/json'
|
35
|
-
end
|
36
|
-
|
37
|
-
@@stubbings = {}
|
38
|
-
|
39
22
|
def self.clear
|
40
|
-
|
41
|
-
end
|
42
|
-
|
43
|
-
|
44
|
-
DEFAULT_HEADERS = {
|
45
|
-
'Content-Type' => 'application/json'
|
46
|
-
}
|
47
|
-
|
48
|
-
def self.stub(config)
|
49
|
-
(@@stubbings[config[:url]] ||= {}).tap do |urls|
|
50
|
-
(urls[config[:method] || :get] ||= {}).tap do |methods|
|
51
|
-
methods[stringify_keys(config[:params] || {})] = {
|
52
|
-
:data => config[:response],
|
53
|
-
:headers => DEFAULT_HEADERS.merge(config[:headers] || {}),
|
54
|
-
:status_code => config[:status_code] || 200
|
55
|
-
}
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
def self.satisfy(path, method, params)
|
61
|
-
@@stubbings[path][method][params] || default_response(path, method, params)
|
62
|
-
rescue
|
63
|
-
default_response(path, method, params)
|
64
|
-
end
|
65
|
-
|
66
|
-
def self.default_response(path, method, params)
|
67
|
-
{
|
68
|
-
:headers => DEFAULT_HEADERS,
|
69
|
-
:status_code => 404,
|
70
|
-
:data => {
|
71
|
-
:error => "Servme doesn't know how to respond to this request",
|
72
|
-
:request => {
|
73
|
-
:method => method,
|
74
|
-
:params => params,
|
75
|
-
:path => path
|
76
|
-
}
|
77
|
-
}
|
78
|
-
}
|
79
|
-
end
|
80
|
-
|
81
|
-
def self.stringify_keys(params)
|
82
|
-
Hash[params.map {|(k,v)| [k.to_s, v]}]
|
23
|
+
Stubber.instance.clear
|
83
24
|
end
|
84
25
|
end
|
85
26
|
|
86
|
-
end
|
27
|
+
end
|
@@ -5,11 +5,11 @@ module Servme
|
|
5
5
|
end
|
6
6
|
|
7
7
|
def respond_with(response)
|
8
|
-
|
8
|
+
Stubber.instance.stub(@request.merge({ :response => response }))
|
9
9
|
end
|
10
10
|
|
11
11
|
def error_with(status_code)
|
12
|
-
|
12
|
+
Stubber.instance.stub(@request.merge({ :status_code => status_code }))
|
13
13
|
end
|
14
14
|
end
|
15
|
-
end
|
15
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
module Servme
|
3
|
+
class Stubber
|
4
|
+
include Singleton
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@stubbings = {}
|
8
|
+
end
|
9
|
+
|
10
|
+
def clear
|
11
|
+
@stubbings = {}
|
12
|
+
end
|
13
|
+
|
14
|
+
def stub(config)
|
15
|
+
(@stubbings[config[:url]] ||= {}).tap do |urls|
|
16
|
+
(urls[config[:method] || :get] ||= {}).tap do |methods|
|
17
|
+
methods[stringify_keys(config[:params] || {})] = {
|
18
|
+
:data => config[:response],
|
19
|
+
:headers => Responder::DEFAULT_HEADERS.merge(config[:headers] || {}),
|
20
|
+
:status_code => config[:status_code] || 200
|
21
|
+
}
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def stub_for_request(req)
|
27
|
+
method = req.request_method.downcase.to_sym
|
28
|
+
begin
|
29
|
+
@stubbings[req.path][method][req.params]
|
30
|
+
rescue NoMethodError
|
31
|
+
nil
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def stringify_keys(params)
|
36
|
+
Hash[params.map {|(k,v)| [k.to_s, v]}]
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/lib/servme/version.rb
CHANGED
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
describe Servme::Responder do
|
3
|
+
|
4
|
+
let(:stubber) { Servme::Stubber.instance }
|
5
|
+
let(:sinatra_app) { stub }
|
6
|
+
subject { Servme::Responder.new(sinatra_app, {}) }
|
7
|
+
|
8
|
+
before { stubber.clear }
|
9
|
+
|
10
|
+
it "returns stubs" do
|
11
|
+
stubber.stub(:url => "/foo", :method => :get, :params => {}, :response => {"foo" => "bar"})
|
12
|
+
|
13
|
+
response = subject.respond(stub(:path => "/foo", :request_method => "GET", :params => {}))
|
14
|
+
|
15
|
+
#response is a Rack response, its last entry is the resopnse body
|
16
|
+
JSON.parse(response.last).should == {"foo" => "bar"}
|
17
|
+
end
|
18
|
+
|
19
|
+
it "sends static files when there is no stub" do
|
20
|
+
File.stub(:exists? => true)
|
21
|
+
sinatra_app.should_receive(:send_file).with("dist/foo")
|
22
|
+
|
23
|
+
subject.respond(stub(:path => "/foo", :request_method => "GET"))
|
24
|
+
end
|
25
|
+
|
26
|
+
it "responds with the static index.html if the request is /" do
|
27
|
+
sinatra_app.should_receive(:send_file).with("dist/index.html")
|
28
|
+
|
29
|
+
subject.respond(stub(:path => "/", :request_method => "GET"))
|
30
|
+
end
|
31
|
+
|
32
|
+
it "allows you to specify an alternate static_file_root_path" do
|
33
|
+
responder = Servme::Responder.new(sinatra_app, :static_file_root_path => "public")
|
34
|
+
File.stub(:exists? => true)
|
35
|
+
sinatra_app.should_receive(:send_file).with("public/style.css")
|
36
|
+
|
37
|
+
responder.respond(stub(:path => "/style.css", :request_method => "GET"))
|
38
|
+
end
|
39
|
+
|
40
|
+
it "returns the stub if there is both a stub and a static file" do
|
41
|
+
stubber.stub(:url => "/foo", :method => :get, :params => {}, :response => {"foo" => "bar"})
|
42
|
+
File.stub(:exists? => true)
|
43
|
+
sinatra_app.should_not_receive(:send_file)
|
44
|
+
|
45
|
+
response = subject.respond(stub(:path => "/foo", :request_method => "GET", :params => {}))
|
46
|
+
|
47
|
+
JSON.parse(response.last).should == {"foo" => "bar"}
|
48
|
+
end
|
49
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: servme
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-10-
|
12
|
+
date: 2012-10-31 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: json
|
@@ -121,10 +121,13 @@ files:
|
|
121
121
|
- Rakefile
|
122
122
|
- lib/servme.rb
|
123
123
|
- lib/servme/dsl.rb
|
124
|
+
- lib/servme/responder.rb
|
124
125
|
- lib/servme/service.rb
|
125
126
|
- lib/servme/service_stubbing.rb
|
127
|
+
- lib/servme/stubber.rb
|
126
128
|
- lib/servme/version.rb
|
127
129
|
- servme.gemspec
|
130
|
+
- spec/lib/servme/responder_spec.rb
|
128
131
|
- spec/lib/servme/service_spec.rb
|
129
132
|
- spec/lib/servme/service_stubbing_spec.rb
|
130
133
|
- spec/spec_helper.rb
|
@@ -154,6 +157,7 @@ specification_version: 3
|
|
154
157
|
summary: Servme lets you stub server responses by standing-in for some remote system
|
155
158
|
your code under test depends on
|
156
159
|
test_files:
|
160
|
+
- spec/lib/servme/responder_spec.rb
|
157
161
|
- spec/lib/servme/service_spec.rb
|
158
162
|
- spec/lib/servme/service_stubbing_spec.rb
|
159
163
|
- spec/spec_helper.rb
|