1import base64
2import unittest
3
4from odoo.tests.common import BaseCase
5from odoo.tools.mimetypes import guess_mimetype
6
7PNG = b'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAADElEQVQI12P4//8/AAX+Av7czFnnAAAAAElFTkSuQmCC'
8GIF = b"R0lGODdhAQABAIAAAP///////ywAAAAAAQABAAACAkQBADs="
9BMP = b"""Qk1+AAAAAAAAAHoAAABsAAAAAQAAAAEAAAABABgAAAAAAAQAAAATCwAAEwsAAAAAAAAAAAAAQkdScwAAAAAAAAAAAA
10AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAD///8A"""
11JPG = """/9j/4AAQSkZJRgABAQEASABIAAD//gATQ3JlYXRlZCB3aXRoIEdJTVD/2wBDAP
12//////////////////////////////////////////////////////////////////////////////////////2wBDAf///////
13///////////////////////////////////////////////////////////////////////////////wgARCAABAAEDAREAAhEB
14AxEB/8QAFAABAAAAAAAAAAAAAAAAAAAAAv/EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhADEAAAAUf/xAAUEAEAAAAAAAA
15AAAAAAAAAAAAA/9oACAEBAAEFAn//xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oACAEDAQE/AX//xAAUEQEAAAAAAAAAAAAAAAAAAA
16AA/9oACAECAQE/AX//xAAUEAEAAAAAAAAAAAAAAAAAAAAA/9oACAEBAAY/An//xAAUEAEAAAAAAAAAAAAAAAAAAAAA/9oACAEBA
17AE/IX//2gAMAwEAAgADAAAAEB//xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oACAEDAQE/EH//xAAUEQEAAAAAAAAAAAAAAAAAAAAA
18/9oACAECAQE/EH//xAAUEAEAAAAAAAAAAAAAAAAAAAAA/9oACAEBAAE/EH//2Q=="""
19SVG = b"""PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMjAwMDExMDIvL0VOIlxuICJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAwL0NSLVNWRy0yMDAwMTEwMi9EVEQvc3ZnLTIwMDAxMTAyLmR0ZCI+PHN2ZyB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg1MCw1MCkiPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxNTAiIGhlaWdodD0iNTAiIHN0eWxlPSJmaWxsOnJlZDsiIC8+PC9nPjwvc3ZnPg=="""
20# minimal zip file with an empty `t.txt` file
21ZIP = b"""UEsDBBQACAAIAGFva1AAAAAAAAAAAAAAAAAFACAAdC50eHRVVA0AB5bgaF6W4GheluBoXnV4CwABBOgDAAAE6AMAAA
22MAUEsHCAAAAAACAAAAAAAAAFBLAQIUAxQACAAIAGFva1AAAAAAAgAAAAAAAAAFACAAAAAAAAAAAACkgQAAAAB0LnR4dFVUDQAHlu
23BoXpbgaF6W4GhedXgLAAEE6AMAAAToAwAAUEsFBgAAAAABAAEAUwAAAFUAAAAAAA=="""
24
25
26class test_guess_mimetype(BaseCase):
27
28    def test_default_mimetype_empty(self):
29        mimetype = guess_mimetype(b'')
30        # odoo implementation returns application/octet-stream by default
31        # if available, python-magic returns application/x-empty
32        self.assertIn(mimetype, ('application/octet-stream', 'application/x-empty'))
33
34    def test_default_mimetype(self):
35        mimetype = guess_mimetype(b'', default='test')
36        # if available, python-magic returns application/x-empty
37        self.assertIn(mimetype, ('test', 'application/x-empty'))
38
39    def test_mimetype_octet_stream(self):
40        mimetype = guess_mimetype(b'\0')
41        self.assertEqual(mimetype, 'application/octet-stream')
42
43    def test_mimetype_png(self):
44        content = base64.b64decode(PNG)
45        mimetype = guess_mimetype(content, default='test')
46        self.assertEqual(mimetype, 'image/png')
47
48    def test_mimetype_bmp(self):
49        content = base64.b64decode(BMP)
50        mimetype = guess_mimetype(content, default='test')
51        # mimetype should match image/bmp, image/x-ms-bmp, ...
52        self.assertRegex(mimetype, r'image/.*\bbmp')
53
54    def test_mimetype_jpg(self):
55        content = base64.b64decode(JPG)
56        mimetype = guess_mimetype(content, default='test')
57        self.assertEqual(mimetype, 'image/jpeg')
58
59    def test_mimetype_gif(self):
60        content = base64.b64decode(GIF)
61        mimetype = guess_mimetype(content, default='test')
62        self.assertEqual(mimetype, 'image/gif')
63
64    def test_mimetype_svg(self):
65        content = base64.b64decode(SVG)
66        mimetype = guess_mimetype(content, default='test')
67        self.assertTrue(mimetype.startswith('image/svg'))
68        # Tests that whitespace padded SVG are not detected as SVG
69        mimetype = guess_mimetype(b"   " + content, default='test')
70        self.assertNotIn("svg", mimetype)
71
72    def test_mimetype_zip(self):
73        content = base64.b64decode(ZIP)
74        mimetype = guess_mimetype(content, default='test')
75        self.assertEqual(mimetype, 'application/zip')
76
77
78
79if __name__ == '__main__':
80    unittest.main()
81