mime-types 3.3.1 → 3.4.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 +4 -4
- data/Code-of-Conduct.md +10 -10
- data/Contributing.md +82 -93
- data/History.md +158 -138
- data/Licence.md +3 -3
- data/README.rdoc +1 -0
- data/Rakefile +131 -145
- data/lib/mime/type/columnar.rb +3 -3
- data/lib/mime/type.rb +141 -94
- data/lib/mime/types/_columnar.rb +20 -19
- data/lib/mime/types/cache.rb +8 -8
- data/lib/mime/types/columnar.rb +1 -1
- data/lib/mime/types/container.rb +14 -14
- data/lib/mime/types/deprecations.rb +15 -11
- data/lib/mime/types/full.rb +2 -2
- data/lib/mime/types/loader.rb +28 -15
- data/lib/mime/types/logger.rb +3 -5
- data/lib/mime/types/registry.rb +7 -7
- data/lib/mime/types.rb +18 -16
- data/lib/mime-types.rb +1 -1
- data/test/minitest_helper.rb +7 -9
- data/test/test_mime_type.rb +272 -261
- data/test/test_mime_types.rb +72 -72
- data/test/test_mime_types_cache.rb +38 -38
- data/test/test_mime_types_class.rb +59 -59
- data/test/test_mime_types_lazy.rb +16 -16
- data/test/test_mime_types_loader.rb +14 -14
- metadata +15 -43
data/test/test_mime_type.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "mime/types"
|
4
|
+
require "minitest_helper"
|
5
5
|
|
6
6
|
describe MIME::Type do
|
7
7
|
def mime_type(content_type)
|
@@ -9,299 +9,299 @@ describe MIME::Type do
|
|
9
9
|
end
|
10
10
|
|
11
11
|
let(:x_appl_x_zip) {
|
12
|
-
mime_type(
|
12
|
+
mime_type("x-appl/x-zip") { |t| t.extensions = %w[zip zp] }
|
13
13
|
}
|
14
|
-
let(:text_plain) { mime_type(
|
15
|
-
let(:text_html) { mime_type(
|
16
|
-
let(:image_jpeg) { mime_type(
|
14
|
+
let(:text_plain) { mime_type("text/plain") }
|
15
|
+
let(:text_html) { mime_type("text/html") }
|
16
|
+
let(:image_jpeg) { mime_type("image/jpeg") }
|
17
17
|
let(:application_javascript) {
|
18
|
-
mime_type(
|
19
|
-
js.friendly(
|
18
|
+
mime_type("application/javascript") do |js|
|
19
|
+
js.friendly("en" => "JavaScript")
|
20
20
|
js.xrefs = {
|
21
|
-
|
22
|
-
|
21
|
+
"rfc" => %w[rfc4239 rfc4239],
|
22
|
+
"template" => %w[application/javascript]
|
23
23
|
}
|
24
|
-
js.encoding =
|
25
|
-
js.extensions = %w
|
24
|
+
js.encoding = "8bit"
|
25
|
+
js.extensions = %w[js sj]
|
26
26
|
js.registered = true
|
27
27
|
end
|
28
28
|
}
|
29
29
|
let(:text_x_yaml) {
|
30
|
-
mime_type(
|
31
|
-
yaml.extensions = %w
|
32
|
-
yaml.encoding
|
33
|
-
yaml.friendly(
|
30
|
+
mime_type("text/x-yaml") do |yaml|
|
31
|
+
yaml.extensions = %w[yaml yml]
|
32
|
+
yaml.encoding = "8bit"
|
33
|
+
yaml.friendly("en" => "YAML Structured Document")
|
34
34
|
end
|
35
35
|
}
|
36
36
|
let(:text_x_yaml_with_docs) {
|
37
37
|
text_x_yaml.dup.tap do |yaml|
|
38
|
-
yaml.docs =
|
38
|
+
yaml.docs = "Test YAML"
|
39
39
|
end
|
40
40
|
}
|
41
41
|
|
42
|
-
describe
|
43
|
-
it
|
44
|
-
assert_equal
|
42
|
+
describe ".simplified" do
|
43
|
+
it "leaves normal types alone" do
|
44
|
+
assert_equal "text/plain", MIME::Type.simplified("text/plain")
|
45
45
|
end
|
46
46
|
|
47
|
-
it
|
48
|
-
assert_equal
|
49
|
-
|
50
|
-
assert_equal
|
47
|
+
it "does not remove x- prefixes by default" do
|
48
|
+
assert_equal "application/x-msword",
|
49
|
+
MIME::Type.simplified("application/x-msword")
|
50
|
+
assert_equal "x-xyz/abc", MIME::Type.simplified("x-xyz/abc")
|
51
51
|
end
|
52
52
|
|
53
|
-
it
|
54
|
-
assert_equal
|
55
|
-
|
56
|
-
assert_equal
|
57
|
-
|
53
|
+
it "removes x- prefixes when requested" do
|
54
|
+
assert_equal "application/msword",
|
55
|
+
MIME::Type.simplified("application/x-msword", remove_x_prefix: true)
|
56
|
+
assert_equal "xyz/abc",
|
57
|
+
MIME::Type.simplified("x-xyz/abc", remove_x_prefix: true)
|
58
58
|
end
|
59
59
|
|
60
|
-
it
|
61
|
-
assert_equal
|
60
|
+
it "lowercases mixed-case types" do
|
61
|
+
assert_equal "text/vcard", MIME::Type.simplified("text/vCard")
|
62
62
|
end
|
63
63
|
|
64
|
-
it
|
65
|
-
assert_nil MIME::Type.simplified(
|
64
|
+
it "returns nil when the value provided is not a valid content type" do
|
65
|
+
assert_nil MIME::Type.simplified("text")
|
66
66
|
end
|
67
67
|
end
|
68
68
|
|
69
|
-
describe
|
70
|
-
it
|
71
|
-
assert_equal
|
69
|
+
describe ".i18n_key" do
|
70
|
+
it "converts text/plain to text.plain" do
|
71
|
+
assert_equal "text.plain", MIME::Type.i18n_key("text/plain")
|
72
72
|
end
|
73
73
|
|
74
|
-
it
|
75
|
-
assert_equal
|
76
|
-
|
74
|
+
it "does not remove x-prefixes" do
|
75
|
+
assert_equal "application.x-msword",
|
76
|
+
MIME::Type.i18n_key("application/x-msword")
|
77
77
|
end
|
78
78
|
|
79
|
-
it
|
80
|
-
assert_equal
|
79
|
+
it "converts text/vCard to text.vcard" do
|
80
|
+
assert_equal "text.vcard", MIME::Type.i18n_key("text/vCard")
|
81
81
|
end
|
82
82
|
|
83
|
-
it
|
84
|
-
assert_nil MIME::Type.i18n_key(
|
83
|
+
it "returns nil when the value provided is not a valid content type" do
|
84
|
+
assert_nil MIME::Type.i18n_key("text")
|
85
85
|
end
|
86
86
|
end
|
87
87
|
|
88
|
-
describe
|
89
|
-
it
|
88
|
+
describe ".new" do
|
89
|
+
it "fails if an invalid content type is provided" do
|
90
90
|
exception = assert_raises MIME::Type::InvalidContentType do
|
91
|
-
MIME::Type.new(
|
91
|
+
MIME::Type.new("apps")
|
92
92
|
end
|
93
93
|
assert_equal 'Invalid Content-Type "apps"', exception.to_s
|
94
94
|
end
|
95
95
|
|
96
|
-
it
|
97
|
-
type = MIME::Type.new(
|
96
|
+
it "creates a valid content type just from a string" do
|
97
|
+
type = MIME::Type.new("text/x-yaml")
|
98
98
|
|
99
99
|
assert_instance_of MIME::Type, type
|
100
|
-
assert_equal
|
100
|
+
assert_equal "text/x-yaml", type.content_type
|
101
101
|
end
|
102
102
|
|
103
|
-
it
|
104
|
-
MIME::Type.new(
|
103
|
+
it "yields the content type in a block" do
|
104
|
+
MIME::Type.new("text/x-yaml") do |type|
|
105
105
|
assert_instance_of MIME::Type, type
|
106
|
-
assert_equal
|
106
|
+
assert_equal "text/x-yaml", type.content_type
|
107
107
|
end
|
108
108
|
end
|
109
109
|
|
110
|
-
it
|
110
|
+
it "creates a valid content type from a hash" do
|
111
111
|
type = MIME::Type.new(
|
112
|
-
|
113
|
-
|
112
|
+
"content-type" => "text/x-yaml",
|
113
|
+
"obsolete" => true
|
114
114
|
)
|
115
115
|
assert_instance_of MIME::Type, type
|
116
|
-
assert_equal
|
116
|
+
assert_equal "text/x-yaml", type.content_type
|
117
117
|
assert type.obsolete?
|
118
118
|
end
|
119
119
|
|
120
|
-
it
|
121
|
-
type = MIME::Type.new(%w
|
120
|
+
it "creates a valid content type from an array" do
|
121
|
+
type = MIME::Type.new(%w[text/x-yaml yaml yml yz])
|
122
122
|
assert_instance_of MIME::Type, type
|
123
|
-
assert_equal
|
124
|
-
assert_equal %w
|
123
|
+
assert_equal "text/x-yaml", type.content_type
|
124
|
+
assert_equal %w[yaml yml yz], type.extensions
|
125
125
|
end
|
126
126
|
end
|
127
127
|
|
128
|
-
describe
|
129
|
-
it
|
128
|
+
describe "#like?" do
|
129
|
+
it "compares two MIME::Types on #simplified values without x- prefixes" do
|
130
130
|
assert text_plain.like?(text_plain)
|
131
131
|
refute text_plain.like?(text_html)
|
132
132
|
end
|
133
133
|
|
134
|
-
it
|
134
|
+
it "compares MIME::Type against string without x- prefixes" do
|
135
135
|
assert text_plain.like?(text_plain.to_s)
|
136
136
|
refute text_plain.like?(text_html.to_s)
|
137
137
|
end
|
138
138
|
end
|
139
139
|
|
140
|
-
describe
|
141
|
-
it
|
140
|
+
describe "#<=>" do
|
141
|
+
it "correctly compares identical types" do
|
142
142
|
assert_equal text_plain, text_plain
|
143
143
|
end
|
144
144
|
|
145
|
-
it
|
146
|
-
right = mime_type(
|
145
|
+
it "correctly compares equivalent types" do
|
146
|
+
right = mime_type("text/Plain")
|
147
147
|
refute_same text_plain, right
|
148
148
|
assert_equal text_plain, right
|
149
149
|
end
|
150
150
|
|
151
|
-
it
|
151
|
+
it "correctly compares types that sort earlier" do
|
152
152
|
refute_equal text_html, text_plain
|
153
153
|
assert_operator text_html, :<, text_plain
|
154
154
|
end
|
155
155
|
|
156
|
-
it
|
156
|
+
it "correctly compares types that sort later" do
|
157
157
|
refute_equal text_plain, text_html
|
158
158
|
assert_operator text_plain, :>, text_html
|
159
159
|
end
|
160
160
|
|
161
|
-
it
|
162
|
-
assert_equal text_plain,
|
161
|
+
it "correctly compares types against equivalent strings" do
|
162
|
+
assert_equal text_plain, "text/plain"
|
163
163
|
end
|
164
164
|
|
165
|
-
it
|
166
|
-
refute_equal text_html,
|
167
|
-
assert_operator text_html, :<,
|
165
|
+
it "correctly compares types against strings that sort earlier" do
|
166
|
+
refute_equal text_html, "text/plain"
|
167
|
+
assert_operator text_html, :<, "text/plain"
|
168
168
|
end
|
169
169
|
|
170
|
-
it
|
171
|
-
refute_equal text_plain,
|
172
|
-
assert_operator text_plain, :>,
|
170
|
+
it "correctly compares types against strings that sort later" do
|
171
|
+
refute_equal text_plain, "text/html"
|
172
|
+
assert_operator text_plain, :>, "text/html"
|
173
173
|
end
|
174
174
|
|
175
|
-
it
|
175
|
+
it "correctly compares against nil" do
|
176
176
|
refute_equal text_html, nil
|
177
177
|
assert_operator text_plain, :<, nil
|
178
178
|
end
|
179
179
|
end
|
180
180
|
|
181
|
-
describe
|
182
|
-
it
|
181
|
+
describe "#ascii?" do
|
182
|
+
it "defaults to true for text/* types" do
|
183
183
|
assert text_plain.ascii?
|
184
184
|
end
|
185
185
|
|
186
|
-
it
|
186
|
+
it "defaults to false for non-text/* types" do
|
187
187
|
refute image_jpeg.ascii?
|
188
188
|
end
|
189
189
|
end
|
190
190
|
|
191
|
-
describe
|
192
|
-
it
|
191
|
+
describe "#binary?" do
|
192
|
+
it "defaults to false for text/* types" do
|
193
193
|
refute text_plain.binary?
|
194
194
|
end
|
195
195
|
|
196
|
-
it
|
196
|
+
it "defaults to true for non-text/* types" do
|
197
197
|
assert image_jpeg.binary?
|
198
198
|
end
|
199
199
|
end
|
200
200
|
|
201
|
-
describe
|
202
|
-
it
|
201
|
+
describe "#complete?" do
|
202
|
+
it "is true when there are extensions" do
|
203
203
|
assert text_x_yaml.complete?
|
204
204
|
end
|
205
205
|
|
206
|
-
it
|
207
|
-
refute mime_type(
|
206
|
+
it "is false when there are no extensions" do
|
207
|
+
refute mime_type("text/plain").complete?
|
208
208
|
end
|
209
209
|
end
|
210
210
|
|
211
|
-
describe
|
212
|
-
it
|
213
|
-
assert_equal
|
214
|
-
assert_equal
|
211
|
+
describe "#content_type" do
|
212
|
+
it "preserves the original case" do
|
213
|
+
assert_equal "text/plain", text_plain.content_type
|
214
|
+
assert_equal "text/vCard", mime_type("text/vCard").content_type
|
215
215
|
end
|
216
216
|
|
217
|
-
it
|
218
|
-
assert_equal
|
217
|
+
it "does not remove x- prefixes" do
|
218
|
+
assert_equal "x-appl/x-zip", x_appl_x_zip.content_type
|
219
219
|
end
|
220
220
|
end
|
221
221
|
|
222
|
-
describe
|
223
|
-
it
|
224
|
-
assert_equal
|
222
|
+
describe "#default_encoding" do
|
223
|
+
it "is quoted-printable for text/* types" do
|
224
|
+
assert_equal "quoted-printable", text_plain.default_encoding
|
225
225
|
end
|
226
226
|
|
227
|
-
it
|
228
|
-
assert_equal
|
227
|
+
it "is base64 for non-text/* types" do
|
228
|
+
assert_equal "base64", image_jpeg.default_encoding
|
229
229
|
end
|
230
230
|
end
|
231
231
|
|
232
|
-
describe
|
233
|
-
it
|
234
|
-
assert_equal
|
235
|
-
assert_equal
|
232
|
+
describe "#encoding, #encoding=" do
|
233
|
+
it "returns #default_encoding if not set explicitly" do
|
234
|
+
assert_equal "quoted-printable", text_plain.encoding
|
235
|
+
assert_equal "base64", image_jpeg.encoding
|
236
236
|
end
|
237
237
|
|
238
|
-
it
|
239
|
-
text_plain.encoding =
|
240
|
-
assert_equal
|
238
|
+
it "returns the set value when set" do
|
239
|
+
text_plain.encoding = "8bit"
|
240
|
+
assert_equal "8bit", text_plain.encoding
|
241
241
|
end
|
242
242
|
|
243
|
-
it
|
244
|
-
text_plain.encoding =
|
243
|
+
it "resets to the default encoding when set to nil or :default" do
|
244
|
+
text_plain.encoding = "8bit"
|
245
245
|
text_plain.encoding = nil
|
246
246
|
assert_equal text_plain.default_encoding, text_plain.encoding
|
247
247
|
text_plain.encoding = :default
|
248
248
|
assert_equal text_plain.default_encoding, text_plain.encoding
|
249
249
|
end
|
250
250
|
|
251
|
-
it
|
251
|
+
it "raises a MIME::Type::InvalidEncoding for an invalid encoding" do
|
252
252
|
exception = assert_raises MIME::Type::InvalidEncoding do
|
253
|
-
text_plain.encoding =
|
253
|
+
text_plain.encoding = "binary"
|
254
254
|
end
|
255
255
|
assert_equal 'Invalid Encoding "binary"', exception.to_s
|
256
256
|
end
|
257
257
|
end
|
258
258
|
|
259
|
-
describe
|
260
|
-
it
|
261
|
-
refute text_plain.eql?(
|
259
|
+
describe "#eql?" do
|
260
|
+
it "is not true for a non-MIME::Type" do
|
261
|
+
refute text_plain.eql?("text/plain")
|
262
262
|
end
|
263
263
|
|
264
|
-
it
|
264
|
+
it "is not true for a different MIME::Type" do
|
265
265
|
refute text_plain.eql?(image_jpeg)
|
266
266
|
end
|
267
267
|
|
268
|
-
it
|
269
|
-
assert text_plain, mime_type(
|
268
|
+
it "is true for an equivalent MIME::Type" do
|
269
|
+
assert text_plain, mime_type("text/Plain")
|
270
270
|
end
|
271
271
|
end
|
272
272
|
|
273
|
-
describe
|
274
|
-
it
|
275
|
-
assert_equal %w
|
276
|
-
assert_equal %w
|
273
|
+
describe "#extensions, #extensions=" do
|
274
|
+
it "returns an array of extensions" do
|
275
|
+
assert_equal %w[yaml yml], text_x_yaml.extensions
|
276
|
+
assert_equal %w[zip zp], x_appl_x_zip.extensions
|
277
277
|
end
|
278
278
|
|
279
|
-
it
|
280
|
-
text_x_yaml.extensions =
|
281
|
-
assert_equal %w
|
279
|
+
it "sets a single extension when provided a single value" do
|
280
|
+
text_x_yaml.extensions = "yaml"
|
281
|
+
assert_equal %w[yaml], text_x_yaml.extensions
|
282
282
|
end
|
283
283
|
|
284
|
-
it
|
285
|
-
text_x_yaml.extensions = %w
|
286
|
-
assert_equal %w
|
284
|
+
it "deduplicates extensions" do
|
285
|
+
text_x_yaml.extensions = %w[yaml yaml]
|
286
|
+
assert_equal %w[yaml], text_x_yaml.extensions
|
287
287
|
end
|
288
288
|
end
|
289
289
|
|
290
|
-
describe
|
291
|
-
it
|
290
|
+
describe "#add_extensions" do
|
291
|
+
it "does not modify extensions when provided nil" do
|
292
292
|
text_x_yaml.add_extensions(nil)
|
293
|
-
assert_equal %w
|
293
|
+
assert_equal %w[yaml yml], text_x_yaml.extensions
|
294
294
|
end
|
295
295
|
|
296
|
-
it
|
297
|
-
text_x_yaml.add_extensions(
|
298
|
-
assert_equal %w
|
299
|
-
text_x_yaml.add_extensions(%w
|
300
|
-
assert_equal %w
|
296
|
+
it "remains deduplicated with duplicate values" do
|
297
|
+
text_x_yaml.add_extensions("yaml")
|
298
|
+
assert_equal %w[yaml yml], text_x_yaml.extensions
|
299
|
+
text_x_yaml.add_extensions(%w[yaml yz])
|
300
|
+
assert_equal %w[yaml yml yz], text_x_yaml.extensions
|
301
301
|
end
|
302
302
|
end
|
303
303
|
|
304
|
-
describe
|
304
|
+
describe "#priority_compare" do
|
305
305
|
def assert_priority_less(left, right)
|
306
306
|
assert_equal(-1, left.priority_compare(right))
|
307
307
|
end
|
@@ -320,17 +320,17 @@ describe MIME::Type do
|
|
320
320
|
assert_priority_more right, left
|
321
321
|
end
|
322
322
|
|
323
|
-
let(:text_1) { mime_type(
|
324
|
-
let(:text_1p) { mime_type(
|
325
|
-
let(:text_2) { mime_type(
|
323
|
+
let(:text_1) { mime_type("text/1") }
|
324
|
+
let(:text_1p) { mime_type("text/1") }
|
325
|
+
let(:text_2) { mime_type("text/2") }
|
326
326
|
|
327
|
-
it
|
327
|
+
it "sorts (1) based on the simplified type" do
|
328
328
|
assert_priority text_1, text_1p, text_2
|
329
329
|
end
|
330
330
|
|
331
|
-
it
|
332
|
-
text_1.extensions = [
|
333
|
-
text_2.extensions = [
|
331
|
+
it "sorts (2) based on extensions" do
|
332
|
+
text_1.extensions = ["foo", "bar"]
|
333
|
+
text_2.extensions = ["foo"]
|
334
334
|
|
335
335
|
assert_priority_same text_1, text_2
|
336
336
|
|
@@ -339,272 +339,283 @@ describe MIME::Type do
|
|
339
339
|
assert_priority_more text_1, text_2
|
340
340
|
end
|
341
341
|
|
342
|
-
it
|
342
|
+
it "sorts (3) based on the registration state" do
|
343
343
|
text_1.registered = text_1p.registered = true
|
344
344
|
text_1b = mime_type(text_1) { |t| t.registered = false }
|
345
345
|
|
346
346
|
assert_priority text_1, text_1p, text_1b
|
347
347
|
end
|
348
348
|
|
349
|
-
it
|
350
|
-
text_1.extensions = text_1p.extensions =
|
349
|
+
it "sorts (4) based on the completeness" do
|
350
|
+
text_1.extensions = text_1p.extensions = "1"
|
351
351
|
text_1b = mime_type(text_1) { |t| t.extensions = nil }
|
352
352
|
|
353
353
|
assert_priority text_1, text_1p, text_1b
|
354
354
|
end
|
355
355
|
|
356
|
-
it
|
356
|
+
it "sorts (5) based on obsolete status" do
|
357
357
|
text_1.obsolete = text_1p.obsolete = false
|
358
358
|
text_1b = mime_type(text_1) { |t| t.obsolete = true }
|
359
359
|
|
360
360
|
assert_priority text_1, text_1p, text_1b
|
361
361
|
end
|
362
362
|
|
363
|
-
it
|
363
|
+
it "sorts (5) based on the use-instead value" do
|
364
364
|
text_1.obsolete = text_1p.obsolete = true
|
365
|
-
text_1.use_instead = text_1p.use_instead =
|
365
|
+
text_1.use_instead = text_1p.use_instead = "abc/xyz"
|
366
366
|
text_1b = mime_type(text_1) { |t| t.use_instead = nil }
|
367
367
|
|
368
368
|
assert_priority text_1, text_1p, text_1b
|
369
369
|
|
370
|
-
text_1b.use_instead =
|
370
|
+
text_1b.use_instead = "abc/zzz"
|
371
371
|
|
372
372
|
assert_priority text_1, text_1p, text_1b
|
373
373
|
end
|
374
374
|
end
|
375
375
|
|
376
|
-
describe
|
377
|
-
it
|
378
|
-
assert_equal
|
376
|
+
describe "#raw_media_type" do
|
377
|
+
it "extracts the media type as case-preserved" do
|
378
|
+
assert_equal "Text", mime_type("Text/plain").raw_media_type
|
379
379
|
end
|
380
380
|
|
381
|
-
it
|
382
|
-
assert_equal(
|
381
|
+
it "does not remove x- prefixes" do
|
382
|
+
assert_equal("x-appl", x_appl_x_zip.raw_media_type)
|
383
383
|
end
|
384
384
|
end
|
385
385
|
|
386
|
-
describe
|
387
|
-
it
|
388
|
-
assert_equal
|
386
|
+
describe "#media_type" do
|
387
|
+
it "extracts the media type as lowercase" do
|
388
|
+
assert_equal "text", text_plain.media_type
|
389
389
|
end
|
390
390
|
|
391
|
-
it
|
392
|
-
assert_equal(
|
391
|
+
it "does not remove x- prefixes" do
|
392
|
+
assert_equal("x-appl", x_appl_x_zip.media_type)
|
393
393
|
end
|
394
394
|
end
|
395
395
|
|
396
|
-
describe
|
397
|
-
it
|
398
|
-
assert_equal
|
396
|
+
describe "#raw_media_type" do
|
397
|
+
it "extracts the media type as case-preserved" do
|
398
|
+
assert_equal "Text", mime_type("Text/plain").raw_media_type
|
399
399
|
end
|
400
400
|
|
401
|
-
it
|
402
|
-
assert_equal(
|
401
|
+
it "does not remove x- prefixes" do
|
402
|
+
assert_equal("x-appl", x_appl_x_zip.raw_media_type)
|
403
403
|
end
|
404
404
|
end
|
405
405
|
|
406
|
-
describe
|
407
|
-
it
|
408
|
-
assert_equal
|
406
|
+
describe "#sub_type" do
|
407
|
+
it "extracts the sub type as lowercase" do
|
408
|
+
assert_equal "plain", text_plain.sub_type
|
409
409
|
end
|
410
410
|
|
411
|
-
it
|
412
|
-
assert_equal(
|
411
|
+
it "does not remove x- prefixes" do
|
412
|
+
assert_equal("x-zip", x_appl_x_zip.sub_type)
|
413
413
|
end
|
414
414
|
end
|
415
415
|
|
416
|
-
describe
|
417
|
-
it
|
418
|
-
assert_equal
|
416
|
+
describe "#raw_sub_type" do
|
417
|
+
it "extracts the sub type as case-preserved" do
|
418
|
+
assert_equal "Plain", mime_type("text/Plain").raw_sub_type
|
419
419
|
end
|
420
420
|
|
421
|
-
it
|
422
|
-
assert_equal(
|
421
|
+
it "does not remove x- prefixes" do
|
422
|
+
assert_equal("x-zip", x_appl_x_zip.raw_sub_type)
|
423
423
|
end
|
424
424
|
end
|
425
425
|
|
426
|
-
describe
|
427
|
-
let(:t) { mime_type(
|
426
|
+
describe "#to_h" do
|
427
|
+
let(:t) { mime_type("a/b") }
|
428
428
|
|
429
|
-
it
|
430
|
-
assert_has_keys t.to_h, %w
|
429
|
+
it "has the required keys (content-type, registered, encoding)" do
|
430
|
+
assert_has_keys t.to_h, %w[content-type registered encoding]
|
431
431
|
end
|
432
432
|
|
433
|
-
it
|
434
|
-
assert_has_keys mime_type(t) { |v| v.docs =
|
433
|
+
it "has the docs key if there are documents" do
|
434
|
+
assert_has_keys mime_type(t) { |v| v.docs = "a" }.to_h, %w[docs]
|
435
435
|
end
|
436
436
|
|
437
|
-
it
|
438
|
-
assert_has_keys mime_type(t) { |v| v.extensions =
|
439
|
-
|
437
|
+
it "has the extensions key if set" do
|
438
|
+
assert_has_keys mime_type(t) { |v| v.extensions = "a" }.to_h,
|
439
|
+
"extensions"
|
440
440
|
end
|
441
441
|
|
442
|
-
it
|
443
|
-
assert_has_keys mime_type(t) { |v| v.preferred_extension =
|
444
|
-
|
442
|
+
it "has the preferred-extension key if set" do
|
443
|
+
assert_has_keys mime_type(t) { |v| v.preferred_extension = "a" }.to_h,
|
444
|
+
"preferred-extension"
|
445
445
|
end
|
446
446
|
|
447
|
-
it
|
448
|
-
assert_has_keys mime_type(t) { |v| v.obsolete = true }.to_h,
|
447
|
+
it "has the obsolete key if set" do
|
448
|
+
assert_has_keys mime_type(t) { |v| v.obsolete = true }.to_h, "obsolete"
|
449
449
|
end
|
450
450
|
|
451
|
-
it
|
451
|
+
it "has the obsolete and use-instead keys if set" do
|
452
452
|
assert_has_keys mime_type(t) { |v|
|
453
453
|
v.obsolete = true
|
454
|
-
v.use_instead =
|
455
|
-
}.to_h, %w
|
454
|
+
v.use_instead = "c/d"
|
455
|
+
}.to_h, %w[obsolete use-instead]
|
456
456
|
end
|
457
457
|
|
458
|
-
it
|
459
|
-
assert_has_keys mime_type(t) { |v| v.signature = true }.to_h,
|
458
|
+
it "has the signature key if set" do
|
459
|
+
assert_has_keys mime_type(t) { |v| v.signature = true }.to_h, "signature"
|
460
460
|
end
|
461
461
|
end
|
462
462
|
|
463
|
-
describe
|
464
|
-
let(:
|
463
|
+
describe "#to_json" do
|
464
|
+
let(:expected_1) {
|
465
465
|
'{"content-type":"a/b","encoding":"base64","registered":false}'
|
466
466
|
}
|
467
|
+
let(:expected_2) {
|
468
|
+
'{"content-type":"a/b","encoding":"base64","registered":true,"provisional":true}'
|
469
|
+
}
|
467
470
|
|
468
|
-
it
|
469
|
-
assert_equal
|
471
|
+
it "converts to JSON when requested" do
|
472
|
+
assert_equal expected_1, mime_type("a/b").to_json
|
473
|
+
end
|
474
|
+
|
475
|
+
it "converts to JSON with provisional when requested" do
|
476
|
+
type = mime_type("a/b") do |t|
|
477
|
+
t.registered = true
|
478
|
+
t.provisional = true
|
479
|
+
end
|
480
|
+
assert_equal expected_2, type.to_json
|
470
481
|
end
|
471
482
|
end
|
472
483
|
|
473
|
-
describe
|
474
|
-
it
|
475
|
-
assert_equal
|
484
|
+
describe "#to_s, #to_str" do
|
485
|
+
it "represents itself as a string of the canonical content_type" do
|
486
|
+
assert_equal "text/plain", text_plain.to_s
|
476
487
|
end
|
477
488
|
|
478
|
-
it
|
479
|
-
assert_equal text_plain,
|
489
|
+
it "acts like a string of the canonical content_type for comparison" do
|
490
|
+
assert_equal text_plain, "text/plain"
|
480
491
|
end
|
481
492
|
|
482
|
-
it
|
483
|
-
assert_equal
|
493
|
+
it "acts like a string for other purposes" do
|
494
|
+
assert_equal "stringy", "text/plain".sub(text_plain, "stringy")
|
484
495
|
end
|
485
496
|
end
|
486
497
|
|
487
|
-
describe
|
498
|
+
describe "#xrefs, #xrefs=" do
|
488
499
|
let(:expected) {
|
489
|
-
MIME::Types::Container.new(
|
500
|
+
MIME::Types::Container.new("rfc" => Set["rfc1234", "rfc5678"])
|
490
501
|
}
|
491
502
|
|
492
|
-
it
|
503
|
+
it "returns the expected results" do
|
493
504
|
application_javascript.xrefs = {
|
494
|
-
|
505
|
+
"rfc" => %w[rfc5678 rfc1234 rfc1234]
|
495
506
|
}
|
496
507
|
|
497
508
|
assert_equal expected, application_javascript.xrefs
|
498
509
|
end
|
499
510
|
end
|
500
511
|
|
501
|
-
describe
|
512
|
+
describe "#xref_urls" do
|
502
513
|
let(:expected) {
|
503
514
|
[
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
|
515
|
+
"http://www.iana.org/go/draft1",
|
516
|
+
"http://www.iana.org/assignments/media-types/a/b",
|
517
|
+
"http://www.iana.org/assignments/media-types/media-types.xhtml#p-1",
|
518
|
+
"http://www.iana.org/go/rfc-1",
|
519
|
+
"http://www.rfc-editor.org/errata_search.php?eid=err-1",
|
520
|
+
"http://example.org",
|
521
|
+
"text"
|
511
522
|
]
|
512
523
|
}
|
513
524
|
|
514
525
|
let(:type) {
|
515
|
-
mime_type(
|
526
|
+
mime_type("a/b").tap do |t|
|
516
527
|
t.xrefs = {
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
|
528
|
+
"draft" => ["RFC1"],
|
529
|
+
"template" => ["a/b"],
|
530
|
+
"person" => ["p-1"],
|
531
|
+
"rfc" => ["rfc-1"],
|
532
|
+
"rfc-errata" => ["err-1"],
|
533
|
+
"uri" => ["http://example.org"],
|
534
|
+
"text" => ["text"]
|
524
535
|
}
|
525
536
|
end
|
526
537
|
}
|
527
538
|
|
528
|
-
it
|
539
|
+
it "translates according to given rules" do
|
529
540
|
assert_equal expected, type.xref_urls
|
530
541
|
end
|
531
542
|
end
|
532
543
|
|
533
|
-
describe
|
534
|
-
it
|
544
|
+
describe "#use_instead" do
|
545
|
+
it "is nil unless the type is obsolete" do
|
535
546
|
assert_nil text_plain.use_instead
|
536
547
|
end
|
537
548
|
|
538
|
-
it
|
549
|
+
it "is nil if not set and the type is obsolete" do
|
539
550
|
text_plain.obsolete = true
|
540
551
|
assert_nil text_plain.use_instead
|
541
552
|
end
|
542
553
|
|
543
|
-
it
|
554
|
+
it "is a different type if set and the type is obsolete" do
|
544
555
|
text_plain.obsolete = true
|
545
|
-
text_plain.use_instead =
|
546
|
-
assert_equal
|
556
|
+
text_plain.use_instead = "text/html"
|
557
|
+
assert_equal "text/html", text_plain.use_instead
|
547
558
|
end
|
548
559
|
end
|
549
560
|
|
550
|
-
describe
|
551
|
-
it
|
561
|
+
describe "#preferred_extension, #preferred_extension=" do
|
562
|
+
it "is nil when not set and there are no extensions" do
|
552
563
|
assert_nil text_plain.preferred_extension
|
553
564
|
end
|
554
565
|
|
555
|
-
it
|
556
|
-
assert_equal
|
566
|
+
it "is the first extension when not set but there are extensions" do
|
567
|
+
assert_equal "yaml", text_x_yaml.preferred_extension
|
557
568
|
end
|
558
569
|
|
559
|
-
it
|
560
|
-
text_x_yaml.preferred_extension =
|
561
|
-
assert_equal
|
570
|
+
it "is the extension provided when set" do
|
571
|
+
text_x_yaml.preferred_extension = "yml"
|
572
|
+
assert_equal "yml", text_x_yaml.preferred_extension
|
562
573
|
end
|
563
574
|
|
564
|
-
it
|
565
|
-
text_x_yaml.preferred_extension =
|
566
|
-
assert_equal
|
567
|
-
assert_includes text_x_yaml.extensions,
|
575
|
+
it "is adds the preferred extension if it does not exist" do
|
576
|
+
text_x_yaml.preferred_extension = "yz"
|
577
|
+
assert_equal "yz", text_x_yaml.preferred_extension
|
578
|
+
assert_includes text_x_yaml.extensions, "yz"
|
568
579
|
end
|
569
580
|
end
|
570
581
|
|
571
|
-
describe
|
572
|
-
it
|
573
|
-
assert_equal
|
582
|
+
describe "#friendly" do
|
583
|
+
it "returns English by default" do
|
584
|
+
assert_equal "YAML Structured Document", text_x_yaml.friendly
|
574
585
|
end
|
575
586
|
|
576
|
-
it
|
577
|
-
assert_equal
|
578
|
-
assert_equal
|
587
|
+
it "returns English when requested" do
|
588
|
+
assert_equal "YAML Structured Document", text_x_yaml.friendly("en")
|
589
|
+
assert_equal "YAML Structured Document", text_x_yaml.friendly(:en)
|
579
590
|
end
|
580
591
|
|
581
|
-
it
|
582
|
-
assert_nil text_x_yaml.friendly(
|
592
|
+
it "returns nothing for an unknown language" do
|
593
|
+
assert_nil text_x_yaml.friendly("zz")
|
583
594
|
end
|
584
595
|
|
585
|
-
it
|
586
|
-
expected = {
|
587
|
-
assert_equal expected, text_plain.friendly([
|
588
|
-
expected.update(
|
596
|
+
it "merges new values from an array parameter" do
|
597
|
+
expected = {"en" => "Text files"}
|
598
|
+
assert_equal expected, text_plain.friendly(["en", "Text files"])
|
599
|
+
expected.update("fr" => "des fichiers texte")
|
589
600
|
assert_equal expected,
|
590
|
-
|
601
|
+
text_plain.friendly(["fr", "des fichiers texte"])
|
591
602
|
end
|
592
603
|
|
593
|
-
it
|
594
|
-
expected = {
|
604
|
+
it "merges new values from a hash parameter" do
|
605
|
+
expected = {"en" => "Text files"}
|
595
606
|
assert_equal expected, text_plain.friendly(expected)
|
596
|
-
french = {
|
607
|
+
french = {"fr" => "des fichiers texte"}
|
597
608
|
expected.update(french)
|
598
609
|
assert_equal expected, text_plain.friendly(french)
|
599
610
|
end
|
600
611
|
|
601
|
-
it
|
612
|
+
it "raises an ArgumentError if an unknown value is provided" do
|
602
613
|
exception = assert_raises ArgumentError do
|
603
614
|
text_plain.friendly(1)
|
604
615
|
end
|
605
616
|
|
606
|
-
assert_equal
|
607
|
-
|
617
|
+
assert_equal "Expected a language or translation set, not 1",
|
618
|
+
exception.message
|
608
619
|
end
|
609
620
|
end
|
610
621
|
end
|