Skip to content
This repository was archived by the owner on Jul 16, 2023. It is now read-only.

Commit 83432e7

Browse files
orevialOlivier
and
Olivier
authored
feat: add 'include-methods' config to 'missing-test-assertion' rule (#1026)
Co-authored-by: Olivier <[email protected]>
1 parent 5408c36 commit 83432e7

File tree

7 files changed

+66
-11
lines changed

7 files changed

+66
-11
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
## Unreleased
44

5+
* feat: add 'include-methods' config to static code diagnostic [`missing-test-assertion`](https://dartcodemetrics.dev/docs/rules/common/missing-test-assertion)
56
* fix: add rule 'missing-test-assertion' in rules factory.
67
* feat: add static code diagnostic [`missing-test-assertion`](https://dartcodemetrics.dev/docs/rules/common/missing-test-assertion).
78
* feat: add support for presets

lib/src/analyzers/lint_analyzer/rules/rules_list/missing_test_assertion/config_parser.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,17 @@ part of 'missing_test_assertion_rule.dart';
22

33
class _ConfigParser {
44
static const _includeAssertionsConfig = 'include-assertions';
5+
static const _includeMethodsConfig = 'include-methods';
56

67
static Iterable<String> parseIncludeAssertions(Map<String, Object> config) =>
78
config.containsKey(_includeAssertionsConfig) &&
89
config[_includeAssertionsConfig] is Iterable
910
? List<String>.from(config[_includeAssertionsConfig] as Iterable)
1011
: <String>[];
12+
13+
static Iterable<String> parseIncludeMethods(Map<String, Object> config) =>
14+
config.containsKey(_includeMethodsConfig) &&
15+
config[_includeMethodsConfig] is Iterable
16+
? List<String>.from(config[_includeMethodsConfig] as Iterable)
17+
: <String>[];
1118
}

lib/src/analyzers/lint_analyzer/rules/rules_list/missing_test_assertion/missing_test_assertion_rule.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import '../../models/common_rule.dart';
1212
import '../../rule_utils.dart';
1313

1414
part 'config_parser.dart';
15+
1516
part 'visitor.dart';
1617

1718
class MissingTestAssertionRule extends CommonRule {
@@ -20,9 +21,11 @@ class MissingTestAssertionRule extends CommonRule {
2021
static const _warningMessage = 'Missing test assertion.';
2122

2223
final Iterable<String> _includeAssertions;
24+
final Iterable<String> _includeMethods;
2325

2426
MissingTestAssertionRule([Map<String, Object> config = const {}])
2527
: _includeAssertions = _ConfigParser.parseIncludeAssertions(config),
28+
_includeMethods = _ConfigParser.parseIncludeMethods(config),
2629
super(
2730
id: ruleId,
2831
severity: readSeverity(config, Severity.warning),
@@ -32,7 +35,7 @@ class MissingTestAssertionRule extends CommonRule {
3235

3336
@override
3437
Iterable<Issue> check(InternalResolvedUnitResult source) {
35-
final visitor = _Visitor(_includeAssertions);
38+
final visitor = _Visitor(_includeAssertions, _includeMethods);
3639

3740
source.unit.visitChildren(visitor);
3841

lib/src/analyzers/lint_analyzer/rules/rules_list/missing_test_assertion/visitor.dart

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ class _Visitor extends RecursiveAstVisitor<void> {
66
Iterable<AstNode> get nodes => _nodes;
77

88
final Iterable<String> _includeAssertions;
9+
final Iterable<String> _includeMethods;
910

10-
_Visitor(this._includeAssertions);
11+
_Visitor(this._includeAssertions, this._includeMethods);
1112

1213
@override
1314
void visitFunctionDeclaration(FunctionDeclaration node) {
@@ -16,14 +17,14 @@ class _Visitor extends RecursiveAstVisitor<void> {
1617
return;
1718
}
1819

19-
final visitor = _MethodTestVisitor(_includeAssertions);
20+
final visitor = _MethodTestVisitor(_includeAssertions, _includeMethods);
2021
node.visitChildren(visitor);
2122
_nodes.addAll(visitor.nodes);
2223
}
2324
}
2425

2526
class _MethodTestVisitor extends RecursiveAstVisitor<void> {
26-
static const _testMethodNameList = <String>{
27+
final _testMethodNameList = <String>{
2728
'test',
2829
'testWidgets',
2930
};
@@ -34,7 +35,9 @@ class _MethodTestVisitor extends RecursiveAstVisitor<void> {
3435

3536
final Iterable<String> _includeAssertions;
3637

37-
_MethodTestVisitor(this._includeAssertions);
38+
_MethodTestVisitor(this._includeAssertions, Iterable<String> includeMethods) {
39+
_testMethodNameList.addAll(includeMethods);
40+
}
3841

3942
@override
4043
void visitMethodInvocation(MethodInvocation node) {
@@ -73,10 +76,8 @@ class _MethodAssertionVisitor extends RecursiveAstVisitor<void> {
7376
'expectLater',
7477
};
7578

76-
final Iterable<String> _includeAssertions;
77-
78-
_MethodAssertionVisitor(this._includeAssertions) {
79-
_assertionMethodNameList.addAll(_includeAssertions);
79+
_MethodAssertionVisitor(Iterable<String> includeAssertions) {
80+
_assertionMethodNameList.addAll(includeAssertions);
8081
}
8182

8283
bool hasContainedAssertion = false;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
void main() {
2+
print('Hello');
3+
4+
customTest(null, () => 1 == 1); // LINT
5+
6+
otherTestMethod(null, () => 1 == 1); // LINT
7+
8+
excludedTestMethod(null, () => 1 == 1);
9+
}

test/src/analyzers/lint_analyzer/rules/rules_list/missing_test_assertion/missing_test_assertion_test.dart

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ const _incorrectExamplePath =
1010
'missing_test_assertion/examples/incorrect_example.dart';
1111
const _customAssertionsExamplePath =
1212
'missing_test_assertion/examples/custom_assertions_example.dart';
13+
const _customMethodsExamplePath =
14+
'missing_test_assertion/examples/custom_methods_example.dart';
1315

1416
void main() {
1517
group('MissingTestAssertion', () {
@@ -31,7 +33,7 @@ void main() {
3133
RuleTestHelper.verifyNoIssues(issues);
3234
});
3335

34-
test('with custom config reports no issues', () async {
36+
test('with custom assertions config reports no issues', () async {
3537
final unit =
3638
await RuleTestHelper.resolveFromFile(_customAssertionsExamplePath);
3739
final config = {
@@ -71,5 +73,31 @@ void main() {
7173
],
7274
);
7375
});
76+
77+
test('with custom methods config reports about found issues', () async {
78+
final unit =
79+
await RuleTestHelper.resolveFromFile(_customMethodsExamplePath);
80+
final config = {
81+
'include-methods': [
82+
'customTest',
83+
'otherTestMethod',
84+
],
85+
};
86+
final issues = MissingTestAssertionRule(config).check(unit);
87+
88+
RuleTestHelper.verifyIssues(
89+
issues: issues,
90+
startLines: [4, 6],
91+
startColumns: [3, 3],
92+
locationTexts: [
93+
'customTest(null, () => 1 == 1)',
94+
'otherTestMethod(null, () => 1 == 1)',
95+
],
96+
messages: [
97+
'Missing test assertion.',
98+
'Missing test assertion.',
99+
],
100+
);
101+
});
74102
});
75103
}

website/docs/rules/common/missing-test-assertion.mdx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
import RuleDetails from '@site/src/components/RuleDetails';
22

3-
<RuleDetails version="4.21.0" severity="style" />
3+
<RuleDetails version="4.21.0" severity="warning" />
44

55
Warns that there is no assertion in the test.
66

77
Use `include-assertions` configuration, if you want to include specific assertions.
8+
Defaults to Dart default assertions including expect, expectLater and all expectAsync variants.
9+
10+
Use `include-methods` configuration, if you want the linter to check particular test methods for missing assertions.
11+
Defaults to `test` and `testWidgets` methods.
812

913
### ⚙️ Config example {#config-example}
1014

@@ -16,6 +20,8 @@ dart_code_metrics:
1620
- missing-test-assertion:
1721
include-assertions:
1822
- verify
23+
include-methods:
24+
- customTest
1925
```
2026
2127
### Example {#example}

0 commit comments

Comments
 (0)