Skip to content

Commit 24caa15

Browse files
authored
Merge pull request #268 from entur/add_unit_tests
Add Unit tests
2 parents 4c15270 + 28468e5 commit 24caa15

File tree

10 files changed

+466
-8
lines changed

10 files changed

+466
-8
lines changed

Diff for: .github/workflows/push.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ jobs:
2727
wget https://raw.githubusercontent.com/entur/ror-maven-settings/master/.m2/settings.xml -O .github/workflows/settings.xml
2828
- uses: actions/setup-java@v4
2929
with:
30-
java-version: 17.0.13
30+
java-version: 17
3131
distribution: liberica
3232
- name: Cache Maven dependencies
3333
uses: actions/cache@v4
@@ -47,7 +47,7 @@ jobs:
4747
SONAR_PROJECT_NAME: ${{ github.event.repository.name }}
4848
SONAR_PROJECT_KEY: entur_${{ github.event.repository.name }}
4949
run: |
50-
mvn -s .github/workflows/settings.xml \
50+
mvn -Psonar -s .github/workflows/settings.xml \
5151
org.jacoco:jacoco-maven-plugin:prepare-agent verify \
5252
org.jacoco:jacoco-maven-plugin:report sonar:sonar \
5353
-Dmaven.main.skip \

Diff for: src/main/java/org/entur/netex/validation/configuration/DefaultValidationConfigLoader.java

+8
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import java.util.Map;
77
import java.util.function.Function;
88
import java.util.stream.Collectors;
9+
import org.entur.netex.validation.exception.NetexValidationException;
910
import org.yaml.snakeyaml.LoaderOptions;
1011
import org.yaml.snakeyaml.Yaml;
1112
import org.yaml.snakeyaml.constructor.Constructor;
@@ -45,6 +46,13 @@ private Map<String, ValidationRuleConfig> loadConfigurationFile(
4546
.currentThread()
4647
.getContextClassLoader()
4748
.getResourceAsStream(configurationFile);
49+
50+
if (inputStream == null) {
51+
throw new NetexValidationException(
52+
"Validation rules configuration file not found: " + configurationFile
53+
);
54+
}
55+
4856
Yaml yaml = new Yaml(
4957
new Constructor(ValidationConfig.class, new LoaderOptions())
5058
);

Diff for: src/main/java/org/entur/netex/validation/validator/jaxb/DefaultCommonDataRepository.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,10 @@ public class DefaultCommonDataRepository implements CommonDataRepositoryLoader {
3131
* The default constructor initializes synchronized data structures for storing the common data.
3232
*/
3333
public DefaultCommonDataRepository() {
34-
this.scheduledStopPointAndQuayIdCache =
35-
Collections.synchronizedMap(new HashMap<>());
36-
this.serviceLinksAndFromToScheduledStopPointIdCache =
37-
Collections.synchronizedMap(new HashMap<>());
34+
this(
35+
Collections.synchronizedMap(new HashMap<>()),
36+
Collections.synchronizedMap(new HashMap<>())
37+
);
3838
}
3939

4040
/**

Diff for: src/main/java/org/entur/netex/validation/validator/schema/NetexSchemaValidator.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,14 @@ public class NetexSchemaValidator
2727
NetexSchemaValidator.class
2828
);
2929

30-
static final ValidationRule RULE_ERROR = new ValidationRule(
30+
public static final ValidationRule RULE_ERROR = new ValidationRule(
3131
"XML_SCHEMA_ERROR",
3232
"NeTEx XML Schema validation error",
3333
"%s",
3434
Severity.CRITICAL
3535
);
3636

37-
static final ValidationRule RULE_WARNING = new ValidationRule(
37+
public static final ValidationRule RULE_WARNING = new ValidationRule(
3838
"XML_SCHEMA_WARNING",
3939
"NeTEx XML Schema validation warning",
4040
"%s",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package org.entur.netex.validation.configuration;
2+
3+
import static org.junit.jupiter.api.Assertions.*;
4+
5+
import java.util.List;
6+
import org.entur.netex.validation.exception.NetexValidationException;
7+
import org.entur.netex.validation.validator.Severity;
8+
import org.junit.jupiter.api.Test;
9+
10+
class DefaultValidationConfigLoaderTest {
11+
12+
private static final String RULE_CODE = "RULE_1";
13+
private static final String CONFIGURATION_FILE_NAME =
14+
"configuration.test.yaml";
15+
private static final String CONFIGURATION_FILE_NAME_OVERLOAD =
16+
"configuration.test.overloaded.yaml";
17+
18+
@Test
19+
void loadConfiguration() {
20+
DefaultValidationConfigLoader loader = new DefaultValidationConfigLoader(
21+
CONFIGURATION_FILE_NAME
22+
);
23+
ValidationRuleConfig validationRuleConfig = loader.getValidationRuleConfig(
24+
RULE_CODE
25+
);
26+
assertNotNull(validationRuleConfig);
27+
assertEquals(Severity.ERROR, validationRuleConfig.getSeverity());
28+
}
29+
30+
@Test
31+
void loadConfigurationNonExistingFile() {
32+
assertThrows(
33+
NetexValidationException.class,
34+
() -> new DefaultValidationConfigLoader("missing.yaml")
35+
);
36+
}
37+
38+
@Test
39+
void loadOverloadedConfiguration() {
40+
DefaultValidationConfigLoader loader = new DefaultValidationConfigLoader(
41+
List.of(CONFIGURATION_FILE_NAME, CONFIGURATION_FILE_NAME_OVERLOAD)
42+
);
43+
ValidationRuleConfig validationRuleConfig = loader.getValidationRuleConfig(
44+
RULE_CODE
45+
);
46+
assertNotNull(validationRuleConfig);
47+
assertEquals(Severity.WARNING, validationRuleConfig.getSeverity());
48+
}
49+
}

Diff for: src/test/java/org/entur/netex/validation/validator/NetexValidatorsRunnerTest.java

+165
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,152 @@
22

33
import static org.junit.jupiter.api.Assertions.*;
44

5+
import java.nio.charset.StandardCharsets;
56
import java.util.List;
67
import java.util.Set;
8+
import java.util.concurrent.atomic.AtomicBoolean;
79
import java.util.stream.Collectors;
810
import org.entur.netex.validation.validator.id.VersionOnLocalNetexIdValidator;
11+
import org.entur.netex.validation.validator.schema.NetexSchemaValidationContext;
12+
import org.entur.netex.validation.validator.schema.NetexSchemaValidator;
13+
import org.entur.netex.validation.validator.xpath.XPathValidationContext;
914
import org.entur.netex.validation.xml.NetexXMLParser;
1015
import org.junit.jupiter.api.Test;
1116

1217
class NetexValidatorsRunnerTest {
1318

19+
private static final String TEST_CODESPACE = "ENT";
20+
private static final String TEST_FILENAME = "netex.xml";
21+
private static final String TEST_VALIDATION_REPORT_ID =
22+
"validation report id";
23+
24+
private static final String NETEX_FRAGMENT =
25+
"""
26+
<PublicationDelivery xmlns="http://www.netex.org.uk/netex" xmlns:ns2="http://www.opengis.net/gml/3.2" xmlns:ns3="http://www.siri.org.uk/siri" version="1.15:NO-NeTEx-networktimetable:1.5">
27+
<dataObjects>
28+
<ServiceFrame id="ENT:ServiceFrame:1" version="2223">
29+
<lines>
30+
<Line id="ENT:Line:2_1" version="2223">
31+
</Line>
32+
</lines>
33+
</ServiceFrame>
34+
</dataObjects>
35+
</PublicationDelivery>
36+
""";
37+
38+
@Test
39+
void testNoValidator() {
40+
NetexValidatorsRunner runner = NetexValidatorsRunner.of().build();
41+
ValidationReport report = validationReport(runner);
42+
assertTrue(report.getValidationReportEntries().isEmpty());
43+
assertEquals(TEST_CODESPACE, report.getCodespace());
44+
assertEquals(TEST_VALIDATION_REPORT_ID, report.getValidationReportId());
45+
}
46+
47+
@Test
48+
void testReportSchemaValidationError() {
49+
NetexValidatorsRunner runner = NetexValidatorsRunner
50+
.of()
51+
.withNetexSchemaValidator(
52+
new TestNetexSchemaValidator(
53+
List.of(
54+
new ValidationIssue(
55+
NetexSchemaValidator.RULE_ERROR,
56+
DataLocation.EMPTY_LOCATION,
57+
"an error"
58+
)
59+
)
60+
)
61+
)
62+
.build();
63+
ValidationReport report = validationReport(runner);
64+
65+
assertEquals(1, report.getValidationReportEntries().size());
66+
}
67+
68+
@Test
69+
void testSkipXPathValidationOnSchemaError() {
70+
NetexValidatorsRunner runner = NetexValidatorsRunner
71+
.of()
72+
.withNetexSchemaValidator(
73+
new TestNetexSchemaValidator(
74+
List.of(
75+
new ValidationIssue(
76+
NetexSchemaValidator.RULE_ERROR,
77+
DataLocation.EMPTY_LOCATION,
78+
"an error"
79+
)
80+
)
81+
)
82+
)
83+
.withNetexXMLParser(new NetexXMLParser())
84+
.withXPathValidators(
85+
List.of(
86+
new XPathValidator() {
87+
@Override
88+
public List<ValidationIssue> validate(
89+
XPathValidationContext validationContext
90+
) {
91+
fail(
92+
"XPath validator should be skipped when Netex schema validation fails"
93+
);
94+
return List.of();
95+
}
96+
97+
@Override
98+
public Set<ValidationRule> getRules() {
99+
return Set.of();
100+
}
101+
}
102+
)
103+
)
104+
.build();
105+
ValidationReport report = validationReport(runner);
106+
107+
assertEquals(1, report.getValidationReportEntries().size());
108+
}
109+
110+
@Test
111+
void testRunXPathValidationIfNoSchemaError() {
112+
AtomicBoolean xpathValidation = new AtomicBoolean();
113+
NetexValidatorsRunner runner = NetexValidatorsRunner
114+
.of()
115+
.withNetexSchemaValidator(
116+
new NetexSchemaValidator(0) {
117+
@Override
118+
public List<ValidationIssue> validate(
119+
NetexSchemaValidationContext validationContext
120+
) {
121+
return List.of();
122+
}
123+
}
124+
)
125+
.withNetexXMLParser(new NetexXMLParser())
126+
.withXPathValidators(
127+
List.of(
128+
new XPathValidator() {
129+
@Override
130+
public List<ValidationIssue> validate(
131+
XPathValidationContext validationContext
132+
) {
133+
xpathValidation.set(true);
134+
return List.of();
135+
}
136+
137+
@Override
138+
public Set<ValidationRule> getRules() {
139+
return Set.of();
140+
}
141+
}
142+
)
143+
)
144+
.build();
145+
ValidationReport report = validationReport(runner);
146+
147+
assertEquals(0, report.getValidationReportEntries().size());
148+
assertTrue(xpathValidation.get());
149+
}
150+
14151
@Test
15152
void testDescriptions() {
16153
XPathValidator xPathValidator = new VersionOnLocalNetexIdValidator();
@@ -28,4 +165,32 @@ void testDescriptions() {
28165
.collect(Collectors.toUnmodifiableSet());
29166
assertEquals(xpathRuleDescriptions, ruleDescriptions);
30167
}
168+
169+
private static ValidationReport validationReport(
170+
NetexValidatorsRunner runner
171+
) {
172+
return runner.validate(
173+
TEST_CODESPACE,
174+
TEST_VALIDATION_REPORT_ID,
175+
TEST_FILENAME,
176+
NETEX_FRAGMENT.getBytes(StandardCharsets.UTF_8)
177+
);
178+
}
179+
180+
private static class TestNetexSchemaValidator extends NetexSchemaValidator {
181+
182+
private final List<ValidationIssue> issues;
183+
184+
public TestNetexSchemaValidator(List<ValidationIssue> issues) {
185+
super(0);
186+
this.issues = issues;
187+
}
188+
189+
@Override
190+
public List<ValidationIssue> validate(
191+
NetexSchemaValidationContext validationContext
192+
) {
193+
return issues;
194+
}
195+
}
31196
}

0 commit comments

Comments
 (0)