Coverage for tests/test_cli.py: 83%

94 statements  

« prev     ^ index     » next       coverage.py v7.10.7, created at 2025-09-28 09:38 +0200

1import pytest 

2from unittest.mock import patch, MagicMock 

3from typer.testing import CliRunner 

4from art_studio_tz.cli import app 

5from art_studio_tz import InvalidQuoteId 

6import art_studio_tz as packet 

7 

8runner = CliRunner() 

9 

10@pytest.fixture 

11def mock_quote_db(): 

12 with patch("art_studio_tz.cli.quote_db") as mock: 

13 db_instance = MagicMock() 

14 mock.return_value.__enter__.return_value = db_instance 

15 yield db_instance 

16 

17@pytest.fixture 

18def mock_quote_db_sql(): 

19 with patch("art_studio_tz.cli.quote_db_sql") as mock: 

20 db_instance = MagicMock() 

21 mock.return_value.__enter__.return_value = db_instance 

22 yield db_instance 

23 

24def test_version(): 

25 result = runner.invoke(app, ["version"]) 

26 assert result.exit_code == 0 

27 assert result.output.strip() == packet.__version__ 

28 

29def test_add(mock_quote_db): 

30 result = runner.invoke(app, ["add", "Hello", "world", "-a", "Author"]) 

31 assert result.exit_code == 0 

32 mock_quote_db.add_quote.assert_called_once() 

33 # Проверка аргументов 

34 arg = mock_quote_db.add_quote.call_args[0][0] 

35 assert arg.text == "Hello world" 

36 assert arg.author == "Author" 

37 

38def test_delete_valid(mock_quote_db): 

39 result = runner.invoke(app, ["delete", "1"]) 

40 assert result.exit_code == 0 

41 mock_quote_db.delete_quote.assert_called_once_with(1) 

42 

43def test_delete_invalid(mock_quote_db): 

44 mock_quote_db.delete_quote.side_effect = InvalidQuoteId 

45 result = runner.invoke(app, ["delete", "1"]) 

46 assert result.exit_code == 0 

47 assert "Error" in result.output 

48 

49def test_list_quote(mock_quote_db): 

50 quote = MagicMock() 

51 quote.id = 1 

52 quote.timestep = "2025-01-01" 

53 quote.text = "Hello" 

54 quote.author = "Author" 

55 mock_quote_db.list_quote.return_value = [quote] 

56 

57 result = runner.invoke(app, ["list"]) 

58 assert result.exit_code == 0 

59 assert "Hello" in result.output 

60 assert "Author" in result.output 

61 

62def test_update(mock_quote_db): 

63 result = runner.invoke(app, ["update", "1", "-t", "New text", "-o", "New author"]) 

64 assert result.exit_code == 0 

65 mock_quote_db.update_quote.assert_called_once() 

66 arg = mock_quote_db.update_quote.call_args[0][1] 

67 assert arg.text == "New text" 

68 assert arg.author == "New author" 

69 

70def test_start(mock_quote_db): 

71 result = runner.invoke(app, ["start", "-p", "0"]) 

72 assert result.exit_code == 0 

73 mock_quote_db.start.assert_called_once() 

74 

75def test_sql_get(mock_quote_db_sql): 

76 result = runner.invoke(app, ["get", "-u", "user", "-p", "pass"]) 

77 assert result.exit_code == 0 

78 mock_quote_db_sql.get_some_quotes.assert_called_once() 

79 

80@pytest.mark.skip() 

81def test_sql_delete_all(mock_quote_db_sql): 

82 mock_quote_db_sql.delete_all.return_value = None 

83 

84 result = runner.invoke( 

85 app, 

86 [ 

87 "delete_all_sql", 

88 "--user", "user", 

89 "--password", "pass", 

90 "--host", "localhost", 

91 "--port", "3306", 

92 "--database", "quotes_db" 

93 ], 

94 standalone_mode=False 

95 ) 

96 

97 print(result.output) 

98 assert result.exit_code == 0 

99 mock_quote_db_sql.delete_all.assert_called_once() 

100 

101@pytest.mark.skip() 

102def test_sql_list_latest_5(mock_quote_db_sql): 

103 class FakeQuote: 

104 def __init__(self): 

105 self.id = 1 

106 self.timestep = "2025-01-01" 

107 self.text = "Hello" 

108 self.author = "Author" 

109 

110 mock_quote_db_sql.get_latest.return_value = [FakeQuote()] 

111 

112 result = runner.invoke(app, ["list_latest_5", "-u", "user", "-p", "pass"]) 

113 assert result.exit_code == 0 

114 assert "Hello" in result.output 

115 assert "Author" in result.output 

116 

117def test_config(mock_quote_db): 

118 result = runner.invoke(app, ["config"]) 

119 assert result.exit_code == 0 

120 mock_quote_db.path.assert_called_once() 

121 

122def test_count(mock_quote_db): 

123 mock_quote_db.count.return_value = 42 

124 result = runner.invoke(app, ["count"]) 

125 assert result.exit_code == 0 

126 assert "42" in result.output