Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 4f18053

Browse filesBrowse files
committed
Add unit tests for the recategorization script.
1 parent 8b7be75 commit 4f18053
Copy full SHA for 4f18053
Expand file treeCollapse file tree

13 files changed

+2061
-0
lines changed
+101Lines 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

Copy file name to clipboardExpand all lines: scripts/guideline_recategorization/requirements.txt
+1Lines 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

Copy file name to clipboardExpand all lines: scripts/guideline_recategorization/test-data/empty-coding-standards-config.yml
Whitespace-only changes.
+2Lines 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"
+3Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"foo": "bar",
3+
}
+4Lines 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+
}
+3Lines 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"
+1Lines 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"}]
+54Lines 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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.