package com.nanri.aiimage.config; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; /** * task-167:aiimage.http-client.* 配置命名空间契约(plan 10)。 * 默认值与现状一致;非法值钳制;配置类绑定字段齐全。 */ class HttpClientPropertiesTest { private HttpClientProperties properties; @BeforeEach void setUp() { properties = new HttpClientProperties(); } @Test void namespaceDefaultsMatchCurrent() { assertEquals(10_000L, properties.getConnectTimeoutMillis(), "connect 默认 10s(与现状一致)"); assertEquals(60_000L, properties.getReadTimeoutMillis(), "read 默认 60s"); assertEquals(90_000L, properties.getCallTimeoutMillis(), "call 默认 90s"); assertEquals(3, properties.getMaxRetries(), "重试默认 3"); assertEquals(500L, properties.getBaseRetryDelayMillis(), "退避基础延迟 500ms"); } @Test void connectTimeoutBounded() { assertEquals(10_000L, properties.effectiveConnectTimeoutMillis()); properties.setConnectTimeoutMillis(1_000); assertEquals(1_000L, properties.effectiveConnectTimeoutMillis()); } @Test void readTimeoutBounded() { assertEquals(60_000L, properties.effectiveReadTimeoutMillis()); properties.setReadTimeoutMillis(3_600_000); assertEquals(3_600_000L, properties.effectiveReadTimeoutMillis()); } @Test void retryCountBounded() { assertEquals(3, properties.effectiveMaxRetries()); properties.setMaxRetries(0); assertEquals(0, properties.effectiveMaxRetries()); } @Test void invalidValuesClamped() { properties.setConnectTimeoutMillis(-5); assertEquals(1_000L, properties.effectiveConnectTimeoutMillis(), "负数钳制到下限"); properties.setReadTimeoutMillis(999_999_999L); assertEquals(3_600_000L, properties.effectiveReadTimeoutMillis(), "超上限钳制"); properties.setMaxRetries(99); assertEquals(10, properties.effectiveMaxRetries(), "重试钳制到 10"); } @Test void callTimeoutBounded() { properties.setCallTimeoutMillis(7_200_000); assertEquals(7_200_000L, properties.effectiveCallTimeoutMillis()); properties.setCallTimeoutMillis(0); assertEquals(1_000L, properties.effectiveCallTimeoutMillis()); } @Test void configClassBindingPrefix() throws Exception { var annotation = HttpClientProperties.class .getAnnotation(org.springframework.boot.context.properties.ConfigurationProperties.class); assertEquals("aiimage.http-client", annotation.prefix(), "绑定 aiimage.http-client 前缀"); assertTrue(HttpClientProperties.class.isAnnotationPresent( org.springframework.stereotype.Component.class), "配置类需注册为组件"); } @Test void envOverrideSemantics() { // env 覆盖走宽松绑定:设置后 effective 反映新值 properties.setConnectTimeoutMillis(30_000); assertEquals(30_000L, properties.effectiveConnectTimeoutMillis()); } }