完成单机TEST统一入口与可靠投递回归收尾
This commit is contained in:
+96
@@ -0,0 +1,96 @@
|
||||
package com.baiyue.auth.client;
|
||||
|
||||
import feign.Client;
|
||||
import feign.FeignException;
|
||||
import feign.Request;
|
||||
import feign.Response;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.boot.autoconfigure.AutoConfigurations;
|
||||
import org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration;
|
||||
import org.springframework.boot.env.YamlPropertySourceLoader;
|
||||
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
|
||||
import org.springframework.cloud.openfeign.EnableFeignClients;
|
||||
import org.springframework.cloud.openfeign.FeignAutoConfiguration;
|
||||
import org.springframework.cloud.openfeign.FeignClient;
|
||||
import org.springframework.cloud.openfeign.FeignClientProperties;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.core.io.FileSystemResource;
|
||||
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
import static org.assertj.core.api.Assertions.*;
|
||||
|
||||
class AuthorizationFeignConfigurationContractTest {
|
||||
@Test
|
||||
void actualNamedNacosConfigMatchesContextIdAndOverridesGlobalFeignBudget() {
|
||||
new ApplicationContextRunner()
|
||||
.withConfiguration(AutoConfigurations.of(FeignAutoConfiguration.class,
|
||||
JacksonAutoConfiguration.class, HttpMessageConvertersAutoConfiguration.class))
|
||||
.withUserConfiguration(OfflineFeignConfiguration.class)
|
||||
.withPropertyValues("baiyue.clients.iam.url=http://127.0.0.1:1")
|
||||
.withInitializer(context -> {
|
||||
for (String file : new String[]{"baiyue-common.yml", "auth-service.yml"}) {
|
||||
Path path = Path.of("config", "nacos", "test", file);
|
||||
if (!Files.isRegularFile(path)) path = Path.of("..").resolve(path);
|
||||
try {
|
||||
// Load real configuration as properties only, without config-data imports.
|
||||
for (var source : new YamlPropertySourceLoader().load(file, new FileSystemResource(path))) {
|
||||
context.getEnvironment().getPropertySources().addLast(source);
|
||||
}
|
||||
} catch (java.io.IOException failure) {
|
||||
throw new IllegalStateException("Cannot read actual Auth Feign configuration", failure);
|
||||
}
|
||||
}
|
||||
})
|
||||
.run(context -> {
|
||||
assertThat(context).hasNotFailed();
|
||||
String contextId = IamAuthorizationClient.class.getAnnotation(FeignClient.class).contextId();
|
||||
var properties = context.getBean(FeignClientProperties.class);
|
||||
var named = properties.getConfig().get(contextId);
|
||||
assertThat(named).as("Nacos key must match actual @FeignClient contextId").isNotNull();
|
||||
assertThat(named.getConnectTimeout()).isEqualTo(1000);
|
||||
assertThat(named.getReadTimeout()).isEqualTo(2000);
|
||||
assertThat(named.isFollowRedirects()).isFalse();
|
||||
assertThat(properties.getConfig().get("default").getConnectTimeout()).isEqualTo(3000);
|
||||
assertThat(properties.getConfig().get("default").getReadTimeout()).isEqualTo(5000);
|
||||
|
||||
var transport = context.getBean(CapturingClient.class);
|
||||
var client = context.getBean(IamAuthorizationClient.class);
|
||||
var request = new AuthorizationSnapshotRequest(1L, 7L, 9L, "MERCHANT");
|
||||
client.load("offline-service-token", request);
|
||||
assertThat(transport.options.get().connectTimeoutMillis()).isEqualTo(1000);
|
||||
assertThat(transport.options.get().readTimeoutMillis()).isEqualTo(2000);
|
||||
assertThat(transport.options.get().isFollowRedirects()).isFalse();
|
||||
|
||||
transport.status.set(503);
|
||||
assertThatThrownBy(() -> client.load("offline-service-token", request)).isInstanceOf(FeignException.class);
|
||||
assertThat(transport.calls.get()).as("One success plus one failure, without automatic retry").isEqualTo(2);
|
||||
});
|
||||
}
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@EnableFeignClients(clients = IamAuthorizationClient.class)
|
||||
static class OfflineFeignConfiguration {
|
||||
@Bean CapturingClient capturingClient() { return new CapturingClient(); }
|
||||
}
|
||||
|
||||
/** The real Feign factory builds the client; only network I/O is replaced. */
|
||||
static class CapturingClient implements Client {
|
||||
final AtomicReference<Request.Options> options = new AtomicReference<>();
|
||||
final AtomicInteger calls = new AtomicInteger();
|
||||
final AtomicInteger status = new AtomicInteger(204);
|
||||
|
||||
@Override public Response execute(Request request, Request.Options effectiveOptions) {
|
||||
options.set(effectiveOptions);
|
||||
calls.incrementAndGet();
|
||||
return Response.builder().request(request).status(status.get()).reason("offline")
|
||||
.headers(Map.of()).build();
|
||||
}
|
||||
}
|
||||
}
|
||||
+3
-3
@@ -10,14 +10,14 @@ import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
class AuthTokenTtlConfigurationContractTest {
|
||||
@Test
|
||||
void cnNacosConfigurationKeepsShortAccessAndSevenDayRefreshTokens() throws Exception {
|
||||
void testNacosConfigurationKeepsUnifiedShortAccessAndSevenDayRefreshTokens() throws Exception {
|
||||
String configuration = Files.readString(
|
||||
Path.of("..", "config", "nacos", "cn", "auth-service.yml"), StandardCharsets.UTF_8);
|
||||
Path.of("..", "config", "nacos", "test", "auth-service.yml"), StandardCharsets.UTF_8);
|
||||
|
||||
assertThat(configuration)
|
||||
.contains("access-token-ttl: ${ACCESS_TOKEN_TTL:24m}")
|
||||
.contains("refresh-token-ttl: ${REFRESH_TOKEN_TTL:7d}")
|
||||
.contains("access-token-ttl: ${OVERSEAS_ACCESS_TOKEN_TTL:15m}")
|
||||
.doesNotContain("OVERSEAS_ACCESS_TOKEN_TTL")
|
||||
.doesNotContain("access-token-ttl: ${ACCESS_TOKEN_TTL:7d}");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user