From e2100d7f77de31968bf1bdf1d2a2fc2b72e5192d Mon Sep 17 00:00:00 2001 From: Jean Bisutti Date: Thu, 26 Mar 2026 15:52:34 +0100 Subject: [PATCH 1/4] Cache Maven dependencies using setup-java built-in support --- .github/workflows/CI.yml | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index e588d23..1ed4ffc 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -22,12 +22,7 @@ jobs: with: java-version: ${{ matrix.java }} distribution: 'temurin' - - name: Cache Maven dependencies - uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5 - with: - path: ~/.m2 - key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }} - restore-keys: ${{ runner.os }}-m2 + cache: 'maven' - name: Execute tests run: mvn verify - name: check license header is present in all files From 13212706896e6482b65564bb8c96cb3e36cd3572 Mon Sep 17 00:00:00 2001 From: Jean Bisutti Date: Thu, 26 Mar 2026 23:09:59 +0100 Subject: [PATCH 2/4] generateInsertScriptFor(DatasetRow) returns insert script --- src/main/java/org/qstd/QuickSqlTestData.java | 12 +++++++ .../java/org/qstd/test/DatasetRowApiTest.java | 33 +++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/src/main/java/org/qstd/QuickSqlTestData.java b/src/main/java/org/qstd/QuickSqlTestData.java index 278edae..4bb6b72 100644 --- a/src/main/java/org/qstd/QuickSqlTestData.java +++ b/src/main/java/org/qstd/QuickSqlTestData.java @@ -130,6 +130,18 @@ public String generateInsertScriptFor(String... sqlQueries) { return generateInsertScriptFor(queries); } + /** + * Generates an SQL insertion script from a DatasetRow object. This script contains INSERT + * statements taking into account the database integrity constraints. + * + * @param datasetRow A dataset row + * @return An SQL script allowing to create in database the dataset row given in parameter + */ + public String generateInsertScriptFor(DatasetRow datasetRow) { + SqlQuery sqlQuery = SqlQuery.buildFromRow(datasetRow, dbType); + return generateInsertScriptFor(sqlQuery.toString()); + } + /** * Generates a list of INSERT statements allowing to create in database the dataset row given in * parameter. These INSERT statements take into account the database integrity constraints. diff --git a/src/test/java/org/qstd/test/DatasetRowApiTest.java b/src/test/java/org/qstd/test/DatasetRowApiTest.java index 5ca7cee..29db348 100644 --- a/src/test/java/org/qstd/test/DatasetRowApiTest.java +++ b/src/test/java/org/qstd/test/DatasetRowApiTest.java @@ -22,6 +22,39 @@ public class DatasetRowApiTest extends H2Config { + @Test + public void should_generate_an_insert_script_from_a_dataset_row() { + + // GIVEN + TestTable playerTable = + buildUniqueTable( + DATA_SOURCE, + "Player", + " id bigint" + ", firstName varchar(255)" + ", lastName varchar(255)") + .create() + .insertValues("1, 'Paul', 'Pogba'"); + + DatasetRow datasetRow = + DatasetRow.ofTable(playerTable.getTableName()) + .addColumnValue("id", 1) + .addColumnValue("firstName", "Paul") + .addColumnValue("lastName", "Pogba"); + + QuickSqlTestData quickSqlTestData = QuickSqlTestData.buildFrom(DATA_SOURCE); + + // WHEN + String insertScript = quickSqlTestData.generateInsertScriptFor(datasetRow); + + // THEN + playerTable.recreate(); + SQL_EXECUTOR.execute(insertScript); + assertThat(playerTable) + .withScript(insertScript) + .hasNumberOfRows(1) + .row(0) + .hasValues(1, "Paul", "Pogba"); + } + @Test public void should_generate_working_insert_from_a_dataset_row() { From 8b47c14e6bcb1a7c03a365466eb6c5145e9b2043 Mon Sep 17 00:00:00 2001 From: Jean Bisutti Date: Fri, 27 Mar 2026 12:03:23 +0100 Subject: [PATCH 3/4] Upgrade Testcontainers to 1.21.4 and upgrade DB container images --- pom.xml | 6 +++--- src/test/java/org/qstd/test/MSSQLServerTest.java | 3 +-- src/test/java/org/qstd/test/MariaDBSlowTest.java | 2 +- src/test/java/org/qstd/test/MariaDBTest.java | 2 +- src/test/java/org/qstd/test/OracleTest.java | 2 +- src/test/java/org/qstd/test/PostgreSqlTest.java | 2 +- 6 files changed, 8 insertions(+), 9 deletions(-) diff --git a/pom.xml b/pom.xml index aac6153..1bef2f4 100644 --- a/pom.xml +++ b/pom.xml @@ -35,7 +35,7 @@ ${basedir} 2022 10 - 1.17.3 + 1.21.4 @@ -259,7 +259,7 @@ maven-enforcer-plugin - 1.4.1 + 3.6.2 enforce-bytecode-version @@ -284,7 +284,7 @@ org.codehaus.mojo extra-enforcer-rules - 1.2 + 1.12.0 diff --git a/src/test/java/org/qstd/test/MSSQLServerTest.java b/src/test/java/org/qstd/test/MSSQLServerTest.java index bc10300..5656d5a 100644 --- a/src/test/java/org/qstd/test/MSSQLServerTest.java +++ b/src/test/java/org/qstd/test/MSSQLServerTest.java @@ -28,8 +28,7 @@ public class MSSQLServerTest { private static final MSSQLServerContainer MS_SQL_SERVER = - new MSSQLServerContainer("mcr.microsoft.com/mssql/server:2019-CU9-ubuntu-16.04") - .acceptLicense(); + new MSSQLServerContainer<>("mcr.microsoft.com/mssql/server:2022-latest").acceptLicense(); private static DataSource DATA_SOURCE; diff --git a/src/test/java/org/qstd/test/MariaDBSlowTest.java b/src/test/java/org/qstd/test/MariaDBSlowTest.java index 98cc773..3722073 100644 --- a/src/test/java/org/qstd/test/MariaDBSlowTest.java +++ b/src/test/java/org/qstd/test/MariaDBSlowTest.java @@ -30,7 +30,7 @@ public class MariaDBSlowTest { private static final String DB_PASSWORD = "pwd"; private static final MariaDBContainer MARIA_DB_CONTAINER = - new MariaDBContainer<>("mariadb:10.5.2") + new MariaDBContainer<>("mariadb:11.4") .withDatabaseName("mariadb") .withUsername(DB_USER_NAME) .withPassword(DB_PASSWORD); diff --git a/src/test/java/org/qstd/test/MariaDBTest.java b/src/test/java/org/qstd/test/MariaDBTest.java index e79f261..3a4cdc3 100644 --- a/src/test/java/org/qstd/test/MariaDBTest.java +++ b/src/test/java/org/qstd/test/MariaDBTest.java @@ -32,7 +32,7 @@ public class MariaDBTest { private static final String DB_PASSWORD = "pwd"; private static final MariaDBContainer MARIA_DB_CONTAINER = - new MariaDBContainer<>("mariadb:10.5.2") + new MariaDBContainer<>("mariadb:11.4") .withDatabaseName("mariadb") .withUsername(DB_USER_NAME) .withPassword(DB_PASSWORD); diff --git a/src/test/java/org/qstd/test/OracleTest.java b/src/test/java/org/qstd/test/OracleTest.java index 7a3cd05..4e24dfd 100644 --- a/src/test/java/org/qstd/test/OracleTest.java +++ b/src/test/java/org/qstd/test/OracleTest.java @@ -31,7 +31,7 @@ public class OracleTest { private static DataSource DATA_SOURCE; private static final OracleContainer ORACLE_CONTAINER = - new OracleContainer("gvenzl/oracle-xe:18-slim").withEnv("ORACLE_PASSWORD", "oracle"); + new OracleContainer("gvenzl/oracle-xe:21.3.0-slim").withEnv("ORACLE_PASSWORD", "oracle"); private static SqlExecutor SQL_EXECUTOR; diff --git a/src/test/java/org/qstd/test/PostgreSqlTest.java b/src/test/java/org/qstd/test/PostgreSqlTest.java index 1fc9c33..076b89d 100644 --- a/src/test/java/org/qstd/test/PostgreSqlTest.java +++ b/src/test/java/org/qstd/test/PostgreSqlTest.java @@ -33,7 +33,7 @@ public class PostgreSqlTest { private static final String DB_PASSWORD = "pwd"; private static final PostgreSQLContainer POSTGRESQL_CONTAINER = - new PostgreSQLContainer<>("postgres:12.3") + new PostgreSQLContainer<>("postgres:17") .withDatabaseName("postgresql") .withUsername(DB_USER_NAME) .withPassword(DB_PASSWORD); From dda89ae91610c4a42545f96cb69c97a9972a6a3e Mon Sep 17 00:00:00 2001 From: Jean Bisutti Date: Fri, 27 Mar 2026 14:34:30 +0100 Subject: [PATCH 4/4] Add Maven Timeline plugin and upload artifact in CI The license-maven-plugin is already bound to process-sources phase in pom.xml, so mvn verify already runs it. The separate mvn license:check step was overwriting target/timeline/ with only its own data. --- .github/workflows/CI.yml | 8 ++++++-- .mvn/extensions.xml | 8 ++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 .mvn/extensions.xml diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 1ed4ffc..0e5f2f8 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -25,7 +25,11 @@ jobs: cache: 'maven' - name: Execute tests run: mvn verify - - name: check license header is present in all files - run: mvn license:check + - name: Upload Maven Timeline + if: always() + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + with: + name: maven-timeline-java-${{ matrix.java }} + path: target/timeline/ - name: Upload coverage to Codecov uses: codecov/codecov-action@75cd11691c0faa626561e295848008c8a7dddffe # v5 \ No newline at end of file diff --git a/.mvn/extensions.xml b/.mvn/extensions.xml new file mode 100644 index 0000000..129440f --- /dev/null +++ b/.mvn/extensions.xml @@ -0,0 +1,8 @@ + + + + io.takari.maven + maven-timeline + 2.0.4 + +