|
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