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
« 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
8runner = CliRunner()
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
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
24def test_version():
25 result = runner.invoke(app, ["version"])
26 assert result.exit_code == 0
27 assert result.output.strip() == packet.__version__
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"
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)
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
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]
57 result = runner.invoke(app, ["list"])
58 assert result.exit_code == 0
59 assert "Hello" in result.output
60 assert "Author" in result.output
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"
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()
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()
80@pytest.mark.skip()
81def test_sql_delete_all(mock_quote_db_sql):
82 mock_quote_db_sql.delete_all.return_value = None
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 )
97 print(result.output)
98 assert result.exit_code == 0
99 mock_quote_db_sql.delete_all.assert_called_once()
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"
110 mock_quote_db_sql.get_latest.return_value = [FakeQuote()]
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
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()
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