rspec-http_helpers 1.0.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 7791490cafb987e25bb187bd95cbbf4a0f26bf8bfcecffcb16ff233fdcf9c762
4
+ data.tar.gz: 1594bafdf748b52a2f0edec769b89a5910f616423926752f6d3ba1787e10de58
5
+ SHA512:
6
+ metadata.gz: 622779849070816187b96b46a5f66b5f301fe332bf2cdaec2564f11ae369c7944ab517361870f02672045ccbeb42224bda3883e471bd2e713cb28f98abd94809
7
+ data.tar.gz: 1680af36ee255974e618d15d1cfcaaa40ea83abd27bfe4c9e73a96211e60d710b10a73bfab3b494b609ac1aa7c3e144abf15c2eaf16857fce0792269bdeea50d
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'http_helpers/http_querystring_matcher'
4
+
5
+ module RSpec
6
+ # RSpec matchers for HTTP requests and responses
7
+ module HttpHelpers
8
+ # Expects a HTTP URI or URI fragment to match the provided
9
+ # querystring.
10
+ #
11
+ # expect('https://foo.com?abc=xyz').to match_http_querystring('abc=xyz')
12
+ #
13
+ # The actual and expected values can be formatted a number of ways:
14
+ #
15
+ # expect('abc=xyz').to match_http_querystring('abc=xyz')
16
+ # expect('?abc=xyz').to match_http_querystring('abc=xyz')
17
+ # expect(URI.parse('...')).to match_http_querystring('abc=xyz')
18
+ #
19
+ # @param [String<HTTP Query>] expected
20
+ # @raise [ArgumentError] Raises an ArgumentError if expected is
21
+ # not nil or a String.
22
+ def match_http_querystring(expected)
23
+ HttpQuerystringMatcher.new(expected)
24
+ end
25
+
26
+ class << self
27
+
28
+ # @api private
29
+ def normalize_querystring(query)
30
+ return '' if query.nil?
31
+
32
+ parts = query.split('&')
33
+ parts = parts.sort_by do |param|
34
+ name, actual_value = param.split('&')
35
+ value = actual_value.nil? ? '' : actual_value
36
+ [name, value, actual_value ? 1 : 0]
37
+ end
38
+ parts.join('&')
39
+ end
40
+
41
+ end
42
+ end
43
+ end
44
+
45
+ RSpec.configure do |config|
46
+ config.include RSpec::HttpHelpers
47
+ end
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'diff-lcs'
4
+ require 'diffy'
5
+ require 'stringio'
6
+ require 'uri'
7
+
8
+ module RSpec
9
+ module HttpHelpers
10
+ # @api private
11
+ class HttpQuerystringMatcher
12
+
13
+ def initialize(expected, colorize: true)
14
+ @expected = querystring_from(expected)
15
+ @diff_format = colorize ? :color : :text
16
+ rescue ArgumentError => error
17
+ raise "Invalid expected value: #{error.message}"
18
+ end
19
+
20
+ def matches?(actual)
21
+ @actual = querystring_from(actual)
22
+ @expected == @actual
23
+ rescue ArgumentError
24
+ got = actual.is_a?(String) ? actual : actual.class
25
+ @wrong_type_error_message = 'expected URI with querystring ' \
26
+ "matching #{@expected} got #{got}"
27
+ false
28
+ end
29
+
30
+ def failure_message
31
+ @wrong_type_error_message || diff_error_message
32
+ end
33
+
34
+ def failure_message_when_negated
35
+ "expected querystring not to match #{@expected}"
36
+ end
37
+
38
+ private
39
+
40
+ def uri_from(value)
41
+ case value
42
+ when nil then URI.parse('')
43
+ when /^http/ then URI.parse(value)
44
+ when /\?/ then URI.parse(value)
45
+ when String then URI.parse("?#{value}")
46
+ when URI::Generic then value
47
+ else
48
+ raise ArgumentError, "expected String<URI> or URI, got #{value.class}"
49
+ end
50
+ end
51
+
52
+ def querystring_from(value)
53
+ HttpHelpers.normalize_querystring(uri_from(value).query)
54
+ end
55
+
56
+ def diff_error_message
57
+ message = StringIO.new
58
+ message << "expected: #{@expected}\n\n"
59
+ message << "got: #{@actual}\n\n"
60
+ message << "Diff:\n#{diff}"
61
+ message.string
62
+ end
63
+
64
+ def diff
65
+ expected = @expected.split('&').join("\n") + "\n"
66
+ actual = @actual.split('&').join("\n") + "\n"
67
+ Diffy::Diff.new(expected, actual).to_s(@diff_format)
68
+ end
69
+
70
+ end
71
+ end
72
+ end
metadata ADDED
@@ -0,0 +1,205 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rspec-http_helpers
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - The Incognito Coder
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-11-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: diff-lcs
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: diffy
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '3.2'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3.2'
41
+ - !ruby/object:Gem::Dependency
42
+ name: coveralls
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.8'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.8'
55
+ - !ruby/object:Gem::Dependency
56
+ name: kramdown
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.16'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.16'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.11'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.11'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rake
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '12.3'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '12.3'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rspec
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '3.7'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '3.7'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rubocop
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "<"
116
+ - !ruby/object:Gem::Version
117
+ version: '0.60'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "<"
123
+ - !ruby/object:Gem::Version
124
+ version: '0.60'
125
+ - !ruby/object:Gem::Dependency
126
+ name: semver-string
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '1.0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '1.0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: yard
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '0.9'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '0.9'
153
+ - !ruby/object:Gem::Dependency
154
+ name: yard-sitemap
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '1.0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '1.0'
167
+ description:
168
+ email:
169
+ - theincognitocoder@gmail.com
170
+ executables: []
171
+ extensions: []
172
+ extra_rdoc_files: []
173
+ files:
174
+ - lib/rspec/http_helpers.rb
175
+ - lib/rspec/http_helpers/http_querystring_matcher.rb
176
+ homepage: https://github.com/theincognitocoder/rspec-http_helpers
177
+ licenses:
178
+ - MIT
179
+ metadata:
180
+ bug_tracker_uri: https://github.com/theincognitocoder/rspec-http_helpers/issues
181
+ changelog_uri: https://github.com/theincognitocoder/rspec-http_helpers/blob/master/CHANGELOG.md
182
+ documentation_uri: https://www.rubydoc.info/github/theincognitocoder/rspec-http_helpers/master
183
+ homepage_uri: https://github.com/theincognitocoder/rspec-http_helpers
184
+ source_code_uri: https://github.com/theincognitocoder/rspec-http_helpers
185
+ post_install_message:
186
+ rdoc_options: []
187
+ require_paths:
188
+ - lib
189
+ required_ruby_version: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - ">="
192
+ - !ruby/object:Gem::Version
193
+ version: '0'
194
+ required_rubygems_version: !ruby/object:Gem::Requirement
195
+ requirements:
196
+ - - ">="
197
+ - !ruby/object:Gem::Version
198
+ version: '0'
199
+ requirements: []
200
+ rubyforge_project:
201
+ rubygems_version: 2.7.8
202
+ signing_key:
203
+ specification_version: 4
204
+ summary: RSpec helpers for matching HTTP requests and responses.
205
+ test_files: []