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

1# pylint: disable=redefined-outer-name 

2import random 

3import typing 

4 

5import pytest 

6from requests.models import Response as RequestsResponse 

7 

8from ._fixtures import BAD_PAYLOAD 

9from whole_app import models 

10from whole_app.settings import SETTINGS, StorageProviders 

11 

12 

13if typing.TYPE_CHECKING: 

14 import faker 

15 from fastapi.testclient import TestClient 

16 

17 

18RUSSIAN_LETTERS: typing.Final = "абвгдежзийклмнопрстуфхцчшщъыьэюяё" 

19RU_LANG: typing.Final = "ru_RU" 

20 

21 

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 

33 

34 

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 

59 

60 

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 ) 

82 

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 ) 

92 

93 def parse_words(server_response: RequestsResponse) -> typing.Any: 

94 return [item["word"] for item in server_response.json()["corrections"]] 

95 

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)