Coverage for tests/publisher/cve/test_cve_get_by_revision.py: 100%
61 statements
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-30 22:06 +0000
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-30 22:06 +0000
1import unittest
2from unittest.mock import patch, MagicMock
3import json
4from webapp.publisher.cve.cve_helper import CveHelper
5from werkzeug.exceptions import NotFound
8class CveHGetByRevisionTest(unittest.TestCase):
10 def setUp(self):
12 self.file_metadata = {"download_url": "https://example.com/file.json"}
14 self.file_content = {
15 "format": 1,
16 "published_at": "2025-01-26T20:30:16+00:00",
17 "security_issues": {
18 "cves": {
19 "CVE-2023-31486": {
20 "cvss_score": 5.5,
21 "cvss_severity": "medium",
22 "description": "description-1",
23 "ubuntu_priority": "critical",
24 },
25 "CVE-2014-9984": {
26 "cvss_score": 9,
27 "cvss_severity": "high",
28 "description": "description-2",
29 "ubuntu_priority": "negligible",
30 },
31 "CVE-2024-52005": {
32 "cvss_score": 2.1,
33 "cvss_severity": "negligible",
34 "description": "description-3",
35 "ubuntu_priority": "medium",
36 },
37 },
38 "usns": {
39 "3009-1": {
40 "description": "USN description",
41 "published_at": "2016-06-20T16:35:09+00:00",
42 "related_cves": ["CVE-2014-9984"],
43 "related_launchpad_bugs": None,
44 }
45 },
46 },
47 "snaps": {
48 "my-snap": {
49 "revisions": {
50 "3053": {
51 "channels": ["edge"],
52 "fixed-cves": {
53 "CVE-2014-9984": {
54 "affected_binaries": [
55 {
56 "fixed_version": "2.27-3ubuntu1.6",
57 "name": "libc-dev-bin",
58 "status": "fixed",
59 "version": "2.27-3ubuntu1.4",
60 },
61 {
62 "fixed_version": "2.27-3ubuntu1.6",
63 "name": "libc6-dev",
64 "status": "fixed",
65 "version": "2.27-3ubuntu1.4",
66 },
67 ],
68 "channels_with_fix": [],
69 "usns": ["3009-1"],
70 },
71 "CVE-2023-31486": {
72 "affected_binaries": [
73 {
74 "fixed_version": "2.27-3ubuntu1.6",
75 "name": "libc-dev-bin21",
76 "status": "fixed",
77 "version": "2.27-3ubuntu1.4",
78 },
79 ],
80 "channels_with_fix": [],
81 "usns": ["3009-1"],
82 },
83 },
84 "unfixed-cves": {
85 "CVE-2024-52005": {
86 "affected_binaries": [
87 {
88 "fixed_version": None,
89 "name": "git-man",
90 "status": "unfixed",
91 "version": "1:2.34.1-1ubuntu1.12",
92 }
93 ],
94 "channels_with_fix": None,
95 "usns": None,
96 }
97 },
98 }
99 }
100 }
101 },
102 }
104 @patch("requests.get")
105 def test_get_cve_by_revision(self, mock_get):
106 mock_get.side_effect = [
107 MagicMock(status_code=200, json=lambda: self.file_metadata),
108 MagicMock(status_code=200, text=json.dumps(self.file_content)),
109 ]
111 result = CveHelper.get_cve_with_revision("my-snap", "3053")
113 self.assertEqual(len(result), 3)
114 self.assertEqual(result[0]["id"], "CVE-2014-9984")
115 self.assertEqual(result[0]["status"], "fixed")
116 self.assertEqual(result[0]["cvss_score"], 9)
117 self.assertEqual(result[0]["cvss_severity"], "high")
118 self.assertEqual(result[0]["description"], "description-2")
119 self.assertEqual(result[0]["ubuntu_priority"], "negligible")
120 self.assertEqual(len(result[0]["affected_binaries"]), 2)
121 self.assertEqual(
122 result[0]["affected_binaries"][0]["name"], "libc-dev-bin"
123 )
124 self.assertEqual(
125 result[0]["affected_binaries"][1]["name"], "libc6-dev"
126 )
127 self.assertEqual(len(result[0]["usns"]), 1)
128 self.assertEqual(result[0]["usns"][0]["id"], "3009-1")
129 self.assertEqual(
130 result[0]["usns"][0]["description"], "USN description"
131 )
133 self.assertEqual(result[1]["id"], "CVE-2023-31486")
134 self.assertEqual(result[1]["status"], "fixed")
135 self.assertEqual(result[1]["cvss_score"], 5.5)
136 self.assertEqual(result[1]["cvss_severity"], "medium")
137 self.assertEqual(result[1]["description"], "description-1")
138 self.assertEqual(result[1]["ubuntu_priority"], "critical")
139 self.assertEqual(len(result[1]["affected_binaries"]), 1)
140 self.assertEqual(
141 result[1]["affected_binaries"][0]["name"], "libc-dev-bin21"
142 )
143 self.assertEqual(result[1]["affected_binaries"][0]["status"], "fixed")
144 self.assertEqual(
145 result[1]["affected_binaries"][0]["fixed_version"],
146 "2.27-3ubuntu1.6",
147 )
148 self.assertEqual(
149 result[1]["affected_binaries"][0]["version"], "2.27-3ubuntu1.4"
150 )
151 self.assertEqual(len(result[1]["usns"]), 1)
152 self.assertEqual(result[1]["usns"][0]["id"], "3009-1")
154 self.assertEqual(result[2]["id"], "CVE-2024-52005")
155 self.assertEqual(result[2]["status"], "unfixed")
156 self.assertEqual(result[2]["cvss_score"], 2.1)
157 self.assertEqual(result[2]["cvss_severity"], "negligible")
158 self.assertEqual(result[2]["description"], "description-3")
159 self.assertEqual(result[2]["ubuntu_priority"], "medium")
160 self.assertEqual(len(result[2]["affected_binaries"]), 1)
161 self.assertEqual(result[2]["affected_binaries"][0]["name"], "git-man")
162 self.assertEqual(
163 result[2]["affected_binaries"][0]["status"], "unfixed"
164 )
165 self.assertEqual(
166 result[2]["affected_binaries"][0]["fixed_version"], None
167 )
168 self.assertEqual(
169 result[2]["affected_binaries"][0]["version"],
170 "1:2.34.1-1ubuntu1.12",
171 )
172 self.assertEqual(len(result[2]["usns"]), 0)
174 @patch("requests.get")
175 def test_get_cve_by_revision_metadata_not_found(self, mock_get):
176 mock_get.side_effect = [
177 MagicMock(status_code=404, json=lambda: {}),
178 MagicMock(status_code=200, text=json.dumps(self.file_content)),
179 ]
180 with self.assertRaises(NotFound):
181 CveHelper.get_cve_with_revision("my-snap", "3053")
183 @patch("requests.get")
184 def test_get_cve_by_revision_file_content_not_found(self, mock_get):
185 mock_get.side_effect = [
186 MagicMock(status_code=200, json=lambda: self.file_metadata),
187 MagicMock(status_code=404, text=json.dumps(self.file_content)),
188 ]
189 with self.assertRaises(NotFound):
190 CveHelper.get_cve_with_revision("my-snap", "3053")