Skip to content

Commit a1b16ac

Browse files
committed
test: add more integration tests
1 parent 7b34f25 commit a1b16ac

12 files changed

+128
-26
lines changed

Diff for: .codeclimate.yml

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
version: "2"
2+
checks:
3+
method-count:
4+
config:
5+
threshold: 40
6+
similar-code:
7+
config:
8+
threshold: 60

Diff for: README.md

+2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# kafka-gitops
22

3+
![Java CI](https://github.com/devshawn/kafka-gitops/workflows/Java%20CI/badge.svg) [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE)
4+
35
Manage Apache Kafka topics and ACLs through a desired state file.
46

57
<p align="center">

Diff for: src/main/java/com/devshawn/kafka/gitops/service/ParserService.java

+8-24
Original file line numberDiff line numberDiff line change
@@ -43,15 +43,15 @@ public DesiredStateFile parseStateFile() {
4343
DesiredStateFile.Builder builder = new DesiredStateFile.Builder().mergeFrom(desiredStateFile);
4444
SettingsFiles settingsFiles = desiredStateFile.getSettings().get().getFiles().get();
4545
if (settingsFiles.getServices().isPresent()) {
46-
DesiredStateFile servicesFile = loadServiceFile(settingsFiles.getServices().get());
46+
DesiredStateFile servicesFile = loadExternalFile(settingsFiles.getServices().get(), "Services");
4747
builder.putAllServices(servicesFile.getServices());
4848
}
4949
if (settingsFiles.getTopics().isPresent()) {
50-
DesiredStateFile topicsFile = loadTopicsFile(settingsFiles.getTopics().get());
50+
DesiredStateFile topicsFile = loadExternalFile(settingsFiles.getTopics().get(), "Topics");
5151
builder.putAllTopics(topicsFile.getTopics());
5252
}
5353
if (settingsFiles.getUsers().isPresent()) {
54-
DesiredStateFile usersFile = loadUsersFile(settingsFiles.getUsers().get());
54+
DesiredStateFile usersFile = loadExternalFile(settingsFiles.getUsers().get(), "Users");
5555
builder.putAllUsers(usersFile.getUsers());
5656
}
5757
return builder.build();
@@ -88,28 +88,12 @@ public DesiredStateFile parseStateFile(File stateFile) {
8888
}
8989
}
9090

91-
private DesiredStateFile loadServiceFile(String servicesFileName) {
92-
File servicesFile = getAdditionalFile(servicesFileName);
93-
if (!servicesFile.exists()) {
94-
throw new ValidationException(String.format("Services file '%s' could not be found.", servicesFileName));
91+
private DesiredStateFile loadExternalFile(String fileName, String type) {
92+
File externalFile = getAdditionalFile(fileName);
93+
if (!externalFile.exists()) {
94+
throw new ValidationException(String.format("%s file '%s' could not be found.", type, fileName));
9595
}
96-
return parseStateFile(servicesFile);
97-
}
98-
99-
private DesiredStateFile loadTopicsFile(String topicsFileName) {
100-
File topicsFile = getAdditionalFile(topicsFileName);
101-
if (!topicsFile.exists()) {
102-
throw new ValidationException(String.format("Topics file '%s' could not be found.", topicsFileName));
103-
}
104-
return parseStateFile(topicsFile);
105-
}
106-
107-
private DesiredStateFile loadUsersFile(String usersFileName) {
108-
File usersFile = getAdditionalFile(usersFileName);
109-
if (!usersFile.exists()) {
110-
throw new ValidationException(String.format("Users file '%s' could not be found.", usersFileName));
111-
}
112-
return parseStateFile(usersFile);
96+
return parseStateFile(externalFile);
11397
}
11498

11599
private File getAdditionalFile(String fileName) {

Diff for: src/test/groovy/com/devshawn/kafka/gitops/PlanCommandIntegrationSpec.groovy

+27-2
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ class PlanCommandIntegrationSpec extends Specification {
5454
"application-service",
5555
"kafka-connect-service",
5656
"kafka-streams-service",
57-
"topics-and-services"
57+
"topics-and-services",
58+
"multi-file"
5859
]
5960
}
6061

@@ -118,7 +119,31 @@ class PlanCommandIntegrationSpec extends Specification {
118119
planName << [
119120
"invalid-missing-principal",
120121
"invalid-topic",
121-
"unrecognized-property"
122+
"unrecognized-property",
123+
"invalid-format"
122124
]
123125
}
126+
127+
void 'test file that does not exist - #planName'() {
128+
setup:
129+
ByteArrayOutputStream err = new ByteArrayOutputStream()
130+
ByteArrayOutputStream out = new ByteArrayOutputStream()
131+
PrintStream oldErr = System.err
132+
PrintStream oldOut = System.out
133+
System.setErr(new PrintStream(err))
134+
System.setOut(new PrintStream(out))
135+
MainCommand mainCommand = new MainCommand()
136+
CommandLine cmd = new CommandLine(mainCommand)
137+
138+
when:
139+
int exitCode = cmd.execute("-f", "null", "plan")
140+
141+
then:
142+
exitCode == 2
143+
out.toString() == TestUtils.getResourceFileContent("plans/null-file-output.txt")
144+
145+
cleanup:
146+
System.setErr(oldErr)
147+
System.setOut(oldOut)
148+
}
124149
}

Diff for: src/test/resources/plans/invalid-format-output.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Generating execution plan...
2+
3+
[INVALID] Value 'a' is not a valid format for: [partitions] in state file definition: topics -> test-topic

Diff for: src/test/resources/plans/invalid-format.yaml

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
topics:
2+
test-topic:
3+
partitions: "a"
4+
replication: 3

Diff for: src/test/resources/plans/multi-file-plan.json

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
{
2+
"topicPlans": [
3+
{
4+
"name": "test-topic",
5+
"action": "ADD",
6+
"topicDetails": {
7+
"partitions": 6,
8+
"replication": 1,
9+
"configs": {}
10+
},
11+
"topicConfigPlans": []
12+
}
13+
],
14+
"aclPlans": [
15+
{
16+
"name": "test-service-0",
17+
"aclDetails": {
18+
"name": "test-topic",
19+
"type": "TOPIC",
20+
"pattern": "LITERAL",
21+
"principal": "User:test",
22+
"host": "*",
23+
"operation": "WRITE",
24+
"permission": "ALLOW"
25+
},
26+
"action": "ADD"
27+
},
28+
{
29+
"name": "test-service-1",
30+
"aclDetails": {
31+
"name": "another-test-topic",
32+
"type": "TOPIC",
33+
"pattern": "LITERAL",
34+
"principal": "User:test",
35+
"host": "*",
36+
"operation": "READ",
37+
"permission": "ALLOW"
38+
},
39+
"action": "ADD"
40+
},
41+
{
42+
"name": "test-service-2",
43+
"aclDetails": {
44+
"name": "test-service",
45+
"type": "GROUP",
46+
"pattern": "LITERAL",
47+
"principal": "User:test",
48+
"host": "*",
49+
"operation": "READ",
50+
"permission": "ALLOW"
51+
},
52+
"action": "ADD"
53+
}
54+
]
55+
}

Diff for: src/test/resources/plans/multi-file-services.yaml

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
services:
2+
test-service:
3+
type: application
4+
principal: User:test
5+
produces:
6+
- test-topic
7+
consumes:
8+
- another-test-topic

Diff for: src/test/resources/plans/multi-file-topics.yaml

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
topics:
2+
test-topic:
3+
partitions: 6
4+
replication: 1

Diff for: src/test/resources/plans/multi-file-users.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
users: {}

Diff for: src/test/resources/plans/multi-file.yaml

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
settings:
2+
files:
3+
services: multi-file-services.yaml
4+
topics: multi-file-topics.yaml
5+
users: multi-file-users.yaml

Diff for: src/test/resources/plans/null-file-output.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Generating execution plan...
2+
3+
[INVALID] Invalid state file. Unknown error: null (No such file or directory)

0 commit comments

Comments
 (0)