diff --git a/ci/smoke-tests.yml b/ci/smoke-tests.yml index 1aea2e44..a7f4a27e 100644 --- a/ci/smoke-tests.yml +++ b/ci/smoke-tests.yml @@ -23,6 +23,7 @@ smoke_tests: - flyway - hateoas - jdbc + - liquibase - logging-log4j2 - logging-logback - mail diff --git a/liquibase/README.adoc b/liquibase/README.adoc new file mode 100644 index 00000000..987157c3 --- /dev/null +++ b/liquibase/README.adoc @@ -0,0 +1 @@ +Tests if database migrations with Liquibase works diff --git a/liquibase/build.gradle b/liquibase/build.gradle new file mode 100644 index 00000000..596efd6d --- /dev/null +++ b/liquibase/build.gradle @@ -0,0 +1,19 @@ +plugins { + id 'java' + id 'org.springframework.boot' + id 'org.springframework.aot.smoke-test' + id 'org.graalvm.buildtools.native' +} + +dependencies { + implementation(platform(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES)) + implementation("org.springframework.boot:spring-boot-starter-jdbc") + implementation("org.liquibase:liquibase-core") + implementation(project(":aot-smoke-test-third-party-hints")) + runtimeOnly("com.h2database:h2") + + testImplementation("org.springframework.boot:spring-boot-starter-test") + + aotTestImplementation(project(":aot-smoke-test-support")) + aotTestImplementation("org.awaitility:awaitility:4.2.0") +} diff --git a/liquibase/src/aotTest/java/com/example/liquibase/LiquibaseApplicationAotTests.java b/liquibase/src/aotTest/java/com/example/liquibase/LiquibaseApplicationAotTests.java new file mode 100644 index 00000000..2cd421f0 --- /dev/null +++ b/liquibase/src/aotTest/java/com/example/liquibase/LiquibaseApplicationAotTests.java @@ -0,0 +1,28 @@ +package com.example.liquibase; + +import java.time.Duration; + +import org.awaitility.Awaitility; +import org.junit.jupiter.api.Test; + +import org.springframework.aot.smoketest.support.assertj.AssertableOutput; +import org.springframework.aot.smoketest.support.junit.AotSmokeTest; + +import static org.assertj.core.api.Assertions.assertThat; + +@AotSmokeTest +class LiquibaseApplicationAotTests { + + @Test + void liquibaseRan(AssertableOutput output) { + Awaitility.await().atMost(Duration.ofSeconds(10)).untilAsserted(() -> { + assertThat(output).hasSingleLineContaining( + "ChangeSet classpath:/db/changelog/db.changelog-master.yaml::1::nvoxland ran successfully in "); + assertThat(output).hasSingleLineContaining( + "ChangeSet classpath:/db/changelog/db.changelog-master.yaml::2::nvoxland ran successfully in "); + assertThat(output).hasSingleLineContaining( + "ChangeSet classpath:/db/changelog/db.changelog-master.yaml::3::nvoxland ran successfully in "); + }); + } + +} diff --git a/liquibase/src/main/java/com/example/liquibase/LiquibaseApplication.java b/liquibase/src/main/java/com/example/liquibase/LiquibaseApplication.java new file mode 100644 index 00000000..fe25da5f --- /dev/null +++ b/liquibase/src/main/java/com/example/liquibase/LiquibaseApplication.java @@ -0,0 +1,17 @@ +package com.example.liquibase; + +import org.springframework.aot.smoketest.thirdpartyhints.HikariRuntimeHints; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ImportRuntimeHints; + +@SpringBootApplication +@ImportRuntimeHints(HikariRuntimeHints.class) +public class LiquibaseApplication { + + public static void main(String[] args) throws InterruptedException { + SpringApplication.run(LiquibaseApplication.class, args); + Thread.currentThread().join(); // To be able to measure memory consumption + } + +} diff --git a/liquibase/src/main/resources/db/changelog/db.changelog-master.yaml b/liquibase/src/main/resources/db/changelog/db.changelog-master.yaml new file mode 100644 index 00000000..3ee1f1a1 --- /dev/null +++ b/liquibase/src/main/resources/db/changelog/db.changelog-master.yaml @@ -0,0 +1,50 @@ +databaseChangeLog: + - preConditions: + + - changeSet: + id: 1 + author: nvoxland + changes: + - createTable: + tableName: person + columns: + - column: + name: id + type: int + autoIncrement: true + constraints: + primaryKey: true + nullable: false + - column: + name: firstname + type: varchar(50) + - column: + name: lastname + type: varchar(50) + constraints: + nullable: false + - column: + name: state + type: char(2) + + - changeSet: + id: 2 + author: nvoxland + changes: + - addColumn: + tableName: person + columns: + - column: + name: username + type: varchar(8) + + - changeSet: + id: 3 + author: nvoxland + changes: + - addLookupTable: + existingTableName: person + existingColumnName: state + newTableName: state + newColumnName: id + newColumnDataType: char(2) diff --git a/liquibase/src/test/java/com/example/liquibase/LiquibaseApplicationTests.java b/liquibase/src/test/java/com/example/liquibase/LiquibaseApplicationTests.java new file mode 100644 index 00000000..fc0338d9 --- /dev/null +++ b/liquibase/src/test/java/com/example/liquibase/LiquibaseApplicationTests.java @@ -0,0 +1,14 @@ +package com.example.liquibase; + +import org.junit.jupiter.api.Test; + +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class LiquibaseApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/settings.gradle b/settings.gradle index 06fc5768..e7d4cead 100644 --- a/settings.gradle +++ b/settings.gradle @@ -51,6 +51,7 @@ include "event-listener" include "flyway" include "hateoas" include "jdbc" +include "liquibase" include "logging-log4j2" include "logging-logback" include "mail"