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 +7 -0
- data/lib/rspec/http_helpers.rb +47 -0
- data/lib/rspec/http_helpers/http_querystring_matcher.rb +72 -0
- metadata +205 -0
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: []
|