Coverage for tests/publisher/tests_account_snaps_metrics.py: 100%

56 statements  

« prev     ^ index     » next       coverage.py v7.10.7, created at 2025-10-14 22:07 +0000

1import json 

2import responses 

3from tests.publisher.endpoint_testing import BaseTestCases 

4 

5# Make sure tests fail on stray responses. 

6responses.mock.assert_all_requests_are_fired = True 

7 

8 

9class AccountSnapsMetricsNotAuth(BaseTestCases.EndpointLoggedOut): 

10 def setUp(self): 

11 endpoint_url = "/snaps/metrics/json" 

12 super().setUp( 

13 snap_name=None, endpoint_url=endpoint_url, method_endpoint="POST" 

14 ) 

15 

16 

17class AccountSnapsMetrics(BaseTestCases.BaseAppTesting): 

18 def setUp(self): 

19 api_url = "https://dashboard.snapcraft.io/dev/api/snaps/metrics" 

20 endpoint_url = "/snaps/metrics/json" 

21 super().setUp( 

22 snap_name=None, endpoint_url=endpoint_url, api_url=api_url 

23 ) 

24 self.authorization = self._log_in(self.client) 

25 

26 @responses.activate 

27 def test_metrics(self): 

28 metrics_payload = { 

29 "metrics": [ 

30 { 

31 "snap_id": "1", 

32 "status": "OK", 

33 "series": [ 

34 {"values": [0, 3], "name": "new"}, 

35 {"values": [2, 3], "name": "lost"}, 

36 {"values": [9, 6], "name": "continued"}, 

37 ], 

38 "buckets": ["2018-04-13", "2018-04-20"], 

39 }, 

40 { 

41 "snap_id": "2", 

42 "status": "NODATA", 

43 "series": [], 

44 "buckets": [], 

45 }, 

46 ] 

47 } 

48 

49 responses.add( 

50 responses.POST, self.api_url, json=metrics_payload, status=200 

51 ) 

52 

53 payload = {"1": "test1", "2": "test2"} 

54 headers = {"content-type": "application/json"} 

55 response = self.client.post( 

56 self.endpoint_url, data=json.dumps(payload), headers=headers 

57 ) 

58 

59 expected_response = { 

60 "buckets": ["2018-04-13", "2018-04-20"], 

61 "days_without_data": [], 

62 "snaps": [ 

63 { 

64 "id": "1", 

65 "name": None, 

66 "series": [ 

67 {"name": "new", "values": [0, 3]}, 

68 {"name": "lost", "values": [2, 3]}, 

69 {"name": "continued", "values": [9, 6]}, 

70 ], 

71 } 

72 ], 

73 } 

74 

75 self.assertEqual(200, response.status_code) 

76 self.assertEqual(expected_response, response.json) 

77 self.assertEqual(1, len(responses.calls)) 

78 called = responses.calls[0] 

79 self.assertEqual(self.api_url, called.request.url) 

80 self.assertEqual( 

81 self.authorization, called.request.headers.get("Authorization") 

82 ) 

83 

84 @responses.activate 

85 def test_metrics_no_payload(self): 

86 headers = {"content-type": "application/json"} 

87 response = self.client.post(self.endpoint_url, headers=headers) 

88 

89 expected_response = {"error": "Please provide a list of snaps"} 

90 

91 self.assertEqual(500, response.status_code) 

92 self.assertEqual(expected_response, response.json) 

93 

94 @responses.activate 

95 def test_metrics_bad_id_payload(self): 

96 headers = {"content-type": "application/json"} 

97 

98 metrics_payload = { 

99 "error_list": [{"message": "Error", "code": "invalid"}] 

100 } 

101 

102 responses.add( 

103 responses.POST, self.api_url, json=metrics_payload, status=400 

104 ) 

105 

106 payload = {"badid": "badname"} 

107 response = self.client.post( 

108 self.endpoint_url, data=json.dumps(payload), headers=headers 

109 ) 

110 

111 expected_response = { 

112 "error": "An error occured while fetching metrics" 

113 } 

114 

115 self.assertEqual(500, response.status_code) 

116 self.assertEqual(expected_response, response.json) 

117 

118 @responses.activate 

119 def test_metrics_with_empty_data(self): 

120 metrics_payload = { 

121 "metrics": [ 

122 { 

123 "snap_id": "1", 

124 "status": "OK", 

125 "series": [ 

126 {"values": [0, 3, None], "name": "new"}, 

127 {"values": [2, 3, None], "name": "lost"}, 

128 {"values": [9, 6, None], "name": "continued"}, 

129 ], 

130 "buckets": ["2018-04-13", "2018-04-20", "2018-04-21"], 

131 }, 

132 ] 

133 } 

134 

135 responses.add( 

136 responses.POST, self.api_url, json=metrics_payload, status=200 

137 ) 

138 

139 payload = {"1": "test1"} 

140 headers = {"content-type": "application/json"} 

141 response = self.client.post( 

142 self.endpoint_url, data=json.dumps(payload), headers=headers 

143 ) 

144 

145 expected_response = { 

146 "buckets": ["2018-04-13", "2018-04-20", "2018-04-21"], 

147 "days_without_data": ["2018-04-21"], 

148 "snaps": [ 

149 { 

150 "id": "1", 

151 "name": None, 

152 "series": [ 

153 {"name": "new", "values": [0, 3, None]}, 

154 {"name": "lost", "values": [2, 3, None]}, 

155 {"name": "continued", "values": [9, 6, None]}, 

156 ], 

157 } 

158 ], 

159 } 

160 

161 self.assertEqual(200, response.status_code) 

162 self.assertEqual(expected_response, response.json) 

163 self.assertEqual(1, len(responses.calls))