/
CheckConfigurationSpec.kt
135 lines (120 loc) · 4.88 KB
/
CheckConfigurationSpec.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
package io.gitlab.arturbosch.detekt.core.config.validation
import io.github.detekt.test.utils.createTempDirectoryForTest
import io.github.detekt.tooling.api.InvalidConfig
import io.gitlab.arturbosch.detekt.api.Config
import io.gitlab.arturbosch.detekt.api.ConfigValidator
import io.gitlab.arturbosch.detekt.api.Notification
import io.gitlab.arturbosch.detekt.api.RuleSet
import io.gitlab.arturbosch.detekt.api.RuleSetProvider
import io.gitlab.arturbosch.detekt.api.internal.SimpleNotification
import io.gitlab.arturbosch.detekt.core.createNullLoggingSpec
import io.gitlab.arturbosch.detekt.core.createProcessingSettings
import io.gitlab.arturbosch.detekt.core.tooling.getDefaultConfiguration
import io.gitlab.arturbosch.detekt.test.yamlConfigFromContent
import org.assertj.core.api.Assertions.assertThatCode
import org.junit.jupiter.api.Test
class CheckConfigurationSpec {
private val testDir = createTempDirectoryForTest("detekt-sample")
private val spec = createNullLoggingSpec {}
@Test
fun `passes because config validation is disabled by tooling spec`() {
val config = yamlConfigFromContent(
"""
unknown_property:
unknown_var: ""
""".trimIndent()
)
createProcessingSettings(
testDir,
config,
) {
config {
shouldValidateBeforeAnalysis = false
}
}.use {
assertThatCode { checkConfiguration(it, spec.getDefaultConfiguration()) }
.doesNotThrowAnyException()
}
}
@Test
fun `fails when unknown properties are found`() {
val config = yamlConfigFromContent(
"""
# Properties of custom rule sets get excluded by default.
sample-rule-set:
TooManyFunctions:
active: true
# This properties are unknown to detekt and must be excluded.
my_additional_properties:
magic_number: 7
magic_string: 'Hello World'
""".trimIndent()
)
createProcessingSettings(testDir, config).use {
assertThatCode { checkConfiguration(it, spec.getDefaultConfiguration()) }
.isInstanceOf(InvalidConfig::class.java)
.hasMessageContaining("Run failed with 1 invalid config property.")
.hasMessageContaining("my_additional_properties")
}
}
@Test
fun `fails due to custom config validator want active to be booleans`() {
val config = yamlConfigFromContent(
"""
# Properties of custom rule sets get excluded by default.
sample-rule-set:
TooManyFunctions:
# This property is tested via the SampleConfigValidator
active: 1 # should be true
""".trimIndent()
)
createProcessingSettings(testDir, config).use {
assertThatCode { checkConfiguration(it, spec.getDefaultConfiguration()) }
.isInstanceOf(InvalidConfig::class.java)
.hasMessageContaining("Run failed with 1 invalid config property.")
}
}
@Test
fun `passes with excluded new properties`() {
val config = yamlConfigFromContent(
"""
config:
validation: true
# Additional properties can be useful when writing custom extensions.
# However only properties defined in the default config are known to detekt.
# All unknown properties are treated as errors if not excluded.
excludes: 'my_additional_properties'
# Properties of custom rule sets get excluded by default.
# If you want to validate them further, consider implementing a ConfigValidator.
sample-rule-set:
TooManyFunctions:
active: true
# This properties are unknown to detekt and must be excluded.
my_additional_properties:
magic_number: 7
magic_string: 'Hello World'
""".trimIndent()
)
createProcessingSettings(testDir, config).use {
assertThatCode { checkConfiguration(it, spec.getDefaultConfiguration()) }
.doesNotThrowAnyException()
}
}
}
class SampleRuleProvider : RuleSetProvider {
override val ruleSetId: String = "sample-rule-set"
override fun instance(config: Config) = RuleSet(ruleSetId, emptyList())
}
class SampleConfigValidator : ConfigValidator {
override fun validate(config: Config): Collection<Notification> {
val result = mutableListOf<Notification>()
runCatching {
config.subConfig("sample-rule-set")
.subConfig("TooManyFunctions")
.valueOrNull<Boolean>("active")
}.onFailure {
result.add(SimpleNotification("'active' property must be of type boolean."))
}
return result
}
}