Coverage for tests/store/tests_store_stats.py: 100%
43 statements
« prev ^ index » next coverage.py v7.15.0, created at 2026-07-08 12:33 +0000
« prev ^ index » next coverage.py v7.15.0, created at 2026-07-08 12:33 +0000
1import json
2from unittest.mock import patch
4from cache.cache_utility import redis_cache
5from flask_testing import TestCase
6from webapp.api.exceptions import ApiConnectionError, ApiTimeoutError
7from webapp.app import create_app
9STATS_PATH = "webapp.store.views.snap_recommendations.get_stats"
10STATS_CACHE_KEY = "store:stats"
12MOCK_STATS = {
13 "total_tracked": 1234,
14 "updated_today": 56,
15 "new_today": 7,
16}
19class StoreStatsTest(TestCase):
20 def create_app(self):
21 app = create_app(testing=True)
22 app.secret_key = "secret_key"
23 app.config["WTF_CSRF_METHODS"] = []
24 return app
26 def setUp(self):
27 redis_cache.delete(STATS_CACHE_KEY)
29 def test_stats_returns_200_with_data_from_api(self):
30 with patch(STATS_PATH, return_value=MOCK_STATS):
31 response = self.client.get("/store/stats")
33 self.assertEqual(response.status_code, 200)
34 data = json.loads(response.data)
35 self.assertEqual(data["total_tracked"], 1234)
36 self.assertEqual(data["updated_today"], 56)
37 self.assertEqual(data["new_today"], 7)
39 def test_stats_uses_redis_cache(self):
40 redis_cache.set(STATS_CACHE_KEY, MOCK_STATS, ttl=3600)
42 with patch(STATS_PATH) as mock_get_stats:
43 response = self.client.get("/store/stats")
44 mock_get_stats.assert_not_called()
46 self.assertEqual(response.status_code, 200)
47 data = json.loads(response.data)
48 self.assertEqual(data["total_tracked"], 1234)
50 def test_stats_returns_503_on_connection_error(self):
51 with patch(
52 STATS_PATH, side_effect=ApiConnectionError("connection error")
53 ):
54 response = self.client.get("/store/stats")
56 self.assertEqual(response.status_code, 503)
57 self.assertEqual(json.loads(response.data), {})
59 def test_stats_returns_503_on_timeout_error(self):
60 with patch(STATS_PATH, side_effect=ApiTimeoutError("timeout")):
61 response = self.client.get("/store/stats")
63 self.assertEqual(response.status_code, 503)
64 self.assertEqual(json.loads(response.data), {})