File: mimemagic_test.rb

package info (click to toggle)
ruby-mimemagic 0.3.5%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 352 kB
  • sloc: ruby: 2,440; makefile: 4
file content (160 lines) | stat: -rw-r--r-- 7,270 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
require 'minitest/autorun'
require 'mimemagic'
require 'stringio'
require 'forwardable'

class TestMimeMagic < Minitest::Test
  # Do deep copy for constants of initial state.
  INIT_EXTENSIONS = Marshal.load(Marshal.dump(MimeMagic::EXTENSIONS))
  INIT_TYPES = Marshal.load(Marshal.dump(MimeMagic::TYPES))
  INIT_MAGIC = Marshal.load(Marshal.dump(MimeMagic::MAGIC))

  def setup
    extentions = Marshal.load(Marshal.dump(INIT_EXTENSIONS))
    types = Marshal.load(Marshal.dump(INIT_TYPES))
    magic = Marshal.load(Marshal.dump(INIT_MAGIC))
    MimeMagic.send(:remove_const, :EXTENSIONS) if MimeMagic.const_defined?(:EXTENSIONS)
    MimeMagic.send(:remove_const, :TYPES) if MimeMagic.const_defined?(:TYPES)
    MimeMagic.send(:remove_const, :MAGIC) if MimeMagic.const_defined?(:MAGIC)
    MimeMagic.const_set('EXTENSIONS', extentions)
    MimeMagic.const_set('TYPES', types)
    MimeMagic.const_set('MAGIC', magic)
  end

  def test_have_type_mediatype_and_subtype
    assert_equal 'text/html', MimeMagic.new('text/html').type
    assert_equal 'text', MimeMagic.new('text/html').mediatype
    assert_equal 'html', MimeMagic.new('text/html').subtype
  end

  def test_have_mediatype_helpers
    assert MimeMagic.new('text/plain').text?
    assert MimeMagic.new('text/html').text?
    assert MimeMagic.new('application/xhtml+xml').text?
    refute MimeMagic.new('application/octet-stream').text?
    refute MimeMagic.new('image/png').text?
    assert MimeMagic.new('image/png').image?
    assert MimeMagic.new('video/ogg').video?
    assert MimeMagic.new('audio/mpeg').audio?
  end

  def test_have_hierarchy
    assert MimeMagic.new('text/html').child_of?('text/plain')
    assert MimeMagic.new('text/x-java').child_of?('text/plain')
  end

  def test_have_extensions
    assert_equal ["htm", "html"].sort, MimeMagic.new('text/html').extensions.sort
  end

  def test_have_comment
    assert_equal 'HTML document', MimeMagic.new('text/html').comment
  end

  def test_recognize_extensions
    assert_equal 'text/html', MimeMagic.by_extension('.html').to_s
    assert_equal 'text/html', MimeMagic.by_extension('html').to_s
    assert_equal 'text/html', MimeMagic.by_extension(:html).to_s
    assert_equal 'application/x-ruby', MimeMagic.by_extension('rb').to_s
    assert_nil MimeMagic.by_extension('crazy')
    assert_nil MimeMagic.by_extension('')
  end

  def test_recognize_by_a_path
    assert_equal 'text/html', MimeMagic.by_path('/adsjkfa/kajsdfkadsf/kajsdfjasdf.html').to_s
    assert_equal 'text/html', MimeMagic.by_path('something.html').to_s
    assert_equal 'application/x-ruby', MimeMagic.by_path('wtf.rb').to_s
    assert_nil MimeMagic.by_path('where/am.html/crazy')
    assert_nil MimeMagic.by_path('')
  end

  def test_recognize_xlsx_as_zip_without_magic
    file = "test/files/application.vnd.openxmlformats-officedocument.spreadsheetml.sheet"
    %w(msoffice rubyxl gdocs).each do |variant|
      file = "test/files/application.vnd.openxmlformats-officedocument.spreadsheetml{#{variant}}.sheet"
      assert_equal "application/zip", MimeMagic.by_magic(File.read(file)).to_s
      assert_equal "application/zip", MimeMagic.by_magic(File.open(file, 'rb')).to_s
    end
  end

  def test_recognize_by_magic
    load "mimemagic/overlay.rb"
    Dir['test/files/*'].each do |file|
      mime = file[11..-1].sub('.', '/').sub(/\{\w+\}/, '')
      assert_equal mime, MimeMagic.by_magic(File.read(file)).to_s
      assert_equal mime, MimeMagic.by_magic(File.open(file, 'rb')).to_s
    end
  end

  def test_recognize_all_by_magic
    load 'mimemagic/overlay.rb'
    %w(msoffice rubyxl gdocs).each do |variant|
      file = "test/files/application.vnd.openxmlformats-officedocument.spreadsheetml{#{variant}}.sheet"
      mimes = %w[application/vnd.openxmlformats-officedocument.spreadsheetml.sheet application/zip]
      assert_equal mimes, MimeMagic.all_by_magic(File.read(file)).map(&:type)
    end
  end

  def test_have_add
    MimeMagic.add('application/mimemagic-test',
                  extensions: %w(ext1 ext2),
                  parents: 'application/xml',
                  comment: 'Comment')
    assert_equal 'application/mimemagic-test', MimeMagic.by_extension('ext1').to_s
    assert_equal 'application/mimemagic-test', MimeMagic.by_extension('ext2').to_s
    assert_equal 'Comment', MimeMagic.by_extension('ext2').comment
    assert_equal %w(ext1 ext2), MimeMagic.new('application/mimemagic-test').extensions
    assert MimeMagic.new('application/mimemagic-test').child_of?('text/plain')
  end

  def test_process_magic
    MimeMagic.add('application/mimemagic-test',
                  magic: [[0, 'MAGICTEST'], # MAGICTEST at position 0
                             [1, 'MAGICTEST'], # MAGICTEST at position 1
                             [9..12, 'MAGICTEST'], # MAGICTEST starting at position 9 to 12
                             [2, 'MAGICTEST', [[0, 'X'], [0, 'Y']]]]) # MAGICTEST at position 2 and (X at 0 or Y at 0)

    assert_equal 'application/mimemagic-test', MimeMagic.by_magic('MAGICTEST').to_s
    assert_equal 'application/mimemagic-test', MimeMagic.by_magic('XMAGICTEST').to_s
    assert_equal 'application/mimemagic-test', MimeMagic.by_magic(' MAGICTEST').to_s
    assert_equal 'application/mimemagic-test', MimeMagic.by_magic('123456789MAGICTEST').to_s
    assert_equal 'application/mimemagic-test', MimeMagic.by_magic('123456789ABMAGICTEST').to_s
    assert_equal 'application/mimemagic-test', MimeMagic.by_magic('123456789ABCMAGICTEST').to_s
    assert_nil MimeMagic.by_magic('123456789ABCDMAGICTEST')
    assert_equal 'application/mimemagic-test', MimeMagic.by_magic('X MAGICTEST').to_s
    assert_equal 'application/mimemagic-test', MimeMagic.by_magic('Y MAGICTEST').to_s
    assert_nil MimeMagic.by_magic('Z MAGICTEST')

    assert_equal 'application/mimemagic-test', MimeMagic.by_magic(StringIO.new 'MAGICTEST').to_s
    assert_equal 'application/mimemagic-test', MimeMagic.by_magic(StringIO.new 'XMAGICTEST').to_s
    assert_equal 'application/mimemagic-test', MimeMagic.by_magic(StringIO.new ' MAGICTEST').to_s
    assert_equal 'application/mimemagic-test', MimeMagic.by_magic(StringIO.new '123456789MAGICTEST').to_s
    assert_equal 'application/mimemagic-test', MimeMagic.by_magic(StringIO.new '123456789ABMAGICTEST').to_s
    assert_equal 'application/mimemagic-test', MimeMagic.by_magic(StringIO.new '123456789ABCMAGICTEST').to_s
    assert_nil MimeMagic.by_magic(StringIO.new '123456789ABCDMAGICTEST')
    assert_equal 'application/mimemagic-test', MimeMagic.by_magic(StringIO.new 'X MAGICTEST').to_s
    assert_equal 'application/mimemagic-test', MimeMagic.by_magic(StringIO.new 'Y MAGICTEST').to_s
    assert_nil MimeMagic.by_magic(StringIO.new 'Z MAGICTEST')
  end

  class IOObject
    def initialize
      @io = StringIO.new('MAGICTEST')
    end

    extend Forwardable
    delegate [:read, :size, :rewind, :eof?, :close] => :@io
  end

  class StringableObject
    def to_s
      'MAGICTEST'
    end
  end

  def test_handle_different_file_objects
    MimeMagic.add('application/mimemagic-test', magic: [[0, 'MAGICTEST']])
    assert_equal 'application/mimemagic-test', MimeMagic.by_magic(IOObject.new).to_s
    assert_equal 'application/mimemagic-test', MimeMagic.by_magic(StringableObject.new).to_s
  end
end