Skip to content

Commit 1c33807

Browse files
committed
More precise testing of plugins
Instead of relying on a count of the severity and confidence levels found within an example file, make use of Python's native unit testing to verify the results of a plugin. The existing method of confirming counts can be inaccurate. It's very easy to have a false positive simply because one issue extra was found and one issue was missed, thus giving the same count. It tells nothing of the validation of a particular line of problematic code. Relates to #352 Signed-off-by: Eric Brown <[email protected]>
1 parent 36fc7be commit 1c33807

29 files changed

+6486
-535
lines changed

tests/functional/test_functional.py

+1-535
Large diffs are not rendered by default.

tests/unit/plugins/__init__.py

Whitespace-only changes.

tests/unit/plugins/base_test_case.py

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# SPDX-License-Identifier: Apache-2.0
2+
import testtools
3+
4+
from bandit.core import config
5+
from bandit.core import manager
6+
from bandit.core import meta_ast
7+
from bandit.core import metrics
8+
from bandit.core import node_visitor
9+
from bandit.core import test_set
10+
11+
12+
class BaseTestCase(testtools.TestCase):
13+
def setUp(self, test_ids):
14+
super().setUp()
15+
b_config = config.BanditConfig()
16+
self.b_manager = manager.BanditManager(b_config, "file")
17+
issue_metrics = metrics.Metrics()
18+
issue_metrics.begin("test.py")
19+
self.visitor = node_visitor.BanditNodeVisitor(
20+
"test.py",
21+
None,
22+
metaast=meta_ast.BanditMetaAst(),
23+
testset=test_set.BanditTestSet(
24+
b_config,
25+
profile={
26+
"include": test_ids,
27+
"exclude": [],
28+
},
29+
),
30+
debug=False,
31+
nosec_lines={},
32+
metrics=issue_metrics,
33+
)

tests/unit/plugins/test_app_debug.py

+71
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
# SPDX-License-Identifier: Apache-2.0
2+
import textwrap
3+
4+
import bandit
5+
from bandit.core import issue as b_issue
6+
from tests.unit.plugins import base_test_case
7+
8+
9+
class FlaskDebugTests(base_test_case.BaseTestCase):
10+
def setUp(self):
11+
super().setUp(["B201"])
12+
13+
def test_app_run_debug_true(self):
14+
fdata = textwrap.dedent(
15+
"""
16+
from flask import Flask
17+
app = Flask(__name__)
18+
app.run(debug=True)
19+
"""
20+
)
21+
self.visitor.process(fdata)
22+
self.assertEqual(1, len(self.visitor.tester.results))
23+
issue = self.visitor.tester.results[0]
24+
self.assertEqual(bandit.HIGH, issue.severity)
25+
self.assertEqual(bandit.MEDIUM, issue.confidence)
26+
self.assertEqual(b_issue.Cwe.CODE_INJECTION, issue.cwe.id)
27+
self.assertEqual(4, issue.lineno)
28+
self.assertEqual([4], issue.linerange)
29+
self.assertEqual(0, issue.col_offset)
30+
31+
def test_app_run_debug_false(self):
32+
fdata = textwrap.dedent(
33+
"""
34+
from flask import Flask
35+
app = Flask(__name__)
36+
app.run(debug=False)
37+
"""
38+
)
39+
self.visitor.process(fdata)
40+
self.assertEqual(0, len(self.visitor.tester.results))
41+
42+
def test_app_run(self):
43+
fdata = textwrap.dedent(
44+
"""
45+
from flask import Flask
46+
app = Flask(__name__)
47+
app.run()
48+
"""
49+
)
50+
self.visitor.process(fdata)
51+
self.assertEqual(0, len(self.visitor.tester.results))
52+
53+
def test_app_run_no_import(self):
54+
fdata = textwrap.dedent(
55+
"""
56+
app = Flask(__name__)
57+
app.run(debug=True)
58+
"""
59+
)
60+
self.visitor.process(fdata)
61+
self.assertEqual(0, len(self.visitor.tester.results))
62+
63+
def test_unrelated_run(self):
64+
fdata = textwrap.dedent(
65+
"""
66+
from flask import Flask
67+
run(debug=True)
68+
"""
69+
)
70+
self.visitor.process(fdata)
71+
self.assertEqual(0, len(self.visitor.tester.results))

tests/unit/plugins/test_asserts.py

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# SPDX-License-Identifier: Apache-2.0
2+
import bandit
3+
from bandit.core import issue as b_issue
4+
from tests.unit.plugins import base_test_case
5+
6+
7+
class AssertsTests(base_test_case.BaseTestCase):
8+
def setUp(self):
9+
super().setUp(["B101"])
10+
11+
def test_asserts(self):
12+
fdata = "assert True"
13+
self.visitor.process(fdata)
14+
self.assertEqual(1, len(self.visitor.tester.results))
15+
issue = self.visitor.tester.results[0]
16+
self.assertEqual(bandit.LOW, issue.severity)
17+
self.assertEqual(bandit.HIGH, issue.confidence)
18+
self.assertEqual(
19+
b_issue.Cwe.IMPROPER_CHECK_OF_EXCEPT_COND, issue.cwe.id
20+
)
21+
self.assertEqual(1, issue.lineno)
22+
self.assertEqual([1], issue.linerange)
23+
self.assertEqual(0, issue.col_offset)

0 commit comments

Comments
 (0)