class TestImageMethodsThatRequireImageAndDraw(unittest.TestCase): def setUp(self): header = Header(text='foo', fontfullpath=None, outline=Outline()) linkback = Linkback(text='bar', fontfullpath=None, outline=Outline()) para = Paragraph(text='foo bar', fontfullpath=None, outline=Outline()) content = Content(para, header=header, linkback=linkback, padding=45) self.fullpath = 'test.png' self.img = Image(content, self.fullpath) self.img._create_image() self.img._create_draw_object() self.img.opposite_to_bg_color = '#000' @classmethod def tearDownClass(self): fullpath = 'test.png' os.remove(fullpath) @mock.patch('PIL.Image.Image.paste') def test_fill_img_with_texture(self, mock): texture = get_random_texture() self.img._fill_image_with_texture(texture) self.assertTrue(mock.called) @mock.patch('PIL.ImageDraw.ImageDraw.rectangle') def test_fill_img_with_color(self, mock): bgcolor = '#000' self.img.bgcolor = bgcolor self.img._fill_image_with_color() mock.assert_called_once_with( [(0, 0), self.img.image.size], fill=bgcolor) @mock.patch('nider.models.Image._draw_unit') def test_draw_header(self, mock): self.img._draw_header() mock.assert_called_once_with(45, self.img.header) @mock.patch('nider.models.Image._draw_unit') def test_draw_para_with_content_that_fits(self, mock): self.img._draw_para() current_h = math.floor( (self.img.height - self.img.para.height) / 2) mock.assert_called_once_with(current_h, self.img.para) @mock.patch('nider.models.Image._draw_unit') def test_draw_para_content_with_header_that_does_not_fit(self, mock): self.img.content.fits = False self.img._draw_para() header_with_padding_height = 2 * \ self.img.content.padding + self.img.header.height current_h = header_with_padding_height mock.assert_called_once_with(current_h, self.img.para) @mock.patch('nider.models.Image._draw_unit') def test_draw_para_content_without_header_that_does_not_fit(self, mock): self.img.content.fits = False self.img.header = None self.img._draw_para() current_h = self.img.content.padding mock.assert_called_once_with(current_h, self.img.para) @mock.patch('PIL.ImageDraw.ImageDraw.text') def test_draw_linkback(self, mock): self.img.color = '#000' aligns = ['center', 'right', 'left'] for align in aligns: with self.subTest(): self.img.linkback.align = align self.img._draw_linkback() self.assertTrue(mock.called) def test_prepare_content(self): content = self.img.content self.img._prepare_content() for unit in [content.header, content.para, content.linkback]: self.assertIsNotNone(unit.color) self.assertIsNotNone(unit.outline.color) def test_prepare_content_with_None_units(self): content = self.img.content content.header = None content.linkback = None self.img._prepare_content() self.assertIsNotNone(content.para.color) self.assertIsNotNone(content.para.outline.color) @mock.patch('nider.models.Image._draw_linkback') @mock.patch('nider.models.Image._draw_para') @mock.patch('nider.models.Image._draw_header') def test_draw_content(self, _draw_header_mock, _draw_para_mock, _draw_linkback_mock): self.img._draw_content() self.assertTrue(_draw_header_mock.called) self.assertTrue(_draw_para_mock.called) self.assertTrue(_draw_linkback_mock.called) @mock.patch('PIL.ImageDraw.ImageDraw.text') def test_draw_unit_with_outline(self, text_mock): available_outlines = [None, Outline(2, '#111')] self.img.color = '#000' start_height = 0 aligns = ['center', 'right', 'left'] for align in aligns: for outline in available_outlines: with self.subTest(): unit = MultilineTextUnit( text='foo', fontfullpath=None, outline=outline, align=align) self.img._draw_unit(start_height, unit) self.assertTrue(text_mock.called) def test_save(self): self.img._save() self.assertTrue(os.path.isfile(self.fullpath))
class TestImageBaseMethods(unittest.TestCase): def setUp(self): header = Header(text='foo', fontfullpath=None) linkback = Linkback(text='bar', fontfullpath=None) para = Paragraph(text='foo bar', fontfullpath=None) content = Content(para, header=header, linkback=linkback) fullpath = 'test.png' self.img = Image(content, fullpath) def test_fix_img_size(self): self.img.content.height = 101 self.img.height = 100 with self.assertWarns(ImageSizeFixedWarning): self.img._fix_image_size() self.assertFalse(self.img.content.fits) self.assertEqual(self.img.height, self.img.content.height) def test_no_need_for_fix_img_size(self): self.img.content.height = 100 self.img.height = 101 self.img._fix_image_size() self.assertTrue(self.img.content.fits) self.assertNotEqual(self.img.height, self.img.content.height) def test_create_img(self): self.img._create_image() self.assertIsInstance(self.img.image, PIL_Image.Image) def test_create_draw_object(self): self.img._create_image() self.img._create_draw_object() self.assertIsInstance(self.img.draw, ImageDraw.ImageDraw) @mock.patch('nider.models.Image._save') @mock.patch('nider.models.Image._draw_content') def test_draw_on_texture(self, _draw_content_mock, _save): self.img.draw_on_texture() self.assertIsNotNone(self.img.opposite_to_bg_color) self.assertTrue(_draw_content_mock.called) def test_draw_on_texture_with_invalid_texturepath(self): with self.assertRaises(FileNotFoundError): self.img.draw_on_texture(texture_path='foo/bar.png') @mock.patch('nider.models.Image._save') @mock.patch('nider.models.Image._draw_content') def test_draw_on_bg(self, _draw_content_mock, _save): self.img.draw_on_bg() self.assertIsNotNone(self.img.opposite_to_bg_color) self.assertTrue(_draw_content_mock.called) @mock.patch('nider.models.Image._save') @mock.patch('nider.models.Image._draw_content') def test_draw_on_image(self, _draw_content_mock, _save): with create_test_image(): self.img.draw_on_image( image_path=os.path.abspath('test.png')) self.assertIsNotNone(self.img.opposite_to_bg_color) self.assertTrue(_draw_content_mock.called) @mock.patch('PIL.ImageEnhance._Enhance.enhance') @mock.patch('nider.models.Image._save') @mock.patch('nider.models.Image._draw_content') def test_draw_on_image_with_enhancements(self, _draw_content_mock, _save, enhance_mock): with create_test_image(): enhance_mock.return_value = PIL_Image.open('test.png') self.img.draw_on_image( image_path=os.path.abspath('test.png'), image_enhancements=((ImageEnhance.Sharpness, 0.5), (ImageEnhance.Brightness, 0.5))) self.assertTrue(enhance_mock.called) self.assertTrue(_draw_content_mock.called) @mock.patch('PIL.Image.Image.filter') @mock.patch('nider.models.Image._save') @mock.patch('nider.models.Image._draw_content') def test_draw_on_image_with_filters(self, _draw_content_mock, _save, filter_mock): filters = (ImageFilter.BLUR, ImageFilter.GaussianBlur(2)) with create_test_image(): filter_mock.return_value = PIL_Image.open('test.png') self.img.draw_on_image( image_path=os.path.abspath('test.png'), image_filters=filters) self.assertTrue(filter_mock.called) self.assertTrue(_draw_content_mock.called) def test_draw_on_image_with_invalid_imagepath(self): with self.assertRaises(FileNotFoundError): self.img.draw_on_image('foo/bar.png')