Add env test

This commit is contained in:
2025-12-02 16:45:56 +01:00
parent 8b7bf1ecde
commit 60f04f1aa8
5 changed files with 81 additions and 3 deletions

View File

@@ -0,0 +1,31 @@
package com.imgfloat.app.config;
import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
@Component
public class TwitchCredentialsValidator {
private final String clientId;
private final String clientSecret;
public TwitchCredentialsValidator(
@Value("${spring.security.oauth2.client.registration.twitch.client-id}") String clientId,
@Value("${spring.security.oauth2.client.registration.twitch.client-secret}") String clientSecret) {
this.clientId = clientId;
this.clientSecret = clientSecret;
}
@PostConstruct
void validate() {
ensurePresent(clientId, "TWITCH_CLIENT_ID");
ensurePresent(clientSecret, "TWITCH_CLIENT_SECRET");
}
private void ensurePresent(String value, String name) {
if (!StringUtils.hasText(value) || "changeme".equalsIgnoreCase(value.trim())) {
throw new IllegalStateException(name + " must be set in the environment or .env file");
}
}
}

View File

@@ -7,6 +7,8 @@ server:
key-store-type: ${SSL_KEYSTORE_TYPE:PKCS12}
spring:
config:
import: optional:file:.env[.properties]
application:
name: imgfloat
thymeleaf:
@@ -16,8 +18,8 @@ spring:
client:
registration:
twitch:
client-id: ${TWITCH_CLIENT_ID:changeme}
client-secret: ${TWITCH_CLIENT_SECRET:changeme}
client-id: ${TWITCH_CLIENT_ID}
client-secret: ${TWITCH_CLIENT_SECRET}
redirect-uri: "{baseUrl}/login/oauth2/code/twitch"
authorization-grant-type: authorization_code
scope: ["user:read:email"]

View File

@@ -19,7 +19,10 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@SpringBootTest
@SpringBootTest(properties = {
"spring.security.oauth2.client.registration.twitch.client-id=test-client-id",
"spring.security.oauth2.client.registration.twitch.client-secret=test-client-secret"
})
@AutoConfigureMockMvc
class ChannelApiIntegrationTest {

View File

@@ -0,0 +1,40 @@
package com.imgfloat.app;
import com.imgfloat.app.config.TwitchCredentialsValidator;
import org.junit.jupiter.api.Test;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.ConfigurableApplicationContext;
import static org.assertj.core.api.Assertions.assertThatCode;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
class TwitchEnvironmentValidationTest {
@Test
void failsToStartWhenTwitchCredentialsMissing() {
assertThatThrownBy(() -> new SpringApplicationBuilder(ImgfloatApplication.class)
.properties("server.port=0")
.run())
.hasRootCauseInstanceOf(IllegalArgumentException.class)
.hasRootCauseMessage("Could not resolve placeholder 'TWITCH_CLIENT_ID' in value \"${TWITCH_CLIENT_ID}\"");
}
@Test
void loadsCredentialsFromDotEnvFile() {
ConfigurableApplicationContext context = null;
try {
context = new SpringApplicationBuilder(ImgfloatApplication.class)
.properties(
"server.port=0",
"spring.config.import=optional:file:src/test/resources/valid.env[.properties]")
.run();
ConfigurableApplicationContext finalContext = context;
assertThatCode(() -> finalContext.getBean(TwitchCredentialsValidator.class))
.doesNotThrowAnyException();
} finally {
if (context != null) {
context.close();
}
}
}
}

View File

@@ -0,0 +1,2 @@
TWITCH_CLIENT_ID=test-client-id
TWITCH_CLIENT_SECRET=test-client-secret