mime-types 2.99.3 → 3.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.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/.autotest +35 -0
  3. data/.gemtest +0 -0
  4. data/.gitignore +17 -0
  5. data/.hoerc +20 -0
  6. data/Code-of-Conduct.rdoc +27 -60
  7. data/Contributing.rdoc +0 -1
  8. data/History.rdoc +75 -36
  9. data/Licence.rdoc +2 -16
  10. data/Manifest.txt +10 -18
  11. data/README.rdoc +46 -46
  12. data/Rakefile +112 -58
  13. data/lib/mime-types.rb +0 -2
  14. data/lib/mime/type.rb +183 -415
  15. data/lib/mime/type/columnar.rb +27 -62
  16. data/lib/mime/types.rb +37 -135
  17. data/lib/mime/types/cache.rb +49 -73
  18. data/lib/mime/types/columnar.rb +42 -48
  19. data/lib/mime/types/container.rb +30 -0
  20. data/lib/mime/types/deprecations.rb +1 -22
  21. data/lib/mime/types/full.rb +17 -0
  22. data/lib/mime/types/loader.rb +10 -137
  23. data/lib/mime/types/logger.rb +2 -0
  24. data/lib/mime/types/registry.rb +81 -0
  25. data/support/benchmarks/load.rb +27 -26
  26. data/support/benchmarks/load_allocations.rb +14 -7
  27. data/support/benchmarks/object_counts.rb +6 -4
  28. data/support/profile/columnar.rb +5 -0
  29. data/support/profile/columnar_full.rb +5 -0
  30. data/support/profile/full.rb +5 -0
  31. data/test/minitest_helper.rb +3 -12
  32. data/test/test_mime_type.rb +461 -454
  33. data/test/test_mime_types.rb +126 -86
  34. data/test/test_mime_types_cache.rb +55 -45
  35. data/test/test_mime_types_class.rb +113 -97
  36. data/test/test_mime_types_lazy.rb +19 -23
  37. data/test/test_mime_types_loader.rb +5 -32
  38. metadata +67 -44
  39. data/History-Types.rdoc +0 -454
  40. data/data/mime-types.json +0 -1
  41. data/data/mime.content_type.column +0 -1980
  42. data/data/mime.docs.column +0 -1980
  43. data/data/mime.encoding.column +0 -1980
  44. data/data/mime.friendly.column +0 -1980
  45. data/data/mime.obsolete.column +0 -1980
  46. data/data/mime.registered.column +0 -1980
  47. data/data/mime.signature.column +0 -1980
  48. data/data/mime.use_instead.column +0 -1980
  49. data/data/mime.xrefs.column +0 -1980
  50. data/docs/COPYING.txt +0 -339
  51. data/docs/artistic.txt +0 -127
  52. data/lib/mime/types/loader_path.rb +0 -15
  53. data/support/apache_mime_types.rb +0 -108
  54. data/support/convert.rb +0 -158
  55. data/support/convert/columnar.rb +0 -88
  56. data/support/iana_registry.rb +0 -172
@@ -3,119 +3,159 @@
3
3
  require 'mime/types'
4
4
  require 'minitest_helper'
5
5
 
6
- class TestMIMETypes < Minitest::Test
7
- def setup
8
- @mime_types = MIME::Types.new
9
- @mime_types.add(MIME::Type.new(['text/plain', %w(txt)]),
10
- MIME::Type.new(['image/jpeg', %w(jpg jpeg)]),
11
- MIME::Type.new('application/x-wordperfect6.1'),
12
- MIME::Type.new('content-type' => 'application/x-www-form-urlencoded', 'registered' => true),
13
- MIME::Type.new(['application/x-gzip', %w(gz)]),
14
- MIME::Type.new(['application/gzip', %w(gz)]))
6
+ describe MIME::Types do
7
+ def mime_types
8
+ @mime_types ||= MIME::Types.new.tap do |mt|
9
+ mt.add MIME::Type.new(['text/plain', %w(txt)]),
10
+ MIME::Type.new(['image/jpeg', %w(jpg jpeg)]),
11
+ MIME::Type.new('application/x-wordperfect6.1'),
12
+ MIME::Type.new(
13
+ 'content-type' => 'application/x-www-form-urlencoded',
14
+ 'registered' => true
15
+ ),
16
+ MIME::Type.new(['application/x-gzip', %w(gz)]),
17
+ MIME::Type.new(
18
+ 'content-type' => 'application/gzip',
19
+ 'extensions' => 'gz',
20
+ 'registered' => true
21
+ )
22
+ end
15
23
  end
16
24
 
17
- def test_enumerable
18
- assert(@mime_types.any? { |type| type.content_type == 'text/plain' })
19
- assert_kind_of(Enumerator, @mime_types.each)
20
- assert_equal(6, @mime_types.each.count)
21
- end
25
+ describe 'is enumerable' do
26
+ it 'correctly uses an Enumerable method like #any?' do
27
+ assert mime_types.any? { |type| type.content_type == 'text/plain' }
28
+ end
22
29
 
23
- def test_index_with_mime_type
24
- xtxp = MIME::Type.new('x-text/x-plain')
25
- assert_includes(@mime_types[xtxp], 'text/plain')
26
- assert_equal(1, @mime_types[xtxp].size)
27
- end
30
+ it 'implements each with no parameters to return an Enumerator' do
31
+ assert_kind_of Enumerator, mime_types.each
32
+ assert_kind_of Enumerator, mime_types.map
33
+ end
28
34
 
29
- def test_index_with_regex
30
- assert_includes(@mime_types[/plain/], 'text/plain')
31
- assert_equal(1, @mime_types[/plain/].size)
32
- end
35
+ it 'will create a lazy enumerator' do
36
+ assert_kind_of Enumerator::Lazy, mime_types.lazy
37
+ assert_kind_of Enumerator::Lazy, mime_types.map.lazy
38
+ end
33
39
 
34
- def test_index_with_string
35
- assert_includes(@mime_types['text/plain'], 'text/plain')
36
- assert_equal(1, @mime_types['text/plain'].size)
40
+ it 'is countable with an enumerator' do
41
+ assert_equal 6, mime_types.each.count
42
+ assert_equal 6, mime_types.lazy.count
43
+ end
37
44
  end
38
45
 
39
- def test_index_with_complete_flag
40
- assert_empty(@mime_types['text/vnd.fly', complete: true])
41
- refute_empty(@mime_types['text/plain', complete: true])
42
- end
46
+ describe '#\[]' do
47
+ it 'can be searched with a MIME::Type' do
48
+ text_plain = MIME::Type.new('text/plain')
49
+ assert_includes mime_types[text_plain], 'text/plain'
50
+ assert_equal 1, mime_types[text_plain].size
51
+ end
43
52
 
44
- def test_index_with_registered_flag
45
- assert_empty(@mime_types['application/x-wordperfect6.1',
46
- registered: true])
47
- refute_empty(@mime_types['application/x-www-form-urlencoded',
48
- registered: true])
49
- refute_empty(@mime_types['application/gzip', registered: true])
50
- refute_equal(@mime_types['application/gzip'].size,
51
- @mime_types['application/gzip', registered: true])
52
- end
53
+ it 'can be searched with a regular expression' do
54
+ assert_includes mime_types[/plain$/], 'text/plain'
55
+ assert_equal 1, mime_types[/plain$/].size
56
+ end
53
57
 
54
- def test_index_with_platform_flag
55
- assert_deprecated('MIME::Types#[]', 'using the :platform flag') do
56
- refute_empty MIME::Types['text/plain', platform: true]
58
+ it 'sorts by priority with multiple matches' do
59
+ assert_equal %w(application/gzip application/x-gzip), mime_types[/gzip$/]
60
+ assert_equal 2, mime_types[/gzip$/].size
57
61
  end
58
- end
59
62
 
60
- def test_add
61
- eruby = MIME::Type.new('application/x-eruby') do |t|
62
- t.extensions = 'rhtml'
63
- t.encoding = '8bit'
63
+ it 'can be searched with a string' do
64
+ assert_includes mime_types['text/plain'], 'text/plain'
65
+ assert_equal 1, mime_types['text/plain'].size
64
66
  end
65
67
 
66
- @mime_types.add(eruby)
68
+ it 'can be searched with the complete flag' do
69
+ assert_empty mime_types[
70
+ 'application/x-www-form-urlencoded',
71
+ complete: true
72
+ ]
73
+ assert_includes mime_types['text/plain', complete: true], 'text/plain'
74
+ assert_equal 1, mime_types['text/plain', complete: true].size
75
+ end
67
76
 
68
- assert_equal(@mime_types['application/x-eruby'], [eruby])
77
+ it 'can be searched with the registered flag' do
78
+ assert_empty mime_types['application/x-wordperfect6.1', registered: true]
79
+ refute_empty mime_types[
80
+ 'application/x-www-form-urlencoded',
81
+ registered: true
82
+ ]
83
+ refute_empty mime_types[/gzip/, registered: true]
84
+ refute_equal mime_types[/gzip/], mime_types[/gzip/, registered: true]
85
+ end
69
86
  end
70
87
 
71
- def test_type_for
72
- assert_equal(%w(application/gzip application/x-gzip),
73
- @mime_types.type_for('gz'))
74
- assert_equal(%w(image/jpeg), MIME::Types.of('foo.jpeg'))
75
- assert_equal(%w(image/jpeg text/plain),
76
- MIME::Types.type_for(%w(foo.txt foo.jpeg)))
77
- assert_deprecated('MIME::Types#type_for', 'using the platform parameter') do
78
- assert_equal(@mime_types.of('gif', true), @mime_types['image/gif'])
88
+ describe '#add' do
89
+ let(:eruby) { MIME::Type.new('application/x-eruby') }
90
+ let(:jinja) { MIME::Type.new('application/jinja2' )}
91
+
92
+ it 'successfully adds a new type' do
93
+ mime_types.add(eruby)
94
+ assert_equal mime_types['application/x-eruby'], [ eruby ]
79
95
  end
80
- assert_empty(MIME::Types.type_for('coverallsjson'))
81
- assert_deprecated('MIME::Types#type_for', 'using the platform parameter') do
82
- assert_equal @mime_types.type_for('jpeg', true), @mime_types['image/jpeg']
96
+
97
+ it 'complains about adding a duplicate type' do
98
+ mime_types.add(eruby)
99
+ assert_output '', /is already registered as a variant/ do
100
+ mime_types.add(eruby)
101
+ end
102
+ assert_equal mime_types['application/x-eruby'], [eruby]
83
103
  end
84
- assert_empty(@mime_types.type_for('zzz'))
85
- end
86
104
 
87
- def test_count
88
- assert_equal(6, @mime_types.count)
89
- end
105
+ it 'does not complain about adding a duplicate type when quiet' do
106
+ mime_types.add(eruby)
107
+ assert_output '', '' do
108
+ mime_types.add(eruby, :silent)
109
+ end
110
+ assert_equal mime_types['application/x-eruby'], [ eruby ]
111
+ end
90
112
 
91
- # This tests the instance implementation through the class implementation.
92
- def test_add_type_variant
93
- xtxp = MIME::Type.new('x-text/x-plain')
94
- assert_deprecated('MIME::Types#add_type_variant', 'and will be private') do
95
- @mime_types.add_type_variant(xtxp)
113
+ it 'successfully adds from an array' do
114
+ mime_types.add([ eruby, jinja ])
115
+ assert_equal mime_types['application/x-eruby'], [ eruby ]
116
+ assert_equal mime_types['application/jinja2'], [ jinja ]
96
117
  end
97
- assert_includes(@mime_types['text/plain'], xtxp)
98
- end
99
118
 
100
- def test_data_version
101
- assert_equal(MIME::Type::VERSION, @mime_types.data_version)
102
- end
119
+ it 'successfully adds from another MIME::Types' do
120
+ mt = MIME::Types.new
121
+ mt.add(mime_types)
122
+ assert_equal mime_types.count, mt.count
103
123
 
104
- # This tests the instance implementation through the class implementation.
105
- def test_index_extensions
106
- xtxp = MIME::Type.new(['x-text/x-plain', %w(tzt)])
107
- assert_deprecated('MIME::Types#index_extensions', 'and will be private') do
108
- @mime_types.index_extensions(xtxp)
124
+ mime_types.each do |type|
125
+ assert_equal mt[type.content_type], [ type ]
126
+ end
109
127
  end
110
- assert_includes(@mime_types.of('tzt'), xtxp)
111
128
  end
112
129
 
113
- def test_defined_types
114
- assert_deprecated('MIME::Types#defined_types') do
115
- assert_empty(MIME::Types.new.defined_types)
130
+ describe '#type_for' do
131
+ it 'finds all types for a given extension' do
132
+ assert_equal %w(application/gzip application/x-gzip),
133
+ mime_types.type_for('gz')
134
+ end
135
+
136
+ it 'separates the extension from filenames' do
137
+ assert_equal %w(image/jpeg), mime_types.of(['foo.jpeg', 'bar.jpeg'])
116
138
  end
117
- assert_deprecated('MIME::Types#defined_types') do
118
- refute_empty(@mime_types.defined_types)
139
+
140
+ it 'finds multiple extensions' do
141
+ assert_equal %w(image/jpeg text/plain),
142
+ mime_types.type_for(%w(foo.txt foo.jpeg))
143
+ end
144
+
145
+ it 'does not find unknown extensions' do
146
+ assert_empty mime_types.type_for('zzz')
147
+ end
148
+
149
+ it 'modifying type extensions causes reindexing' do
150
+ plain_text = mime_types['text/plain'].first
151
+ plain_text.add_extensions('xtxt')
152
+ assert_includes mime_types.type_for('xtxt'), 'text/plain'
153
+ end
154
+ end
155
+
156
+ describe '#count' do
157
+ it 'can count the number of types inside' do
158
+ assert_equal 6, mime_types.count
119
159
  end
120
160
  end
121
161
  end
@@ -3,7 +3,7 @@
3
3
  require 'mime/types'
4
4
  require 'minitest_helper'
5
5
 
6
- class TestMIMETypesCache < Minitest::Test
6
+ describe MIME::Types::Cache do
7
7
  def setup
8
8
  require 'fileutils'
9
9
  @cache_file = File.expand_path('../cache.tst', __FILE__)
@@ -25,66 +25,76 @@ class TestMIMETypesCache < Minitest::Test
25
25
  FileUtils.rm @cache_file if File.exist? @cache_file
26
26
  end
27
27
 
28
- def test_does_not_use_cache_when_unset
29
- ENV.delete('RUBY_MIME_TYPES_CACHE')
30
- assert_equal(nil, MIME::Types::Cache.load)
31
- end
28
+ describe '.load' do
29
+ it 'does not use cache when RUBY_MIME_TYPES_CACHE is unset' do
30
+ ENV.delete('RUBY_MIME_TYPES_CACHE')
31
+ assert_equal(nil, MIME::Types::Cache.load)
32
+ end
32
33
 
33
- def test_does_not_use_cache_when_missing
34
- assert_equal(nil, MIME::Types::Cache.load)
35
- end
34
+ it 'does not use cache when missing' do
35
+ assert_equal(nil, MIME::Types::Cache.load)
36
+ end
36
37
 
37
- def test_does_not_create_cache_when_unset
38
- ENV.delete('RUBY_MIME_TYPES_CACHE')
39
- assert_equal(nil, MIME::Types::Cache.save)
40
- end
38
+ it 'outputs an error when there is an invalid version' do
39
+ v = MIME::Types::Data::VERSION.dup
40
+ MIME::Types::Data::VERSION.gsub!(/.*/, '0.0')
41
+ MIME::Types::Cache.save
42
+ MIME::Types::Data::VERSION.gsub!(/.*/, v)
43
+ MIME::Types.instance_variable_set(:@__types__, nil)
44
+ assert_output '', /MIME::Types cache: invalid version/ do
45
+ MIME::Types['text/html']
46
+ end
47
+ end
41
48
 
42
- def test_creates_cache
43
- assert_equal(false, File.exist?(@cache_file))
44
- MIME::Types::Cache.save
45
- assert_equal(true, File.exist?(@cache_file))
49
+ it 'outputs an error when there is a marshal file incompatibility' do
50
+ MIME::Types::Cache.save
51
+ data = File.binread(@cache_file).reverse
52
+ File.open(@cache_file, 'wb') { |f| f.write(data) }
53
+ MIME::Types.instance_variable_set(:@__types__, nil)
54
+ assert_output '', /incompatible marshal file format/ do
55
+ MIME::Types['text/html']
56
+ end
57
+ end
46
58
  end
47
59
 
48
- def test_uses_cache
49
- MIME::Types['text/html'].first.extensions << 'hex'
50
- MIME::Types::Cache.save
51
- MIME::Types.instance_variable_set(:@__types__, nil)
60
+ describe '.save' do
61
+ it 'does not create cache when RUBY_MIME_TYPES_CACHE is unset' do
62
+ ENV.delete('RUBY_MIME_TYPES_CACHE')
63
+ assert_equal(nil, MIME::Types::Cache.save)
64
+ end
52
65
 
53
- assert_includes(MIME::Types['text/html'].first.extensions, 'hex')
66
+ it 'creates the cache ' do
67
+ assert_equal(false, File.exist?(@cache_file))
68
+ MIME::Types::Cache.save
69
+ assert_equal(true, File.exist?(@cache_file))
70
+ end
54
71
 
55
- reset_mime_types
56
- end
72
+ it 'uses the cache' do
73
+ MIME::Types['text/html'].first.add_extensions('hex')
74
+ MIME::Types::Cache.save
75
+ MIME::Types.instance_variable_set(:@__types__, nil)
57
76
 
58
- def test_load_different_version
59
- v = MIME::Types::VERSION.dup
60
- MIME::Types::VERSION.gsub!(/.*/, '0.0')
61
- MIME::Types::Cache.save
62
- MIME::Types::VERSION.gsub!(/.*/, v)
63
- MIME::Types.instance_variable_set(:@__types__, nil)
64
- assert_output(nil, /MIME::Types cache: invalid version/) do
65
- MIME::Types['text/html']
66
- end
67
- end
77
+ assert_includes MIME::Types['text/html'].first.extensions, 'hex'
68
78
 
69
- def test_cache_load_failure
70
- MIME::Types::Cache.save
71
- data = File.binread(@cache_file).reverse
72
- File.open(@cache_file, 'wb') { |f| f.write(data) }
73
- MIME::Types.instance_variable_set(:@__types__, nil)
74
- assert_output(nil, /Could not load MIME::Types cache: incompatible marshal file format/) do
75
- MIME::Types['text/html']
79
+ reset_mime_types
76
80
  end
77
81
  end
82
+ end
78
83
 
79
- def test_container_marshalling
84
+ describe MIME::Types::Container do
85
+ it 'marshals and unmarshals correctly' do
80
86
  container = MIME::Types::Container.new
81
- # default proc should return []
82
- assert_equal([], container['abc'])
87
+ container['xyz'] << 'abc'
88
+
89
+ # default proc should return Set[]
90
+ assert_equal(Set[], container['abc'])
91
+ assert_equal(Set['abc'], container['xyz'])
83
92
 
84
93
  marshalled = Marshal.dump(container)
85
94
  loaded_container = Marshal.load(marshalled)
86
95
 
87
- # default proc should still return []
88
- assert_equal([], loaded_container['abcd'])
96
+ # default proc should still return Set[]
97
+ assert_equal(Set[], loaded_container['abc'])
98
+ assert_equal(Set['abc'], container['xyz'])
89
99
  end
90
100
  end
@@ -3,137 +3,153 @@
3
3
  require 'mime/types'
4
4
  require 'minitest_helper'
5
5
 
6
- class TestMIMETypesQueryClassMethods < Minitest::Test
6
+ describe MIME::Types, 'registry' do
7
7
  def setup
8
8
  MIME::Types.send(:load_default_mime_types)
9
9
  end
10
10
 
11
- def test_enumerable
12
- assert(MIME::Types.any? { |type| type.content_type == 'text/plain' })
13
- assert_kind_of(Enumerator, MIME::Types.each)
14
- assert(MIME::Types.each.count > 999)
15
- end
11
+ describe 'is enumerable' do
12
+ it 'correctly uses an Enumerable method like #any?' do
13
+ assert MIME::Types.any? { |type| type.content_type == 'text/plain' }
14
+ end
16
15
 
17
- def test_load_from_file
18
- fn = File.expand_path('../fixture/old-data', __FILE__)
19
- assert_deprecated('MIME::Types.load_from_file') do
20
- MIME::Types.load_from_file(fn)
16
+ it 'implements each with no parameters to return an Enumerator' do
17
+ assert_kind_of Enumerator, MIME::Types.each
18
+ assert_kind_of Enumerator, MIME::Types.map
21
19
  end
22
- end
23
20
 
24
- def test_index_with_mime_type
25
- xtxp = MIME::Type.new('x-text/x-plain')
26
- assert_includes(MIME::Types[xtxp], 'text/plain')
27
- assert_equal(1, MIME::Types[xtxp].size)
28
- end
21
+ it 'will create a lazy enumerator' do
22
+ assert_kind_of Enumerator::Lazy, MIME::Types.lazy
23
+ assert_kind_of Enumerator::Lazy, MIME::Types.map.lazy
24
+ end
29
25
 
30
- def test_index_with_regex
31
- assert_includes(MIME::Types[/plain/], 'text/plain')
32
- assert_equal(1, MIME::Types[/plain/].size)
26
+ it 'is countable with an enumerator' do
27
+ assert MIME::Types.each.count > 999
28
+ assert MIME::Types.lazy.count > 999
29
+ end
33
30
  end
34
31
 
35
- def test_index_with_string
36
- assert_includes(MIME::Types['text/plain'], 'text/plain')
37
- assert_equal(1, MIME::Types['text/plain'].size)
38
- end
32
+ describe '.\[]' do
33
+ it 'can be searched with a MIME::Type' do
34
+ text_plain = MIME::Type.new('text/plain')
35
+ assert_includes MIME::Types[text_plain], 'text/plain'
36
+ assert_equal 1, MIME::Types[text_plain].size
37
+ end
39
38
 
40
- def test_index_with_complete_flag
41
- assert_empty(MIME::Types['application/1d-interleaved-parityfec', complete: true])
42
- refute_empty(MIME::Types['text/plain', complete: true])
43
- end
39
+ it 'can be searched with a regular expression' do
40
+ assert_includes MIME::Types[/plain$/], 'text/plain'
41
+ assert_equal 1, MIME::Types[/plain$/].size
42
+ end
44
43
 
45
- def test_index_with_registered_flag
46
- assert_empty(MIME::Types['application/x-wordperfect6.1',
47
- registered: true])
48
- refute_empty(MIME::Types['application/x-www-form-urlencoded',
49
- registered: true])
50
- refute_empty(MIME::Types['application/gzip', registered: true])
51
- refute_equal(MIME::Types['application/gzip'].size,
52
- MIME::Types['application/gzip', registered: true])
53
- end
44
+ it 'sorts by priority with multiple matches' do
45
+ assert_equal %w(application/gzip application/x-gzip multipart/x-gzip),
46
+ MIME::Types[/gzip$/]
47
+ assert_equal 3, MIME::Types[/gzip$/].size
48
+ end
54
49
 
55
- def test_index_with_platform_flag
56
- assert_deprecated('MIME::Types#[]', 'using the :platform flag') do
57
- refute_empty MIME::Types['text/plain', platform: true]
50
+ it 'can be searched with a string' do
51
+ assert_includes MIME::Types['text/plain'], 'text/plain'
52
+ assert_equal 1, MIME::Types['text/plain'].size
58
53
  end
59
- end
60
54
 
61
- def test_type_for
62
- assert_equal(%w(application/xml text/xml), MIME::Types.type_for('xml'))
63
- assert_equal(%w(image/gif), MIME::Types.of('foo.gif'))
64
- assert_equal(%w(application/xml image/gif text/xml),
65
- MIME::Types.type_for(%w(xml gif)))
66
- assert_deprecated('MIME::Types#type_for', 'using the platform parameter') do
67
- refute_empty MIME::Types.type_for('gif', true)
55
+ it 'can be searched with the complete flag' do
56
+ assert_empty MIME::Types[
57
+ 'application/x-www-form-urlencoded',
58
+ complete: true
59
+ ]
60
+ assert_includes MIME::Types['text/plain', complete: true], 'text/plain'
61
+ assert_equal 1, MIME::Types['text/plain', complete: true].size
68
62
  end
69
- assert_empty(MIME::Types.type_for('zzz'))
70
- end
71
63
 
72
- def test_count
73
- assert(MIME::Types.count.nonzero?,
74
- 'A lot of types are expected to be known.')
64
+ it 'can be searched with the registered flag' do
65
+ assert_empty MIME::Types['application/x-wordperfect6.1', registered: true]
66
+ refute_empty MIME::Types[
67
+ 'application/x-www-form-urlencoded',
68
+ registered: true
69
+ ]
70
+ refute_empty MIME::Types[/gzip/, registered: true]
71
+ refute_equal MIME::Types[/gzip/], MIME::Types[/gzip/, registered: true]
72
+ end
75
73
  end
76
74
 
77
- def test_cache_file
78
- ENV['RUBY_MIME_TYPES_CACHE'] = 'foo'
79
- assert_deprecated('MIME::Types.cache_file') do
80
- assert_equal('foo', MIME::Types.cache_file)
75
+ describe '.type_for' do
76
+ it 'finds all types for a given extension' do
77
+ assert_equal %w(application/gzip application/x-gzip),
78
+ MIME::Types.type_for('gz')
81
79
  end
82
- ENV.delete('RUBY_MIME_TYPES_CACHE')
83
- assert_deprecated('MIME::Types.cache_file') do
84
- assert_nil(MIME::Types.cache_file)
80
+
81
+ it 'separates the extension from filenames' do
82
+ assert_equal %w(image/jpeg), MIME::Types.of(['foo.jpeg', 'bar.jpeg'])
85
83
  end
86
- end
87
- end
88
84
 
89
- class TestMIMETypesClassMethods < Minitest::Test
90
- def setup
91
- MIME::Types.instance_variable_set(:@__types__, nil)
92
- MIME::Types.send(:load_default_mime_types)
93
- end
85
+ it 'finds multiple extensions' do
86
+ assert_equal %w(image/jpeg text/plain),
87
+ MIME::Types.type_for(%w(foo.txt foo.jpeg))
88
+ end
94
89
 
95
- def test_add_with_type
96
- MIME::Types.add(MIME::Type.new('application/x-eruby'))
97
- refute_empty(MIME::Types['application/x-eruby'])
98
- end
90
+ it 'does not find unknown extensions' do
91
+ assert_empty MIME::Types.type_for('zzz')
92
+ end
99
93
 
100
- def test_add_with_types
101
- mt = MIME::Types.new
102
- mt.add MIME::Type.new('application/x-eruby')
103
- MIME::Types.add(mt)
104
- refute_empty(MIME::Types['application/x-eruby'])
94
+ it 'modifying type extensions causes reindexing' do
95
+ plain_text = MIME::Types['text/plain'].first
96
+ plain_text.add_extensions('xtxt')
97
+ assert_includes MIME::Types.type_for('xtxt'), 'text/plain'
98
+ end
105
99
  end
106
100
 
107
- def test_add_with_array
108
- MIME::Types.add([MIME::Type.new('application/x-eruby')])
109
- refute_empty(MIME::Types['application/x-eruby'])
101
+ describe '.count' do
102
+ it 'can count the number of types inside' do
103
+ assert MIME::Types.count > 999
104
+ end
110
105
  end
111
106
 
112
- def test_add_with_noise_suppression
113
- assert_silent do
114
- MIME::Types.add(MIME::Type.new('application/x-eruby'))
107
+ describe '.add' do
108
+ def setup
109
+ MIME::Types.instance_variable_set(:@__types__, nil)
110
+ MIME::Types.send(:load_default_mime_types)
111
+ end
112
+
113
+ let(:eruby) { MIME::Type.new('application/x-eruby') }
114
+ let(:jinja) { MIME::Type.new('application/jinja2' )}
115
+
116
+ it 'successfully adds a new type' do
117
+ MIME::Types.add(eruby)
118
+ assert_equal MIME::Types['application/x-eruby'], [ eruby ]
115
119
  end
116
- assert_output(nil, %r{application/x-eruby is already registered}) do
117
- MIME::Types.add(MIME::Type.new('application/x-eruby'))
120
+
121
+ it 'complains about adding a duplicate type' do
122
+ MIME::Types.add(eruby)
123
+ assert_output '', /is already registered as a variant/ do
124
+ MIME::Types.add(eruby)
125
+ end
126
+ assert_equal MIME::Types['application/x-eruby'], [eruby]
118
127
  end
119
- assert_silent do
120
- MIME::Types.add(MIME::Type.new('application/x-eruby'), :silent)
128
+
129
+ it 'does not complain about adding a duplicate type when quiet' do
130
+ MIME::Types.add(eruby)
131
+ assert_silent do
132
+ MIME::Types.add(eruby, :silent)
133
+ end
134
+ assert_equal MIME::Types['application/x-eruby'], [ eruby ]
121
135
  end
122
- end
123
136
 
124
- def test_add_type_variant
125
- xtxp = MIME::Type.new('x-text/x-plain')
126
- assert_deprecated('MIME::Types#add_type_variant', 'and will be private') do
127
- MIME::Types.add_type_variant(xtxp)
137
+ it 'successfully adds from an array' do
138
+ MIME::Types.add([ eruby, jinja ])
139
+ assert_equal MIME::Types['application/x-eruby'], [ eruby ]
140
+ assert_equal MIME::Types['application/jinja2'], [ jinja ]
128
141
  end
129
- assert_includes(MIME::Types['text/plain'], xtxp)
130
- end
131
142
 
132
- def test_index_extensions
133
- xtxp = MIME::Type.new(['x-text/x-plain', %w(tzt)])
134
- assert_deprecated('MIME::Types#index_extensions', 'and will be private') do
135
- MIME::Types.index_extensions(xtxp)
143
+ it 'successfully adds from another MIME::Types' do
144
+ old_count = MIME::Types.count
145
+
146
+ mt = MIME::Types.new
147
+ mt.add(eruby)
148
+
149
+ MIME::Types.add(mt)
150
+ assert_equal old_count + 1, MIME::Types.count
151
+
152
+ assert_equal MIME::Types[eruby.content_type], [ eruby ]
136
153
  end
137
- assert_includes(MIME::Types.of('tzt'), xtxp)
138
154
  end
139
155
  end