evil-client 0.3.3 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (180) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +0 -11
  3. data/.gitignore +1 -0
  4. data/.rspec +0 -1
  5. data/.rubocop.yml +22 -19
  6. data/.travis.yml +1 -0
  7. data/CHANGELOG.md +251 -6
  8. data/LICENSE.txt +3 -1
  9. data/README.md +47 -81
  10. data/docs/helpers/body.md +93 -0
  11. data/docs/helpers/connection.md +19 -0
  12. data/docs/helpers/headers.md +72 -0
  13. data/docs/helpers/http_method.md +39 -0
  14. data/docs/helpers/let.md +14 -0
  15. data/docs/helpers/logger.md +24 -0
  16. data/docs/helpers/middleware.md +56 -0
  17. data/docs/helpers/operation.md +103 -0
  18. data/docs/helpers/option.md +50 -0
  19. data/docs/helpers/path.md +37 -0
  20. data/docs/helpers/query.md +59 -0
  21. data/docs/helpers/response.md +40 -0
  22. data/docs/helpers/scope.md +121 -0
  23. data/docs/helpers/security.md +102 -0
  24. data/docs/helpers/validate.md +68 -0
  25. data/docs/index.md +70 -78
  26. data/docs/license.md +5 -1
  27. data/docs/rspec.md +96 -0
  28. data/evil-client.gemspec +10 -8
  29. data/lib/evil/client.rb +126 -72
  30. data/lib/evil/client/builder.rb +47 -0
  31. data/lib/evil/client/builder/operation.rb +40 -0
  32. data/lib/evil/client/builder/scope.rb +31 -0
  33. data/lib/evil/client/chaining.rb +17 -0
  34. data/lib/evil/client/connection.rb +60 -20
  35. data/lib/evil/client/container.rb +66 -0
  36. data/lib/evil/client/container/operation.rb +23 -0
  37. data/lib/evil/client/container/scope.rb +28 -0
  38. data/lib/evil/client/exceptions/definition_error.rb +15 -0
  39. data/lib/evil/client/exceptions/name_error.rb +32 -0
  40. data/lib/evil/client/exceptions/response_error.rb +42 -0
  41. data/lib/evil/client/exceptions/type_error.rb +29 -0
  42. data/lib/evil/client/exceptions/validation_error.rb +27 -0
  43. data/lib/evil/client/formatter.rb +49 -0
  44. data/lib/evil/client/formatter/form.rb +45 -0
  45. data/lib/evil/client/formatter/multipart.rb +33 -0
  46. data/lib/evil/client/formatter/part.rb +66 -0
  47. data/lib/evil/client/formatter/text.rb +21 -0
  48. data/lib/evil/client/resolver.rb +84 -0
  49. data/lib/evil/client/resolver/body.rb +22 -0
  50. data/lib/evil/client/resolver/format.rb +30 -0
  51. data/lib/evil/client/resolver/headers.rb +46 -0
  52. data/lib/evil/client/resolver/http_method.rb +34 -0
  53. data/lib/evil/client/resolver/middleware.rb +36 -0
  54. data/lib/evil/client/resolver/query.rb +39 -0
  55. data/lib/evil/client/resolver/request.rb +96 -0
  56. data/lib/evil/client/resolver/response.rb +26 -0
  57. data/lib/evil/client/resolver/security.rb +113 -0
  58. data/lib/evil/client/resolver/uri.rb +35 -0
  59. data/lib/evil/client/rspec.rb +127 -0
  60. data/lib/evil/client/schema.rb +105 -0
  61. data/lib/evil/client/schema/operation.rb +177 -0
  62. data/lib/evil/client/schema/scope.rb +73 -0
  63. data/lib/evil/client/settings.rb +172 -0
  64. data/lib/evil/client/settings/validator.rb +64 -0
  65. data/mkdocs.yml +21 -15
  66. data/spec/features/custom_connection_spec.rb +17 -0
  67. data/spec/features/operation/middleware_spec.rb +50 -0
  68. data/spec/features/operation/options_spec.rb +71 -0
  69. data/spec/features/operation/request_spec.rb +94 -0
  70. data/spec/features/operation/response_spec.rb +48 -0
  71. data/spec/features/scope/options_spec.rb +52 -0
  72. data/spec/fixtures/locales/en.yml +16 -0
  73. data/spec/fixtures/test_client.rb +76 -0
  74. data/spec/spec_helper.rb +18 -6
  75. data/spec/support/fixtures_helper.rb +7 -0
  76. data/spec/unit/builder/operation_spec.rb +90 -0
  77. data/spec/unit/builder/scope_spec.rb +84 -0
  78. data/spec/unit/client_spec.rb +137 -0
  79. data/spec/unit/connection_spec.rb +78 -0
  80. data/spec/unit/container/operation_spec.rb +81 -0
  81. data/spec/unit/container/scope_spec.rb +61 -0
  82. data/spec/unit/container_spec.rb +107 -0
  83. data/spec/unit/exceptions/definition_error_spec.rb +15 -0
  84. data/spec/unit/exceptions/name_error_spec.rb +77 -0
  85. data/spec/unit/exceptions/response_error_spec.rb +22 -0
  86. data/spec/unit/exceptions/type_error_spec.rb +71 -0
  87. data/spec/unit/exceptions/validation_error_spec.rb +13 -0
  88. data/spec/unit/formatter/form_spec.rb +27 -0
  89. data/spec/unit/formatter/multipart_spec.rb +23 -0
  90. data/spec/unit/formatter/part_spec.rb +49 -0
  91. data/spec/unit/formatter/text_spec.rb +37 -0
  92. data/spec/unit/formatter_spec.rb +46 -0
  93. data/spec/unit/resolver/body_spec.rb +65 -0
  94. data/spec/unit/resolver/format_spec.rb +66 -0
  95. data/spec/unit/resolver/headers_spec.rb +93 -0
  96. data/spec/unit/resolver/http_method_spec.rb +67 -0
  97. data/spec/unit/resolver/middleware_spec.rb +83 -0
  98. data/spec/unit/resolver/query_spec.rb +85 -0
  99. data/spec/unit/resolver/request_spec.rb +121 -0
  100. data/spec/unit/resolver/response_spec.rb +64 -0
  101. data/spec/unit/resolver/security_spec.rb +156 -0
  102. data/spec/unit/resolver/uri_spec.rb +117 -0
  103. data/spec/unit/rspec_spec.rb +342 -0
  104. data/spec/unit/schema/operation_spec.rb +309 -0
  105. data/spec/unit/schema/scope_spec.rb +110 -0
  106. data/spec/unit/schema_spec.rb +157 -0
  107. data/spec/unit/settings/validator_spec.rb +128 -0
  108. data/spec/unit/settings_spec.rb +248 -0
  109. metadata +192 -135
  110. data/docs/base_url.md +0 -38
  111. data/docs/documentation.md +0 -9
  112. data/docs/headers.md +0 -59
  113. data/docs/http_method.md +0 -31
  114. data/docs/model.md +0 -173
  115. data/docs/operation.md +0 -0
  116. data/docs/overview.md +0 -0
  117. data/docs/path.md +0 -48
  118. data/docs/query.md +0 -99
  119. data/docs/responses.md +0 -66
  120. data/docs/security.md +0 -102
  121. data/docs/settings.md +0 -32
  122. data/lib/evil/client/connection/net_http.rb +0 -57
  123. data/lib/evil/client/dsl.rb +0 -127
  124. data/lib/evil/client/dsl/base.rb +0 -26
  125. data/lib/evil/client/dsl/files.rb +0 -37
  126. data/lib/evil/client/dsl/headers.rb +0 -16
  127. data/lib/evil/client/dsl/http_method.rb +0 -24
  128. data/lib/evil/client/dsl/operation.rb +0 -91
  129. data/lib/evil/client/dsl/operations.rb +0 -41
  130. data/lib/evil/client/dsl/path.rb +0 -25
  131. data/lib/evil/client/dsl/query.rb +0 -16
  132. data/lib/evil/client/dsl/response.rb +0 -61
  133. data/lib/evil/client/dsl/responses.rb +0 -29
  134. data/lib/evil/client/dsl/scope.rb +0 -27
  135. data/lib/evil/client/dsl/security.rb +0 -57
  136. data/lib/evil/client/dsl/verifier.rb +0 -35
  137. data/lib/evil/client/middleware.rb +0 -81
  138. data/lib/evil/client/middleware/base.rb +0 -11
  139. data/lib/evil/client/middleware/merge_security.rb +0 -20
  140. data/lib/evil/client/middleware/normalize_headers.rb +0 -17
  141. data/lib/evil/client/middleware/stringify_form.rb +0 -40
  142. data/lib/evil/client/middleware/stringify_json.rb +0 -19
  143. data/lib/evil/client/middleware/stringify_multipart.rb +0 -36
  144. data/lib/evil/client/middleware/stringify_multipart/part.rb +0 -36
  145. data/lib/evil/client/middleware/stringify_query.rb +0 -35
  146. data/lib/evil/client/operation.rb +0 -34
  147. data/lib/evil/client/operation/request.rb +0 -26
  148. data/lib/evil/client/operation/response.rb +0 -39
  149. data/lib/evil/client/operation/response_error.rb +0 -13
  150. data/lib/evil/client/operation/unexpected_response_error.rb +0 -19
  151. data/spec/features/instantiation_spec.rb +0 -68
  152. data/spec/features/middleware_spec.rb +0 -79
  153. data/spec/features/operation_with_documentation_spec.rb +0 -41
  154. data/spec/features/operation_with_files_spec.rb +0 -40
  155. data/spec/features/operation_with_form_body_spec.rb +0 -158
  156. data/spec/features/operation_with_headers_spec.rb +0 -99
  157. data/spec/features/operation_with_http_method_spec.rb +0 -45
  158. data/spec/features/operation_with_json_body_spec.rb +0 -156
  159. data/spec/features/operation_with_nested_responses_spec.rb +0 -95
  160. data/spec/features/operation_with_path_spec.rb +0 -47
  161. data/spec/features/operation_with_query_spec.rb +0 -84
  162. data/spec/features/operation_with_security_spec.rb +0 -228
  163. data/spec/features/scoping_spec.rb +0 -48
  164. data/spec/support/test_client.rb +0 -15
  165. data/spec/unit/evil/client/connection/net_http_spec.rb +0 -38
  166. data/spec/unit/evil/client/dsl/files_spec.rb +0 -37
  167. data/spec/unit/evil/client/dsl/operation_spec.rb +0 -374
  168. data/spec/unit/evil/client/dsl/operations_spec.rb +0 -29
  169. data/spec/unit/evil/client/dsl/scope_spec.rb +0 -32
  170. data/spec/unit/evil/client/dsl/security_spec.rb +0 -135
  171. data/spec/unit/evil/client/middleware/merge_security_spec.rb +0 -32
  172. data/spec/unit/evil/client/middleware/normalize_headers_spec.rb +0 -17
  173. data/spec/unit/evil/client/middleware/stringify_form_spec.rb +0 -63
  174. data/spec/unit/evil/client/middleware/stringify_json_spec.rb +0 -61
  175. data/spec/unit/evil/client/middleware/stringify_multipart/part_spec.rb +0 -59
  176. data/spec/unit/evil/client/middleware/stringify_multipart_spec.rb +0 -62
  177. data/spec/unit/evil/client/middleware/stringify_query_spec.rb +0 -40
  178. data/spec/unit/evil/client/middleware_spec.rb +0 -46
  179. data/spec/unit/evil/client/operation/request_spec.rb +0 -49
  180. data/spec/unit/evil/client/operation/response_spec.rb +0 -63
@@ -1,29 +0,0 @@
1
- describe Evil::Client::DSL::Operations do
2
- let(:operations) { described_class.new }
3
- let(:settings) do
4
- double(:settings, version: 1, user: "foo", password: "bar")
5
- end
6
-
7
- before do
8
- operations.register(nil) do |settings|
9
- http_method :post
10
- security { basic_auth settings.user, settings.password }
11
- end
12
-
13
- operations.register(:find_user) do |_|
14
- http_method :get
15
- path { |id:, **| "/users/#{id}" }
16
- end
17
- end
18
-
19
- subject { operations.finalize(settings) }
20
-
21
- it "builds a proper schema" do
22
- find_user = subject[:find_user]
23
-
24
- expect(find_user[:method].call).to eq "get"
25
- expect(find_user[:path].call(id: 7)).to eq "users/7"
26
- expect(find_user[:security].call)
27
- .to eq headers: { "authorization" => "Basic Zm9vOmJhcg==" }
28
- end
29
- end
@@ -1,32 +0,0 @@
1
- RSpec.describe Evil::Client::DSL, ".scope" do
2
- before do
3
- class Test::Foo
4
- extend Evil::Client::DSL
5
-
6
- base_url { "https://example.com" }
7
-
8
- scope :foo do
9
- param :bar
10
-
11
- scope do
12
- param :baz
13
-
14
- def find
15
- qux(bar: bar, baz: baz)
16
- end
17
- end
18
- end
19
-
20
- def qux(bar:, baz:)
21
- "#{bar}/#{baz}"
22
- end
23
- end
24
- end
25
-
26
- let(:client) { Test::Foo.new }
27
- subject { client.foo("users")[54].find }
28
-
29
- it "provides access to params and methods via nested scopes" do
30
- expect(subject).to eq "users/54"
31
- end
32
- end
@@ -1,135 +0,0 @@
1
- RSpec.describe Evil::Client::DSL::Security do
2
- subject { described_class.new(&block).call }
3
-
4
- context "from block without definitions:" do
5
- let(:block) { proc {} }
6
-
7
- it "provides an empty schema" do
8
- expect(subject).to eq({})
9
- end
10
- end
11
-
12
- context "from block with #key_auth using headers:" do
13
- let(:block) do
14
- proc do
15
- key_auth "foo", "bar"
16
- end
17
- end
18
-
19
- it "provides a schema" do
20
- expect(subject).to eq headers: { "foo" => "bar" }
21
- end
22
- end
23
-
24
- context "from block with #key_auth using body:" do
25
- let(:block) do
26
- proc do
27
- key_auth "foo", "bar", using: :body
28
- end
29
- end
30
-
31
- it "provides a schema" do
32
- expect(subject).to eq body: { "foo" => "bar" }
33
- end
34
- end
35
-
36
- context "from block with #key_auth using query:" do
37
- let(:block) do
38
- proc do
39
- key_auth "foo", "bar", using: :query
40
- end
41
- end
42
-
43
- it "provides a schema" do
44
- expect(subject).to eq query: { "foo" => "bar" }
45
- end
46
- end
47
-
48
- context "from block with #key_auth using unknown part:" do
49
- let(:block) do
50
- proc do
51
- key_auth "foo", "bar", using: :unknown
52
- end
53
- end
54
-
55
- it "raises" do
56
- expect { subject }.to raise_error ArgumentError
57
- end
58
- end
59
-
60
- context "from block with #token_auth using headers:" do
61
- let(:block) do
62
- proc do
63
- token_auth "foo"
64
- end
65
- end
66
-
67
- it "provides a schema" do
68
- expect(subject).to eq headers: { "authorization" => "foo" }
69
- end
70
- end
71
-
72
- context "from block with #token_auth with a prefix:" do
73
- let(:block) do
74
- proc do
75
- token_auth "foo", prefix: "Digest"
76
- end
77
- end
78
-
79
- it "provides a schema" do
80
- expect(subject).to eq headers: { "authorization" => "Digest foo" }
81
- end
82
- end
83
-
84
- context "from block with #token_auth using body:" do
85
- let(:block) do
86
- proc do
87
- token_auth "foo", using: :body
88
- end
89
- end
90
-
91
- it "provides a schema" do
92
- expect(subject).to eq body: { "access_token" => "foo" }
93
- end
94
- end
95
-
96
- context "from block with #token_auth using query:" do
97
- let(:block) do
98
- proc do
99
- token_auth "foo", using: :query
100
- end
101
- end
102
-
103
- it "provides a schema" do
104
- expect(subject).to eq query: { "access_token" => "foo" }
105
- end
106
- end
107
-
108
- context "from block with #basic_auth:" do
109
- let(:block) do
110
- proc do
111
- basic_auth "foo", "bar"
112
- end
113
- end
114
-
115
- it "provides a schema" do
116
- expect(subject)
117
- .to eq headers: { "authorization" => "Basic Zm9vOmJhcg==" }
118
- end
119
- end
120
-
121
- context "from block with several definitions:" do
122
- let(:block) do
123
- proc do
124
- basic_auth "foo", "bar"
125
- token_auth "baz", using: :query
126
- end
127
- end
128
-
129
- it "provides a full schema" do
130
- expect(subject).to eq \
131
- headers: { "authorization" => "Basic Zm9vOmJhcg==" },
132
- query: { "access_token" => "baz" }
133
- end
134
- end
135
- end
@@ -1,32 +0,0 @@
1
- RSpec.describe Evil::Client::Middleware::MergeSecurity do
2
- let(:stack) { described_class.new(app) }
3
- let(:app) { double :app }
4
-
5
- def update!(env)
6
- @result = env
7
- end
8
-
9
- before { allow(app).to receive(:call) { |env, *| update! env } }
10
- subject { stack.call env, {}, {} }
11
-
12
- let(:env) do
13
- {
14
- body: { "foo" => :FOO, "access_key" => :FOO },
15
- query: { "bar" => :BAR, "access_key" => :FOO },
16
- headers: { "baz" => :BAZ, "authorization" => :FOO },
17
- security: {
18
- body: { "access_key" => :QUX },
19
- query: { "access_key" => :ZYX },
20
- headers: { "authorization" => "Basic 3ou08314tq==" }
21
- }
22
- }
23
- end
24
-
25
- it "merges security schema to env" do
26
- subject
27
- expect(@result).to eq \
28
- body: { "foo" => :FOO, "access_key" => :QUX },
29
- query: { "bar" => :BAR, "access_key" => :ZYX },
30
- headers: { "baz" => :BAZ, "authorization" => "Basic 3ou08314tq==" }
31
- end
32
- end
@@ -1,17 +0,0 @@
1
- RSpec.describe Evil::Client::Middleware::NormalizeHeaders do
2
- let(:stack) { described_class.new(app) }
3
- let(:app) { double :app }
4
- let(:env) { { headers: { Foo: :BAR } } }
5
-
6
- def update!(env)
7
- @result = env
8
- end
9
-
10
- before { allow(app).to receive(:call) { |env, *| update! env } }
11
- subject { stack.call env, {}, {} }
12
-
13
- it "normalizes headers" do
14
- subject
15
- expect(@result[:headers]).to eq "foo" => "BAR"
16
- end
17
- end
@@ -1,63 +0,0 @@
1
- RSpec.describe Evil::Client::Middleware::StringifyForm do
2
- let(:stack) { described_class.new(app) }
3
- let(:app) { double :app }
4
-
5
- def update!(env)
6
- @result = env
7
- end
8
-
9
- before { allow(app).to receive(:call) { |env, *| update! env } }
10
- subject { stack.call env, {}, {} }
11
-
12
- context "with a non-empty body:" do
13
- let(:env) do
14
- {
15
- body: { foo: :FOO, bar: [:BAR], baz: { qux: :QUX }, qux: nil },
16
- format: "form"
17
- }
18
- end
19
-
20
- it "stringifies the body" do
21
- subject
22
- expect(@result[:body_string]).to eq "foo=FOO&bar[]=BAR&baz[qux]=QUX&qux="
23
- end
24
-
25
- it "adds content-type header" do
26
- subject
27
- expect(@result[:headers])
28
- .to eq "content-type" => "application/x-www-form-urlencoded"
29
- end
30
- end
31
-
32
- context "when format is not a form:" do
33
- let(:env) do
34
- {
35
- body: { foo: :FOO, bar: [:BAR], baz: { qux: :QUX }, qux: nil },
36
- format: "json"
37
- }
38
- end
39
-
40
- it "does nothing" do
41
- subject
42
- expect(@result).to eq env
43
- end
44
- end
45
-
46
- context "with empty body:" do
47
- let(:env) { { body: {}, format: "form" } }
48
-
49
- it "does nothing" do
50
- subject
51
- expect(@result).to eq env
52
- end
53
- end
54
-
55
- context "without a body:" do
56
- let(:env) { { format: "form" } }
57
-
58
- it "does nothing" do
59
- subject
60
- expect(@result).to eq env
61
- end
62
- end
63
- end
@@ -1,61 +0,0 @@
1
- RSpec.describe Evil::Client::Middleware::StringifyJson do
2
- def update!(result)
3
- @result = result
4
- end
5
-
6
- let(:app) { double :app }
7
-
8
- before { allow(app).to receive(:call) { |env, *| update!(env) } }
9
- subject { described_class.new(app).call(env, {}, {}) }
10
-
11
- context "with a body:" do
12
- let(:env) { { format: "json", body: { foo: :bar } } }
13
-
14
- it "stringifies a body" do
15
- subject
16
- expect(@result[:body_string]).to eq '{"foo":"bar"}'
17
- end
18
-
19
- it "sets content-type" do
20
- subject
21
- expect(@result[:headers]).to eq "content-type" => "application/json"
22
- end
23
- end
24
-
25
- context "when format is not json:" do
26
- let(:env) { { format: "form", body: { foo: :bar } } }
27
-
28
- it "does nothing" do
29
- subject
30
- expect(@result).to eq env
31
- end
32
- end
33
-
34
- context "with empty body:" do
35
- let(:env) { { format: "json", body: {} } }
36
-
37
- it "stringifies an empty body" do
38
- subject
39
- expect(@result[:body_string]).to eq "{}"
40
- end
41
-
42
- it "sets content-type" do
43
- subject
44
- expect(@result[:headers]).to eq "content-type" => "application/json"
45
- end
46
- end
47
-
48
- context "without a body:" do
49
- let(:env) { { format: "json" } }
50
-
51
- it "stringifies an empty body" do
52
- subject
53
- expect(@result[:body_string]).to eq "{}"
54
- end
55
-
56
- it "sets content-type" do
57
- subject
58
- expect(@result[:headers]).to eq "content-type" => "application/json"
59
- end
60
- end
61
- end
@@ -1,59 +0,0 @@
1
- RSpec.describe Evil::Client::Middleware::StringifyMultipart::Part do
2
- let(:file) { StringIO.new "Hello!" }
3
- let(:type) { MIME::Types["text/html"].first }
4
- let(:charset) { "utf-8" }
5
- let(:part) do
6
- described_class.new(file: file, type: type, charset: charset)
7
- end
8
-
9
- subject { part.to_s }
10
-
11
- shared_examples :building_part do
12
- it "includes content disposition" do
13
- expect(subject).to include \
14
- 'Content-Disposition: form-data; name="AttachedFile"; filename='
15
- end
16
-
17
- it "includes content type" do
18
- expect(subject).to include "Content-Type: text/html; charset=utf-8"
19
- end
20
-
21
- it "includes content" do
22
- expect(subject).to include "Hello!"
23
- end
24
- end
25
-
26
- context "with a name" do
27
- let(:part) { described_class.new(file: file, name: "UploadedFile") }
28
-
29
- it "includes part name" do
30
- expect(subject).to include 'name="UploadedFile"'
31
- end
32
- end
33
-
34
- context "with a filename" do
35
- let(:part) { described_class.new(file: file, filename: "weird_thing.json") }
36
-
37
- it "includes part name" do
38
- expect(subject).to include 'filename="weird_thing.json"'
39
- end
40
- end
41
-
42
- context "from file" do
43
- let(:file) { instance_double ::File, path: "foo/bar.html", read: "Hello!" }
44
- it_behaves_like :building_part
45
-
46
- it "includes filename" do
47
- expect(subject).to include 'filename="bar.html"'
48
- end
49
- end
50
-
51
- context "from io" do
52
- it_behaves_like :building_part
53
- end
54
-
55
- context "from text" do
56
- let(:file) { "Hello!" }
57
- it_behaves_like :building_part
58
- end
59
- end
@@ -1,62 +0,0 @@
1
- RSpec.describe Evil::Client::Middleware::StringifyMultipart do
2
- let(:app) { double :app }
3
- let(:type) { "file" }
4
- let(:env) do
5
- {
6
- format: "multipart",
7
- headers: {},
8
- files: [
9
- {
10
- file: StringIO.new('{"text":"Hello!"}'),
11
- type: MIME::Types["application/json"].first,
12
- charset: "utf-16",
13
- filename: "greetings.json"
14
- }
15
- ]
16
- }
17
- end
18
-
19
- def update!(result)
20
- @result = result
21
- end
22
-
23
- before { allow(app).to receive(:call) { |env, *| update!(env) } }
24
- subject { described_class.new(app).call(env, {}, {}) }
25
-
26
- context "with a multipart format:" do
27
- let(:body_string) { @result[:body_string] }
28
-
29
- it "builds multipart body_string" do
30
- subject
31
- expect(body_string).to include '{"text":"Hello!"}'
32
- end
33
-
34
- it "uses name and filename" do
35
- subject
36
- expect(body_string).to include "Content-Disposition: form-data;" \
37
- ' name="AttachedFile1";' \
38
- ' filename="greetings.json"'
39
- end
40
-
41
- it "uses content-type and charset" do
42
- subject
43
- expect(body_string)
44
- .to include "Content-Type: application/json; charset=utf-16"
45
- end
46
-
47
- it "adds the header" do
48
- subject
49
- expect(@result[:headers]["content-type"])
50
- .to include "multipart/form-data; boundary="
51
- end
52
- end
53
-
54
- context "with non-multipart format:" do
55
- before { env[:format] = "json" }
56
-
57
- it "does nothing" do
58
- subject
59
- expect(@result).to eq env
60
- end
61
- end
62
- end