Module app.tests.test_images
View Source
import os
import shutil
import time
from pathlib import Path
import pytest
from .. import models, settings, utils
@pytest.fixture(scope="session")
def images():
path = settings.TEST_IMAGES_DIRECTORY
flag = path / ".flag"
if flag.exists():
age = time.time() - flag.stat().st_mtime
if age > 60 * 60 * 6 and "SKIP_SLOW" not in os.environ:
shutil.rmtree(path)
path.mkdir(exist_ok=True)
flag.touch()
return path
@pytest.fixture(scope="session")
def template():
return models.Template.objects.get("icanhas")
# Formats
@pytest.mark.parametrize(("key", "lines"), settings.TEST_IMAGES)
def test_png_images(images, key, lines):
template = models.Template.objects.get(key)
utils.images.save(template, lines, "png", directory=images)
def test_jpg_images(images):
key, lines = settings.TEST_IMAGES[0]
template = models.Template.objects.get(key)
utils.images.save(template, lines, "jpg", directory=images)
# Size
def test_smaller_width(images, template):
utils.images.save(template, ["width=250"], size=(250, 0), directory=images)
def test_smaller_height(images, template):
utils.images.save(template, ["height=250"], size=(0, 250), directory=images)
def test_larger_width(images, template):
utils.images.save(template, ["width=500"], size=(500, 0), directory=images)
def test_larger_height(images, template):
utils.images.save(template, ["height=500"], size=(0, 500), directory=images)
def test_padding(images, template):
lines = ["width=500", "height=500"]
utils.images.save(template, lines, size=(500, 500), directory=images)
def test_small_padding(images, template):
lines = ["width=50", "height=50"]
utils.images.save(template, lines, size=(50, 50), directory=images)
@pytest.mark.slow
def test_large_padding(images, template):
lines = ["width=2000", "height=2000"]
utils.images.save(template, lines, size=(2000, 2000), directory=images)
# Templates
@pytest.mark.asyncio
async def test_custom_template(images):
url = "https://www.gstatic.com/webp/gallery/2.jpg"
template = await models.Template.create(url)
utils.images.save(template, ["", "My Custom Template"], directory=images)
@pytest.mark.slow
@pytest.mark.asyncio
async def test_custom_template_with_exif_rotation(images):
url = "https://cdn.discordapp.com/attachments/752902976322142218/752903391281283152/20200608_111430.jpg"
template = await models.Template.create(url)
utils.images.save(template, ["", "This should not be rotated!"], directory=images)
def test_unknown_template(images):
template = models.Template.objects.get("_error")
utils.images.save(template, ["UNKNOWN TEMPLATE"], directory=images)
# Styles
def test_style(images):
template = models.Template.objects.get("ds")
lines = ["one", "two", "three"]
utils.images.save(template, lines, style="maga", directory=images)
# Text
def test_special_characters(images, template):
lines = ["Special? 100% #these-memes", "template_rating: 9/10"]
utils.images.save(template, lines, directory=images)
@pytest.mark.skipif("CIRCLECI" in os.environ, reason="Long filenames not supported")
def test_extremely_long_text(images, tmpdir):
template = models.Template.objects.get("fry")
lines = ["", "word " * 40]
utils.images.save(template, lines, directory=Path(tmpdir) / "images")
def test_long_first_word(images):
template = models.Template.objects.get("fine")
lines = ["", "thiiiiiiiiiiiiiiiiiiiiis will probably be fine right now"]
utils.images.save(template, lines, directory=images)
def test_text_wrap_when_font_is_too_small(images):
template = models.Template.objects.get("ds")
lines = ["this button seems to be ok to push"]
utils.images.save(template, lines, directory=images)
@pytest.mark.slow
def test_descender_vertical_alignment(images):
template = models.Template.objects.get("ptj")
lines = [
"Exit",
"Exit",
"the",
"the",
"monorepo",
"monorepo",
"Exit the monorepo.",
"Stop testing!",
]
utils.images.save(template, lines, directory=images)
# Debug
def test_debug_images(images, monkeypatch):
monkeypatch.setattr(settings, "DEBUG", True)
key, lines = settings.TEST_IMAGES[0]
template = models.Template.objects.get(key)
lines = [lines[0], lines[1] + " (debug)"]
utils.images.save(template, lines, directory=images)
Functions
images
def images(
)
View Source
@pytest.fixture(scope="session")
def images():
path = settings.TEST_IMAGES_DIRECTORY
flag = path / ".flag"
if flag.exists():
age = time.time() - flag.stat().st_mtime
if age > 60 * 60 * 6 and "SKIP_SLOW" not in os.environ:
shutil.rmtree(path)
path.mkdir(exist_ok=True)
flag.touch()
return path
template
def template(
)
View Source
@pytest.fixture(scope="session")
def template():
return models.Template.objects.get("icanhas")
test_custom_template
def test_custom_template(
images
)
View Source
@pytest.mark.asyncio
async def test_custom_template(images):
url = "https://www.gstatic.com/webp/gallery/2.jpg"
template = await models.Template.create(url)
utils.images.save(template, ["", "My Custom Template"], directory=images)
test_custom_template_with_exif_rotation
def test_custom_template_with_exif_rotation(
images
)
View Source
@pytest.mark.slow
@pytest.mark.asyncio
async def test_custom_template_with_exif_rotation(images):
url = "https://cdn.discordapp.com/attachments/752902976322142218/752903391281283152/20200608_111430.jpg"
template = await models.Template.create(url)
utils.images.save(template, ["", "This should not be rotated!"], directory=images)
test_debug_images
def test_debug_images(
images,
monkeypatch
)
View Source
def test_debug_images(images, monkeypatch):
monkeypatch.setattr(settings, "DEBUG", True)
key, lines = settings.TEST_IMAGES[0]
template = models.Template.objects.get(key)
lines = [lines[0], lines[1] + " (debug)"]
utils.images.save(template, lines, directory=images)
test_descender_vertical_alignment
def test_descender_vertical_alignment(
images
)
View Source
@pytest.mark.slow
def test_descender_vertical_alignment(images):
template = models.Template.objects.get("ptj")
lines = [
"Exit",
"Exit",
"the",
"the",
"monorepo",
"monorepo",
"Exit the monorepo.",
"Stop testing!",
]
utils.images.save(template, lines, directory=images)
test_extremely_long_text
def test_extremely_long_text(
images,
tmpdir
)
View Source
@pytest.mark.skipif("CIRCLECI" in os.environ, reason="Long filenames not supported")
def test_extremely_long_text(images, tmpdir):
template = models.Template.objects.get("fry")
lines = ["", "word " * 40]
utils.images.save(template, lines, directory=Path(tmpdir) / "images")
test_jpg_images
def test_jpg_images(
images
)
View Source
def test_jpg_images(images):
key, lines = settings.TEST_IMAGES[0]
template = models.Template.objects.get(key)
utils.images.save(template, lines, "jpg", directory=images)
test_large_padding
def test_large_padding(
images,
template
)
View Source
@pytest.mark.slow
def test_large_padding(images, template):
lines = ["width=2000", "height=2000"]
utils.images.save(template, lines, size=(2000, 2000), directory=images)
test_larger_height
def test_larger_height(
images,
template
)
View Source
def test_larger_height(images, template):
utils.images.save(template, ["height=500"], size=(0, 500), directory=images)
test_larger_width
def test_larger_width(
images,
template
)
View Source
def test_larger_width(images, template):
utils.images.save(template, ["width=500"], size=(500, 0), directory=images)
test_long_first_word
def test_long_first_word(
images
)
View Source
def test_long_first_word(images):
template = models.Template.objects.get("fine")
lines = ["", "thiiiiiiiiiiiiiiiiiiiiis will probably be fine right now"]
utils.images.save(template, lines, directory=images)
test_padding
def test_padding(
images,
template
)
View Source
def test_padding(images, template):
lines = ["width=500", "height=500"]
utils.images.save(template, lines, size=(500, 500), directory=images)
test_png_images
def test_png_images(
images,
key,
lines
)
View Source
@pytest.mark.parametrize(("key", "lines"), settings.TEST_IMAGES)
def test_png_images(images, key, lines):
template = models.Template.objects.get(key)
utils.images.save(template, lines, "png", directory=images)
test_small_padding
def test_small_padding(
images,
template
)
View Source
def test_small_padding(images, template):
lines = ["width=50", "height=50"]
utils.images.save(template, lines, size=(50, 50), directory=images)
test_smaller_height
def test_smaller_height(
images,
template
)
View Source
def test_smaller_height(images, template):
utils.images.save(template, ["height=250"], size=(0, 250), directory=images)
test_smaller_width
def test_smaller_width(
images,
template
)
View Source
def test_smaller_width(images, template):
utils.images.save(template, ["width=250"], size=(250, 0), directory=images)
test_special_characters
def test_special_characters(
images,
template
)
View Source
def test_special_characters(images, template):
lines = ["Special? 100% #these-memes", "template_rating: 9/10"]
utils.images.save(template, lines, directory=images)
test_style
def test_style(
images
)
View Source
def test_style(images):
template = models.Template.objects.get("ds")
lines = ["one", "two", "three"]
utils.images.save(template, lines, style="maga", directory=images)
test_text_wrap_when_font_is_too_small
def test_text_wrap_when_font_is_too_small(
images
)
View Source
def test_text_wrap_when_font_is_too_small(images):
template = models.Template.objects.get("ds")
lines = ["this button seems to be ok to push"]
utils.images.save(template, lines, directory=images)
test_unknown_template
def test_unknown_template(
images
)
View Source
def test_unknown_template(images):
template = models.Template.objects.get("_error")
utils.images.save(template, ["UNKNOWN TEMPLATE"], directory=images)