|
41 | 41 | from tests import reorder
|
42 | 42 |
|
43 | 43 |
|
44 |
| -class TestModelVulnerability(TestCase): |
| 44 | +class TestModelVulnerabilitySeverity(TestCase): |
45 | 45 |
|
46 | 46 | def test_v_severity_from_cvss_scores_single_critical(self) -> None:
|
47 | 47 | self.assertEqual(
|
@@ -85,87 +85,165 @@ def test_v_severity_from_cvss_scores_multiple_high(self) -> None:
|
85 | 85 | VulnerabilitySeverity.HIGH
|
86 | 86 | )
|
87 | 87 |
|
| 88 | + |
| 89 | +class TestModelVulnerabilityScoreSource(TestCase): |
| 90 | + |
| 91 | + def test_v_source_parse_other(self) -> None: |
| 92 | + self.assertEqual( |
| 93 | + VulnerabilityScoreSource.get_from_vector('loremIpsum'), |
| 94 | + VulnerabilityScoreSource.OTHER |
| 95 | + ) |
| 96 | + |
| 97 | + def test_v_source_parse_cvss4_0(self) -> None: |
| 98 | + self.assertEqual( |
| 99 | + VulnerabilityScoreSource.get_from_vector( |
| 100 | + 'CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:P/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N/E:U'), |
| 101 | + VulnerabilityScoreSource.CVSS_V4 |
| 102 | + ) |
| 103 | + |
88 | 104 | def test_v_source_parse_cvss3_1(self) -> None:
|
89 | 105 | self.assertEqual(
|
90 |
| - VulnerabilityScoreSource.get_from_vector('CVSS:3.0/AV:L/AC:L/PR:N/UI:R/S:C/C:L/I:N/A:N'), |
| 106 | + VulnerabilityScoreSource.get_from_vector( |
| 107 | + 'CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H'), |
| 108 | + VulnerabilityScoreSource.CVSS_V3_1 |
| 109 | + ) |
| 110 | + |
| 111 | + def test_v_source_parse_cvss3_0(self) -> None: |
| 112 | + self.assertEqual( |
| 113 | + VulnerabilityScoreSource.get_from_vector( |
| 114 | + 'CVSS:3.0/AV:L/AC:L/PR:N/UI:R/S:C/C:L/I:N/A:N'), |
91 | 115 | VulnerabilityScoreSource.CVSS_V3
|
92 | 116 | )
|
93 | 117 |
|
94 |
| - def test_v_source_parse_cvss2_1(self) -> None: |
| 118 | + def test_v_source_parse_cvss2_0(self) -> None: |
95 | 119 | self.assertEqual(
|
96 |
| - VulnerabilityScoreSource.get_from_vector('CVSS:2.0/AV:N/AC:L/Au:N/C:N/I:N/A:C'), |
| 120 | + VulnerabilityScoreSource.get_from_vector( |
| 121 | + 'CVSS:2.0/AV:N/AC:L/Au:N/C:N/I:N/A:C'), |
97 | 122 | VulnerabilityScoreSource.CVSS_V2
|
98 | 123 | )
|
99 | 124 |
|
100 | 125 | def test_v_source_parse_owasp_1(self) -> None:
|
101 | 126 | self.assertEqual(
|
102 |
| - VulnerabilityScoreSource.get_from_vector('OWASP/K9:M1:O0:Z2/D1:X1:W1:L3/C2:I1:A1:T1/F1:R1:S2:P3/50'), |
| 127 | + VulnerabilityScoreSource.get_from_vector( |
| 128 | + 'OWASP/K9:M1:O0:Z2/D1:X1:W1:L3/C2:I1:A1:T1/F1:R1:S2:P3/50'), |
103 | 129 | VulnerabilityScoreSource.OWASP
|
104 | 130 | )
|
105 | 131 |
|
106 |
| - def test_v_source_get_localised_vector_cvss3_1(self) -> None: |
| 132 | + def test_v_source_get_localised_vector_cvss4_slash(self) -> None: |
| 133 | + self.assertEqual( |
| 134 | + VulnerabilityScoreSource.CVSS_V4.get_localised_vector( |
| 135 | + 'CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:P/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N'), |
| 136 | + 'AV:N/AC:L/AT:P/PR:N/UI:P/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N' |
| 137 | + ) |
| 138 | + |
| 139 | + def test_v_source_get_localised_vector_cvss4_noslash(self) -> None: |
| 140 | + self.assertEqual( |
| 141 | + VulnerabilityScoreSource.CVSS_V4.get_localised_vector( |
| 142 | + 'CVSS:4.0AV:N/AC:L/AT:P/PR:N/UI:P/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N'), |
| 143 | + 'AV:N/AC:L/AT:P/PR:N/UI:P/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N' |
| 144 | + ) |
| 145 | + |
| 146 | + def test_v_source_get_localised_vector_cvss4_none(self) -> None: |
| 147 | + self.assertEqual( |
| 148 | + VulnerabilityScoreSource.CVSS_V4.get_localised_vector( |
| 149 | + 'AV:N/AC:L/AT:P/PR:N/UI:P/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N'), |
| 150 | + 'AV:N/AC:L/AT:P/PR:N/UI:P/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N' |
| 151 | + ) |
| 152 | + |
| 153 | + def test_v_source_get_localised_vector_cvss3_1_slash(self) -> None: |
| 154 | + self.assertEqual( |
| 155 | + VulnerabilityScoreSource.CVSS_V3.get_localised_vector( |
| 156 | + 'CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H'), |
| 157 | + 'AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H' |
| 158 | + ) |
| 159 | + |
| 160 | + def test_v_source_get_localised_vector_cvss3_1_noslash(self) -> None: |
| 161 | + self.assertEqual( |
| 162 | + VulnerabilityScoreSource.CVSS_V3_1.get_localised_vector( |
| 163 | + 'CVSS:3.0AV:L/AC:L/PR:N/UI:R/S:C/C:L/I:N/A:N'), |
| 164 | + 'AV:L/AC:L/PR:N/UI:R/S:C/C:L/I:N/A:N' |
| 165 | + ) |
| 166 | + |
| 167 | + def test_v_source_get_localised_vector_cvss3_1_none(self) -> None: |
| 168 | + self.assertEqual( |
| 169 | + VulnerabilityScoreSource.CVSS_V3_1.get_localised_vector( |
| 170 | + 'AV:L/AC:L/PR:N/UI:R/S:C/C:L/I:N/A:N'), |
| 171 | + 'AV:L/AC:L/PR:N/UI:R/S:C/C:L/I:N/A:N' |
| 172 | + ) |
| 173 | + |
| 174 | + def test_v_source_get_localised_vector_cvss3_slash(self) -> None: |
107 | 175 | self.assertEqual(
|
108 | 176 | VulnerabilityScoreSource.CVSS_V3.get_localised_vector(
|
109 |
| - vector='CVSS:3.0/AV:L/AC:L/PR:N/UI:R/S:C/C:L/I:N/A:N' |
110 |
| - ), |
| 177 | + 'CVSS:3.0/AV:L/AC:L/PR:N/UI:R/S:C/C:L/I:N/A:N'), |
111 | 178 | 'AV:L/AC:L/PR:N/UI:R/S:C/C:L/I:N/A:N'
|
112 | 179 | )
|
113 | 180 |
|
114 |
| - def test_v_source_get_localised_vector_cvss3_2(self) -> None: |
| 181 | + def test_v_source_get_localised_vector_cvss3_noslash(self) -> None: |
115 | 182 | self.assertEqual(
|
116 |
| - VulnerabilityScoreSource.CVSS_V3.get_localised_vector(vector='CVSS:3.0AV:L/AC:L/PR:N/UI:R/S:C/C:L/I:N/A:N'), |
| 183 | + VulnerabilityScoreSource.CVSS_V3.get_localised_vector( |
| 184 | + 'CVSS:3.0AV:L/AC:L/PR:N/UI:R/S:C/C:L/I:N/A:N'), |
117 | 185 | 'AV:L/AC:L/PR:N/UI:R/S:C/C:L/I:N/A:N'
|
118 | 186 | )
|
119 | 187 |
|
120 |
| - def test_v_source_get_localised_vector_cvss3_3(self) -> None: |
| 188 | + def test_v_source_get_localised_vector_cvss3_none(self) -> None: |
121 | 189 | self.assertEqual(
|
122 |
| - VulnerabilityScoreSource.CVSS_V3.get_localised_vector(vector='AV:L/AC:L/PR:N/UI:R/S:C/C:L/I:N/A:N'), |
| 190 | + VulnerabilityScoreSource.CVSS_V3.get_localised_vector( |
| 191 | + 'AV:L/AC:L/PR:N/UI:R/S:C/C:L/I:N/A:N'), |
123 | 192 | 'AV:L/AC:L/PR:N/UI:R/S:C/C:L/I:N/A:N'
|
124 | 193 | )
|
125 | 194 |
|
126 |
| - def test_v_source_get_localised_vector_cvss2_1(self) -> None: |
| 195 | + def test_v_source_get_localised_vector_cvss2_slash(self) -> None: |
127 | 196 | self.assertEqual(
|
128 | 197 | VulnerabilityScoreSource.CVSS_V2.get_localised_vector(
|
129 |
| - vector='CVSS:2.0/AV:L/AC:L/PR:N/UI:R/S:C/C:L/I:N/A:N'), |
| 198 | + 'CVSS:2.0/AV:L/AC:L/PR:N/UI:R/S:C/C:L/I:N/A:N'), |
130 | 199 | 'AV:L/AC:L/PR:N/UI:R/S:C/C:L/I:N/A:N'
|
131 | 200 | )
|
132 | 201 |
|
133 |
| - def test_v_source_get_localised_vector_cvss2_2(self) -> None: |
| 202 | + def test_v_source_get_localised_vector_cvss2_noslash(self) -> None: |
134 | 203 | self.assertEqual(
|
135 |
| - VulnerabilityScoreSource.CVSS_V2.get_localised_vector(vector='CVSS:2.1AV:L/AC:L/PR:N/UI:R/S:C/C:L/I:N/A:N'), |
| 204 | + VulnerabilityScoreSource.CVSS_V2.get_localised_vector( |
| 205 | + 'CVSS:2.0AV:L/AC:L/PR:N/UI:R/S:C/C:L/I:N/A:N'), |
136 | 206 | 'AV:L/AC:L/PR:N/UI:R/S:C/C:L/I:N/A:N'
|
137 | 207 | )
|
138 | 208 |
|
139 |
| - def test_v_source_get_localised_vector_cvss2_3(self) -> None: |
| 209 | + def test_v_source_get_localised_vector_cvss2_none(self) -> None: |
140 | 210 | self.assertEqual(
|
141 |
| - VulnerabilityScoreSource.CVSS_V2.get_localised_vector(vector='AV:L/AC:L/PR:N/UI:R/S:C/C:L/I:N/A:N'), |
| 211 | + VulnerabilityScoreSource.CVSS_V2.get_localised_vector( |
| 212 | + 'AV:L/AC:L/PR:N/UI:R/S:C/C:L/I:N/A:N'), |
142 | 213 | 'AV:L/AC:L/PR:N/UI:R/S:C/C:L/I:N/A:N'
|
143 | 214 | )
|
144 | 215 |
|
145 |
| - def test_v_source_get_localised_vector_owasp_1(self) -> None: |
| 216 | + def test_v_source_get_localised_vector_owasp_slash(self) -> None: |
146 | 217 | self.assertEqual(
|
147 |
| - VulnerabilityScoreSource.OWASP.get_localised_vector(vector='OWASP/AV:L/AC:L/PR:N/UI:R/S:C/C:L/I:N/A:N'), |
| 218 | + VulnerabilityScoreSource.OWASP.get_localised_vector( |
| 219 | + 'OWASP/AV:L/AC:L/PR:N/UI:R/S:C/C:L/I:N/A:N'), |
148 | 220 | 'AV:L/AC:L/PR:N/UI:R/S:C/C:L/I:N/A:N'
|
149 | 221 | )
|
150 | 222 |
|
151 |
| - def test_v_source_get_localised_vector_owasp_2(self) -> None: |
| 223 | + def test_v_source_get_localised_vector_owasp_noslash(self) -> None: |
152 | 224 | self.assertEqual(
|
153 |
| - VulnerabilityScoreSource.OWASP.get_localised_vector(vector='OWASPAV:L/AC:L/PR:N/UI:R/S:C/C:L/I:N/A:N'), |
| 225 | + VulnerabilityScoreSource.OWASP.get_localised_vector( |
| 226 | + 'OWASPAV:L/AC:L/PR:N/UI:R/S:C/C:L/I:N/A:N'), |
154 | 227 | 'AV:L/AC:L/PR:N/UI:R/S:C/C:L/I:N/A:N'
|
155 | 228 | )
|
156 | 229 |
|
157 |
| - def test_v_source_get_localised_vector_owasp_3(self) -> None: |
| 230 | + def test_v_source_get_localised_vector_owasp_none(self) -> None: |
158 | 231 | self.assertEqual(
|
159 |
| - VulnerabilityScoreSource.OWASP.get_localised_vector(vector='AV:L/AC:L/PR:N/UI:R/S:C/C:L/I:N/A:N'), |
| 232 | + VulnerabilityScoreSource.OWASP.get_localised_vector( |
| 233 | + 'AV:L/AC:L/PR:N/UI:R/S:C/C:L/I:N/A:N'), |
160 | 234 | 'AV:L/AC:L/PR:N/UI:R/S:C/C:L/I:N/A:N'
|
161 | 235 | )
|
162 | 236 |
|
163 |
| - def test_v_source_get_localised_vector_other_2(self) -> None: |
| 237 | + def test_v_source_get_localised_vector_other(self) -> None: |
164 | 238 | self.assertEqual(
|
165 |
| - VulnerabilityScoreSource.OTHER.get_localised_vector(vector='SOMETHING_OR_OTHER'), |
| 239 | + VulnerabilityScoreSource.OTHER.get_localised_vector( |
| 240 | + 'SOMETHING_OR_OTHER'), |
166 | 241 | 'SOMETHING_OR_OTHER'
|
167 | 242 | )
|
168 | 243 |
|
| 244 | + |
| 245 | +class TestModelVulnerability(TestCase): |
| 246 | + |
169 | 247 | def test_empty_vulnerability(self) -> None:
|
170 | 248 | v = Vulnerability()
|
171 | 249 | self.assertIsNone(v.bom_ref.value)
|
|
0 commit comments