rivulet-rspec 0.1.3

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: 0ef9399fd0a91d1a3a5719ec19a9534148cba3679866a862a2cad65799b3101c
4
+ data.tar.gz: 93ab13307b0b40118fd3b3709b1fb9bd1d317b4f1aa39a6f62abc5ea5065eb97
5
+ SHA512:
6
+ metadata.gz: cad3519811e5da6fb3c1d80fc16b4b3101665653a821529cf9d263803036fc88359271d7d82ecfad92a3b5303c0ffa4ad753996e4f80ef3f5cde03cd88ce04da
7
+ data.tar.gz: fa8902655bb387b704906bbe7aa8dee9954eb04d22517d143f8c2c8a9f05e030ede1881e85e640941429600d19b1532891aee29d57a740579630504168bb1f02
@@ -0,0 +1,92 @@
1
+ require 'oj'
2
+ require 'rack'
3
+ require 'rack/multipart'
4
+
5
+ module Rivulet
6
+ module RSpec
7
+ module Helpers
8
+ def get(url, params: {}, headers: {})
9
+ env = Rack::MockRequest.env_for(
10
+ url,
11
+ method: 'GET',
12
+ params: params,
13
+ **env_headers(headers)
14
+ )
15
+
16
+ @response = Rack::MockResponse.new(*Rivulet.app.call(env))
17
+ end
18
+
19
+ %i[post put patch delete].each do |method_name|
20
+ define_method(method_name) do |url, params: {}, headers: {}, content_type: 'application/json'|
21
+ opts = {
22
+ method: method_name,
23
+ **env_headers(headers),
24
+ **build_payload(params, content_type)
25
+ }
26
+
27
+ env = Rack::MockRequest.env_for(url, opts)
28
+
29
+ @response = Rack::MockResponse.new(*Rivulet.app.call(env))
30
+ end
31
+ end
32
+
33
+ def response
34
+ @response
35
+ end
36
+
37
+ def json_response
38
+ payload = Oj.strict_load(@response.body)
39
+
40
+ unless payload.is_a?(Hash)
41
+ raise ArgumentError, "expected a JSON object in the response body, got #{payload.class}"
42
+ end
43
+
44
+ payload.deep_symbolize_keys
45
+ end
46
+
47
+ private
48
+
49
+ def env_headers(headers)
50
+ headers.to_h do |key, value|
51
+ ["HTTP_#{key.to_s.upcase.tr('-', '_')}", value]
52
+ end
53
+ end
54
+
55
+ def build_payload(params, content_type)
56
+ case content_type
57
+ when 'application/x-www-form-urlencoded'
58
+ { params: params }
59
+ when 'multipart/form-data'
60
+ unless multipart_upload?(params)
61
+ raise ArgumentError,
62
+ "multipart/form-data requires Rack::Multipart::UploadedFile values in params, got plain params"
63
+ end
64
+
65
+ { params: params }
66
+ when 'application/json', 'text/json'
67
+ { input: Oj.dump(params, mode: :strict), 'CONTENT_TYPE' => content_type }
68
+ else
69
+ if params.is_a?(Hash)
70
+ raise ArgumentError,
71
+ "cannot encode Hash params with #{content_type}; pass a String or IO body"
72
+ end
73
+
74
+ { input: params, 'CONTENT_TYPE' => content_type }
75
+ end
76
+ end
77
+
78
+ # Mirrors Rack::Multipart::Generator#multipart? without consuming the
79
+ # upload IOs, so Rack can still build the multipart body itself.
80
+ def multipart_upload?(value)
81
+ case value
82
+ when Array
83
+ value.any? { |item| multipart_upload?(item) }
84
+ when Hash
85
+ value.values.any? { |item| multipart_upload?(item) }
86
+ else
87
+ value.is_a?(Rack::Multipart::UploadedFile)
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,15 @@
1
+ require 'rspec'
2
+
3
+ RSpec::Matchers.define :have_http_status do |status|
4
+ match do |response|
5
+ response.status == status
6
+ end
7
+
8
+ failure_message do
9
+ "expected response to have http status #{status} but got #{response.status}"
10
+ end
11
+
12
+ failure_message_when_negated do
13
+ "expected response not to have http status #{status}"
14
+ end
15
+ end
@@ -0,0 +1,5 @@
1
+ module Rivulet
2
+ module RSpec
3
+ VERSION = '0.1.3'.freeze
4
+ end
5
+ end
@@ -0,0 +1,3 @@
1
+ require_relative 'rivulet/rspec/version'
2
+ require_relative 'rivulet/rspec/matchers'
3
+ require_relative 'rivulet/rspec/helpers'
metadata ADDED
@@ -0,0 +1,124 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rivulet-rspec
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.3
5
+ platform: ruby
6
+ authors:
7
+ - Vladimir Dombrovskiy <vold@fastmail.com>
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: oj
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: rack
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: rspec
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: pry
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ type: :development
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ - !ruby/object:Gem::Dependency
69
+ name: rake
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ - !ruby/object:Gem::Dependency
83
+ name: rspec
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ executables: []
97
+ extensions: []
98
+ extra_rdoc_files: []
99
+ files:
100
+ - lib/rivulet-rspec.rb
101
+ - lib/rivulet/rspec/helpers.rb
102
+ - lib/rivulet/rspec/matchers.rb
103
+ - lib/rivulet/rspec/version.rb
104
+ licenses:
105
+ - Apache-2.0
106
+ metadata: {}
107
+ rdoc_options: []
108
+ require_paths:
109
+ - lib
110
+ required_ruby_version: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - ">="
113
+ - !ruby/object:Gem::Version
114
+ version: '3.3'
115
+ required_rubygems_version: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ version: '0'
120
+ requirements: []
121
+ rubygems_version: 4.0.8
122
+ specification_version: 4
123
+ summary: Rivulet RSpec helpers
124
+ test_files: []