Skip to content

Commit 4f18053

Browse files
committed
Add unit tests for the recategorization script.
1 parent 8b7be75 commit 4f18053

13 files changed

+2061
-0
lines changed
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
import pytest
2+
import difflib
3+
import recategorize
4+
import jsonschema
5+
from pathlib import Path
6+
import argparse
7+
import sys
8+
9+
TEST_DATA_DIR = Path(__file__).resolve().parent / 'test-data'
10+
11+
class TestsInputs:
12+
def test_invalid_codeql_config(self):
13+
with pytest.raises(SystemExit):
14+
recategorize.main(argparse.Namespace(
15+
coding_standards_schema_file= Path.cwd(),
16+
sarif_schema_file= Path.cwd(),
17+
coding_standards_config_file= TEST_DATA_DIR / 'invalid-coding-standards-config.yml'
18+
))
19+
20+
def test_valid_codeql_config(self):
21+
with (TEST_DATA_DIR / 'valid-sarif.json').open(mode='r') as sarif_in:
22+
recategorize.main(argparse.Namespace(
23+
coding_standards_schema_file= Path.cwd(),
24+
sarif_schema_file= Path.cwd(),
25+
coding_standards_config_file= TEST_DATA_DIR / 'valid-coding-standards-config.yml',
26+
sarif_in=sarif_in,
27+
sarif_out=sys.stdout,
28+
dump_json_patch=None
29+
))
30+
31+
def test_invalid_sarif_file(self):
32+
with pytest.raises(SystemExit):
33+
with (TEST_DATA_DIR / 'invalid-sarif.json').open(mode='r') as sarif_in:
34+
recategorize.main(argparse.Namespace(
35+
coding_standards_schema_file= Path.cwd(),
36+
sarif_schema_file= Path.cwd(),
37+
coding_standards_config_file= TEST_DATA_DIR / 'valid-coding-standards-config.yml',
38+
sarif_in=sarif_in
39+
))
40+
41+
def test_valid_sarif_file(self):
42+
with (TEST_DATA_DIR / 'valid-sarif.json').open(mode='r') as sarif_in:
43+
recategorize.main(argparse.Namespace(
44+
coding_standards_schema_file= Path.cwd(),
45+
sarif_schema_file= Path.cwd(),
46+
coding_standards_config_file= TEST_DATA_DIR / 'valid-coding-standards-config.yml',
47+
sarif_in=sarif_in,
48+
sarif_out=sys.stdout,
49+
dump_json_patch=None
50+
))
51+
52+
def test_invalid_yaml(self):
53+
with pytest.raises(SystemExit):
54+
recategorize.main(argparse.Namespace(
55+
coding_standards_schema_file= Path.cwd(),
56+
sarif_schema_file= Path.cwd(),
57+
coding_standards_config_file= TEST_DATA_DIR / 'invalid-yaml.yml'
58+
))
59+
60+
def test_invalid_json_for_schema(self):
61+
with pytest.raises(SystemExit):
62+
recategorize.main(argparse.Namespace(
63+
coding_standards_schema_file= TEST_DATA_DIR / 'invalid-json.json'
64+
))
65+
66+
class TestUnsupportedSchemas:
67+
def test_unsupported_sarif_schema(self):
68+
with pytest.raises(SystemExit):
69+
recategorize.main(argparse.Namespace(
70+
coding_standards_schema_file= Path.cwd(),
71+
sarif_schema_file= TEST_DATA_DIR / 'unsupported-sarif-schema-2.0.0.json',
72+
coding_standards_config_file= Path.cwd()
73+
))
74+
def test_unsupported_coding_standards_config_schema(self):
75+
with pytest.raises(SystemExit):
76+
recategorize.main(argparse.Namespace(
77+
coding_standards_schema_file= Path.cwd(),
78+
sarif_schema_file= TEST_DATA_DIR / 'unsupported-coding-standards-schema-0.0.1.json',
79+
coding_standards_config_file= Path.cwd()
80+
))
81+
82+
class TestRecategorization:
83+
def test_recategorization(self, tmp_path):
84+
with (TEST_DATA_DIR / 'valid-sarif.json').open(mode='r') as sarif_in:
85+
with (tmp_path / 'sarif.json').open(mode='w') as sarif_out:
86+
recategorize.main(argparse.Namespace(
87+
coding_standards_schema_file= Path.cwd(),
88+
sarif_schema_file= Path.cwd(),
89+
coding_standards_config_file= TEST_DATA_DIR / 'valid-coding-standards-config.yml',
90+
sarif_in=sarif_in,
91+
sarif_out=sarif_out,
92+
dump_json_patch=tmp_path / 'json-patch.json'
93+
))
94+
95+
expected_patch = (TEST_DATA_DIR / 'json-patch.expected').read_text()
96+
actual_patch = (tmp_path / 'json-patch.json').read_text()
97+
assert(expected_patch == actual_patch)
98+
99+
expected_sarif = (TEST_DATA_DIR / 'valid-sarif-recategorized.expected').read_text()
100+
actual_sarif = (tmp_path / 'sarif.json').read_text()
101+
assert(expected_sarif == actual_sarif)

scripts/guideline_recategorization/requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ jsonschema==4.9.1
33
jsonpatch==1.32
44
jsonpointer==2.3
55
PyYAML==5.4
6+
pytest==7.2.0
67

scripts/guideline_recategorization/test-data/empty-coding-standards-config.yml

Whitespace-only changes.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
guideline-recategorizations:
2+
- rule-id: "A0-1-1"
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"foo": "bar",
3+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"$schema": "https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json",
3+
"version": "2.1.0"
4+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
key:
2+
key1: "value"
3+
key2: "value"
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[{"op": "replace", "path": "/runs/0/tool/driver/rules/0/properties/tags/5", "value": "external/autosar/obligation/mandatory"}, {"op": "add", "path": "/runs/0/tool/driver/rules/0/properties/tags/5", "value": "external/autosar/original-obligation/required"}, {"op": "replace", "path": "/runs/0/tool/driver/rules/1/properties/tags/5", "value": "external/autosar/obligation/disapplied"}, {"op": "add", "path": "/runs/0/tool/driver/rules/1/properties/tags/5", "value": "external/autosar/original-obligation/advisory"}, {"op": "replace", "path": "/runs/0/tool/driver/rules/2/properties/tags/4", "value": "external/autosar/obligation/mandatory"}, {"op": "add", "path": "/runs/0/tool/driver/rules/2/properties/tags/4", "value": "external/autosar/original-obligation/advisory"}]
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
{
2+
"$schema": "http://json-schema.org/draft-07/schema",
3+
"$id": "https://raw.githubusercontent.com/github/codeql-coding-standards/main/schemas/coding-standards-schema-0.0.1.json",
4+
"additionalProperties": false,
5+
"definitions": {
6+
"guideline-category": {
7+
"enum": [
8+
"mandatory",
9+
"required",
10+
"advisory",
11+
"disapplied"
12+
]
13+
},
14+
"guideline-recategorization": {
15+
"type": "object",
16+
"properties": {
17+
"rule-id": {
18+
"type": "string"
19+
},
20+
"category": {
21+
"$ref": "#/definitions/guideline-category"
22+
}
23+
},
24+
"required": [
25+
"rule-id",
26+
"category"
27+
]
28+
}
29+
},
30+
"properties": {
31+
"report-deviated-alerts": {
32+
"description": "When true includes alerts with an applicable deviation. Used for report generation.",
33+
"type": "boolean"
34+
},
35+
"deviations": {
36+
"description": "A set of deviation records.",
37+
"type": "array"
38+
},
39+
"deviation-permits": {
40+
"description": "A set of deviation permits.",
41+
"type": "array"
42+
},
43+
"guideline-recategorizations": {
44+
"type": "array",
45+
"minProperties": 1,
46+
"uniqueItems": true,
47+
"items": {
48+
"$ref": "#/definitions/guideline-recategorization"
49+
}
50+
}
51+
},
52+
"required": [],
53+
"type": "object"
54+
}

0 commit comments

Comments
 (0)