Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ Source = "https://github.com/jkowalleck/rfc3987-syntax2"

[project.optional-dependencies]
testing = [
"typing_extensions>=4.16.0",
"pytest>=8.3.5",
]

Expand Down
23 changes: 22 additions & 1 deletion tests/__init__.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,30 @@
import json
from pathlib import Path
from typing import TypedDict
from typing_extensions import Required, NotRequired

TESTS_ROOT_DIR = Path(__file__).parent
TESTS_DATA_DIR = TESTS_ROOT_DIR / '_data'

TESTS_DATA_FILES = {
'invalid_syntax': TESTS_DATA_DIR / 'invalid_syntax.json',
'valid_syntax': TESTS_DATA_DIR / 'valid_syntax.json',
}
}

class SyntaxCase(TypedDict):
value: Required[str]
reason: Required[str]
expect_lark: NotRequired[bool]
expect_regex: NotRequired[bool]
conforms_with_rfc3987_semantics: NotRequired[bool]
semantics_notes: NotRequired[str]

T_syntax_file = dict[str, list[SyntaxCase]]

def valid_syntax_data() -> T_syntax_file:
with open(TESTS_DATA_FILES['valid_syntax'], "r", encoding="utf-8") as f:
return json.load(f)

def invalid_syntax_data() -> T_syntax_file:
with open(TESTS_DATA_FILES['invalid_syntax'], "r", encoding="utf-8") as f:
return json.load(f)
23 changes: 8 additions & 15 deletions tests/test_syntax.py
Original file line number Diff line number Diff line change
@@ -1,29 +1,21 @@
from pathlib import Path
import json
from typing import TYPE_CHECKING

import pytest
from typing import Callable

import rfc3987_syntax2 as sut

from . import TESTS_DATA_FILES

def valid_syntax_data():
with open(TESTS_DATA_FILES['valid_syntax'], "r", encoding="utf-8") as f:
return json.load(f)

from . import valid_syntax_data, invalid_syntax_data, SyntaxCase, T_syntax_file

def invalid_syntax_data():
with open(TESTS_DATA_FILES['invalid_syntax'], "r", encoding="utf-8") as f:
return json.load(f)


def syntax_data_as_params(src_cb):
def syntax_data_as_params(src_cb: Callable[[], T_syntax_file]):
for term, examples in src_cb().items():
for example in examples:
yield pytest.param(term, example, id=f"{term}-{example['value']}")


@pytest.mark.parametrize("term,valid_example", syntax_data_as_params(valid_syntax_data))
def test_is_valid_syntax(term, valid_example):
def test_is_valid_syntax(term: str, valid_example: SyntaxCase) -> None:
actual = sut.is_valid_syntax(term=term, value=valid_example["value"])
print("")
print(
Expand All @@ -33,8 +25,9 @@ def test_is_valid_syntax(term, valid_example):
actual is True
), f"Failed term: {term} for '{valid_example['value']}' : {valid_example['reason']}"


@pytest.mark.parametrize("term,invalid_example", syntax_data_as_params(invalid_syntax_data))
def test_not_is_valid_syntax(term, invalid_example):
def test_not_is_valid_syntax(term: str, invalid_example: SyntaxCase) -> None:
actual = sut.is_valid_syntax(term=term, value=invalid_example["value"])
print("")
print(
Expand Down