ephemeral_response 0.3.2 → 0.4.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.
- data/.gitignore +0 -1
- data/.rvmrc +1 -0
- data/History.markdown +24 -4
- data/README.markdown +22 -0
- data/VERSION +1 -1
- data/ephemeral_response.gemspec +6 -2
- data/lib/ephemeral_response.rb +24 -4
- data/lib/ephemeral_response/configuration.rb +24 -0
- data/lib/ephemeral_response/fixture.rb +11 -6
- data/lib/ephemeral_response/net_http.rb +2 -2
- data/lib/ephemeral_response/null_output.rb +6 -0
- data/spec/ephemeral_response/configuration_spec.rb +70 -0
- data/spec/ephemeral_response/fixture_spec.rb +29 -1
- data/spec/integration/read_body_compatibility_spec.rb +12 -4
- data/spec/integration/sets_spec.rb +74 -0
- data/spec/integration/unique_fixtures_spec.rb +27 -11
- data/spec/spec_helper.rb +10 -4
- metadata +16 -4
data/.gitignore
CHANGED
data/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm gemset use ephemeral_response
|
data/History.markdown
CHANGED
@@ -1,14 +1,34 @@
|
|
1
1
|
History
|
2
2
|
=======
|
3
3
|
|
4
|
+
0.4.0 / 2011-01-18
|
5
|
+
----------------
|
6
|
+
|
7
|
+
#### Fixes
|
8
|
+
|
9
|
+
* Net::HTTP#request now respects the body parameter. When the body
|
10
|
+
parameter is passed in, it will be set on the request (like normal)
|
11
|
+
making it available for identification of the fixture. (bernerdschaefer,
|
12
|
+
veezus)
|
13
|
+
* Force removal of expired fixtures to overcome missing file exception
|
14
|
+
* Handle fixture load failures by output errant fixture file to debug output
|
15
|
+
|
16
|
+
|
17
|
+
#### Enhancements
|
18
|
+
|
19
|
+
* EphemeralResponse.fixture\_set allows you to keep named groups of fixtures. By
|
20
|
+
default, this is nil (also :default).
|
21
|
+
* EphemeralResponse::Configuration.debug\_output prints debugging information to
|
22
|
+
the provided IO object
|
23
|
+
|
4
24
|
0.3.2 / 2010-07-30
|
5
25
|
------------------
|
6
26
|
|
7
|
-
####
|
27
|
+
#### Fixes
|
8
28
|
|
9
|
-
* Net::HTTP
|
29
|
+
* Net::HTTP#request now yields the response when a fixture exists
|
10
30
|
* Net::HTTPResponse#read\_body works when a fixture exists
|
11
|
-
* OpenURI compatibility (it depends on #
|
31
|
+
* OpenURI compatibility (it depends on #read\_body)
|
12
32
|
|
13
33
|
0.3.1 / 2010-06-29
|
14
34
|
--------------
|
@@ -23,7 +43,7 @@ History
|
|
23
43
|
#### Enhancements
|
24
44
|
|
25
45
|
* Periods no longer replaced with slashes in fixture names.
|
26
|
-
* Added
|
46
|
+
* Added skip\expiration option allowing fixtures to never expire.
|
27
47
|
|
28
48
|
0.2.0 / 2010-06-23
|
29
49
|
--------------
|
data/README.markdown
CHANGED
@@ -93,6 +93,22 @@ An example may help clear this up.
|
|
93
93
|
|
94
94
|
Take a look in `examples/custom_cache_key.rb` to see this in action.
|
95
95
|
|
96
|
+
## Grouping fixtures to isolate responses
|
97
|
+
|
98
|
+
Occasionally you are in a situation where you are making the same request but
|
99
|
+
you are expecting a different result, for example, a list of all resources,
|
100
|
+
create a new resource, and then list them again. For this scenario, you can use
|
101
|
+
a 'newly_created' fixture set. In your specs, change the fixture set to
|
102
|
+
'newly_created' for the create and second list requests. The default fixture
|
103
|
+
set is named :default (or nil).
|
104
|
+
|
105
|
+
# pseudo code
|
106
|
+
get('http://example.com/books').should_not contain('The Illiad')
|
107
|
+
EphemeralResponse.fixture_set = :newly_created
|
108
|
+
post('http://example.com/books', {:title => 'The Illiad'})
|
109
|
+
get('http://example.com/books').should contain('The Illiad')
|
110
|
+
EphemeralResponse.fixture_set = :default
|
111
|
+
|
96
112
|
## Configuration
|
97
113
|
|
98
114
|
Change the fixture directory; defaults to "spec/fixtures/ephemeral\_response"
|
@@ -114,6 +130,11 @@ Never let fixtures expire by setting skip\_expiration to true.
|
|
114
130
|
|
115
131
|
EphemeralResponse::Configuration.skip_expiration = true
|
116
132
|
|
133
|
+
Print debugging information
|
134
|
+
|
135
|
+
EphemeralResponse::Configuration.debug_output = $stderr
|
136
|
+
|
137
|
+
|
117
138
|
### Selenium Tip
|
118
139
|
|
119
140
|
Always allow requests to be made to a host by adding it to the white list.
|
@@ -129,6 +150,7 @@ the local server.
|
|
129
150
|
config.expiration = lambda { one_day * 30 }
|
130
151
|
config.skip_expiration = true
|
131
152
|
config.white_list = 'localhost'
|
153
|
+
config.debug_output = $stderr
|
132
154
|
end
|
133
155
|
|
134
156
|
## Similar Projects
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.4.0
|
data/ephemeral_response.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{ephemeral_response}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.4.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Sandro Turriate", "Les Hill"]
|
12
|
-
s.date = %q{
|
12
|
+
s.date = %q{2011-01-18}
|
13
13
|
s.description = %q{
|
14
14
|
Save HTTP responses to give your tests a hint of reality.
|
15
15
|
Responses are saved into your fixtures directory and are used for subsequent web requests until they expire.
|
@@ -21,6 +21,7 @@ Gem::Specification.new do |s|
|
|
21
21
|
s.files = [
|
22
22
|
".document",
|
23
23
|
".gitignore",
|
24
|
+
".rvmrc",
|
24
25
|
"Gemfile",
|
25
26
|
"History.markdown",
|
26
27
|
"MIT_LICENSE",
|
@@ -36,6 +37,7 @@ Gem::Specification.new do |s|
|
|
36
37
|
"lib/ephemeral_response/configuration.rb",
|
37
38
|
"lib/ephemeral_response/fixture.rb",
|
38
39
|
"lib/ephemeral_response/net_http.rb",
|
40
|
+
"lib/ephemeral_response/null_output.rb",
|
39
41
|
"lib/ephemeral_response/request.rb",
|
40
42
|
"spec/ephemeral_response/configuration_spec.rb",
|
41
43
|
"spec/ephemeral_response/fixture_spec.rb",
|
@@ -44,6 +46,7 @@ Gem::Specification.new do |s|
|
|
44
46
|
"spec/integration/custom_identifier_spec.rb",
|
45
47
|
"spec/integration/normal_flow_spec.rb",
|
46
48
|
"spec/integration/read_body_compatibility_spec.rb",
|
49
|
+
"spec/integration/sets_spec.rb",
|
47
50
|
"spec/integration/unique_fixtures_spec.rb",
|
48
51
|
"spec/integration/white_list_spec.rb",
|
49
52
|
"spec/spec.opts",
|
@@ -66,6 +69,7 @@ Gem::Specification.new do |s|
|
|
66
69
|
"spec/integration/custom_identifier_spec.rb",
|
67
70
|
"spec/integration/normal_flow_spec.rb",
|
68
71
|
"spec/integration/read_body_compatibility_spec.rb",
|
72
|
+
"spec/integration/sets_spec.rb",
|
69
73
|
"spec/integration/unique_fixtures_spec.rb",
|
70
74
|
"spec/integration/white_list_spec.rb",
|
71
75
|
"spec/spec_helper.rb",
|
data/lib/ephemeral_response.rb
CHANGED
@@ -7,9 +7,12 @@ require 'yaml'
|
|
7
7
|
require 'ephemeral_response/configuration'
|
8
8
|
require 'ephemeral_response/request'
|
9
9
|
require 'ephemeral_response/fixture'
|
10
|
+
require 'ephemeral_response/null_output'
|
10
11
|
|
11
12
|
module EphemeralResponse
|
12
|
-
VERSION = "0.
|
13
|
+
VERSION = "0.4.0".freeze
|
14
|
+
|
15
|
+
Error = Class.new(StandardError)
|
13
16
|
|
14
17
|
def self.activate
|
15
18
|
deactivate
|
@@ -17,6 +20,20 @@ module EphemeralResponse
|
|
17
20
|
Fixture.load_all
|
18
21
|
end
|
19
22
|
|
23
|
+
def self.configure
|
24
|
+
yield Configuration if block_given?
|
25
|
+
Configuration
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.fixture_set
|
29
|
+
Configuration.fixture_set
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.fixture_set=(name)
|
33
|
+
Configuration.fixture_set = name
|
34
|
+
Fixture.load_all
|
35
|
+
end
|
36
|
+
|
20
37
|
def self.deactivate
|
21
38
|
Net::HTTP.class_eval do
|
22
39
|
remove_method(:generate_uri) if method_defined?(:generate_uri)
|
@@ -34,8 +51,11 @@ module EphemeralResponse
|
|
34
51
|
Fixture.fixtures
|
35
52
|
end
|
36
53
|
|
37
|
-
|
38
|
-
|
39
|
-
|
54
|
+
# FIXME: Don't deactivate and reactivate, instead set a flag which ignores
|
55
|
+
# fixtures entirely.
|
56
|
+
def self.live
|
57
|
+
deactivate
|
58
|
+
yield
|
59
|
+
activate
|
40
60
|
end
|
41
61
|
end
|
@@ -2,12 +2,34 @@ module EphemeralResponse
|
|
2
2
|
module Configuration
|
3
3
|
extend self
|
4
4
|
|
5
|
+
attr_accessor :fixture_set
|
5
6
|
attr_writer :fixture_directory, :skip_expiration
|
6
7
|
|
8
|
+
def effective_directory
|
9
|
+
if fixture_set.nil? or fixture_set.to_s == 'default'
|
10
|
+
fixture_directory
|
11
|
+
else
|
12
|
+
File.join(fixture_directory, fixture_set.to_s)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
7
16
|
def fixture_directory
|
8
17
|
@fixture_directory || "spec/fixtures/ephemeral_response"
|
9
18
|
end
|
10
19
|
|
20
|
+
# Set an IO object to receive the debugging information.
|
21
|
+
def debug_output=(io)
|
22
|
+
if io.respond_to?(:puts)
|
23
|
+
@debug_output = io
|
24
|
+
else
|
25
|
+
raise Error, 'The debug_output object must respond to #puts'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def debug_output
|
30
|
+
@debug_output ||= NullOutput.new
|
31
|
+
end
|
32
|
+
|
11
33
|
def expiration=(expiration)
|
12
34
|
if expiration.is_a?(Proc)
|
13
35
|
expiration = instance_eval &expiration
|
@@ -28,11 +50,13 @@ module EphemeralResponse
|
|
28
50
|
end
|
29
51
|
|
30
52
|
def reset
|
53
|
+
@fixture_set = nil
|
31
54
|
@expiration = nil
|
32
55
|
@fixture_directory = nil
|
33
56
|
@white_list = nil
|
34
57
|
@skip_expiration = nil
|
35
58
|
@host_registry = nil
|
59
|
+
@debug_output = nil
|
36
60
|
end
|
37
61
|
|
38
62
|
def skip_expiration
|
@@ -17,14 +17,18 @@ module EphemeralResponse
|
|
17
17
|
|
18
18
|
def self.load_all
|
19
19
|
clear
|
20
|
-
if File.directory?(Configuration.
|
21
|
-
Dir.glob("#{Configuration.
|
20
|
+
if File.directory?(Configuration.effective_directory)
|
21
|
+
Dir.glob("#{Configuration.effective_directory}/*.yml", &method(:load_fixture))
|
22
22
|
end
|
23
23
|
fixtures
|
24
24
|
end
|
25
25
|
|
26
26
|
def self.load_fixture(file_name)
|
27
|
-
|
27
|
+
if fixture = YAML.load_file(file_name)
|
28
|
+
register fixture
|
29
|
+
else
|
30
|
+
EphemeralResponse::Configuration.debug_output.puts "EphemeralResponse couldn't load fixture: #{file_name}"
|
31
|
+
end
|
28
32
|
end
|
29
33
|
|
30
34
|
def self.find_or_initialize(uri, request, &block)
|
@@ -33,7 +37,7 @@ module EphemeralResponse
|
|
33
37
|
|
34
38
|
def self.register(fixture)
|
35
39
|
if fixture.expired?
|
36
|
-
FileUtils.
|
40
|
+
FileUtils.rm_f fixture.path
|
37
41
|
else
|
38
42
|
fixtures[fixture.identifier] = fixture
|
39
43
|
end
|
@@ -87,18 +91,19 @@ module EphemeralResponse
|
|
87
91
|
end
|
88
92
|
|
89
93
|
def path
|
90
|
-
File.join(Configuration.
|
94
|
+
File.join(Configuration.effective_directory, file_name)
|
91
95
|
end
|
92
96
|
|
93
97
|
def register
|
94
98
|
unless Configuration.white_list.include? uri.host
|
99
|
+
EphemeralResponse::Configuration.debug_output.puts "#{request.method} #{uri} saved as #{path}"
|
95
100
|
save
|
96
101
|
self.class.register self
|
97
102
|
end
|
98
103
|
end
|
99
104
|
|
100
105
|
def save
|
101
|
-
FileUtils.mkdir_p Configuration.
|
106
|
+
FileUtils.mkdir_p Configuration.effective_directory
|
102
107
|
File.open(path, 'w') do |f|
|
103
108
|
f.write to_yaml
|
104
109
|
end
|
@@ -10,7 +10,6 @@ module Net
|
|
10
10
|
private :connect
|
11
11
|
|
12
12
|
def do_start_with_ephemeral_response
|
13
|
-
D "EphemeralResponse: establishing connection to #{uri}"
|
14
13
|
connect_without_ephemeral_response
|
15
14
|
@started = true
|
16
15
|
end
|
@@ -23,9 +22,10 @@ module Net
|
|
23
22
|
|
24
23
|
def request(request, body = nil, &block)
|
25
24
|
generate_uri(request)
|
25
|
+
request.set_body_internal body
|
26
26
|
EphemeralResponse::Fixture.respond_to(uri, request, block) do
|
27
27
|
do_start_with_ephemeral_response
|
28
|
-
request_without_ephemeral_response(request,
|
28
|
+
request_without_ephemeral_response(request, nil, &block)
|
29
29
|
end
|
30
30
|
end
|
31
31
|
end
|
@@ -3,6 +3,43 @@ require 'spec_helper'
|
|
3
3
|
describe EphemeralResponse::Configuration do
|
4
4
|
subject { EphemeralResponse::Configuration }
|
5
5
|
|
6
|
+
describe ".debug_output=" do
|
7
|
+
it "raises an exception when the argument isn't an IO object" do
|
8
|
+
expect do
|
9
|
+
subject.debug_output = :foo
|
10
|
+
end.to raise_exception(EphemeralResponse::Error, /must respond to #puts/)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "stores the argument" do
|
14
|
+
subject.debug_output = $stderr
|
15
|
+
subject.instance_variable_get(:@debug_output).should == $stderr
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe ".debug_output" do
|
20
|
+
it "defaults to being off (NullOutput)" do
|
21
|
+
subject.debug_output.should be_instance_of(EphemeralResponse::NullOutput)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "returns the the result of the setter" do
|
25
|
+
subject.debug_output = $stdout
|
26
|
+
subject.debug_output.should == $stdout
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "#fixture_set" do
|
31
|
+
let(:name) { 'name' }
|
32
|
+
|
33
|
+
subject { EphemeralResponse::Configuration.fixture_set }
|
34
|
+
|
35
|
+
it { should be_nil }
|
36
|
+
|
37
|
+
it "can be overwritten" do
|
38
|
+
EphemeralResponse::Configuration.fixture_set = name
|
39
|
+
should == name
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
6
43
|
describe "#fixture_directory" do
|
7
44
|
it "has a default" do
|
8
45
|
subject.fixture_directory.should == "spec/fixtures/ephemeral_response"
|
@@ -14,6 +51,33 @@ describe EphemeralResponse::Configuration do
|
|
14
51
|
end
|
15
52
|
end
|
16
53
|
|
54
|
+
describe "#effective_directory" do
|
55
|
+
it "defaults to the fixture directory" do
|
56
|
+
subject.effective_directory.should == "spec/fixtures/ephemeral_response"
|
57
|
+
end
|
58
|
+
|
59
|
+
context "with a fixture_set" do
|
60
|
+
before do
|
61
|
+
subject.fixture_directory = "test/fixtures/ephemeral_response"
|
62
|
+
subject.fixture_set = :setname
|
63
|
+
end
|
64
|
+
|
65
|
+
it "adds the fixture_set to the fixture directory" do
|
66
|
+
subject.effective_directory.should == "test/fixtures/ephemeral_response/setname"
|
67
|
+
end
|
68
|
+
|
69
|
+
context "that has been reset to the default" do
|
70
|
+
before do
|
71
|
+
subject.fixture_set = :default
|
72
|
+
end
|
73
|
+
|
74
|
+
it "resets to the fixture directory" do
|
75
|
+
subject.effective_directory.should == "test/fixtures/ephemeral_response"
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
17
81
|
describe "#expiration" do
|
18
82
|
it "defaults to 86400" do
|
19
83
|
subject.expiration.should == 86400
|
@@ -82,6 +146,12 @@ describe EphemeralResponse::Configuration do
|
|
82
146
|
subject.reset
|
83
147
|
subject.host_registry.should be_empty
|
84
148
|
end
|
149
|
+
|
150
|
+
it "resets debug_output" do
|
151
|
+
subject.debug_output = $stderr
|
152
|
+
subject.reset
|
153
|
+
subject.debug_output.should be_instance_of(EphemeralResponse::NullOutput)
|
154
|
+
end
|
85
155
|
end
|
86
156
|
|
87
157
|
describe "#white_list" do
|
@@ -23,7 +23,7 @@ describe EphemeralResponse::Fixture do
|
|
23
23
|
EphemeralResponse::Fixture.load_all
|
24
24
|
end
|
25
25
|
|
26
|
-
context "fixture files exist" do
|
26
|
+
context "default set fixture files exist" do
|
27
27
|
before do
|
28
28
|
FileUtils.mkdir_p fixture_directory
|
29
29
|
Dir.chdir(fixture_directory) do
|
@@ -37,6 +37,24 @@ describe EphemeralResponse::Fixture do
|
|
37
37
|
EphemeralResponse::Fixture.load_all
|
38
38
|
end
|
39
39
|
end
|
40
|
+
|
41
|
+
context "fixture files exist for the set" do
|
42
|
+
let(:dir) { "#{fixture_directory}/name" }
|
43
|
+
|
44
|
+
before do
|
45
|
+
EphemeralResponse.fixture_set = :name
|
46
|
+
FileUtils.mkdir_p dir
|
47
|
+
Dir.chdir(dir) do
|
48
|
+
FileUtils.touch %w(1.yml 2.yml)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
it "calls #load_fixture for each fixture file" do
|
53
|
+
EphemeralResponse::Fixture.should_receive(:load_fixture).with("#{dir}/1.yml")
|
54
|
+
EphemeralResponse::Fixture.should_receive(:load_fixture).with("#{dir}/2.yml")
|
55
|
+
EphemeralResponse::Fixture.load_all
|
56
|
+
end
|
57
|
+
end
|
40
58
|
end
|
41
59
|
|
42
60
|
describe ".load_fixture" do
|
@@ -45,6 +63,11 @@ describe EphemeralResponse::Fixture do
|
|
45
63
|
EphemeralResponse::Fixture.load_fixture(fixture.path)
|
46
64
|
EphemeralResponse::Fixture.fixtures.should have_key(fixture.identifier)
|
47
65
|
end
|
66
|
+
|
67
|
+
it "handles empty yaml files" do
|
68
|
+
FileUtils.touch '3.yml'
|
69
|
+
EphemeralResponse::Fixture.load_fixture('3.yml').should be_nil
|
70
|
+
end
|
48
71
|
end
|
49
72
|
|
50
73
|
describe ".register" do
|
@@ -298,6 +321,11 @@ describe EphemeralResponse::Fixture do
|
|
298
321
|
fixture.register
|
299
322
|
EphemeralResponse::Fixture.fixtures.should have_key(fixture.identifier)
|
300
323
|
end
|
324
|
+
|
325
|
+
it "debugs saving the fixture" do
|
326
|
+
EphemeralResponse::Configuration.debug_output.should_receive(:puts).with("GET http://example.com/ saved as #{fixture.path}")
|
327
|
+
fixture.register
|
328
|
+
end
|
301
329
|
end
|
302
330
|
|
303
331
|
context "uri is white listed" do
|
@@ -18,8 +18,12 @@ describe "Read Body Compatibility" do
|
|
18
18
|
Net::HTTP::Get.new '/'
|
19
19
|
end
|
20
20
|
|
21
|
-
def
|
22
|
-
|
21
|
+
def new_post
|
22
|
+
Net::HTTP::Post.new('/')
|
23
|
+
end
|
24
|
+
|
25
|
+
def send_request(req, body=nil)
|
26
|
+
http.start {|h| h.request(req, body) }
|
23
27
|
end
|
24
28
|
|
25
29
|
context "open-uri" do
|
@@ -45,12 +49,16 @@ describe "Read Body Compatibility" do
|
|
45
49
|
|
46
50
|
context "Net::HTTP.post" do
|
47
51
|
it "generates a fixture, then uses the fixture" do
|
48
|
-
post =
|
52
|
+
post = new_post
|
53
|
+
post.body = 'foo=bar'
|
54
|
+
|
49
55
|
real_response = nil
|
50
56
|
http.post('/', 'foo=bar') {|s| real_response = s}
|
57
|
+
|
51
58
|
fixture = EphemeralResponse::Fixture.find(uri, post)
|
52
59
|
File.exists?(fixture.path).should be_true
|
53
|
-
|
60
|
+
|
61
|
+
fixture_response = send_request(new_post, 'foo=bar').body
|
54
62
|
real_response.should == fixture_response
|
55
63
|
end
|
56
64
|
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "Sets" do
|
4
|
+
let(:uri) { URI.parse('http://localhost:9876/') }
|
5
|
+
let(:http) { Net::HTTP.new uri.host, uri.port }
|
6
|
+
let(:get) { Net::HTTP::Get.new '/' }
|
7
|
+
|
8
|
+
before do
|
9
|
+
clear_fixtures
|
10
|
+
end
|
11
|
+
|
12
|
+
context "default set" do
|
13
|
+
it "saves one fixture to the default directory" do
|
14
|
+
EphemeralResponse::RackReflector.while_running do
|
15
|
+
http.start {|h| h.request(get) }
|
16
|
+
EphemeralResponse::Fixture.fixtures.should_not be_empty
|
17
|
+
Dir.glob("#{EphemeralResponse::Configuration.fixture_directory}/*").size.should == 1
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
it "restores the fixture" do
|
22
|
+
clear_fixtures
|
23
|
+
body = nil
|
24
|
+
EphemeralResponse::RackReflector.while_running do
|
25
|
+
body = http.start {|h| h.request(get) }
|
26
|
+
end
|
27
|
+
http.start {|h| h.request(get) }.should == body
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context "named set" do
|
32
|
+
let(:name) { 'name' }
|
33
|
+
|
34
|
+
describe "#fixture_set=" do
|
35
|
+
it "unloads the existing fixtures" do
|
36
|
+
EphemeralResponse::RackReflector.while_running do
|
37
|
+
http.start {|h| h.request(get) }
|
38
|
+
EphemeralResponse.fixture_set = name
|
39
|
+
EphemeralResponse::Fixture.fixtures.should be_empty
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
it "reloads any existing fixtures for the set" do
|
44
|
+
EphemeralResponse::RackReflector.while_running do
|
45
|
+
EphemeralResponse.fixture_set = name
|
46
|
+
http.start {|h| h.request(get) }
|
47
|
+
end
|
48
|
+
EphemeralResponse.fixture_set = :default
|
49
|
+
EphemeralResponse.fixture_set = name
|
50
|
+
EphemeralResponse::Fixture.find(uri, get).should be
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
it "saves one fixture to the set directory only" do
|
55
|
+
EphemeralResponse::RackReflector.while_running do
|
56
|
+
EphemeralResponse.fixture_set = name
|
57
|
+
http.start {|h| h.request(get) }
|
58
|
+
EphemeralResponse::Fixture.fixtures.should_not be_empty
|
59
|
+
File.exists?("#{EphemeralResponse::Configuration.fixture_directory}/#{name}").should be_true
|
60
|
+
Dir.glob("#{EphemeralResponse::Configuration.fixture_directory}/#{name}/*").size.should == 1
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
it "reads the fixture back from the set directory" do
|
65
|
+
body = nil
|
66
|
+
EphemeralResponse::RackReflector.while_running do
|
67
|
+
EphemeralResponse.fixture_set = name
|
68
|
+
body = http.start {|h| h.request(get) }
|
69
|
+
EphemeralResponse::Fixture.fixtures.should_not be_empty
|
70
|
+
end
|
71
|
+
http.start {|h| h.request(get) }.should == body
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -11,6 +11,7 @@ module UniqueRequests
|
|
11
11
|
post_with_body
|
12
12
|
post_with_data_and_query_string
|
13
13
|
post_with_data_and_query_string_and_basic_auth
|
14
|
+
post_with_manual_request_body
|
14
15
|
)
|
15
16
|
|
16
17
|
def uri
|
@@ -23,15 +24,20 @@ module UniqueRequests
|
|
23
24
|
|
24
25
|
def set_up_responses
|
25
26
|
VARIATIONS.each do |request|
|
26
|
-
|
27
|
+
response = send(request)
|
28
|
+
if responses.values.include?(response)
|
29
|
+
fail "Duplicate response for #{request.inspect}"
|
30
|
+
else
|
31
|
+
responses[request] = response
|
32
|
+
end
|
27
33
|
end
|
28
34
|
end
|
29
35
|
|
30
|
-
def perform(request)
|
36
|
+
def perform(request, body=nil)
|
31
37
|
http = Net::HTTP.new uri.host, uri.port
|
32
38
|
# http.set_debug_output $stdout
|
33
39
|
http.start do |http|
|
34
|
-
http.request(request)
|
40
|
+
http.request(request, body)
|
35
41
|
end
|
36
42
|
end
|
37
43
|
|
@@ -68,26 +74,30 @@ module UniqueRequests
|
|
68
74
|
|
69
75
|
def post_with_body
|
70
76
|
request = Net::HTTP::Post.new('/')
|
71
|
-
request.body = '
|
77
|
+
request.body = 'post_with=body'
|
72
78
|
perform request
|
73
79
|
end
|
74
80
|
|
75
81
|
def post_with_data_and_query_string
|
76
82
|
request = Net::HTTP::Post.new('/?foo=bar')
|
77
|
-
request.set_form_data '
|
83
|
+
request.set_form_data 'post_with' => 'data_and_query_string'
|
78
84
|
perform request
|
79
85
|
end
|
80
86
|
|
81
87
|
def post_with_data_and_query_string_and_basic_auth
|
82
88
|
request = Net::HTTP::Post.new('/?foo=bar')
|
83
89
|
request.basic_auth 'user', 'password'
|
84
|
-
request.set_form_data '
|
90
|
+
request.set_form_data 'post_with' => 'data_and_query_string_and_basic_auth'
|
85
91
|
perform request
|
86
92
|
end
|
87
93
|
|
94
|
+
def post_with_manual_request_body
|
95
|
+
perform Net::HTTP::Post.new('/'), 'post_with=manual_request_body'
|
96
|
+
end
|
97
|
+
|
88
98
|
end
|
89
99
|
|
90
|
-
describe "
|
100
|
+
describe "Repeated requests properly reloaded" do
|
91
101
|
include UniqueRequests
|
92
102
|
|
93
103
|
before :all do
|
@@ -98,10 +108,6 @@ describe "Unique fixtures generated for the following requests" do
|
|
98
108
|
end
|
99
109
|
end
|
100
110
|
|
101
|
-
after :all do
|
102
|
-
EphemeralResponse::RackReflector.stop
|
103
|
-
end
|
104
|
-
|
105
111
|
UniqueRequests::VARIATIONS.each do |request|
|
106
112
|
it "restores the correct response from the fixture" do
|
107
113
|
send(request).body.should == responses[request].body
|
@@ -150,4 +156,14 @@ describe "Unique fixtures generated for the following requests" do
|
|
150
156
|
http.request(get).body.should == EphemeralResponse::Fixture.find(http.uri, get).response.body
|
151
157
|
end
|
152
158
|
end
|
159
|
+
|
160
|
+
context "when changing the fixture set" do
|
161
|
+
it "attempts to access the server which is not available" do
|
162
|
+
EphemeralResponse.fixture_set = :server_down
|
163
|
+
expect do
|
164
|
+
simple_get
|
165
|
+
end.to raise_exception(Errno::ECONNREFUSED, /connection refused/i)
|
166
|
+
EphemeralResponse.fixture_set = :default
|
167
|
+
end
|
168
|
+
end
|
153
169
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -9,15 +9,21 @@ Dir.glob("spec/support/*.rb") {|f| require File.expand_path(f, '.')}
|
|
9
9
|
|
10
10
|
Spec::Runner.configure do |config|
|
11
11
|
config.include ClearFixtures
|
12
|
+
|
12
13
|
config.before(:suite) do
|
13
14
|
ClearFixtures.clear_fixtures
|
14
15
|
end
|
15
|
-
|
16
|
-
EphemeralResponse::Configuration.reset
|
17
|
-
EphemeralResponse.activate
|
18
|
-
end
|
16
|
+
|
19
17
|
config.after(:suite) do
|
20
18
|
EphemeralResponse.deactivate
|
21
19
|
ClearFixtures.clear_fixtures
|
22
20
|
end
|
21
|
+
|
22
|
+
config.before(:each) do
|
23
|
+
EphemeralResponse.activate
|
24
|
+
end
|
25
|
+
|
26
|
+
config.after(:each) do
|
27
|
+
EphemeralResponse::Configuration.reset
|
28
|
+
end
|
23
29
|
end
|
metadata
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ephemeral_response
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
+
hash: 15
|
4
5
|
prerelease: false
|
5
6
|
segments:
|
6
7
|
- 0
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 0.
|
8
|
+
- 4
|
9
|
+
- 0
|
10
|
+
version: 0.4.0
|
10
11
|
platform: ruby
|
11
12
|
authors:
|
12
13
|
- Sandro Turriate
|
@@ -15,7 +16,7 @@ autorequire:
|
|
15
16
|
bindir: bin
|
16
17
|
cert_chain: []
|
17
18
|
|
18
|
-
date:
|
19
|
+
date: 2011-01-18 00:00:00 -05:00
|
19
20
|
default_executable:
|
20
21
|
dependencies:
|
21
22
|
- !ruby/object:Gem::Dependency
|
@@ -26,6 +27,7 @@ dependencies:
|
|
26
27
|
requirements:
|
27
28
|
- - ">="
|
28
29
|
- !ruby/object:Gem::Version
|
30
|
+
hash: 7
|
29
31
|
segments:
|
30
32
|
- 1
|
31
33
|
- 4
|
@@ -41,6 +43,7 @@ dependencies:
|
|
41
43
|
requirements:
|
42
44
|
- - ">="
|
43
45
|
- !ruby/object:Gem::Version
|
46
|
+
hash: 13
|
44
47
|
segments:
|
45
48
|
- 1
|
46
49
|
- 2
|
@@ -56,6 +59,7 @@ dependencies:
|
|
56
59
|
requirements:
|
57
60
|
- - ">="
|
58
61
|
- !ruby/object:Gem::Version
|
62
|
+
hash: 11
|
59
63
|
segments:
|
60
64
|
- 0
|
61
65
|
- 5
|
@@ -71,6 +75,7 @@ dependencies:
|
|
71
75
|
requirements:
|
72
76
|
- - ">="
|
73
77
|
- !ruby/object:Gem::Version
|
78
|
+
hash: 21
|
74
79
|
segments:
|
75
80
|
- 0
|
76
81
|
- 2
|
@@ -86,6 +91,7 @@ dependencies:
|
|
86
91
|
requirements:
|
87
92
|
- - ">="
|
88
93
|
- !ruby/object:Gem::Version
|
94
|
+
hash: 23
|
89
95
|
segments:
|
90
96
|
- 1
|
91
97
|
- 0
|
@@ -104,6 +110,7 @@ extra_rdoc_files:
|
|
104
110
|
files:
|
105
111
|
- .document
|
106
112
|
- .gitignore
|
113
|
+
- .rvmrc
|
107
114
|
- Gemfile
|
108
115
|
- History.markdown
|
109
116
|
- MIT_LICENSE
|
@@ -119,6 +126,7 @@ files:
|
|
119
126
|
- lib/ephemeral_response/configuration.rb
|
120
127
|
- lib/ephemeral_response/fixture.rb
|
121
128
|
- lib/ephemeral_response/net_http.rb
|
129
|
+
- lib/ephemeral_response/null_output.rb
|
122
130
|
- lib/ephemeral_response/request.rb
|
123
131
|
- spec/ephemeral_response/configuration_spec.rb
|
124
132
|
- spec/ephemeral_response/fixture_spec.rb
|
@@ -127,6 +135,7 @@ files:
|
|
127
135
|
- spec/integration/custom_identifier_spec.rb
|
128
136
|
- spec/integration/normal_flow_spec.rb
|
129
137
|
- spec/integration/read_body_compatibility_spec.rb
|
138
|
+
- spec/integration/sets_spec.rb
|
130
139
|
- spec/integration/unique_fixtures_spec.rb
|
131
140
|
- spec/integration/white_list_spec.rb
|
132
141
|
- spec/spec.opts
|
@@ -149,6 +158,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
149
158
|
requirements:
|
150
159
|
- - ">="
|
151
160
|
- !ruby/object:Gem::Version
|
161
|
+
hash: 3
|
152
162
|
segments:
|
153
163
|
- 0
|
154
164
|
version: "0"
|
@@ -157,6 +167,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
157
167
|
requirements:
|
158
168
|
- - ">="
|
159
169
|
- !ruby/object:Gem::Version
|
170
|
+
hash: 3
|
160
171
|
segments:
|
161
172
|
- 0
|
162
173
|
version: "0"
|
@@ -175,6 +186,7 @@ test_files:
|
|
175
186
|
- spec/integration/custom_identifier_spec.rb
|
176
187
|
- spec/integration/normal_flow_spec.rb
|
177
188
|
- spec/integration/read_body_compatibility_spec.rb
|
189
|
+
- spec/integration/sets_spec.rb
|
178
190
|
- spec/integration/unique_fixtures_spec.rb
|
179
191
|
- spec/integration/white_list_spec.rb
|
180
192
|
- spec/spec_helper.rb
|