http-double 0.1.8 → 0.1.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +95 -1
- data/lib/http_double/base.rb +4 -3
- data/lib/http_double/version.rb +1 -1
- metadata +9 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f23faa1f6653d54edc6a1b1584c02720859b5f56
|
4
|
+
data.tar.gz: 23e07dbfc8058a0f85ac642cc6ec2b1e466743c3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 052c0e4cadc430e204ae4a0e00554d0eafd1d3e1f37586200bdce216dc1546907a6f45e5edacaa49374d22d014561ed71511ddfa0a99c583c269207c42f6e072
|
7
|
+
data.tar.gz: 593c08637600a28ca534f2a3d6b2b51f0cc51fb04edca47dd33af0a43c2e950e76e21fd4fee60b6f2cdef5b7fbbf26371ac4a003146c31f406b8bb964a7cbee4
|
data/README.md
CHANGED
@@ -1 +1,95 @@
|
|
1
|
-
|
1
|
+
This gem allows you to double external HTTP services using [Sinatra](http://www.sinatrarb.com/). Your server(s) will be run in the background using [Thin](http://code.macournoyer.com/thin/) each time you run your tests/specs.
|
2
|
+
|
3
|
+
## Installation
|
4
|
+
|
5
|
+
```bash
|
6
|
+
$ gem install http-double
|
7
|
+
```
|
8
|
+
|
9
|
+
## Usage
|
10
|
+
|
11
|
+
First, define a server double:
|
12
|
+
|
13
|
+
```ruby
|
14
|
+
require 'http-double'
|
15
|
+
|
16
|
+
class HelloDouble < HttpDouble::Base
|
17
|
+
get '/hello' do
|
18
|
+
[
|
19
|
+
200,
|
20
|
+
{'Content-Type' => 'application/json'},
|
21
|
+
['{"greeting":"Hello!"}']
|
22
|
+
]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
```
|
26
|
+
|
27
|
+
Then background it in your spec helper or test setup routine, specifying a local address and port:
|
28
|
+
|
29
|
+
```ruby
|
30
|
+
HelloDouble.background '127.0.0.1', 1357
|
31
|
+
```
|
32
|
+
|
33
|
+
You can now write functional tests against your double, using no-nonsense HTTP over honest-to-goodness TCP.
|
34
|
+
|
35
|
+
```ruby
|
36
|
+
describe 'The "Hello" server' do
|
37
|
+
it 'should greet me politely' do
|
38
|
+
response = Net::HTTP.get_response(URI 'http://127.0.0.1:1357/hello').body
|
39
|
+
expect(response).to include 'Hello!'
|
40
|
+
end
|
41
|
+
end
|
42
|
+
```
|
43
|
+
|
44
|
+
### Expectations on Traffic
|
45
|
+
|
46
|
+
Every request/response to/from an HTTP double is recorded in its `log`. To use the log effectively, clear it before each test.
|
47
|
+
|
48
|
+
```ruby
|
49
|
+
before :each do
|
50
|
+
HelloDouble.log.clear
|
51
|
+
end
|
52
|
+
```
|
53
|
+
|
54
|
+
Each member of the `log` array contains a `request` and a `response`. Here's a contrived example:
|
55
|
+
|
56
|
+
```ruby
|
57
|
+
describe 'The "Hello" server' do
|
58
|
+
it 'should record traffic' do
|
59
|
+
log = HelloDouble.log
|
60
|
+
Net::HTTP.get_response URI 'http://127.0.0.1:1357/hello'
|
61
|
+
|
62
|
+
expect(log.count).to be 1
|
63
|
+
|
64
|
+
expect(log.last.request.verb).to be :get
|
65
|
+
expect(log.last.request.path).to eq '/hello'
|
66
|
+
expect(log.last.request.body).to be_nil
|
67
|
+
|
68
|
+
expect(log.last.response.code).to be 200
|
69
|
+
expect(log.last.response.headers['Content-Type']).to eq 'application/json'
|
70
|
+
expect(JSON.parse(log.last.response.body)['greeting']).to eq 'Hello!'
|
71
|
+
end
|
72
|
+
end
|
73
|
+
```
|
74
|
+
|
75
|
+
In functional tests, you will tend to mostly want to test what your application sends. The log's request object lets you set expectations using indexed access:
|
76
|
+
|
77
|
+
```ruby
|
78
|
+
def be_a_cowboy!
|
79
|
+
uri = URI 'http://127.0.0.1:1357/hello'
|
80
|
+
Net::HTTP.post_form uri, 'new_greeting' => 'Howdy!'
|
81
|
+
end
|
82
|
+
|
83
|
+
describe 'Something that changes my greeting' do
|
84
|
+
it 'should act like a cowboy' do
|
85
|
+
be_a_cowboy!
|
86
|
+
request = HelloDouble.log.last.request
|
87
|
+
|
88
|
+
expect(request.verb).to be :post
|
89
|
+
expect(request.path).to eq '/hello'
|
90
|
+
expect(request['new_greeting']).to eq 'Howdy!'
|
91
|
+
end
|
92
|
+
end
|
93
|
+
```
|
94
|
+
|
95
|
+
You can use indexed access on any request sent as valid `application/x-www-form-urlencoded` or `application/json`.
|
data/lib/http_double/base.rb
CHANGED
@@ -12,7 +12,7 @@ module HttpDouble
|
|
12
12
|
@initializer = block
|
13
13
|
end
|
14
14
|
|
15
|
-
def foreground(addr, port, log_path: '/dev/null', logger: nil)
|
15
|
+
def foreground(addr, port, log_path: '/dev/null', logger: nil, &block)
|
16
16
|
server_class = self
|
17
17
|
app_class = @app_class || server_class
|
18
18
|
|
@@ -26,13 +26,14 @@ module HttpDouble
|
|
26
26
|
Thin::Server.start(addr, port) do
|
27
27
|
initializer.call if initializer
|
28
28
|
use RequestLogger, server_class.log
|
29
|
+
instance_exec &block if block
|
29
30
|
run Class === app_class ? app_class.new : app_class
|
30
31
|
end
|
31
32
|
|
32
33
|
end
|
33
34
|
|
34
|
-
def background(addr, port, **args)
|
35
|
-
thread = Thread.new{ foreground addr, port, **args }
|
35
|
+
def background(addr, port, **args, &block)
|
36
|
+
thread = Thread.new{ foreground addr, port, **args, &block }
|
36
37
|
thread.abort_on_exception = true
|
37
38
|
sleep 0.05 until test_background addr, port
|
38
39
|
thread
|
data/lib/http_double/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: http-double
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Neil E. Pearson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-06-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sinatra
|
@@ -98,30 +98,30 @@ dependencies:
|
|
98
98
|
name: rake
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- - "
|
101
|
+
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
103
|
version: '10.1'
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- - "
|
108
|
+
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '10.1'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: rspec
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
|
-
- - "
|
115
|
+
- - "~>"
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: 3.0
|
117
|
+
version: '3.0'
|
118
118
|
type: :development
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
|
-
- - "
|
122
|
+
- - "~>"
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version: 3.0
|
124
|
+
version: '3.0'
|
125
125
|
description: Provides a simple way to double HTTP services, APIs etc, for testing.
|
126
126
|
email:
|
127
127
|
- neil@helium.net.au
|
@@ -156,9 +156,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
156
156
|
version: '0'
|
157
157
|
requirements: []
|
158
158
|
rubyforge_project:
|
159
|
-
rubygems_version: 2.
|
159
|
+
rubygems_version: 2.4.6
|
160
160
|
signing_key:
|
161
161
|
specification_version: 4
|
162
162
|
summary: Sinatra-based HTTP test doubling
|
163
163
|
test_files: []
|
164
|
-
has_rdoc:
|