http_stub 0.22.4 → 0.23.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.
Files changed (103) hide show
  1. checksums.yaml +4 -4
  2. data/lib/http_stub.rb +15 -5
  3. data/lib/http_stub/configurer/dsl/request_attribute_referencer.rb +19 -0
  4. data/lib/http_stub/configurer/dsl/request_referencer.rb +24 -0
  5. data/lib/http_stub/configurer/dsl/scenario_activator.rb +2 -2
  6. data/lib/http_stub/configurer/dsl/scenario_builder.rb +2 -2
  7. data/lib/http_stub/configurer/dsl/server.rb +4 -4
  8. data/lib/http_stub/configurer/dsl/stub_builder.rb +5 -3
  9. data/lib/http_stub/configurer/request/controllable_value.rb +1 -3
  10. data/lib/http_stub/configurer/request/http/factory.rb +2 -2
  11. data/lib/http_stub/configurer/request/omittable.rb +2 -4
  12. data/lib/http_stub/configurer/request/regexpable.rb +3 -8
  13. data/lib/http_stub/configurer/server/command_processor.rb +5 -7
  14. data/lib/http_stub/configurer/server/facade.rb +2 -4
  15. data/lib/http_stub/extensions/core/hash.rb +4 -11
  16. data/lib/http_stub/extensions/core/hash/formatted.rb +23 -0
  17. data/lib/http_stub/extensions/core/hash/indifferent_and_insensitive_access.rb +24 -0
  18. data/lib/http_stub/extensions/core/hash/with_indifferent_and_insensitive_access.rb +18 -0
  19. data/lib/http_stub/extensions/rack/handler.rb +1 -1
  20. data/lib/http_stub/rake/task_generators.rb +1 -1
  21. data/lib/http_stub/server/application.rb +10 -11
  22. data/lib/http_stub/server/application_helpers.rb +3 -5
  23. data/lib/http_stub/server/daemon.rb +5 -6
  24. data/lib/http_stub/server/request.rb +3 -10
  25. data/lib/http_stub/server/request/headers.rb +25 -0
  26. data/lib/http_stub/server/request/parameters.rb +21 -0
  27. data/lib/http_stub/server/request/request.rb +21 -0
  28. data/lib/http_stub/server/scenario/links.rb +1 -1
  29. data/lib/http_stub/server/stub/controller.rb +1 -1
  30. data/lib/http_stub/server/stub/empty.rb +4 -0
  31. data/lib/http_stub/server/stub/match/hash_matcher.rb +19 -0
  32. data/lib/http_stub/server/stub/match/omitted_value_matcher.rb +1 -3
  33. data/lib/http_stub/server/stub/match/rule/body.rb +2 -4
  34. data/lib/http_stub/server/stub/match/rule/headers.rb +5 -11
  35. data/lib/http_stub/server/stub/match/rule/json_body.rb +3 -5
  36. data/lib/http_stub/server/stub/match/rule/method.rb +1 -1
  37. data/lib/http_stub/server/stub/match/rule/parameters.rb +4 -7
  38. data/lib/http_stub/server/stub/match/rule/simple_body.rb +3 -3
  39. data/lib/http_stub/server/stub/match/rule/truthy.rb +27 -0
  40. data/lib/http_stub/server/stub/match/rule/uri.rb +3 -3
  41. data/lib/http_stub/server/stub/match/string_value_matcher.rb +4 -13
  42. data/lib/http_stub/server/stub/response.rb +5 -2
  43. data/lib/http_stub/server/stub/response/attribute/body.rb +32 -0
  44. data/lib/http_stub/server/stub/response/attribute/headers.rb +26 -0
  45. data/lib/http_stub/server/stub/response/attribute/interpolator.rb +26 -0
  46. data/lib/http_stub/server/stub/response/attribute/interpolator/headers.rb +27 -0
  47. data/lib/http_stub/server/stub/response/attribute/interpolator/parameters.rb +27 -0
  48. data/lib/http_stub/server/stub/response/base.rb +5 -16
  49. data/lib/http_stub/server/stub/response/file.rb +6 -2
  50. data/lib/http_stub/server/stub/response/text.rb +12 -0
  51. data/lib/http_stub/server/stub/stub.rb +4 -0
  52. data/lib/http_stub/version.rb +1 -1
  53. data/spec/acceptance/request_reference_spec.rb +44 -0
  54. data/spec/lib/http_stub/configurer/dsl/request_attribute_referencer_spec.rb +37 -0
  55. data/spec/lib/http_stub/configurer/dsl/request_referencer_spec.rb +37 -0
  56. data/spec/lib/http_stub/configurer/dsl/scenario_activator_spec.rb +14 -14
  57. data/spec/lib/http_stub/configurer/dsl/server_spec.rb +2 -6
  58. data/spec/lib/http_stub/configurer/dsl/stub_builder_spec.rb +34 -8
  59. data/spec/lib/http_stub/{server/formatted_hash_spec.rb → extensions/core/hash/formatted_spec.rb} +4 -6
  60. data/spec/lib/http_stub/{hash_with_indifferent_and_insensitive_access_spec.rb → extensions/core/hash/indifferent_and_insensitive_access_spec.rb} +8 -4
  61. data/spec/lib/http_stub/extensions/core/hash/with_indifferent_and_insensitive_access_spec.rb +41 -0
  62. data/spec/lib/http_stub/extensions/core/hash_spec.rb +11 -129
  63. data/spec/lib/http_stub/server/application_spec.rb +1 -1
  64. data/spec/lib/http_stub/server/payload_file_consolidator_spec.rb +1 -1
  65. data/spec/lib/http_stub/server/request/headers_spec.rb +89 -0
  66. data/spec/lib/http_stub/server/request/parameters_spec.rb +60 -0
  67. data/spec/lib/http_stub/server/request/request_spec.rb +84 -0
  68. data/spec/lib/http_stub/server/request_spec.rb +9 -98
  69. data/spec/lib/http_stub/server/response_spec.rb +2 -6
  70. data/spec/lib/http_stub/server/scenario/controller_spec.rb +1 -1
  71. data/spec/lib/http_stub/server/scenario/parser_spec.rb +3 -1
  72. data/spec/lib/http_stub/server/stub/controller_spec.rb +11 -4
  73. data/spec/lib/http_stub/server/stub/empty_spec.rb +10 -0
  74. data/spec/lib/http_stub/server/stub/match/hash_matcher_spec.rb +122 -0
  75. data/spec/lib/http_stub/server/stub/match/rule/body_spec.rb +4 -4
  76. data/spec/lib/http_stub/server/stub/match/rule/headers_spec.rb +54 -45
  77. data/spec/lib/http_stub/server/stub/match/rule/json_body_spec.rb +5 -5
  78. data/spec/lib/http_stub/server/stub/match/rule/method_spec.rb +19 -17
  79. data/spec/lib/http_stub/server/stub/match/rule/parameters_spec.rb +26 -33
  80. data/spec/lib/http_stub/server/stub/match/rule/simple_body_spec.rb +16 -25
  81. data/spec/lib/http_stub/server/stub/match/{truthy_matcher_spec.rb → rule/truthy_spec.rb} +3 -5
  82. data/spec/lib/http_stub/server/stub/match/rule/uri_spec.rb +16 -25
  83. data/spec/lib/http_stub/server/stub/match/string_value_matcher_spec.rb +2 -12
  84. data/spec/lib/http_stub/server/stub/parser_spec.rb +5 -3
  85. data/spec/lib/http_stub/server/stub/response/attribute/body_spec.rb +98 -0
  86. data/spec/lib/http_stub/server/stub/response/attribute/headers_spec.rb +57 -0
  87. data/spec/lib/http_stub/server/stub/response/attribute/interpolator/headers_spec.rb +53 -0
  88. data/spec/lib/http_stub/server/stub/response/attribute/interpolator/parameters_spec.rb +53 -0
  89. data/spec/lib/http_stub/server/stub/response/attribute/interpolator_spec.rb +41 -0
  90. data/spec/lib/http_stub/server/stub/response/base_spec.rb +6 -53
  91. data/spec/lib/http_stub/server/stub/response/file_spec.rb +48 -7
  92. data/spec/lib/http_stub/server/stub/response/text_spec.rb +66 -1
  93. data/spec/lib/http_stub/server/stub/stub_spec.rb +25 -4
  94. data/spec/spec_helper.rb +1 -0
  95. data/spec/support/http_stub/server/request_fixture.rb +1 -1
  96. metadata +86 -26
  97. data/lib/http_stub/hash_with_indifferent_and_insensitive_access.rb +0 -18
  98. data/lib/http_stub/server/formatted_hash.rb +0 -18
  99. data/lib/http_stub/server/header_parser.rb +0 -17
  100. data/lib/http_stub/server/stub/match/hash_with_string_value_matchers.rb +0 -26
  101. data/lib/http_stub/server/stub/match/truthy_matcher.rb +0 -25
  102. data/spec/lib/http_stub/server/header_parser_spec.rb +0 -51
  103. data/spec/lib/http_stub/server/stub/match/hash_with_string_value_matchers_spec.rb +0 -166
@@ -1,111 +1,22 @@
1
1
  describe HttpStub::Server::Request do
2
2
 
3
- let(:rack_path_info) { "/rack/path/info" }
4
- let(:rack_request_method) { "some method" }
5
- let(:rack_parameters) { { "parameter_key" => "parameter value" } }
6
- let(:rack_body) { "some request body" }
7
- let(:rack_request) do
8
- instance_double(Rack::Request, path_info: rack_path_info,
9
- request_method: rack_request_method,
10
- params: rack_parameters,
11
- body: StringIO.new(rack_body))
12
- end
13
-
14
- let(:server_request) { described_class.new(rack_request) }
15
-
16
- before(:example) do
17
- allow(HttpStub::Server::HeaderParser).to receive(:parse).and_return({})
18
- allow(HttpStub::Server::FormattedHash).to receive(:new)
19
- end
20
-
21
- describe "#uri" do
22
-
23
- it "is the rack request path information" do
24
- expect(server_request.uri).to eql(rack_path_info)
25
- end
26
-
27
- end
28
-
29
- describe "#method" do
30
-
31
- subject { server_request.method }
32
-
33
- it "is the rack request method" do
34
- expect(subject).to eql(rack_request_method)
35
- end
36
-
37
- end
38
-
39
- describe "#headers" do
40
-
41
- let(:parsed_headers) { { "parsed_header_key" => "parsed header value" } }
42
- let(:formatted_hash) { instance_double(HttpStub::Server::FormattedHash) }
43
-
44
- subject { server_request.headers }
45
-
46
- before(:example) do
47
- allow(HttpStub::Server::HeaderParser).to receive(:parse).and_return(parsed_headers)
48
- allow(HttpStub::Server::FormattedHash).to receive(:new).with(parsed_headers, anything).and_return(formatted_hash)
49
- end
50
-
51
- it "parses the headers from the rack request via the header parser" do
52
- expect(HttpStub::Server::HeaderParser).to receive(:parse).with(rack_request)
53
-
54
- subject
55
- end
3
+ let(:rack_request) { instance_double(Rack::Request) }
56
4
 
57
- it "creates a formatted hash containing the parsed headers" do
58
- expect(HttpStub::Server::FormattedHash).to receive(:new).with(parsed_headers, anything)
5
+ describe "::create" do
59
6
 
60
- subject
61
- end
62
-
63
- it "creates a formatted hash formatted by a ':' request value delimiter" do
64
- expect(HttpStub::Server::FormattedHash).to receive(:new).with(anything, ":")
65
-
66
- subject
67
- end
68
-
69
- it "is the formattted hash" do
70
- expect(subject).to eql(formatted_hash)
71
- end
72
-
73
- end
74
-
75
- describe "#parameters" do
76
-
77
- let(:formatted_hash) { instance_double(HttpStub::Server::FormattedHash) }
7
+ subject { described_class.create(rack_request) }
78
8
 
79
- subject { server_request.parameters }
80
-
81
- before(:example) do
82
- allow(HttpStub::Server::FormattedHash).to receive(:new).with(rack_parameters, anything).and_return(formatted_hash)
83
- end
84
-
85
- it "creates a formatted hash containing the rack request parameters" do
86
- expect(HttpStub::Server::FormattedHash).to receive(:new).with(rack_parameters, anything)
87
-
88
- subject
89
- end
90
-
91
- it "creates a formatted hash with a '=' request value delimiter" do
92
- expect(HttpStub::Server::FormattedHash).to receive(:new).with(anything, "=")
9
+ it "creates a request for the rack request" do
10
+ expect(HttpStub::Server::Request::Request).to receive(:new).with(rack_request)
93
11
 
94
12
  subject
95
13
  end
96
14
 
97
- it "is the formatted hash" do
98
- expect(subject).to eql(formatted_hash)
99
- end
100
-
101
- end
102
-
103
- describe "#body" do
104
-
105
- subject { server_request.body }
15
+ it "returns the created request" do
16
+ http_stub_request = instance_double(HttpStub::Server::Request::Request)
17
+ allow(HttpStub::Server::Request::Request).to receive(:new).and_return(http_stub_request)
106
18
 
107
- it "is the read rack request body" do
108
- expect(subject).to eql(rack_body)
19
+ expect(subject).to eql(http_stub_request)
109
20
  end
110
21
 
111
22
  end
@@ -14,7 +14,7 @@ describe HttpStub::Server::Response do
14
14
 
15
15
  describe "::success" do
16
16
 
17
- subject { HttpStub::Server::Response::success }
17
+ subject { described_class.success }
18
18
 
19
19
  it_behaves_like "a success response"
20
20
 
@@ -63,11 +63,7 @@ describe HttpStub::Server::Response do
63
63
  end
64
64
 
65
65
  it "has no body" do
66
- expect(subject.body).to be(nil)
67
- end
68
-
69
- it "is empty" do
70
- expect(subject).to be_empty
66
+ expect(subject.body.provided?).to be(false)
71
67
  end
72
68
 
73
69
  end
@@ -1,7 +1,7 @@
1
1
  describe HttpStub::Server::Scenario::Controller do
2
2
 
3
3
  let(:request_uri) { "/some/request/path" }
4
- let(:request) { instance_double(HttpStub::Server::Request, uri: request_uri) }
4
+ let(:request) { instance_double(HttpStub::Server::Request::Request, uri: request_uri) }
5
5
  let(:logger) { instance_double(Logger) }
6
6
  let(:payload) { HttpStub::ScenarioFixture.new.server_payload }
7
7
  let(:stubs) { (1..3).map { instance_double(HttpStub::Server::Stub::Stub) } }
@@ -6,7 +6,9 @@ describe HttpStub::Server::Scenario::Parser do
6
6
 
7
7
  let(:parameters) { {} }
8
8
  let(:body_hash) { {} }
9
- let(:request) { instance_double(HttpStub::Server::Request, parameters: parameters, body: body_hash.to_json) }
9
+ let(:request) do
10
+ instance_double(HttpStub::Server::Request::Request, parameters: parameters, body: body_hash.to_json)
11
+ end
10
12
 
11
13
  subject { parser.parse(request) }
12
14
 
@@ -1,6 +1,6 @@
1
1
  describe HttpStub::Server::Stub::Controller do
2
2
 
3
- let(:request) { instance_double(HttpStub::Server::Request) }
3
+ let(:request) { instance_double(HttpStub::Server::Request::Request) }
4
4
  let(:logger) { instance_double(Logger) }
5
5
  let(:payload) { HttpStub::StubFixture.new.server_payload }
6
6
  let(:response) { instance_double(HttpStub::Server::Stub::Response::Base) }
@@ -62,10 +62,17 @@ describe HttpStub::Server::Stub::Controller do
62
62
 
63
63
  let(:matched_stub) { the_stub }
64
64
 
65
- it "returns the stubs response" do
66
- expect(the_stub).to receive(:response).and_return(response)
65
+ it "calculates the stubs response based on the request" do
66
+ expect(the_stub).to receive(:response_for).with(request)
67
67
 
68
- expect(subject).to eql(response)
68
+ subject
69
+ end
70
+
71
+ it "returns the calculated response" do
72
+ calculated_response = instance_double(HttpStub::Server::Stub::Response::Base)
73
+ allow(the_stub).to receive(:response_for).and_return(calculated_response)
74
+
75
+ expect(subject).to eql(calculated_response)
69
76
  end
70
77
 
71
78
  end
@@ -53,6 +53,16 @@ describe HttpStub::Server::Stub::Empty do
53
53
 
54
54
  end
55
55
 
56
+ describe "#response_for" do
57
+
58
+ let(:request) { instance_double(HttpStub::Server::Request) }
59
+
60
+ it "returns unchanged empty stub" do
61
+ expect(empty_stub.response_for(request)).to eql(empty_stub)
62
+ end
63
+
64
+ end
65
+
56
66
  describe "#to_s" do
57
67
 
58
68
  it "returns an empty string" do
@@ -0,0 +1,122 @@
1
+ describe HttpStub::Server::Stub::Match::HashMatcher do
2
+
3
+ let(:stub_hash) do
4
+ (1..3).each_with_object({}) { |i, result| result["key#{i}"] = "stub value #{i}" }
5
+ end
6
+
7
+ let(:string_value_matcher) { HttpStub::Server::Stub::Match::StringValueMatcher }
8
+
9
+ describe "::match?" do
10
+
11
+ let(:actual_hash) { {} }
12
+
13
+ subject { described_class.match?(stub_hash, actual_hash) }
14
+
15
+ context "when the stub hash contains multiple entries" do
16
+
17
+ it "returns the result of evaluating a match for each stub value" do
18
+ stub_hash.values.each do |stub_value|
19
+ allow(string_value_matcher).to receive(:match?).with(stub_value, anything).and_return(true)
20
+ end
21
+
22
+ expect(subject).to be(true)
23
+ end
24
+
25
+ context "and the actual hash has the same number of entries" do
26
+
27
+ context "and the keys match" do
28
+
29
+ let(:actual_hash) do
30
+ (1..3).each_with_object({}) { |i, result| result["key#{i}"] = "actual value #{i}" }
31
+ end
32
+
33
+ context "and the values match" do
34
+
35
+ before(:example) { allow(string_value_matcher).to receive(:match?).and_return(true) }
36
+
37
+ it "returns true" do
38
+ expect(subject).to be(true)
39
+ end
40
+
41
+ end
42
+
43
+ context "and a value does not match" do
44
+
45
+ before(:example) do
46
+ allow(string_value_matcher).to receive(:match?).and_return(true)
47
+ allow(string_value_matcher).to receive(:match?).with("stub value 2", "actual value 2").and_return(false)
48
+ end
49
+
50
+ it "returns false" do
51
+ expect(subject).to be(false)
52
+ end
53
+
54
+ end
55
+
56
+ end
57
+
58
+ context "and a key does not match" do
59
+
60
+ let(:actual_hash) do
61
+ { "key1" => "actual value 1", "differentkey2" => "different value 2", "key3" => "actual value 3" }
62
+ end
63
+
64
+ before(:example) { allow(string_value_matcher).to receive(:match?).and_return(true) }
65
+
66
+ it "determines if the corresponding value matches nil" do
67
+ expect(string_value_matcher).to receive(:match?).with("stub value 2", nil)
68
+
69
+ subject
70
+ end
71
+
72
+ end
73
+
74
+ end
75
+
76
+ context "and the actual hash contains more entries" do
77
+
78
+ let(:actual_hash) do
79
+ (1..5).each_with_object({}) { |i, result| result["key#{i}"] = "actual value #{i}" }
80
+ end
81
+
82
+ it "only evaluates a match for each stub value" do
83
+ stub_hash.values.each do |stub_value|
84
+ allow(string_value_matcher).to receive(:match?).with(stub_value, anything).and_return(true)
85
+ end
86
+
87
+ expect(subject).to be(true)
88
+ end
89
+
90
+ end
91
+
92
+ end
93
+
94
+ context "when the stubbed hash is empty" do
95
+
96
+ let(:stub_hash) { {} }
97
+
98
+ context "and the actual hash is not empty" do
99
+
100
+ let(:actual_hash) { { "key" => "value" } }
101
+
102
+ it "returns true" do
103
+ expect(subject).to be(true)
104
+ end
105
+
106
+ end
107
+
108
+ context "and the provided hash is empty" do
109
+
110
+ let(:actual_hash) { {} }
111
+
112
+ it "returns true" do
113
+ expect(subject).to be(true)
114
+ end
115
+
116
+ end
117
+
118
+ end
119
+
120
+ end
121
+
122
+ end
@@ -99,8 +99,8 @@ describe HttpStub::Server::Stub::Match::Rule::Body do
99
99
 
100
100
  let(:stubbed_body) { "" }
101
101
 
102
- it "returns a truthy request matcher" do
103
- expect(subject).to eql(HttpStub::Server::Stub::Match::TruthyMatcher)
102
+ it "returns a truthy match rule" do
103
+ expect(subject).to eql(HttpStub::Server::Stub::Match::Rule::Truthy)
104
104
  end
105
105
 
106
106
  end
@@ -109,8 +109,8 @@ describe HttpStub::Server::Stub::Match::Rule::Body do
109
109
 
110
110
  let(:stubbed_body) { nil }
111
111
 
112
- it "returns a truthy request matcher" do
113
- expect(subject).to eql(HttpStub::Server::Stub::Match::TruthyMatcher)
112
+ it "returns a truthy match rule" do
113
+ expect(subject).to eql(HttpStub::Server::Stub::Match::Rule::Truthy)
114
114
  end
115
115
 
116
116
  end
@@ -1,64 +1,53 @@
1
1
  describe HttpStub::Server::Stub::Match::Rule::Headers do
2
2
 
3
- let(:request) { instance_double(HttpStub::Server::Request) }
3
+ let(:stub_headers) { { "stub_key" => "value" } }
4
4
 
5
- let(:stubbed_headers) { { "stub_key" => "value" } }
5
+ let(:headers) { described_class.new(stub_headers) }
6
6
 
7
- let(:request_headers) { described_class.new(stubbed_headers) }
7
+ it "is a hash with indifferent and insensitive access" do
8
+ expect(headers).to be_a(HttpStub::Extensions::Core::Hash::IndifferentAndInsensitiveAccess)
9
+ end
8
10
 
9
- describe "when stubbed headers are provided" do
11
+ context "when the stub header names contain hypens" do
10
12
 
11
- it "creates a regexpable representation of the stubbed headers whose keys are downcased and underscored" do
12
- downcased_and_underscored_hash = { "another_stub_key" => "value" }
13
- expect(stubbed_headers).to receive(:downcase_and_underscore_keys).and_return(downcased_and_underscored_hash)
14
- expect(HttpStub::Server::Stub::Match::HashWithStringValueMatchers).to(
15
- receive(:new).with(downcased_and_underscored_hash)
16
- )
13
+ let(:stub_headers) { (1..3).each_with_object({}) { |i, result| result["stub-key-#{i}"] = "value-#{i}" } }
17
14
 
18
- request_headers
15
+ it "underscores the names to accommodate for Rack Header manipulation" do
16
+ expect(headers.keys).to eql(stub_headers.keys.map(&:underscore))
19
17
  end
20
18
 
21
- end
19
+ it "leaves the values unchanged" do
20
+ expect(headers.values).to eql(stub_headers.values)
21
+ end
22
22
 
23
- describe "when the stubbed headers are nil" do
23
+ end
24
24
 
25
- let(:stubbed_headers) { nil }
25
+ context "when no headers are provided" do
26
26
 
27
- it "creates a regexpable representation of an empty hash" do
28
- expect(HttpStub::Server::Stub::Match::HashWithStringValueMatchers).to receive(:new).with({})
27
+ let(:stub_headers) { nil }
29
28
 
30
- request_headers
29
+ it "is empty" do
30
+ expect(headers.empty?).to be(true)
31
31
  end
32
32
 
33
33
  end
34
34
 
35
35
  describe "#matches?" do
36
36
 
37
- let(:request_header_hash) { { "header_key" => "header value" } }
38
- let(:regexpable_stubbed_headers) do
39
- double(HttpStub::Server::Stub::Match::HashWithStringValueMatchers).as_null_object
40
- end
41
- let(:logger) { double(Logger) }
37
+ let(:request_headers) { instance_double(HttpStub::Server::Request::Headers) }
38
+ let(:request) { instance_double(HttpStub::Server::Request::Request, headers: request_headers) }
39
+ let(:logger) { double(Logger) }
42
40
 
43
- subject { request_headers.matches?(request, logger) }
41
+ subject { headers.matches?(request, logger) }
44
42
 
45
- before(:example) do
46
- allow(request).to receive(:headers).and_return(request_header_hash)
47
- allow(HttpStub::Server::Stub::Match::HashWithStringValueMatchers).to(
48
- receive(:new).and_return(regexpable_stubbed_headers)
49
- )
50
- end
51
-
52
- it "downcases and underscore the keys in the request header hash" do
53
- expect(request_header_hash).to receive(:downcase_and_underscore_keys)
43
+ it "determines if the stub header and request header hashes match" do
44
+ expect(HttpStub::Server::Stub::Match::HashMatcher).to receive(:match?).with(headers, request_headers)
54
45
 
55
46
  subject
56
47
  end
57
48
 
58
- it "delegates to the regexpable representation of the stubbed headers to determine a match" do
59
- downcased_and_underscored_hash = { "another_request_key" => "value" }
60
- allow(request_header_hash).to receive(:downcase_and_underscore_keys).and_return(downcased_and_underscored_hash)
61
- expect(regexpable_stubbed_headers).to receive(:matches?).with(downcased_and_underscored_hash).and_return(true)
49
+ it "returns the result of the match" do
50
+ allow(HttpStub::Server::Stub::Match::HashMatcher).to receive(:match?).and_return(true)
62
51
 
63
52
  expect(subject).to eql(true)
64
53
  end
@@ -67,22 +56,42 @@ describe HttpStub::Server::Stub::Match::Rule::Headers do
67
56
 
68
57
  describe "#to_s" do
69
58
 
70
- let(:readable_hash) { instance_double(HttpStub::Server::FormattedHash, to_s: "readable header hash string") }
59
+ subject { headers.to_s }
60
+
61
+ describe "when multiple headers are provided" do
62
+
63
+ let(:stub_headers) { (1..3).each_with_object({}) { |i, result| result["key#{i}"] = "value#{i}" } }
71
64
 
72
- subject { request_headers.to_s }
65
+ it "returns a string with each header name and value separated by ':'" do
66
+ result = subject
67
+
68
+ stub_headers.each { |name, value| expect(result).to match(/#{name}:#{value}/) }
69
+ end
70
+
71
+ it "separates each header with comma for readability" do
72
+ expect(subject).to match(/key\d.value\d, key\d.value\d, key\d.value\d/)
73
+ end
73
74
 
74
- before(:example) do
75
- allow(HttpStub::Server::FormattedHash).to receive(:new).with(stubbed_headers, anything).and_return(readable_hash)
76
75
  end
77
76
 
78
- it "returns the string representation of the readable header hash" do
79
- expect(subject).to eql("readable header hash string")
77
+ describe "when empty headers are provided" do
78
+
79
+ let(:stub_headers) { {} }
80
+
81
+ it "returns an empty string" do
82
+ expect(subject).to eql("")
83
+ end
84
+
80
85
  end
81
86
 
82
- it "formats the headers with a ':' key value delimiter" do
83
- expect(HttpStub::Server::FormattedHash).to receive(:new).with(stubbed_headers, ":")
87
+ describe "when nil headers are provided" do
88
+
89
+ let(:stub_headers) { nil }
90
+
91
+ it "returns an empty string" do
92
+ expect(subject).to eql("")
93
+ end
84
94
 
85
- subject
86
95
  end
87
96
 
88
97
  end