From 0eeae7036984552114961418cdd2963941e334ae Mon Sep 17 00:00:00 2001 From: hsiegeln <37154749+hsiegeln@users.noreply.github.com> Date: Mon, 16 Mar 2026 18:15:32 +0100 Subject: [PATCH] test: add TimescaleDB test base class and Flyway migration smoke test --- .../server/app/AbstractPostgresIT.java | 29 +++++++++++++++ .../server/app/storage/FlywayMigrationIT.java | 36 +++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 cameleer3-server-app/src/test/java/com/cameleer3/server/app/AbstractPostgresIT.java create mode 100644 cameleer3-server-app/src/test/java/com/cameleer3/server/app/storage/FlywayMigrationIT.java diff --git a/cameleer3-server-app/src/test/java/com/cameleer3/server/app/AbstractPostgresIT.java b/cameleer3-server-app/src/test/java/com/cameleer3/server/app/AbstractPostgresIT.java new file mode 100644 index 00000000..26faf84a --- /dev/null +++ b/cameleer3-server-app/src/test/java/com/cameleer3/server/app/AbstractPostgresIT.java @@ -0,0 +1,29 @@ +package com.cameleer3.server.app; + +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.DynamicPropertyRegistry; +import org.springframework.test.context.DynamicPropertySource; +import org.testcontainers.containers.PostgreSQLContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@Testcontainers +public abstract class AbstractPostgresIT { + + @Container + static final PostgreSQLContainer postgres = + new PostgreSQLContainer<>("timescale/timescaledb:latest-pg16") + .withDatabaseName("cameleer3") + .withUsername("cameleer") + .withPassword("test"); + + @DynamicPropertySource + static void configureProperties(DynamicPropertyRegistry registry) { + registry.add("spring.datasource.url", postgres::getJdbcUrl); + registry.add("spring.datasource.username", postgres::getUsername); + registry.add("spring.datasource.password", postgres::getPassword); + registry.add("spring.datasource.driver-class-name", () -> "org.postgresql.Driver"); + registry.add("spring.flyway.enabled", () -> "true"); + } +} diff --git a/cameleer3-server-app/src/test/java/com/cameleer3/server/app/storage/FlywayMigrationIT.java b/cameleer3-server-app/src/test/java/com/cameleer3/server/app/storage/FlywayMigrationIT.java new file mode 100644 index 00000000..227a4236 --- /dev/null +++ b/cameleer3-server-app/src/test/java/com/cameleer3/server/app/storage/FlywayMigrationIT.java @@ -0,0 +1,36 @@ +package com.cameleer3.server.app.storage; + +import com.cameleer3.server.app.AbstractPostgresIT; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; + +import static org.junit.jupiter.api.Assertions.*; + +class FlywayMigrationIT extends AbstractPostgresIT { + + @Autowired + JdbcTemplate jdbcTemplate; + + @Test + void allMigrationsApplySuccessfully() { + // Verify core tables exist + Integer execCount = jdbcTemplate.queryForObject( + "SELECT COUNT(*) FROM executions", Integer.class); + assertEquals(0, execCount); + + Integer procCount = jdbcTemplate.queryForObject( + "SELECT COUNT(*) FROM processor_executions", Integer.class); + assertEquals(0, procCount); + + Integer userCount = jdbcTemplate.queryForObject( + "SELECT COUNT(*) FROM users", Integer.class); + assertEquals(0, userCount); + + // Verify continuous aggregates exist + Integer caggCount = jdbcTemplate.queryForObject( + "SELECT COUNT(*) FROM timescaledb_information.continuous_aggregates", + Integer.class); + assertEquals(4, caggCount); + } +}