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