Coverage for tests/services/test_log_service.py: 100%
113 statements
« prev ^ index » next coverage.py v7.6.12, created at 2025-05-02 02:49 +0000
« prev ^ index » next coverage.py v7.6.12, created at 2025-05-02 02:49 +0000
1import pytest
2from unittest.mock import patch, MagicMock
3from app.services import log_service
6def mock_execute_with_data(data):
7 mock_response = MagicMock()
8 mock_response.data = data
9 return mock_response
12@patch("app.services.log_service.client", new_callable=MagicMock)
13def test_log_event_success(mock_client, app):
14 mock_table = MagicMock()
15 mock_insert = MagicMock()
16 mock_execute = MagicMock()
18 mock_client.table.return_value = mock_table
19 mock_table.insert.return_value = mock_insert
20 mock_insert.execute.return_value = None
22 event = {"event": "test", "metadata": {"user_id": "abc"}}
24 log_service.log_event(event)
26 mock_client.table.assert_called_once_with("logs")
27 mock_table.insert.assert_called_once_with(event)
28 mock_insert.execute.assert_called_once()
31@patch("app.services.log_service.client", new_callable=MagicMock)
32def test_log_suggestion_success(mock_client, app):
33 mock_table = MagicMock()
34 mock_insert = MagicMock()
35 mock_execute = MagicMock()
36 mock_execute.data = [{"id": "abc123"}]
38 mock_client.table.return_value = mock_table
39 mock_table.insert.return_value = mock_insert
40 mock_insert.execute.return_value = mock_execute
42 suggestion = {
43 "event": "suggestion",
44 "metadata": {},
45 }
47 result = log_service.log_suggestion(suggestion)
49 assert result["id"] == "abc123"
50 mock_client.table.assert_called_with("suggestions")
51 mock_table.insert.assert_called_once_with(suggestion)
54@patch("app.services.log_service.client", new_callable=MagicMock)
55def test_log_suggestion_failure_no_data(mock_client, app):
56 mock_table = MagicMock()
57 mock_insert = MagicMock()
58 mock_execute = MagicMock()
59 mock_execute.data = None
61 mock_client.table.return_value = mock_table
62 mock_table.insert.return_value = mock_insert
63 mock_insert.execute.return_value = mock_execute
65 with pytest.raises(Exception, match="No data returned from insert operation"):
66 log_service.log_suggestion({"event": "fail", "metadata": {}})
69@patch("app.services.log_service.client", new_callable=MagicMock)
70def test_get_all_logs(mock_client, app):
71 mock_table = MagicMock()
72 mock_select = MagicMock()
73 mock_execute = mock_execute_with_data([{"event": "test"}])
75 mock_client.table.return_value = mock_table
76 mock_table.select.return_value = mock_select
77 mock_select.execute.return_value = mock_execute
79 result = log_service.get_all_logs()
80 assert result == [{"event": "test"}]
83@patch("app.services.log_service.client", new_callable=MagicMock)
84def test_get_logs_by_user(mock_client, app):
85 mock_table = MagicMock()
86 mock_select = MagicMock()
87 mock_eq = MagicMock()
88 mock_execute = mock_execute_with_data([{"event": "test"}])
90 mock_client.table.return_value = mock_table
91 mock_table.select.return_value = mock_select
92 mock_select.eq.return_value = mock_eq
93 mock_eq.execute.return_value = mock_execute
95 result = log_service.get_logs_by_user("user123")
96 assert result == [{"event": "test"}]
99@patch("app.services.log_service.client", new_callable=MagicMock)
100def test_get_logs_by_user_with_section_and_class(mock_client, app):
101 # Set up chained .eq().eq().eq().execute().data
102 mock_execute = MagicMock()
103 mock_execute.data = [{"event": "test"}]
105 mock_eq3 = MagicMock()
106 mock_eq3.execute.return_value = mock_execute
108 mock_eq2 = MagicMock()
109 mock_eq2.eq.return_value = mock_eq3
111 mock_eq1 = MagicMock()
112 mock_eq1.eq.return_value = mock_eq2
114 mock_select = MagicMock()
115 mock_select.eq.return_value = mock_eq1
117 mock_table = MagicMock()
118 mock_table.select.return_value = mock_select
120 mock_client.table.return_value = mock_table
122 result = log_service.get_logs_by_user("user123", "sec1", "class1")
123 assert result == [{"event": "test"}]
126@patch("app.services.log_service.client", new_callable=MagicMock)
127def test_get_logs_by_class(mock_client, app):
128 mock_table = MagicMock()
129 mock_select = MagicMock()
130 mock_eq = MagicMock()
131 mock_execute = mock_execute_with_data([{"event": "class-log"}])
133 mock_client.table.return_value = mock_table
134 mock_table.select.return_value = mock_select
135 mock_select.eq.return_value = mock_eq
136 mock_eq.execute.return_value = mock_execute
138 result = log_service.get_logs_by_class("class123")
139 assert result == [{"event": "class-log"}]
142@patch("app.services.log_service.client", new_callable=MagicMock)
143def test_get_ai_usage(mock_client, app):
144 mock_table = MagicMock()
145 mock_select = MagicMock()
146 mock_execute = mock_execute_with_data([{"usage": 10}])
148 mock_client.table.return_value = mock_table
149 mock_table.select.return_value = mock_select
150 mock_select.execute.return_value = mock_execute
152 result = log_service.get_ai_usage()
153 assert result == [{"usage": 10}]
156@patch("app.services.log_service.client", new_callable=MagicMock)
157def test_get_all_data_from_db(mock_client, app):
158 mock_client.table.return_value.select.return_value.execute.side_effect = [
159 mock_execute_with_data([{"id": "user1"}]),
160 mock_execute_with_data([{"id": "cu1"}]),
161 mock_execute_with_data([{"id": "class1"}]),
162 mock_execute_with_data([{"event": "log1"}]),
163 mock_execute_with_data([{"id": "suggest1"}]),
164 mock_execute_with_data([{"id": "usq1"}]),
165 mock_execute_with_data([{"id": "us1"}]),
166 ]
168 result = log_service.get_all_data_from_db()
170 assert result["users"][0]["id"] == "user1"
171 assert result["logs"][0]["event"] == "log1"
172 assert "user_sections" in result