Skip to content

Commit

Permalink
build: Add end-to-end test for the native CLI. (#371)
Browse files Browse the repository at this point in the history
  • Loading branch information
michael-simons authored Jan 6, 2022
1 parent b67fcc0 commit 356fa46
Show file tree
Hide file tree
Showing 2 changed files with 94 additions and 2 deletions.
29 changes: 27 additions & 2 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ jobs:
env:
TC_CLOUD_TOKEN: ${{ secrets.TC_CLOUD_TOKEN }}
steps:
- uses: actions/checkout@v1
- uses: actions/checkout@v2
- name: Set up JDK
uses: actions/setup-java@v1
with:
Expand Down Expand Up @@ -48,6 +48,31 @@ jobs:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
run: ./mvnw --no-transfer-progress clean install -P$USE_SONAR

test_cli_native:
name: Test CLI native binary
runs-on: ubuntu-latest
needs: build
steps:
- uses: graalvm/setup-graalvm@v1
with:
version: '21.3.0'
java-version: '17'
components: 'native-image'
github-token: ${{ secrets.GITHUB_TOKEN }}
- uses: actions/checkout@v2
- name: 'Cache Maven packages'
uses: actions/cache@v1
with:
path: ~/.m2
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
restore-keys: ${{ runner.os }}-m2
- name: Clean and build
run: ./mvnw --no-transfer-progress -Dnative -DskipTests -pl eu.michael-simons.neo4j:neo4j-migrations-cli clean package
- name: Run binary
uses: jbangdev/jbang-action@v0.86.0
with:
script: bin/test_native_cli.java

test_quarkus_native:
name: Test Quarkus extension in native image
runs-on: ubuntu-latest
Expand All @@ -59,7 +84,7 @@ jobs:
java-version: '17'
components: 'native-image'
github-token: ${{ secrets.GITHUB_TOKEN }}
- uses: actions/checkout@v1
- uses: actions/checkout@v2
- name: 'Cache Maven packages'
uses: actions/cache@v1
with:
Expand Down
67 changes: 67 additions & 0 deletions bin/test_native_cli.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
///usr/bin/env jbang "$0" "$@" ; exit $?
//JAVA 17
//DEPS org.testcontainers:neo4j:1.16.2
//DEPS org.slf4j:slf4j-simple:1.7.32
//DEPS org.neo4j.driver:neo4j-java-driver:4.4.2
//DEPS org.assertj:assertj-core:3.22.0
package ac.simons.neo4j.migrations.quarkus;

import static org.assertj.core.api.Assertions.assertThat;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UncheckedIOException;
import java.nio.file.Paths;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.stream.Collectors;

import org.neo4j.driver.AuthTokens;
import org.neo4j.driver.GraphDatabase;
import org.testcontainers.containers.Neo4jContainer;
import org.testcontainers.utility.TestcontainersConfiguration;

/**
* Needs to be called from the root of the project.
*/
public class test_native_cli {

public static void main(String... a) throws Exception {

var executable = Paths.get("./neo4j-migrations-cli/target/neo4j-migrations").toAbsolutePath().normalize().toString();
var scripts = "file://" + Paths.get("./neo4j-migrations-test-resources/src/main/resources/some/changeset").toAbsolutePath().normalize();

// Let Ryuk take care of it, so no try/catch with autockose
var reusable = TestcontainersConfiguration.getInstance().environmentSupportsReuse();
var neo4j = new Neo4jContainer<>("neo4j:4.3").withReuse(reusable);
neo4j.start();

try (var driver = GraphDatabase.driver(neo4j.getBoltUrl(), AuthTokens.basic("neo4j", neo4j.getAdminPassword()));
var session = driver.session()) {
session.run("MATCH (n) DETACH DELETE n");
}

var expectedOutput = List.of(
"Applied migration 0001 (\"delete old data\")",
"Applied migration 0002 (\"create new data\")",
"Database migrated to version 0002."
);

var p = new ProcessBuilder(executable,
"--address", neo4j.getBoltUrl(),
"--password", neo4j.getAdminPassword(),
"--location", scripts,
"apply"
).start();

p.onExit().thenAccept(done -> {
try (var in = new BufferedReader(new InputStreamReader(done.getInputStream()))) {
var output = in.lines().collect(Collectors.toCollection(LinkedHashSet::new));
assertThat(output).containsExactlyElementsOf(expectedOutput);
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}).get();
}
}

0 comments on commit 356fa46

Please sign in to comment.