From b4de03c9c76297eaa3ff55cef585d77aa53c8f37 Mon Sep 17 00:00:00 2001 From: Ivan Vakhrushev Date: Mon, 4 Nov 2024 10:17:51 +0400 Subject: [PATCH 1/3] New version --- common-internal-bom/build.gradle.kts | 2 +- spring-boot-2-demo-app/build.gradle.kts | 3 +- .../boot2/test/IndexesMaintenanceTest.java | 48 ++++++++++--------- 3 files changed, 28 insertions(+), 25 deletions(-) diff --git a/common-internal-bom/build.gradle.kts b/common-internal-bom/build.gradle.kts index 9e0007c5..b443fa31 100644 --- a/common-internal-bom/build.gradle.kts +++ b/common-internal-bom/build.gradle.kts @@ -12,7 +12,7 @@ dependencies { api(platform("org.assertj:assertj-bom:3.26.3")) api(platform("org.testcontainers:testcontainers-bom:1.20.3")) api(platform("org.junit:junit-bom:5.11.3")) - api(platform("io.github.mfvanek:pg-index-health-bom:0.13.1")) + api(platform("io.github.mfvanek:pg-index-health-bom:0.13.2")) constraints { api("org.liquibase:liquibase-core:4.29.2") diff --git a/spring-boot-2-demo-app/build.gradle.kts b/spring-boot-2-demo-app/build.gradle.kts index a8914d89..0fb671a4 100644 --- a/spring-boot-2-demo-app/build.gradle.kts +++ b/spring-boot-2-demo-app/build.gradle.kts @@ -21,7 +21,8 @@ dependencies { implementation("org.springframework.kafka:spring-kafka") implementation("io.opentelemetry:opentelemetry-exporter-otlp") - implementation("org.springframework.cloud:spring-cloud-starter-sleuth") { + implementation("org.springframework.cloud:spring-cloud-starter-sleuth:3.1.11") { + because("The version is higher than in BOM") exclude(group = "org.springframework.cloud", module = "spring-cloud-sleuth-brave") } implementation("org.springframework.cloud:spring-cloud-sleuth-otel-autoconfigure") diff --git a/spring-boot-2-demo-app/src/test/java/io/github/mfvanek/spring/boot2/test/IndexesMaintenanceTest.java b/spring-boot-2-demo-app/src/test/java/io/github/mfvanek/spring/boot2/test/IndexesMaintenanceTest.java index 4967c663..b3ed2633 100644 --- a/spring-boot-2-demo-app/src/test/java/io/github/mfvanek/spring/boot2/test/IndexesMaintenanceTest.java +++ b/spring-boot-2-demo-app/src/test/java/io/github/mfvanek/spring/boot2/test/IndexesMaintenanceTest.java @@ -25,33 +25,35 @@ class IndexesMaintenanceTest extends TestBase { void checkPostgresVersion() { final String pgVersion = jdbcTemplate.queryForObject("select version();", String.class); assertThat(pgVersion) - .startsWith("PostgreSQL 16.4"); + .startsWith("PostgreSQL 16.4"); } @Test void databaseStructureCheckForPublicSchema() { assertThat(checks) - .hasSameSizeAs(Diagnostic.values()); - - checks.forEach(check -> { - switch (check.getDiagnostic()) { - case TABLES_WITHOUT_PRIMARY_KEY, TABLES_WITHOUT_DESCRIPTION -> assertThat(check.check()) - .asInstanceOf(list(Table.class)) - .hasSize(1) - .containsExactly(Table.of("databasechangelog", 0L)); - - case COLUMNS_WITHOUT_DESCRIPTION -> assertThat(check.check()) - .asInstanceOf(list(Column.class)) - .hasSize(14) - .allSatisfy(column -> assertThat(column.getTableName()).isEqualTo("databasechangelog")); - - case TABLES_WITH_MISSING_INDEXES -> assertThat(check.check()) - .hasSizeLessThanOrEqualTo(1); // TODO skip runtime checks after https://github.com/mfvanek/pg-index-health/issues/456 - - default -> assertThat(check.check()) - .as(check.getDiagnostic().name()) - .isEmpty(); - } - }); + .hasSameSizeAs(Diagnostic.values()); + + checks.stream() + .filter(DatabaseCheckOnHost::isStatic) + .forEach(check -> { + switch (check.getDiagnostic()) { + case TABLES_WITHOUT_PRIMARY_KEY, TABLES_WITHOUT_DESCRIPTION -> assertThat(check.check()) + .asInstanceOf(list(Table.class)) + .hasSize(1) + .containsExactly(Table.of("databasechangelog", 0L)); + + case COLUMNS_WITHOUT_DESCRIPTION -> assertThat(check.check()) + .asInstanceOf(list(Column.class)) + .hasSize(14) + .allSatisfy(column -> assertThat(column.getTableName()).isEqualTo("databasechangelog")); + + case TABLES_WITH_MISSING_INDEXES -> assertThat(check.check()) + .hasSizeLessThanOrEqualTo(1); // TODO skip runtime checks after https://github.com/mfvanek/pg-index-health/issues/456 + + default -> assertThat(check.check()) + .as(check.getDiagnostic().name()) + .isEmpty(); + } + }); } } From 92b44bcf7f6022b4747bb9ea1d9e26301a6d2b07 Mon Sep 17 00:00:00 2001 From: Ivan Vakhrushev Date: Mon, 4 Nov 2024 10:32:16 +0400 Subject: [PATCH 2/3] Refactor tests --- docker/docker-compose-base.yml | 2 +- .../boot2/test/IndexesMaintenanceTest.java | 43 ++++++++----------- .../test/support/PostgresInitializer.java | 2 +- .../boot3/test/IndexesMaintenanceTest.java | 41 ++++++++---------- .../test/support/PostgresInitializer.java | 2 +- 5 files changed, 41 insertions(+), 49 deletions(-) diff --git a/docker/docker-compose-base.yml b/docker/docker-compose-base.yml index dc3aba7b..fa15936f 100644 --- a/docker/docker-compose-base.yml +++ b/docker/docker-compose-base.yml @@ -86,7 +86,7 @@ services: postgres: container_name: postgres - image: postgres:16.4 + image: postgres:17.0 shm_size: "2gb" environment: POSTGRES_DB: "otel_demo_db" diff --git a/spring-boot-2-demo-app/src/test/java/io/github/mfvanek/spring/boot2/test/IndexesMaintenanceTest.java b/spring-boot-2-demo-app/src/test/java/io/github/mfvanek/spring/boot2/test/IndexesMaintenanceTest.java index b3ed2633..f872f4e5 100644 --- a/spring-boot-2-demo-app/src/test/java/io/github/mfvanek/spring/boot2/test/IndexesMaintenanceTest.java +++ b/spring-boot-2-demo-app/src/test/java/io/github/mfvanek/spring/boot2/test/IndexesMaintenanceTest.java @@ -3,9 +3,10 @@ import io.github.mfvanek.pg.common.maintenance.DatabaseCheckOnHost; import io.github.mfvanek.pg.common.maintenance.Diagnostic; import io.github.mfvanek.pg.model.DbObject; +import io.github.mfvanek.pg.model.PgContext; import io.github.mfvanek.pg.model.column.Column; -import io.github.mfvanek.pg.model.table.Table; import io.github.mfvanek.spring.boot2.test.support.TestBase; +import org.assertj.core.api.ListAssert; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -25,35 +26,29 @@ class IndexesMaintenanceTest extends TestBase { void checkPostgresVersion() { final String pgVersion = jdbcTemplate.queryForObject("select version();", String.class); assertThat(pgVersion) - .startsWith("PostgreSQL 16.4"); + .startsWith("PostgreSQL 17.0"); } @Test void databaseStructureCheckForPublicSchema() { assertThat(checks) - .hasSameSizeAs(Diagnostic.values()); + .hasSameSizeAs(Diagnostic.values()); checks.stream() - .filter(DatabaseCheckOnHost::isStatic) - .forEach(check -> { - switch (check.getDiagnostic()) { - case TABLES_WITHOUT_PRIMARY_KEY, TABLES_WITHOUT_DESCRIPTION -> assertThat(check.check()) - .asInstanceOf(list(Table.class)) - .hasSize(1) - .containsExactly(Table.of("databasechangelog", 0L)); - - case COLUMNS_WITHOUT_DESCRIPTION -> assertThat(check.check()) - .asInstanceOf(list(Column.class)) - .hasSize(14) - .allSatisfy(column -> assertThat(column.getTableName()).isEqualTo("databasechangelog")); - - case TABLES_WITH_MISSING_INDEXES -> assertThat(check.check()) - .hasSizeLessThanOrEqualTo(1); // TODO skip runtime checks after https://github.com/mfvanek/pg-index-health/issues/456 - - default -> assertThat(check.check()) - .as(check.getDiagnostic().name()) - .isEmpty(); - } - }); + .filter(DatabaseCheckOnHost::isStatic) + .forEach(check -> { + final List objects = check.check(PgContext.ofPublic(), o -> !o.getName().equalsIgnoreCase("databasechangelog")); + final ListAssert checkAssert = assertThat(objects) + .as(check.getDiagnostic().name()); + + if (check.getDiagnostic() == Diagnostic.COLUMNS_WITHOUT_DESCRIPTION) { + assertThat(objects) + .asInstanceOf(list(Column.class)) + .hasSize(14) + .allSatisfy(column -> assertThat(column.getTableName()).isEqualTo("databasechangelog")); + } else { + checkAssert.isEmpty(); + } + }); } } diff --git a/spring-boot-2-demo-app/src/test/java/io/github/mfvanek/spring/boot2/test/support/PostgresInitializer.java b/spring-boot-2-demo-app/src/test/java/io/github/mfvanek/spring/boot2/test/support/PostgresInitializer.java index 9b551f18..52eb6b29 100644 --- a/spring-boot-2-demo-app/src/test/java/io/github/mfvanek/spring/boot2/test/support/PostgresInitializer.java +++ b/spring-boot-2-demo-app/src/test/java/io/github/mfvanek/spring/boot2/test/support/PostgresInitializer.java @@ -10,7 +10,7 @@ public class PostgresInitializer implements ApplicationContextInitializer { - private static final DockerImageName IMAGE = DockerImageName.parse("postgres:16.4"); + private static final DockerImageName IMAGE = DockerImageName.parse("postgres:17.0"); private static final Network NETWORK = Network.newNetwork(); private static final PostgreSQLContainer CONTAINER = new PostgreSQLContainer<>(IMAGE); diff --git a/spring-boot-3-demo-app/src/test/java/io/github/mfvanek/spring/boot3/test/IndexesMaintenanceTest.java b/spring-boot-3-demo-app/src/test/java/io/github/mfvanek/spring/boot3/test/IndexesMaintenanceTest.java index d19a43f0..db988e21 100644 --- a/spring-boot-3-demo-app/src/test/java/io/github/mfvanek/spring/boot3/test/IndexesMaintenanceTest.java +++ b/spring-boot-3-demo-app/src/test/java/io/github/mfvanek/spring/boot3/test/IndexesMaintenanceTest.java @@ -3,9 +3,10 @@ import io.github.mfvanek.pg.common.maintenance.DatabaseCheckOnHost; import io.github.mfvanek.pg.common.maintenance.Diagnostic; import io.github.mfvanek.pg.model.DbObject; +import io.github.mfvanek.pg.model.PgContext; import io.github.mfvanek.pg.model.column.Column; -import io.github.mfvanek.pg.model.table.Table; import io.github.mfvanek.spring.boot3.test.support.TestBase; +import org.assertj.core.api.ListAssert; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -25,7 +26,7 @@ class IndexesMaintenanceTest extends TestBase { void checkPostgresVersion() { final String pgVersion = jdbcTemplate.queryForObject("select version();", String.class); assertThat(pgVersion) - .startsWith("PostgreSQL 16.4"); + .startsWith("PostgreSQL 17.0"); } @Test @@ -33,25 +34,21 @@ void databaseStructureCheckForPublicSchema() { assertThat(checks) .hasSameSizeAs(Diagnostic.values()); - checks.forEach(check -> { - switch (check.getDiagnostic()) { - case TABLES_WITHOUT_PRIMARY_KEY, TABLES_WITHOUT_DESCRIPTION -> assertThat(check.check()) - .asInstanceOf(list(Table.class)) - .hasSize(1) - .containsExactly(Table.of("databasechangelog", 0L)); - - case COLUMNS_WITHOUT_DESCRIPTION -> assertThat(check.check()) - .asInstanceOf(list(Column.class)) - .hasSize(14) - .allSatisfy(column -> assertThat(column.getTableName()).isEqualTo("databasechangelog")); - - case TABLES_WITH_MISSING_INDEXES -> assertThat(check.check()) - .hasSizeLessThanOrEqualTo(1); // TODO skip runtime checks after https://github.com/mfvanek/pg-index-health/issues/456 - - default -> assertThat(check.check()) - .as(check.getDiagnostic().name()) - .isEmpty(); - } - }); + checks.stream() + .filter(DatabaseCheckOnHost::isStatic) + .forEach(check -> { + final List objects = check.check(PgContext.ofPublic(), o -> !o.getName().equalsIgnoreCase("databasechangelog")); + final ListAssert checkAssert = assertThat(objects) + .as(check.getDiagnostic().name()); + + if (check.getDiagnostic() == Diagnostic.COLUMNS_WITHOUT_DESCRIPTION) { + assertThat(objects) + .asInstanceOf(list(Column.class)) + .hasSize(14) + .allSatisfy(column -> assertThat(column.getTableName()).isEqualTo("databasechangelog")); + } else { + checkAssert.isEmpty(); + } + }); } } diff --git a/spring-boot-3-demo-app/src/test/java/io/github/mfvanek/spring/boot3/test/support/PostgresInitializer.java b/spring-boot-3-demo-app/src/test/java/io/github/mfvanek/spring/boot3/test/support/PostgresInitializer.java index 266e1742..408d17d5 100644 --- a/spring-boot-3-demo-app/src/test/java/io/github/mfvanek/spring/boot3/test/support/PostgresInitializer.java +++ b/spring-boot-3-demo-app/src/test/java/io/github/mfvanek/spring/boot3/test/support/PostgresInitializer.java @@ -10,7 +10,7 @@ public class PostgresInitializer implements ApplicationContextInitializer { - private static final DockerImageName IMAGE = DockerImageName.parse("postgres:16.4"); + private static final DockerImageName IMAGE = DockerImageName.parse("postgres:17.0"); private static final Network NETWORK = Network.newNetwork(); private static final PostgreSQLContainer CONTAINER = new PostgreSQLContainer<>(IMAGE); From 3656fb03f3d8bd3d3c2a0607ad207804d4fd6873 Mon Sep 17 00:00:00 2001 From: Ivan Vakhrushev Date: Mon, 4 Nov 2024 10:45:26 +0400 Subject: [PATCH 3/3] Refactor tests #2 --- .../boot2/test/IndexesMaintenanceTest.java | 27 +++++++++---------- .../boot3/test/IndexesMaintenanceTest.java | 27 +++++++++---------- 2 files changed, 24 insertions(+), 30 deletions(-) diff --git a/spring-boot-2-demo-app/src/test/java/io/github/mfvanek/spring/boot2/test/IndexesMaintenanceTest.java b/spring-boot-2-demo-app/src/test/java/io/github/mfvanek/spring/boot2/test/IndexesMaintenanceTest.java index f872f4e5..064fd5aa 100644 --- a/spring-boot-2-demo-app/src/test/java/io/github/mfvanek/spring/boot2/test/IndexesMaintenanceTest.java +++ b/spring-boot-2-demo-app/src/test/java/io/github/mfvanek/spring/boot2/test/IndexesMaintenanceTest.java @@ -4,17 +4,16 @@ import io.github.mfvanek.pg.common.maintenance.Diagnostic; import io.github.mfvanek.pg.model.DbObject; import io.github.mfvanek.pg.model.PgContext; -import io.github.mfvanek.pg.model.column.Column; +import io.github.mfvanek.pg.model.table.TableNameAware; import io.github.mfvanek.spring.boot2.test.support.TestBase; -import org.assertj.core.api.ListAssert; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import java.util.List; +import java.util.function.Predicate; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.InstanceOfAssertFactories.list; class IndexesMaintenanceTest extends TestBase { @@ -37,18 +36,16 @@ void databaseStructureCheckForPublicSchema() { checks.stream() .filter(DatabaseCheckOnHost::isStatic) .forEach(check -> { - final List objects = check.check(PgContext.ofPublic(), o -> !o.getName().equalsIgnoreCase("databasechangelog")); - final ListAssert checkAssert = assertThat(objects) - .as(check.getDiagnostic().name()); - - if (check.getDiagnostic() == Diagnostic.COLUMNS_WITHOUT_DESCRIPTION) { - assertThat(objects) - .asInstanceOf(list(Column.class)) - .hasSize(14) - .allSatisfy(column -> assertThat(column.getTableName()).isEqualTo("databasechangelog")); - } else { - checkAssert.isEmpty(); - } + final Predicate skipLiquibaseTables = dbObject -> { + if (dbObject instanceof TableNameAware t) { + return !t.getTableName().equalsIgnoreCase("databasechangelog"); + } + return true; + }; + final List objects = check.check(PgContext.ofPublic(), skipLiquibaseTables); + assertThat(objects) + .as(check.getDiagnostic().name()) + .isEmpty(); }); } } diff --git a/spring-boot-3-demo-app/src/test/java/io/github/mfvanek/spring/boot3/test/IndexesMaintenanceTest.java b/spring-boot-3-demo-app/src/test/java/io/github/mfvanek/spring/boot3/test/IndexesMaintenanceTest.java index db988e21..0fe52597 100644 --- a/spring-boot-3-demo-app/src/test/java/io/github/mfvanek/spring/boot3/test/IndexesMaintenanceTest.java +++ b/spring-boot-3-demo-app/src/test/java/io/github/mfvanek/spring/boot3/test/IndexesMaintenanceTest.java @@ -4,17 +4,16 @@ import io.github.mfvanek.pg.common.maintenance.Diagnostic; import io.github.mfvanek.pg.model.DbObject; import io.github.mfvanek.pg.model.PgContext; -import io.github.mfvanek.pg.model.column.Column; +import io.github.mfvanek.pg.model.table.TableNameAware; import io.github.mfvanek.spring.boot3.test.support.TestBase; -import org.assertj.core.api.ListAssert; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import java.util.List; +import java.util.function.Predicate; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.InstanceOfAssertFactories.list; class IndexesMaintenanceTest extends TestBase { @@ -37,18 +36,16 @@ void databaseStructureCheckForPublicSchema() { checks.stream() .filter(DatabaseCheckOnHost::isStatic) .forEach(check -> { - final List objects = check.check(PgContext.ofPublic(), o -> !o.getName().equalsIgnoreCase("databasechangelog")); - final ListAssert checkAssert = assertThat(objects) - .as(check.getDiagnostic().name()); - - if (check.getDiagnostic() == Diagnostic.COLUMNS_WITHOUT_DESCRIPTION) { - assertThat(objects) - .asInstanceOf(list(Column.class)) - .hasSize(14) - .allSatisfy(column -> assertThat(column.getTableName()).isEqualTo("databasechangelog")); - } else { - checkAssert.isEmpty(); - } + final Predicate skipLiquibaseTables = dbObject -> { + if (dbObject instanceof TableNameAware t) { + return !t.getTableName().equalsIgnoreCase("databasechangelog"); + } + return true; + }; + final List objects = check.check(PgContext.ofPublic(), skipLiquibaseTables); + assertThat(objects) + .as(check.getDiagnostic().name()) + .isEmpty(); }); } }