Coverage for tests/test_spell_views.py: 100%
32 statements
« prev ^ index » next coverage.py v7.10.4, created at 2025-08-21 23:45 +0000
« prev ^ index » next coverage.py v7.10.4, created at 2025-08-21 23:45 +0000
1# pylint: disable=redefined-outer-name
2import random
3import typing
5import pytest
6from requests.models import Response as RequestsResponse
8from ._fixtures import BAD_PAYLOAD
9from whole_app import models
10from whole_app.settings import SETTINGS, StorageProviders
13if typing.TYPE_CHECKING:
14 import faker
15 from fastapi.testclient import TestClient
18RUSSIAN_LETTERS: typing.Final = "абвгдежзийклмнопрстуфхцчшщъыьэюяё"
19RU_LANG: typing.Final = "ru_RU"
22@pytest.mark.parametrize(
23 "wannabe_user_input",
24 ["Привет как дела", "Пока, я ушёл", *BAD_PAYLOAD],
25)
26def test_no_corrections(app_client: "TestClient", wannabe_user_input: str) -> None:
27 """Dead simple test."""
28 server_response: typing.Final = app_client.post(
29 f"{SETTINGS.api_prefix}/check/",
30 json=models.SpellCheckRequest(text=wannabe_user_input, language=RU_LANG).model_dump(),
31 )
32 assert server_response.status_code == 200
35@pytest.mark.repeat(5)
36def test_with_corrections_simple(
37 app_client: "TestClient",
38 faker_obj: "faker.Faker",
39) -> None:
40 """Not so dead simple test."""
41 generated_letter: typing.Final = random.choice(RUSSIAN_LETTERS)
42 wannabe_user_input: typing.Final[str] = (
43 faker_obj.text()
44 .lower()
45 .replace(
46 generated_letter,
47 random.choice(RUSSIAN_LETTERS.replace(generated_letter, "")),
48 )
49 )
50 server_response: typing.Final = app_client.post(
51 f"{SETTINGS.api_prefix}/check/",
52 json=models.SpellCheckRequest(
53 text=wannabe_user_input,
54 language=RU_LANG,
55 user_name=faker_obj.user_name(),
56 ).model_dump(),
57 )
58 assert server_response.status_code == 200
61@pytest.mark.parametrize(
62 ("wannabe_user_input", "tested_word"),
63 [
64 (BAD_PAYLOAD[0], "Капиталисиическая"),
65 (BAD_PAYLOAD[1], "блохера"),
66 ],
67)
68def test_with_exception_word_in_dictionary(
69 monkeypatch: typing.Any,
70 app_client: "TestClient",
71 faker_obj: "faker.Faker",
72 wannabe_user_input: str,
73 tested_word: str,
74) -> None:
75 """Complex tests, where we add word to dictionary and tests that it really excluded from the output."""
76 # replace all symbols from wannabe_user_input except letters and numbers
77 monkeypatch.setattr(
78 SETTINGS,
79 "dictionaries_storage_provider",
80 StorageProviders.FILE,
81 )
83 def run_request() -> typing.Any:
84 return app_client.post(
85 f"{SETTINGS.api_prefix}/check/",
86 json=models.SpellCheckRequest(
87 text=wannabe_user_input,
88 language=RU_LANG,
89 user_name=user_name,
90 ).model_dump(),
91 )
93 def parse_words(server_response: RequestsResponse) -> typing.Any:
94 return [item["word"] for item in server_response.json()["corrections"]]
96 user_name: typing.Final[str] = faker_obj.user_name()
97 # run usual check request
98 server_response: RequestsResponse = run_request()
99 assert tested_word in parse_words(server_response)
100 # add word to user dictionary
101 app_client.post(
102 f"{SETTINGS.api_prefix}/dictionaries/",
103 json=models.UserDictionaryRequestWithWord(
104 user_name=user_name,
105 exception_word=tested_word,
106 ).model_dump(),
107 )
108 # and than check that excepted word not in the check output
109 server_response = run_request()
110 assert tested_word not in parse_words(server_response)