ww 0.3.1 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +5 -0
- data/lib/ww.rb +1 -14
- data/lib/ww/application.rb +2 -4
- data/lib/ww/double.rb +0 -12
- data/lib/ww/double/mock.rb +4 -30
- data/lib/ww/double/mock/expectation.rb +73 -0
- data/lib/ww/double/spy.rb +3 -7
- data/lib/ww/double/stub.rb +4 -7
- data/lib/ww/dsl/definition_base.rb +34 -0
- data/lib/ww/dsl/mock_definition.rb +31 -0
- data/lib/ww/dsl/spy_definition.rb +18 -0
- data/lib/ww/dsl/stub_definition.rb +17 -0
- data/lib/ww/server.rb +27 -4
- data/spec/ww/application_spec.rb +1 -1
- data/spec/ww/double/mock/expectation_spec.rb +73 -0
- data/spec/ww/double/mock_spec.rb +6 -6
- data/spec/ww/double/spy_spec.rb +4 -4
- data/spec/ww/double/stub_spec.rb +6 -6
- data/spec/ww/server_integration_spec.rb +33 -12
- data/spec/ww/server_spec.rb +30 -1
- metadata +50 -21
data/ChangeLog
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
== 0.4.0 / 2010 01-28
|
2
|
+
* new API to defining double actions.
|
3
|
+
* new API (syntax suger) to access defined dobule server.
|
4
|
+
* add Hash-style expectation for simple expectation of mock.
|
5
|
+
|
1
6
|
== 0.3.1 / 2010 01-20
|
2
7
|
* add utility method to store all request.
|
3
8
|
* silence WEBrick and Thin servers.
|
data/lib/ww.rb
CHANGED
@@ -1,17 +1,4 @@
|
|
1
1
|
module Ww
|
2
|
-
Version = '0.
|
3
|
-
|
4
|
-
def to_app(*args, &block)
|
5
|
-
$stderr.puts <<-WORNING
|
6
|
-
*** DUPLICATION WORNING ***
|
7
|
-
Ww.to_app moves to Ww::SpyEye.to_app
|
8
|
-
|
9
|
-
This comatibility will be lost on 0.4.0.
|
10
|
-
***************************
|
11
|
-
WORNING
|
12
|
-
require 'ww/spy_eye'
|
13
|
-
Ww::SpyEye.to_app(*args, &block)
|
14
|
-
end
|
15
|
-
module_function :to_app
|
2
|
+
Version = '0.4.0'
|
16
3
|
end
|
17
4
|
|
data/lib/ww/application.rb
CHANGED
@@ -3,17 +3,15 @@ require 'forwardable'
|
|
3
3
|
|
4
4
|
module Ww
|
5
5
|
class Application
|
6
|
+
extend Forwardable
|
6
7
|
attr_reader :current
|
8
|
+
def_delegators :current, :call
|
7
9
|
|
8
10
|
def initialize(&servlet_initializer)
|
9
11
|
@servlet_initializer = servlet_initializer
|
10
12
|
reset!
|
11
13
|
end
|
12
14
|
|
13
|
-
def call(env)
|
14
|
-
current.call(env)
|
15
|
-
end
|
16
|
-
|
17
15
|
def reset!
|
18
16
|
@current = build_servlet
|
19
17
|
end
|
data/lib/ww/double.rb
CHANGED
@@ -16,17 +16,5 @@ module Ww
|
|
16
16
|
base.send(:include, mod::InstanceMethods) if mod.const_defined?("InstanceMethods")
|
17
17
|
end
|
18
18
|
end
|
19
|
-
|
20
|
-
def unbound_action(klass, mname, block)
|
21
|
-
klass.module_eval do
|
22
|
-
begin
|
23
|
-
define_method(mname, &block)
|
24
|
-
instance_method(mname)
|
25
|
-
ensure
|
26
|
-
remove_method(mname) if instance_methods.include?(mname)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
module_function :unbound_action
|
31
19
|
end
|
32
20
|
end
|
data/lib/ww/double/mock.rb
CHANGED
@@ -1,24 +1,8 @@
|
|
1
|
+
require 'ww/dsl/mock_definition'
|
2
|
+
|
1
3
|
module Ww
|
2
4
|
module Double
|
3
5
|
module Mock
|
4
|
-
class Expectation
|
5
|
-
def executed!; @e = true; end
|
6
|
-
def executed?; !!@e; end
|
7
|
-
attr_reader :identifier
|
8
|
-
|
9
|
-
def initialize(verb, path, verifier = nil)
|
10
|
-
@identifier = "_mock_ #{verb.to_s.upcase} #{path}"
|
11
|
-
@verifier = verifier
|
12
|
-
end
|
13
|
-
|
14
|
-
def verify(request, testing_thread = nil)
|
15
|
-
return true unless @verifier && testing_thread # no need to verify
|
16
|
-
return true if @verifier.call(r = request.dup, r.params)
|
17
|
-
|
18
|
-
testing_thread.raise MockError
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
6
|
def testing_thread=(thread)
|
23
7
|
@testing_thread = thread
|
24
8
|
end
|
@@ -27,24 +11,14 @@ module Ww
|
|
27
11
|
@testing_thread
|
28
12
|
end
|
29
13
|
|
30
|
-
def mock(
|
31
|
-
|
32
|
-
expectations << expect
|
33
|
-
action = Double.unbound_action(self, expect.identifier, block)
|
34
|
-
|
35
|
-
stub(verb, path) do |*args|
|
36
|
-
expect.verify(request, self.class.testing_thread)
|
37
|
-
expect.executed!
|
38
|
-
|
39
|
-
action.bind(self).call(*args)
|
40
|
-
end
|
14
|
+
def mock(args = nil, &block)
|
15
|
+
Dsl::MockDefinition.new(self, args, &block)
|
41
16
|
end
|
42
17
|
|
43
18
|
def verify
|
44
19
|
raise MockError unless expectations.all? {|mock| mock.executed? }
|
45
20
|
end
|
46
21
|
|
47
|
-
private
|
48
22
|
def expectations
|
49
23
|
@expectations ||= []
|
50
24
|
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
module Ww
|
2
|
+
module Double
|
3
|
+
module Mock
|
4
|
+
class Expectation
|
5
|
+
def executed?; !!@executed; end
|
6
|
+
attr_reader :identifier
|
7
|
+
|
8
|
+
def initialize(verb, path, verifier = nil, &verify_block)
|
9
|
+
if verifier && block_given?
|
10
|
+
raise ArgumentError, "only one of either argument or block can specified."
|
11
|
+
end
|
12
|
+
|
13
|
+
@identifier = "_mock_ #{verb.to_s.upcase} #{path}"
|
14
|
+
@verifier = block_given? ? verify_block : verifier
|
15
|
+
end
|
16
|
+
|
17
|
+
def verify(request, testing_thread = nil)
|
18
|
+
@executed = true
|
19
|
+
return true unless need_to_verify?(testing_thread)
|
20
|
+
|
21
|
+
passed, message = _verify(request.dup)
|
22
|
+
return true if passed
|
23
|
+
|
24
|
+
testing_thread.raise MockError, message
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
def need_to_verify?(testing_thread)
|
29
|
+
@verifier && testing_thread
|
30
|
+
end
|
31
|
+
|
32
|
+
def _verify(request)
|
33
|
+
case @verifier
|
34
|
+
when Proc then @verifier.call(request.dup, request.params)
|
35
|
+
when Hash
|
36
|
+
params = @verifier.dup
|
37
|
+
header = params.delete(:header) || {}
|
38
|
+
|
39
|
+
verify_by_hash(params, request.params) &&
|
40
|
+
verify_by_hash(header, request.env, true)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def verify_by_hash(expectations, actuals, upcase_key = false)
|
45
|
+
expectations.all? do |key, value|
|
46
|
+
key = key.to_s
|
47
|
+
key = key.upcase if upcase_key
|
48
|
+
hash_expectation_match?(value, actuals[key])
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def hash_expectation_match?(expect, actual)
|
53
|
+
case expect
|
54
|
+
when String then expect == actual
|
55
|
+
when Regexp then expect.match(actual)
|
56
|
+
when Integer then expect == actual.to_i
|
57
|
+
when Class then klass_match?(expect, actual)
|
58
|
+
else false
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def klass_match?(e, actual)
|
63
|
+
if e == Integer
|
64
|
+
Integer(actual) rescue false
|
65
|
+
elsif e == Float
|
66
|
+
Float(actual) rescue false
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
data/lib/ww/double/spy.rb
CHANGED
@@ -1,16 +1,12 @@
|
|
1
1
|
require 'ww/store'
|
2
2
|
require 'ww/double/spy/request'
|
3
|
+
require 'ww/dsl/spy_definition'
|
3
4
|
|
4
5
|
module Ww
|
5
6
|
module Double
|
6
7
|
module Spy
|
7
|
-
def spy
|
8
|
-
|
9
|
-
|
10
|
-
stub(verb, path) do |*args|
|
11
|
-
spy!
|
12
|
-
action.bind(self).call(*args)
|
13
|
-
end
|
8
|
+
def spy
|
9
|
+
Dsl::SpyDefinition.new(self)
|
14
10
|
end
|
15
11
|
|
16
12
|
def spy_them_all!
|
data/lib/ww/double/stub.rb
CHANGED
@@ -1,13 +1,10 @@
|
|
1
|
+
require 'ww/dsl/stub_definition'
|
2
|
+
|
1
3
|
module Ww
|
2
4
|
module Double
|
3
5
|
module Stub
|
4
|
-
def stub
|
5
|
-
|
6
|
-
|
7
|
-
synchronize do
|
8
|
-
send(verb, path, &block)
|
9
|
-
routes[v].unshift(routes[v].pop)
|
10
|
-
end
|
6
|
+
def stub
|
7
|
+
Dsl::StubDefinition.new(self)
|
11
8
|
end
|
12
9
|
end
|
13
10
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Ww
|
2
|
+
module Dsl
|
3
|
+
class DefinitionBase
|
4
|
+
attr_reader :servlet
|
5
|
+
def initialize(servlet)
|
6
|
+
@servlet = servlet
|
7
|
+
end
|
8
|
+
|
9
|
+
%w[get post put delete].each do |verb|
|
10
|
+
class_eval <<-RUBY, __FILE__, __LINE__
|
11
|
+
def #{verb}(path, options = {}, &action)
|
12
|
+
define_action(:#{verb}, path, options, &action)
|
13
|
+
end
|
14
|
+
RUBY
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
def define_action(verb, path, options = {}, &action)
|
19
|
+
raise NotImplementedError, "override me"
|
20
|
+
end
|
21
|
+
|
22
|
+
def unbound_action(klass, mname, block)
|
23
|
+
klass.module_eval do
|
24
|
+
begin
|
25
|
+
define_method(mname, &block)
|
26
|
+
instance_method(mname)
|
27
|
+
ensure
|
28
|
+
remove_method(mname) if instance_methods.include?(mname)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'ww/dsl/definition_base'
|
2
|
+
require 'ww/double/mock/expectation'
|
3
|
+
|
4
|
+
module Ww
|
5
|
+
module Dsl
|
6
|
+
class MockDefinition < DefinitionBase
|
7
|
+
def initialize(servlet, verification = nil, &block)
|
8
|
+
super(servlet)
|
9
|
+
@verification = block_given? ? block : verification
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
def expectation_for(verb, path, options)
|
14
|
+
Double::Mock::Expectation.new(verb, path, @verification)
|
15
|
+
end
|
16
|
+
|
17
|
+
def define_action(verb, path, options = {}, &action)
|
18
|
+
expect = expectation_for(verb, path, options)
|
19
|
+
servlet.expectations << expect
|
20
|
+
action = unbound_action(servlet, expect.identifier, action)
|
21
|
+
|
22
|
+
servlet.stub.send(verb, path, options) do |*args|
|
23
|
+
expect.verify(request, self.class.testing_thread)
|
24
|
+
|
25
|
+
action.bind(self).call(*args)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'ww/dsl/definition_base'
|
2
|
+
|
3
|
+
module Ww
|
4
|
+
module Dsl
|
5
|
+
class SpyDefinition < Ww::Dsl::DefinitionBase
|
6
|
+
private
|
7
|
+
def define_action(verb, path, options = {}, &action)
|
8
|
+
ident = "_spy_ #{verb.to_s.upcase} #{path}"
|
9
|
+
action = unbound_action(servlet, ident, action)
|
10
|
+
|
11
|
+
servlet.stub.send(verb, path, options) do |*args|
|
12
|
+
spy!
|
13
|
+
action.bind(self).call(*args)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'ww/dsl/definition_base'
|
2
|
+
|
3
|
+
module Ww
|
4
|
+
module Dsl
|
5
|
+
class StubDefinition < DefinitionBase
|
6
|
+
private
|
7
|
+
def define_action(verb, path, options = {}, &action)
|
8
|
+
v = verb.to_s.upcase
|
9
|
+
servlet.synchronize do
|
10
|
+
servlet.send(verb, path, options, &action)
|
11
|
+
routes = servlet.routes
|
12
|
+
routes[v].unshift(routes[v].pop)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/ww/server.rb
CHANGED
@@ -21,12 +21,35 @@ module Ww
|
|
21
21
|
def build_double(port, &block)
|
22
22
|
new(Application.new(&block), port)
|
23
23
|
end
|
24
|
+
|
25
|
+
def detect_server(args)
|
26
|
+
if servers.include?(args.first)
|
27
|
+
return self[args.shift]
|
28
|
+
elsif servers.size == 1
|
29
|
+
return servers.values.first
|
30
|
+
end
|
31
|
+
raise ArgumentError, "Ambigous server" unless server
|
32
|
+
end
|
24
33
|
end
|
25
34
|
|
26
|
-
|
27
|
-
spy spy_them_all! requests
|
35
|
+
double_methods = %w[
|
36
|
+
spy spy_them_all! requests
|
37
|
+
mock verify
|
38
|
+
stub
|
28
39
|
]
|
29
40
|
|
41
|
+
# server instance delegate the methods to currently working Ww::Servlet
|
42
|
+
def_delegators :current_servlet, *double_methods
|
43
|
+
|
44
|
+
# syntax sugers above
|
45
|
+
(double_methods + %w[start_once shutdown running?]).each do |server_method|
|
46
|
+
class_eval <<-RUBY, __FILE__, __LINE__
|
47
|
+
def self.#{server_method}(*args, &block)
|
48
|
+
detect_server(args).#{server_method}(*args, &block)
|
49
|
+
end
|
50
|
+
RUBY
|
51
|
+
end
|
52
|
+
|
30
53
|
attr_reader :app, :port
|
31
54
|
|
32
55
|
def initialize(app, port)
|
@@ -37,7 +60,7 @@ module Ww
|
|
37
60
|
|
38
61
|
def start_once
|
39
62
|
@app.reset!
|
40
|
-
|
63
|
+
current_servlet.testing_thread = Thread.current
|
41
64
|
start! unless running?
|
42
65
|
end
|
43
66
|
|
@@ -91,7 +114,7 @@ module Ww
|
|
91
114
|
end
|
92
115
|
end
|
93
116
|
|
94
|
-
def
|
117
|
+
def current_servlet
|
95
118
|
app.current
|
96
119
|
end
|
97
120
|
end
|
data/spec/ww/application_spec.rb
CHANGED
@@ -20,7 +20,7 @@ describe Ww::Application do
|
|
20
20
|
|
21
21
|
describe "GET /hello (stubbed)" do
|
22
22
|
before do
|
23
|
-
@container.current.stub(
|
23
|
+
@container.current.stub.get("/hello") { response = "Good night" }
|
24
24
|
end
|
25
25
|
its(:body) { should == "Good night" }
|
26
26
|
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require File.expand_path("../../../spec_helper", File.dirname(__FILE__))
|
2
|
+
require 'ww/double'
|
3
|
+
require 'ww/double/mock/expectation'
|
4
|
+
require 'rack/mock'
|
5
|
+
|
6
|
+
describe Ww::Double::Mock::Expectation, "[GET] /pass?key=value&int=10" do
|
7
|
+
def expectation(*verifier, &block)
|
8
|
+
Ww::Double::Mock::Expectation.new(:get, "/pass", *verifier, &block)
|
9
|
+
end
|
10
|
+
|
11
|
+
before do
|
12
|
+
@request = Rack::Request.new( Rack::MockRequest.env_for("/pass?key=value&int=10", :method => "GET"))
|
13
|
+
end
|
14
|
+
subject { expect{ @expectation.verify(@request, Thread.current) } }
|
15
|
+
|
16
|
+
describe "with block" do
|
17
|
+
before do
|
18
|
+
@expectation = expectation{|req, prm|
|
19
|
+
req.path == "/pass" &&
|
20
|
+
prm["key"] == "value" &&
|
21
|
+
prm["int"] == "10"
|
22
|
+
}
|
23
|
+
end
|
24
|
+
it { should_not raise_error Exception }
|
25
|
+
|
26
|
+
describe "fail" do
|
27
|
+
before do
|
28
|
+
@expectation = expectation{|req, prm|
|
29
|
+
req.path == "/pass" &&
|
30
|
+
prm["key"] == "value" &&
|
31
|
+
prm["int"] == "11"
|
32
|
+
}
|
33
|
+
end
|
34
|
+
it { should raise_error Ww::Double::MockError }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe ":key => \"value\"" do
|
39
|
+
before { @expectation = expectation(:key => "value") }
|
40
|
+
it { should_not raise_error Exception }
|
41
|
+
|
42
|
+
describe ":key => \"VALUE\"" do
|
43
|
+
before { @expectation = expectation(:key => "VALUE") }
|
44
|
+
it { should raise_error Ww::Double::MockError }
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe ":key => /VALUE/i # regexp match" do
|
49
|
+
before { @expectation = expectation(:key => /VALUE/i) }
|
50
|
+
it { should_not raise_error Exception }
|
51
|
+
end
|
52
|
+
|
53
|
+
describe ":int => 10" do
|
54
|
+
before { @expectation = expectation(:int => 10) }
|
55
|
+
it { should_not raise_error Exception }
|
56
|
+
end
|
57
|
+
|
58
|
+
describe ":int => Integer" do
|
59
|
+
before { @expectation = expectation(:int => Integer) }
|
60
|
+
it { should_not raise_error Exception }
|
61
|
+
end
|
62
|
+
|
63
|
+
describe ":header => {:path_info => \"pass\"}" do
|
64
|
+
before { @expectation = expectation(:header => {:path_info => "/pass"}) }
|
65
|
+
it { should_not raise_error Exception }
|
66
|
+
|
67
|
+
describe ":key => \"VALUE\"" do
|
68
|
+
before { @expectation = expectation(:header => {:path_info => "/fail"}) }
|
69
|
+
it { should raise_error Ww::Double::MockError }
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
data/spec/ww/double/mock_spec.rb
CHANGED
@@ -6,11 +6,11 @@ describe Ww::Double::Mock, "with Servlet" do
|
|
6
6
|
@server = servlet_defining_get_root
|
7
7
|
end
|
8
8
|
|
9
|
-
describe "mock(
|
9
|
+
describe "mock{ verify }.get('/')" do
|
10
10
|
before do
|
11
|
-
|
12
|
-
|
13
|
-
|
11
|
+
@server.mock{|req, prm|
|
12
|
+
prm["entity_id"].to_i == 1 && prm["entity_value"] == "var"
|
13
|
+
}.get('/') do
|
14
14
|
response.status = 200
|
15
15
|
response["Content-Type"] = "text/plain"
|
16
16
|
response.body = "Hi World"
|
@@ -29,9 +29,9 @@ describe Ww::Double::Mock, "with Servlet" do
|
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
-
describe "mock(
|
32
|
+
describe "mock.get('/') # expect called w/anything" do
|
33
33
|
before do
|
34
|
-
@server.mock(
|
34
|
+
@server.mock.get('/') do
|
35
35
|
response.status = 200
|
36
36
|
response["Content-Type"] = "text/plain"
|
37
37
|
response.body = "Hi World"
|
data/spec/ww/double/spy_spec.rb
CHANGED
@@ -6,9 +6,9 @@ describe Ww::Double, "with Servlet" do
|
|
6
6
|
@server = servlet_defining_get_root
|
7
7
|
end
|
8
8
|
|
9
|
-
describe "spy(
|
9
|
+
describe "spy.get('/')" do
|
10
10
|
before do
|
11
|
-
@server.spy(
|
11
|
+
@server.spy.get('/') do
|
12
12
|
response.status = 200
|
13
13
|
response["Content-Type"] = "text/plain"
|
14
14
|
response.body = "Hi World"
|
@@ -39,7 +39,7 @@ describe Ww::Double, "with Servlet" do
|
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
|
-
describe "
|
42
|
+
describe "get('/') backword compat, old version spy! or spy(:get..) called stump!" do
|
43
43
|
before do
|
44
44
|
@server.get('/backword') do
|
45
45
|
stump!
|
@@ -70,7 +70,7 @@ describe Ww::Double, "with Servlet" do
|
|
70
70
|
|
71
71
|
describe "do-not collect if already collected" do
|
72
72
|
before do
|
73
|
-
@server.spy(
|
73
|
+
@server.spy.get('/spyed'){ "Hello" }
|
74
74
|
@app.call( Rack::MockRequest.env_for("/spyed", :method => "GET"))
|
75
75
|
end
|
76
76
|
it { should have(3 + 1).requests }
|
data/spec/ww/double/stub_spec.rb
CHANGED
@@ -6,9 +6,9 @@ describe Ww::Double::Stub, "included to Servlet" do
|
|
6
6
|
@server = servlet_defining_get_root
|
7
7
|
end
|
8
8
|
|
9
|
-
describe "stub(
|
9
|
+
describe "stub.get('/dynamic_add')" do
|
10
10
|
before do
|
11
|
-
@server.stub(
|
11
|
+
@server.stub.get('/dynamic_add') do
|
12
12
|
response.status = 200
|
13
13
|
response["Content-Type"] = "text/plain"
|
14
14
|
response.body = "Hi World"
|
@@ -22,9 +22,9 @@ describe Ww::Double::Stub, "included to Servlet" do
|
|
22
22
|
it { should == [200, {"Content-Type"=>"text/plain", "Content-Length"=>"8"}, ["Hi World"]] }
|
23
23
|
end
|
24
24
|
|
25
|
-
describe "stub(
|
25
|
+
describe "stub.get('/') # override" do
|
26
26
|
before do
|
27
|
-
@server.stub(
|
27
|
+
@server.stub.get('/') do
|
28
28
|
response.status = 200
|
29
29
|
response["Content-Type"] = "text/plain"
|
30
30
|
response.body = "Hi World"
|
@@ -38,11 +38,11 @@ describe Ww::Double::Stub, "included to Servlet" do
|
|
38
38
|
it { should == [200, {"Content-Type"=>"text/plain", "Content-Length"=>"8"}, ["Hi World"]] }
|
39
39
|
end
|
40
40
|
|
41
|
-
describe "stub(
|
41
|
+
describe "stub.get('/') # re-define after app initialized" do
|
42
42
|
before do
|
43
43
|
@app = @server.new
|
44
44
|
|
45
|
-
@server.stub(
|
45
|
+
@server.stub.get('/') do
|
46
46
|
response.status = 200
|
47
47
|
response["Content-Type"] = "text/plain"
|
48
48
|
response.body = "Hi! World"
|
@@ -8,9 +8,9 @@ describe Ww::Server do
|
|
8
8
|
Ww::Server.handler = :webrick
|
9
9
|
Ww::Server[:spec] ||= Ww::Server.build_double(3080) do
|
10
10
|
get("/goodnight") { "Good night" }
|
11
|
-
spy(
|
11
|
+
spy.get("/hello") { "Hello world" }
|
12
12
|
end
|
13
|
-
Ww::Server
|
13
|
+
Ww::Server.start_once(:spec)
|
14
14
|
end
|
15
15
|
|
16
16
|
describe "store only spy-ed action" do
|
@@ -19,14 +19,14 @@ describe Ww::Server do
|
|
19
19
|
ignore = URI("http://localhost:3080/hello").read
|
20
20
|
end
|
21
21
|
|
22
|
-
subject { Ww::Server
|
22
|
+
subject { Ww::Server.requests(:spec) }
|
23
23
|
it { should have(1).items }
|
24
24
|
it { subject.first.path.should == "/hello" }
|
25
25
|
end
|
26
26
|
|
27
27
|
describe "spying POST action" do
|
28
28
|
before do
|
29
|
-
Ww::Server
|
29
|
+
Ww::Server.spy(:spec).post("/message") { status(200) }
|
30
30
|
|
31
31
|
Net::HTTP.start("localhost", 3080) do |http|
|
32
32
|
post = Net::HTTP::Post.new("/message")
|
@@ -35,7 +35,7 @@ describe Ww::Server do
|
|
35
35
|
http.request post
|
36
36
|
end
|
37
37
|
end
|
38
|
-
subject { Ww::Server
|
38
|
+
subject { Ww::Server.requests(:spec).first }
|
39
39
|
|
40
40
|
its(:parsed_body) do
|
41
41
|
should == {"message" => "I'm double Ruby.", "madeby" => "moro"}
|
@@ -46,7 +46,7 @@ describe Ww::Server do
|
|
46
46
|
before do
|
47
47
|
# validates it's not stubbed.
|
48
48
|
URI("http://localhost:3080/goodnight").read.should == "Good night"
|
49
|
-
Ww::Server
|
49
|
+
Ww::Server.stub(:spec).get("/goodnight") { "I'm sleepy, too" }
|
50
50
|
end
|
51
51
|
|
52
52
|
subject { URI("http://localhost:3080/goodnight").read }
|
@@ -55,25 +55,46 @@ describe Ww::Server do
|
|
55
55
|
|
56
56
|
describe "mocking" do
|
57
57
|
before do
|
58
|
-
Ww::Server
|
58
|
+
Ww::Server.mock(:spec).get("/goodnight") do
|
59
59
|
"OYASUMI-NASAI"
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
63
63
|
it "pass if access there" do
|
64
64
|
ignore = URI("http://localhost:3080/goodnight").read
|
65
|
-
expect{ Ww::Server
|
65
|
+
expect{ Ww::Server.verify(:spec) }.should_not raise_error
|
66
66
|
end
|
67
67
|
|
68
68
|
it "fail unless access there" do
|
69
|
-
expect{ Ww::Server
|
69
|
+
expect{ Ww::Server.verify(:spec) }.should raise_error Ww::Double::MockError
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
73
|
-
describe "mocking with verifying expectation" do
|
73
|
+
describe "mocking with verifying hash expectation" do
|
74
74
|
before do
|
75
|
-
|
76
|
-
|
75
|
+
Ww::Server.mock(:spec, :key => "value").get("/goodnight") do
|
76
|
+
"OYASUMI-NASAI"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
it "fail unless access there" do
|
81
|
+
expect{
|
82
|
+
URI("http://localhost:3080/goodnight").read
|
83
|
+
}.should raise_error Ww::Double::MockError
|
84
|
+
end
|
85
|
+
|
86
|
+
it "pass if access there" do
|
87
|
+
expect{
|
88
|
+
URI("http://localhost:3080/goodnight?key=value").read
|
89
|
+
}.should_not raise_error
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
describe "mocking with verifying block expectation" do
|
94
|
+
before do
|
95
|
+
Ww::Server.mock(:spec){|req,par|
|
96
|
+
par["key"] == "value"
|
97
|
+
}.get("/goodnight") do
|
77
98
|
"OYASUMI-NASAI"
|
78
99
|
end
|
79
100
|
end
|
data/spec/ww/server_spec.rb
CHANGED
@@ -8,7 +8,7 @@ describe Ww::Server do
|
|
8
8
|
Ww::Server.handler = :mongrel # Mongrel is most silent.
|
9
9
|
Ww::Server[:spec] ||= Ww::Server.build_double(3080) do
|
10
10
|
get("/goodnight") { "Good night" }
|
11
|
-
spy(
|
11
|
+
spy.get("/hello") { "Hello world" }
|
12
12
|
end
|
13
13
|
Ww::Server[:spec].start_once
|
14
14
|
end
|
@@ -35,5 +35,34 @@ describe Ww::Server do
|
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
+
describe "SyntaxSuger" do
|
39
|
+
describe "stub" do
|
40
|
+
before { Ww::Server[:spec].should_receive(:stub).and_return "--stub--" }
|
41
|
+
it "Ww::Server.stub(ident) calls Ww::Server[:ident].stub" do
|
42
|
+
Ww::Server.stub(:spec).should == "--stub--"
|
43
|
+
end
|
44
|
+
|
45
|
+
it "Ww::Server.stub calls Ww::Server[:ident].stub when has only 1 server" do
|
46
|
+
Ww::Server.stub.should == "--stub--"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe "mock" do
|
51
|
+
before { Ww::Server[:spec].should_receive(:mock).with(:key => "value").and_return "--mock--" }
|
52
|
+
|
53
|
+
it "Ww::Server.mock(ident, expectation) calls Ww::Server[:ident].mock(expectation)" do
|
54
|
+
Ww::Server.mock(:spec, :key => "value").should == "--mock--"
|
55
|
+
end
|
56
|
+
|
57
|
+
it "Ww::Server.mock(expectation) calls Ww::Server[:ident].mock(expectation) when defined only 1 server" do
|
58
|
+
Ww::Server.mock(:key => "value").should == "--mock--"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
it "Ww::Server.start_once(ident) calls Ww::Server[:ident].start_once" do
|
63
|
+
Ww::Server[:spec].should_receive(:start_once).and_return "--start_once--"
|
64
|
+
Ww::Server.start_once(:spec).should == "--start_once--"
|
65
|
+
end
|
66
|
+
end
|
38
67
|
end
|
39
68
|
|
metadata
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ww
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 4
|
8
|
+
- 0
|
9
|
+
version: 0.4.0
|
5
10
|
platform: ruby
|
6
11
|
authors:
|
7
12
|
- moro
|
@@ -9,49 +14,65 @@ autorequire:
|
|
9
14
|
bindir: bin
|
10
15
|
cert_chain: []
|
11
16
|
|
12
|
-
date: 2010-01-
|
17
|
+
date: 2010-01-28 00:00:00 +09:00
|
13
18
|
default_executable:
|
14
19
|
dependencies:
|
15
20
|
- !ruby/object:Gem::Dependency
|
16
21
|
name: sinatra
|
17
|
-
|
18
|
-
|
19
|
-
version_requirements: !ruby/object:Gem::Requirement
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
20
24
|
requirements:
|
21
25
|
- - ">="
|
22
26
|
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 0
|
29
|
+
- 9
|
30
|
+
- 4
|
23
31
|
version: 0.9.4
|
24
|
-
|
32
|
+
type: :runtime
|
33
|
+
version_requirements: *id001
|
25
34
|
- !ruby/object:Gem::Dependency
|
26
35
|
name: rack
|
27
|
-
|
28
|
-
|
29
|
-
version_requirements: !ruby/object:Gem::Requirement
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
30
38
|
requirements:
|
31
39
|
- - ">="
|
32
40
|
- !ruby/object:Gem::Version
|
41
|
+
segments:
|
42
|
+
- 1
|
43
|
+
- 0
|
44
|
+
- 1
|
33
45
|
version: 1.0.1
|
34
|
-
|
46
|
+
type: :runtime
|
47
|
+
version_requirements: *id002
|
35
48
|
- !ruby/object:Gem::Dependency
|
36
49
|
name: haml
|
37
|
-
|
38
|
-
|
39
|
-
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
prerelease: false
|
51
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
40
52
|
requirements:
|
41
53
|
- - ">="
|
42
54
|
- !ruby/object:Gem::Version
|
55
|
+
segments:
|
56
|
+
- 2
|
57
|
+
- 2
|
58
|
+
- 13
|
43
59
|
version: 2.2.13
|
44
|
-
|
60
|
+
type: :runtime
|
61
|
+
version_requirements: *id003
|
45
62
|
- !ruby/object:Gem::Dependency
|
46
63
|
name: json
|
47
|
-
|
48
|
-
|
49
|
-
version_requirements: !ruby/object:Gem::Requirement
|
64
|
+
prerelease: false
|
65
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
50
66
|
requirements:
|
51
67
|
- - ">="
|
52
68
|
- !ruby/object:Gem::Version
|
69
|
+
segments:
|
70
|
+
- 1
|
71
|
+
- 2
|
72
|
+
- 0
|
53
73
|
version: 1.2.0
|
54
|
-
|
74
|
+
type: :runtime
|
75
|
+
version_requirements: *id004
|
55
76
|
description: Double Web, framework to build double Web server.
|
56
77
|
email: moronatural@gmail.com
|
57
78
|
executables: []
|
@@ -67,6 +88,7 @@ files:
|
|
67
88
|
- Rakefile
|
68
89
|
- spec/spec_helper.rb
|
69
90
|
- spec/ww/application_spec.rb
|
91
|
+
- spec/ww/double/mock/expectation_spec.rb
|
70
92
|
- spec/ww/double/mock_spec.rb
|
71
93
|
- spec/ww/double/spy_spec.rb
|
72
94
|
- spec/ww/double/stub_spec.rb
|
@@ -75,11 +97,16 @@ files:
|
|
75
97
|
- spec/ww/server_spec.rb
|
76
98
|
- spec/ww/servlet_spec.rb
|
77
99
|
- lib/ww/application.rb
|
100
|
+
- lib/ww/double/mock/expectation.rb
|
78
101
|
- lib/ww/double/mock.rb
|
79
102
|
- lib/ww/double/spy/request.rb
|
80
103
|
- lib/ww/double/spy.rb
|
81
104
|
- lib/ww/double/stub.rb
|
82
105
|
- lib/ww/double.rb
|
106
|
+
- lib/ww/dsl/definition_base.rb
|
107
|
+
- lib/ww/dsl/mock_definition.rb
|
108
|
+
- lib/ww/dsl/spy_definition.rb
|
109
|
+
- lib/ww/dsl/stub_definition.rb
|
83
110
|
- lib/ww/server.rb
|
84
111
|
- lib/ww/servlet.rb
|
85
112
|
- lib/ww/spy_eye.html.haml
|
@@ -112,18 +139,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
112
139
|
requirements:
|
113
140
|
- - ">="
|
114
141
|
- !ruby/object:Gem::Version
|
142
|
+
segments:
|
143
|
+
- 0
|
115
144
|
version: "0"
|
116
|
-
version:
|
117
145
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
118
146
|
requirements:
|
119
147
|
- - ">="
|
120
148
|
- !ruby/object:Gem::Version
|
149
|
+
segments:
|
150
|
+
- 0
|
121
151
|
version: "0"
|
122
|
-
version:
|
123
152
|
requirements: []
|
124
153
|
|
125
154
|
rubyforge_project:
|
126
|
-
rubygems_version: 1.3.
|
155
|
+
rubygems_version: 1.3.6
|
127
156
|
signing_key:
|
128
157
|
specification_version: 3
|
129
158
|
summary: Double Web, framework to build double Web server.
|