http_stub 0.22.4 → 0.23.0

Sign up to get free protection for your applications and to get access to all the features.
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