Coverage for tests/publisher/tests_get_package_metadata.py: 42%

45 statements  

« prev     ^ index     » next       coverage.py v7.10.2, created at 2025-08-05 22:06 +0000

1import responses 

2from unittest.mock import patch 

3from tests.publisher.endpoint_testing import BaseTestCases 

4from canonicalwebteam.exceptions import ( 

5 StoreApiResourceNotFound, 

6 StoreApiResponseErrorList, 

7 StoreApiError, 

8) 

9 

10# Make sure tests fail on stray responses. 

11responses.mock.assert_all_requests_are_fired = True 

12 

13 

14class TestGetPackageMetadata(BaseTestCases): 

15 def setUp(self): 

16 super().setUp() 

17 

18 @responses.activate 

19 @patch( 

20 "canonicalwebteam.store_api.publishergw." 

21 "PublisherGW.get_package_metadata" 

22 ) 

23 def test_get_package_metadata(self, mock_get_package_metadata): 

24 # testing for track guardrails 

25 mock_metadata = { 

26 "track-guardrails": { 

27 "created-at": "2024-03-26T11:54:50.062999", 

28 "pattern": "^v\\.[0-9]+", 

29 } 

30 } 

31 mock_get_package_metadata.return_value = mock_metadata 

32 

33 self.client.set_session_data( 

34 {"publisher": {"nickname": "test_username"}} 

35 ) 

36 

37 snap_name = "test_snap" 

38 api_response = {"metadata": mock_metadata} 

39 responses.add( 

40 responses.GET, 

41 f"https://api.charmhub.io/v1/snap/{snap_name}", 

42 json=api_response, 

43 status=200, 

44 ) 

45 

46 response = self.client.get(f"/api/packages/{snap_name}") 

47 

48 self.assertEqual(response.status_code, 200) 

49 self.assertEqual( 

50 response.json, 

51 {"data": mock_metadata, "success": True}, 

52 ) 

53 mock_get_package_metadata.assert_called_once_with( 

54 self.client.session, 

55 "snap", 

56 snap_name, 

57 ) 

58 

59 @responses.activate 

60 @patch( 

61 "canonicalwebteam.store_api.publishergw." 

62 "PublisherGW.get_package_metadata" 

63 ) 

64 def test_package_not_found(self, mock_get_package_metadata): 

65 mock_get_package_metadata.side_effect = StoreApiResourceNotFound() 

66 

67 self.client.set_session_data( 

68 {"publisher": {"nickname": "test_username"}} 

69 ) 

70 

71 response = self.client.get("/api/packages/test_snap") 

72 

73 self.assertEqual(response.status_code, 400) 

74 self.assertEqual( 

75 response.json, 

76 {"error": "Package not found", "success": False}, 

77 ) 

78 

79 @responses.activate 

80 @patch( 

81 "canonicalwebteam.store_api.publishergw." 

82 "PublisherGW.get_package_metadata" 

83 ) 

84 def test_api_error_with_list(self, mock_get_package_metadata): 

85 mock_get_package_metadata.side_effect = StoreApiResponseErrorList( 

86 "The api returned a list of errors", 

87 403, 

88 [ 

89 { 

90 "code": "error-code-1", 

91 "message": "error 1", 

92 }, 

93 { 

94 "code": "error-code-2", 

95 "message": "error 2", 

96 }, 

97 ], 

98 ) 

99 

100 self.client.set_session_data( 

101 {"publisher": {"nickname": "test_username"}} 

102 ) 

103 

104 response = self.client.get("/api/packages/test_snap") 

105 self.assertEqual(response.status_code, 403) 

106 self.assertEqual( 

107 response.json, 

108 { 

109 "error": "Error occurred while fetching snap metadata.", 

110 "errors": [ 

111 { 

112 "code": "error-code-1", 

113 "message": "error 1", 

114 }, 

115 { 

116 "code": "error-code-2", 

117 "message": "error 2", 

118 }, 

119 ], 

120 "success": False, 

121 }, 

122 ) 

123 

124 @responses.activate 

125 @patch( 

126 "canonicalwebteam.store_api.publishergw." 

127 "PublisherGW.get_package_metadata" 

128 ) 

129 def test_api_error(self, mock_get_package_metadata): 

130 mock_get_package_metadata.side_effect = StoreApiError() 

131 

132 self.client.set_session_data( 

133 {"publisher": {"nickname": "test_username"}} 

134 ) 

135 

136 response = self.client.get("/api/packages/test_snap") 

137 self.assertEqual(response.status_code, 403) 

138 self.assertEqual( 

139 response.json, 

140 { 

141 "error": "Error occurred while fetching snap metadata.", 

142 "success": False, 

143 }, 

144 )