Coverage for tests/store/test_details_overview.py: 100%

64 statements  

« prev     ^ index     » next       coverage.py v7.16.1, created at 2026-09-18 22:11 +0000

1from unittest import TestCase 

2from unittest.mock import patch 

3from webapp.app import app 

4from webapp.store.views import get_libraries, get_package_details 

5from mock_data.mock_store_logic import sample_package_detail 

6import copy 

7 

8 

9class TestDetailsOverview(TestCase): 

10 def setUp(self): 

11 app.testing = True 

12 self.client = app.test_client() 

13 

14 @patch("webapp.store.views.redis_cache.get") 

15 @patch("webapp.store.views.get_package_details") 

16 def test_details_with_discourse_link(self, mock_find, mock_cache_get): 

17 mock_find.return_value = sample_package_detail 

18 mock_cache_get.return_value = None 

19 response = self.client.get("/test") 

20 self.assertNotIn(b"Read documentation", response.data) 

21 self.assertEqual(response.status_code, 200) 

22 

23 @patch("webapp.store.views.redis_cache.get") 

24 @patch("webapp.store.views.get_package_details") 

25 def test_details_with_readthedocs_link(self, mock_find, mock_cache_get): 

26 data = copy.deepcopy(sample_package_detail) 

27 data["default-release"]["revision"][ 

28 "metadata-yaml" 

29 ] = """ 

30 docs: https://readthedocs.charmhub.io/t/xxx 

31 """ 

32 mock_find.return_value = data 

33 mock_cache_get.return_value = None 

34 response = self.client.get("/test") 

35 self.assertIn(b"Read documentation", response.data) 

36 self.assertNotIn(b"Add docs to a charm", response.data) 

37 self.assertEqual(response.status_code, 200) 

38 

39 @patch("webapp.store.logic.process_libraries") 

40 @patch("webapp.store_api.publisher_gateway.get_charm_libraries") 

41 @patch("webapp.store.views.redis_cache.set") 

42 @patch("webapp.store.views.redis_cache.get", return_value=["lib1", "lib2"]) 

43 def test_get_libraries_from_cache( 

44 self, _, mock_cache_set, mock_publishergw, mock_process 

45 ): 

46 result = get_libraries("test-package") 

47 self.assertEqual(result, ["lib1", "lib2"]) 

48 mock_publishergw.assert_not_called() 

49 mock_process.assert_not_called() 

50 mock_cache_set.assert_not_called() 

51 

52 @patch( 

53 "webapp.store.logic.process_libraries", return_value=["processed-lib"] 

54 ) 

55 @patch( 

56 "webapp.store_api.publisher_gateway.get_charm_libraries", 

57 return_value=["raw-lib"], 

58 ) 

59 @patch("webapp.store.views.redis_cache.set") 

60 @patch("webapp.store.views.redis_cache.get", return_value=None) 

61 def test_get_libraries_from_gateway_on_cache_miss( 

62 self, _, mock_set, mock_publishergw, mock_process 

63 ): 

64 result = get_libraries("test-package") 

65 self.assertEqual(result, ["processed-lib"]) 

66 mock_publishergw.assert_called_once_with("test-package") 

67 mock_process.assert_called_once_with(["raw-lib"]) 

68 mock_set.assert_called_once_with( 

69 "test-package:libraries", ["processed-lib"], ttl=600 

70 ) 

71 

72 @patch("webapp.store.views.redis_cache.set") 

73 @patch( 

74 "webapp.store.views.redis_cache.get", 

75 return_value={"name": "test-package"}, 

76 ) 

77 def test_get_package_details_from_cache(self, _, mock_cache_set): 

78 result = get_package_details( 

79 "test-package", "stable", fields=["result.name"] 

80 ) 

81 self.assertEqual(result, {"name": "test-package"}) 

82 mock_cache_set.assert_not_called() 

83 

84 @patch( 

85 "webapp.store_api.device_gateway.get_item_details", 

86 return_value={"name": "test-package"}, 

87 ) 

88 @patch("webapp.store.views.redis_cache.set") 

89 @patch("webapp.store.views.redis_cache.get", return_value=None) 

90 def test_get_package_details_from_gateway_on_cache_miss( 

91 self, _, mock_set, mock_publishergw 

92 ): 

93 result = get_package_details( 

94 "test-package", "stable", fields=["result.name"] 

95 ) 

96 expected_key = ( 

97 "package_details:test-package", 

98 {"channel": "stable", "fields": "result.name"}, 

99 ) 

100 self.assertEqual(result, {"name": "test-package"}) 

101 mock_publishergw.assert_called_once_with( 

102 "test-package", channel="stable", fields=["result.name"] 

103 ) 

104 mock_set.assert_called_once_with( 

105 expected_key, {"name": "test-package"}, ttl=600 

106 )