diff --git a/spring-boot-project/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java b/spring-boot-project/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java index 398bffbc22..0c8f16e9e0 100644 --- a/spring-boot-project/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java +++ b/spring-boot-project/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java @@ -33,13 +33,16 @@ import static org.assertj.core.api.Assertions.assertThat; class PostgresJdbcDockerComposeConnectionDetailsFactoryIntegrationTests { @DockerComposeTest(composeFile = "postgres-compose.yaml", image = TestImage.POSTGRESQL) - void runCreatesConnectionDetails(JdbcConnectionDetails connectionDetails) { + void runCreatesConnectionDetails(JdbcConnectionDetails connectionDetails) throws ClassNotFoundException { assertConnectionDetails(connectionDetails); + checkDatabaseAccess(connectionDetails); } @DockerComposeTest(composeFile = "postgres-bitnami-compose.yaml", image = TestImage.BITNAMI_POSTGRESQL) - void runWithBitnamiImageCreatesConnectionDetails(JdbcConnectionDetails connectionDetails) { + void runWithBitnamiImageCreatesConnectionDetails(JdbcConnectionDetails connectionDetails) + throws ClassNotFoundException { assertConnectionDetails(connectionDetails); + checkDatabaseAccess(connectionDetails); } private void assertConnectionDetails(JdbcConnectionDetails connectionDetails) { diff --git a/spring-boot-project/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresR2dbcDockerComposeConnectionDetailsFactoryIntegrationTests.java b/spring-boot-project/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresR2dbcDockerComposeConnectionDetailsFactoryIntegrationTests.java index 2c01091b09..d449b024b7 100644 --- a/spring-boot-project/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresR2dbcDockerComposeConnectionDetailsFactoryIntegrationTests.java +++ b/spring-boot-project/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresR2dbcDockerComposeConnectionDetailsFactoryIntegrationTests.java @@ -37,11 +37,13 @@ class PostgresR2dbcDockerComposeConnectionDetailsFactoryIntegrationTests { @DockerComposeTest(composeFile = "postgres-compose.yaml", image = TestImage.POSTGRESQL) void runCreatesConnectionDetails(R2dbcConnectionDetails connectionDetails) { assertConnectionDetails(connectionDetails); + checkDatabaseAccess(connectionDetails); } @DockerComposeTest(composeFile = "postgres-bitnami-compose.yaml", image = TestImage.BITNAMI_POSTGRESQL) void runWithBitnamiImageCreatesConnectionDetails(R2dbcConnectionDetails connectionDetails) { assertConnectionDetails(connectionDetails); + checkDatabaseAccess(connectionDetails); } private void assertConnectionDetails(R2dbcConnectionDetails connectionDetails) { diff --git a/spring-boot-project/spring-boot-docker-compose/src/dockerTest/resources/org/springframework/boot/docker/compose/service/connection/postgres/postgres-bitnami-compose.yaml b/spring-boot-project/spring-boot-docker-compose/src/dockerTest/resources/org/springframework/boot/docker/compose/service/connection/postgres/postgres-bitnami-compose.yaml index cb34245ec1..97eca6b3c8 100644 --- a/spring-boot-project/spring-boot-docker-compose/src/dockerTest/resources/org/springframework/boot/docker/compose/service/connection/postgres/postgres-bitnami-compose.yaml +++ b/spring-boot-project/spring-boot-docker-compose/src/dockerTest/resources/org/springframework/boot/docker/compose/service/connection/postgres/postgres-bitnami-compose.yaml @@ -4,6 +4,6 @@ services: ports: - '5432' environment: - - 'POSTGRESQL_USER=myuser' - - 'POSTGRESQL_DB=mydatabase' + - 'POSTGRESQL_USERNAME=myuser' + - 'POSTGRESQL_DATABASE=mydatabase' - 'POSTGRESQL_PASSWORD=secret' diff --git a/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresEnvironment.java b/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresEnvironment.java index 4a63bbc0b6..0d560a5302 100644 --- a/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresEnvironment.java +++ b/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresEnvironment.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,9 +28,18 @@ import org.springframework.util.StringUtils; * @author Andy Wilkinson * @author Phillip Webb * @author Scott Frederick + * @author He Zean */ class PostgresEnvironment { + private static final String[] USERNAME_KEYS = new String[] { "POSTGRES_USER", "POSTGRES_USERNAME", + "POSTGRESQL_USER", "POSTGRESQL_USERNAME" }; + + private static final String DEFAULT_USERNAME = "postgres"; + + private static final String[] DATABASE_KEYS = new String[] { "POSTGRES_DB", "POSTGRES_DATABASE", + "POSTGRESQL_DATABASE" }; + private final String username; private final String password; @@ -38,9 +47,18 @@ class PostgresEnvironment { private final String database; PostgresEnvironment(Map env) { - this.username = env.getOrDefault("POSTGRES_USER", env.getOrDefault("POSTGRESQL_USER", "postgres")); + this.username = extractUsername(env); this.password = extractPassword(env); - this.database = env.getOrDefault("POSTGRES_DB", env.getOrDefault("POSTGRESQL_DB", this.username)); + this.database = extractDatabase(env); + } + + private String extractUsername(Map env) { + for (String key : USERNAME_KEYS) { + if (env.containsKey(key)) { + return env.get(key); + } + } + return DEFAULT_USERNAME; } private String extractPassword(Map env) { @@ -49,6 +67,15 @@ class PostgresEnvironment { return password; } + private String extractDatabase(Map env) { + for (String key : DATABASE_KEYS) { + if (env.containsKey(key)) { + return env.get(key); + } + } + return this.username; + } + String getUsername() { return this.username; } diff --git a/spring-boot-project/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresEnvironmentTests.java b/spring-boot-project/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresEnvironmentTests.java index 9058c1f11d..7a8e5dab2c 100644 --- a/spring-boot-project/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresEnvironmentTests.java +++ b/spring-boot-project/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresEnvironmentTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,6 +31,7 @@ import static org.assertj.core.api.Assertions.assertThatIllegalStateException; * @author Andy Wilkinson * @author Phillip Webb * @author Scott Frederick + * @author He Zean */ class PostgresEnvironmentTests { @@ -66,6 +67,20 @@ class PostgresEnvironmentTests { assertThat(environment.getUsername()).isEqualTo("me"); } + @Test + void getUsernameWhenHasPostgresUsername() { + PostgresEnvironment environment = new PostgresEnvironment( + Map.of("POSTGRES_USERNAME", "me", "POSTGRESQL_PASSWORD", "secret")); + assertThat(environment.getUsername()).isEqualTo("me"); + } + + @Test + void getUsernameWhenHasPostgresqlUsername() { + PostgresEnvironment environment = new PostgresEnvironment( + Map.of("POSTGRESQL_USERNAME", "me", "POSTGRESQL_PASSWORD", "secret")); + assertThat(environment.getUsername()).isEqualTo("me"); + } + @Test void getPasswordWhenHasPostgresPassword() { PostgresEnvironment environment = new PostgresEnvironment(Map.of("POSTGRES_PASSWORD", "secret")); @@ -104,6 +119,13 @@ class PostgresEnvironmentTests { assertThat(environment.getDatabase()).isEqualTo("me"); } + @Test + void getDatabaseWhenNoPostgresqlDatabaseAndPostgresqlUsername() { + PostgresEnvironment environment = new PostgresEnvironment( + Map.of("POSTGRESQL_USERNAME", "me", "POSTGRESQL_PASSWORD", "secret")); + assertThat(environment.getDatabase()).isEqualTo("me"); + } + @Test void getDatabaseWhenHasPostgresDb() { PostgresEnvironment environment = new PostgresEnvironment( @@ -112,9 +134,16 @@ class PostgresEnvironmentTests { } @Test - void getDatabaseWhenHasPostgresqlDb() { + void getDatabaseWhenHasPostgresDatabase() { PostgresEnvironment environment = new PostgresEnvironment( - Map.of("POSTGRESQL_DB", "db", "POSTGRESQL_PASSWORD", "secret")); + Map.of("POSTGRES_DATABASE", "db", "POSTGRESQL_PASSWORD", "secret")); + assertThat(environment.getDatabase()).isEqualTo("db"); + } + + @Test + void getDatabaseWhenHasPostgresqlDatabase() { + PostgresEnvironment environment = new PostgresEnvironment( + Map.of("POSTGRESQL_DATABASE", "db", "POSTGRESQL_PASSWORD", "secret")); assertThat(environment.getDatabase()).isEqualTo("db"); }