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

1import json 

2from unittest.mock import patch 

3 

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 

8 

9STATS_PATH = "webapp.store.views.snap_recommendations.get_stats" 

10STATS_CACHE_KEY = "store:stats" 

11 

12MOCK_STATS = { 

13 "total_tracked": 1234, 

14 "updated_today": 56, 

15 "new_today": 7, 

16} 

17 

18 

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 

25 

26 def setUp(self): 

27 redis_cache.delete(STATS_CACHE_KEY) 

28 

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") 

32 

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) 

38 

39 def test_stats_uses_redis_cache(self): 

40 redis_cache.set(STATS_CACHE_KEY, MOCK_STATS, ttl=3600) 

41 

42 with patch(STATS_PATH) as mock_get_stats: 

43 response = self.client.get("/store/stats") 

44 mock_get_stats.assert_not_called() 

45 

46 self.assertEqual(response.status_code, 200) 

47 data = json.loads(response.data) 

48 self.assertEqual(data["total_tracked"], 1234) 

49 

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") 

55 

56 self.assertEqual(response.status_code, 503) 

57 self.assertEqual(json.loads(response.data), {}) 

58 

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") 

62 

63 self.assertEqual(response.status_code, 503) 

64 self.assertEqual(json.loads(response.data), {})