import pytest import logging from teilchensammler_cli.models import TeilchenCreate, make_teilchen_input logger = logging.getLogger(__name__) @pytest.mark.final # don't run while we are fiddling with the app def test_initial_layout(snap_compare): from teilchensammler_cli.main import app assert snap_compare(app, terminal_size=(130, 40)) empty_teilchen = { "name": "", "description": "", "tags": "", "text": "", "number": 1, } def TC(**kwargs) -> TeilchenCreate | None: """TC = TeilchenCreate Create Teilchen with desired attributes. Args: input: mapping that must be well-formed enough to actually create a Teilchen Returns: - `None` on empty input - an instance of `TeilchenCreate` """ if kwargs: arguments = empty_teilchen | kwargs return TeilchenCreate(**arguments) # ty:ignore[invalid-argument-type] @pytest.mark.parametrize( "example_input,expected", [ # Not enough data ("", TC()), (".", TC()), ("..", TC()), (".a.", TC()), ("a", TC()), ("aa", TC()), # Just enough for "name" ("a.", TC(name="a", text="a.")), ("aa.", TC(name="aa", text="aa.")), ("a..", TC(name="a", text="a..")), ("a.b.", TC(name="a", text="a.b.")), # Just enough for "name" and "description" ('a."b"', TC(name="a", description="b", text='a."b"')), ('a. "b"', TC(name="a", description="b", text='a. "b"')), ('a. ""', TC(name="a", description="", text='a. ""')), ('. ""', TC()), ('. "b"', TC()), # Just enough for "name" and "description" and "tags" ('a. "b" #c', TC(name="a", description="b", tags="#c", text='a. "b" #c')), ('a. "b #d" #c', TC(name="a", description="b #d", tags="#c #d", text='a. "b #d" #c')), # swap order in input, tag result is stable ('a. "b #c" #d', TC(name="a", description="b #c", tags="#c #d", text='a. "b #c" #d')), # Just enough for "name" and "tags" ("a. #d", TC(name="a", description="", tags="#d", text="a. #d")), ("a. #d#b", TC(name="a", description="", tags="#b #d", text="a. #d#b")), ("a. ##b", TC(name="a", description="", tags="#b", text="a. ##b")), ("a. #", TC(name="a", description="", tags="", text="a. #")), ("a. ##", TC(name="a", description="", tags="", text="a. ##")), # do we care about "number"? ], ) async def test_maketeilcheninput_can_create_desired_teilchen( example_input: str, expected: dict[str, str | int] | None ) -> None: actual = await make_teilchen_input(example_input) assert expected == actual