Skip to content

Commit

Permalink
Add test cases for transforming strings
Browse files Browse the repository at this point in the history
  • Loading branch information
MaddyGuthridge committed Jan 25, 2025
1 parent 19e91ff commit fffd49d
Show file tree
Hide file tree
Showing 6 changed files with 129 additions and 51 deletions.
3 changes: 2 additions & 1 deletion tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,8 @@ def make_entry_point_from_plugin(
value=f"{cls.__module__}:{cls.__name__}",
)

if dist:
# Ignore coverage, since idk what this code is for
if dist: # pragma: no cover
ep = ep._for(dist) # type: ignore[attr-defined,no-untyped-call]
return ep

Expand Down
Empty file added tests/handlers/__init__.py
Empty file.
76 changes: 76 additions & 0 deletions tests/handlers/example_handlers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
"""
# Tests / Handlers / Example handlers
Simple Transdoc handlers used for testing.
"""

from typing import IO
import transdoc
from transdoc.handlers.api import TransdocHandler


class SimpleHandler(TransdocHandler):
"""Simple, valid handler plugin"""

group = "transdoc.handlers"

def matches_file(self, file_path: str) -> bool:
return True

def transform_file(
self,
transformer: transdoc.TransdocTransformer,
in_path: str,
in_file: IO,
out_file: IO | None,
) -> None:
# Do nothing, we don't test outputs using this handler
pass


class UnsupportedHandler(TransdocHandler):
"""handler plugin which supports no file types"""

group = "transdoc.handlers"

def matches_file(self, file_path: str) -> bool:
return False

def transform_file(
self,
transformer: transdoc.TransdocTransformer,
in_path: str,
in_file: IO,
out_file: IO | None,
) -> None:
# Do nothing, we don't test outputs using this handler
pass


class FailToLoadHandler(TransdocHandler):
"""Handler plugin that fails to load due to an exception during creation"""

group = "transdoc.handlers"

def __init__(self) -> None:
raise RuntimeError("Intentional failure to load plugin")

def matches_file(self, file_path: str) -> bool:
raise NotImplementedError()

def transform_file(
self,
transformer: transdoc.TransdocTransformer,
in_path: str,
in_file: IO,
out_file: IO | None,
) -> None:
raise NotImplementedError()


class ProtocolMismatchHandler:
"""Handler plugin that doesn't match the protocol"""

group = "transdoc.handlers"

# Intentionally empty
56 changes: 6 additions & 50 deletions tests/handlers/get_handlers_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,18 @@
Test cases for `transdoc.handlers.get_all_handlers`
"""

from typing import IO
import jestspectation as expect
import pytest
from pytest_mock import MockerFixture

from tests.conftest import mock_metadata_entry_points
from .example_handlers import (
FailToLoadHandler,
ProtocolMismatchHandler,
SimpleHandler,
)
import transdoc
from transdoc.errors import TransdocHandlerLoadError
from transdoc.handlers.api import TransdocHandler
from transdoc.handlers.plaintext import PlaintextHandler


Expand All @@ -28,7 +31,7 @@ def test_default_handlers():


def test_handler_load_valid(mocker: MockerFixture):
mock_metadata_entry_points(mocker, ValidHandler)
mock_metadata_entry_points(mocker, SimpleHandler)
transdoc.handlers.get_all_handlers()


Expand All @@ -44,50 +47,3 @@ def test_handler_protocol_mismatch(mocker: MockerFixture):
with pytest.raises(TransdocHandlerLoadError):
# FailToLoadHandler should give an exception
transdoc.handlers.get_all_handlers()


class ValidHandler(TransdocHandler):
"""Simple, valid handler plugin"""

group = "transdoc.handlers"

def matches_file(self, file_path: str) -> bool:
raise NotImplementedError()

def transform_file(
self,
transformer: transdoc.TransdocTransformer,
in_path: str,
in_file: IO,
out_file: IO | None,
) -> None:
raise NotImplementedError()


class FailToLoadHandler(TransdocHandler):
"""Handler plugin that fails to load due to an exception during creation"""

group = "transdoc.handlers"

def __init__(self) -> None:
raise RuntimeError("Intentional failure to load plugin")

def matches_file(self, file_path: str) -> bool:
raise NotImplementedError()

def transform_file(
self,
transformer: transdoc.TransdocTransformer,
in_path: str,
in_file: IO,
out_file: IO | None,
) -> None:
raise NotImplementedError()


class ProtocolMismatchHandler:
"""Handler plugin that doesn't match the protocol"""

group = "transdoc.handlers"

# Intentionally empty
35 changes: 35 additions & 0 deletions tests/string_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
"""
# Tests / string test
Test cases for transforming strings
"""

from tests.handlers.example_handlers import SimpleHandler, UnsupportedHandler
from pytest_mock import MockerFixture

import transdoc
from transdoc import TransdocTransformer


def test_transforms_strings(transformer: TransdocTransformer):
assert transdoc.transform(transformer, "Input") == "Input"


def test_transforms_using_given_handler(
mocker: MockerFixture, transformer: TransdocTransformer
):
handler = SimpleHandler()
matches_file = mocker.spy(handler, "matches_file")
transform_file = mocker.spy(handler, "transform_file")

transdoc.transform(transformer, "Input", path="<test>", handler=handler)

matches_file.assert_called_once_with("<test>")
transform_file.assert_called_once()


def test_unsupported_handler_warning(transformer: TransdocTransformer):
handler = UnsupportedHandler()
transdoc.transform(transformer, "Input", path="<test>", handler=handler)
# Not testing for logging issues, because that's sorta annoying. This is
# just here for coverage
10 changes: 10 additions & 0 deletions transdoc/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
]

from io import StringIO
import logging
from typing import Optional
from .__rule import TransdocRule
from .__consts import VERSION as __version__
Expand All @@ -24,6 +25,9 @@
from .__transform_file import transform_file


log = logging.getLogger("transdoc")


def transform(
transformer: TransdocTransformer,
input: str,
Expand All @@ -43,6 +47,12 @@ def transform(
"""
if handler is None:
handler = PlaintextHandler()

if not handler.matches_file(path):
log.warning(
f"The given handler {handler} does not match the input file path '{path}'"
)

in_buf = StringIO(input)
out_buf = StringIO()
handler.transform_file(transformer, path, in_buf, out_buf)
Expand Down

0 comments on commit fffd49d

Please sign in to comment.