From dac9fd0b181079e64373aa72980da7650bf8f4c5 Mon Sep 17 00:00:00 2001 From: Ethan Paul <24588726+enpaul@users.noreply.github.com> Date: Fri, 29 Oct 2021 18:56:42 -0400 Subject: [PATCH] Add tests for configuration module --- tests/test_configuration.py | 167 ++++++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 tests/test_configuration.py diff --git a/tests/test_configuration.py b/tests/test_configuration.py new file mode 100644 index 0000000..0ecfbde --- /dev/null +++ b/tests/test_configuration.py @@ -0,0 +1,167 @@ +import contextlib +import json +from pathlib import Path +from typing import Dict + +import pytest + +from kodak import configuration +from kodak import constants +from kodak import exceptions + + +@contextlib.contextmanager +def mockenv(patch, env: Dict[str, str]): + for key, value in env.items(): + patch.setenv(key, value) + yield + for key in env: + patch.delenv(key) + + +def test_conf_global(monkeypatch): + assert configuration.KodakConfig() == configuration.load() + + with mockenv( + monkeypatch, + { + "KODAK_SOURCE_DIR": "foobar/baz/", + "KODAK_CONTENT_DIR": "/var/log/run/proc/sys/class/net/dev/opt/srv", + "KODAK_EXPOSE_SOURCE": "flalse", + "KODAK_PRIVATE": "herblegerble", + }, + ): + config = configuration.load() + assert config.source_dir == (Path.cwd() / "foobar" / "baz") + assert config.content_dir == Path( + "/", "var", "log", "run", "proc", "sys", "class", "net", "dev", "opt", "srv" + ) + assert not config.expose_source + assert not config.private + + with mockenv( + monkeypatch, {"KODAK_EXPOSE_SOURCE": "false", "KODAK_PRIVATE": "false"} + ): + config = configuration.load() + assert not config.expose_source + assert not config.private + + with mockenv(monkeypatch, {"KODAK_EXPOSE_SOURCE": "tRuE", "KODAK_PRIVATE": "TruE"}): + config = configuration.load() + assert config.expose_source + assert config.private + + +def test_conf_database(monkeypatch): + with mockenv(monkeypatch, {"KODAK_DATABASE_BACKEND": "couchdb"}): + with pytest.raises(exceptions.ConfigurationError): + configuration.load() + + pragmas = {"foo": "bar", "fizz": 1, "buzz": True} + with mockenv( + monkeypatch, + { + "KODAK_DATABASE_BACKEND": "SQLite", + "KODAK_DATABASE_SQLITE_PRAGMAS": json.dumps(pragmas), + "KODAK_DATABASE_SQLITE_PATH": "~/nowhere/nothing.db", + }, + ): + config = configuration.load() + assert config.database.sqlite.pragmas == pragmas + assert config.database.backend == constants.DatabaseBackend.SQLITE + assert ( + config.database.sqlite.path + == Path("~", "nowhere", "nothing.db").expanduser().resolve() + ) + with mockenv( + monkeypatch, {"KODAK_DATABASE_SQLITE_PRAGMAS": "this]is{not,valid,,js:on"} + ): + with pytest.raises(exceptions.ConfigurationError): + configuration.load() + + with mockenv( + monkeypatch, + { + "KODAK_DATABASE_BACKEND": "mariaDB", + }, + ): + assert ( + configuration.load().database.backend == constants.DatabaseBackend.MARIADB + ) + with mockenv(monkeypatch, {"KODAK_DATABASE_MARIADB_PORT": "NaN"}): + with pytest.raises(exceptions.ConfigurationError): + configuration.load() + + +def test_conf_manip(monkeypatch): + with mockenv( + monkeypatch, + { + "KODAK_MANIP_BIFF_FORMATS": "png", + "KODAK_MANIP_BIFF_BLACK_AND_WHITE": "[jonathan frakes voice] its a total fantasy", + }, + ): + config = configuration.load() + assert "biff" in config.manips + manip = config.manips["biff"] + assert manip.name == "biff" + assert manip.formats == {constants.ImageFormat.PNG} + assert not manip.black_and_white + + with mockenv( + monkeypatch, + { + "KODAK_MANIP_BOFF_NAME": "grand poohbah, de d*ink, of/all%of This&That", + "KODAK_MANIP_BOFF_FORMATS": "png,jpeg,JPeg", + "KODAK_MANIP_BOFF_BLACK_AND_WHITE": "truE", + "KODAK_MANIP_BOFF_CROP_HORIZONTAL": "500", + "KODAK_MANIP_BOFF_CROP_ANCHOR": "Bottom-Center", + "KODAK_MANIP_BOFF_SCALE_VERTICAL": "1.5", + "KODAK_MANIP_BOFF_SCALE_STRATEGY": "RelaTive", + "KODAK_MANIP_BAFF_CROP_VERTICAL": "128", + "KODAK_MANIP_BAFF_SCALE_HORIZONTAL": "200", + "KODAK_MANIP_BAFF_SCALE_STRATEGY": "absoLUTE", + }, + ): + config = configuration.load() + assert "grand poohbah, de d*ink, of/all%of This&That" in config.manips + assert "baff" in config.manips + + manip = config.manips["grand poohbah, de d*ink, of/all%of This&That"] + assert manip.name == "grand poohbah, de d*ink, of/all%of This&That" + assert manip.formats == {constants.ImageFormat.JPEG, constants.ImageFormat.PNG} + assert manip.black_and_white + assert manip.crop.horizontal == 500 + assert manip.crop.anchor == constants.CropAnchor.BC + assert manip.scale.vertical == 1.5 + assert manip.scale.strategy == constants.ScaleStrategy.RELATIVE + + manip = config.manips["baff"] + assert manip.crop.vertical == 128 + assert manip.scale.horizontal == 200 + assert manip.scale.strategy == constants.ScaleStrategy.ABSOLUTE + + # bad format values + with mockenv(monkeypatch, {"KODAK_MANIP_TERRIBLE_FORMATS": "jpeg,tiff,woff2"}): + with pytest.raises(exceptions.ConfigurationError): + configuration.load() + # bad scale strategy value + with mockenv( + monkeypatch, {"KODAK_MANIP_TERRIBLE_SCALE_STRATEGY": "take it back now yall"} + ): + with pytest.raises(exceptions.ConfigurationError): + configuration.load() + # bad scale value + with mockenv( + monkeypatch, + { + "KODAK_MANIP_TERRIBLE_SCALE_STRATEGY": "absolute", + "KODAK_MANIP_TERRIBLE_SCALE_HORIZONTAL": "32.5", + }, + ): + with pytest.raises(exceptions.ConfigurationError): + configuration.load() + # bad crop anchor value + with mockenv(monkeypatch, {"KODAK_MANIP_TERRIBLE_CROP_ANCHOR": "ahoy"}): + with pytest.raises(exceptions.ConfigurationError): + configuration.load()