From edb132402629efa49494c6f9ad6e2caf1463eab1 Mon Sep 17 00:00:00 2001 From: XuqmGroup Date: Tue, 28 Jul 2026 22:14:14 +0800 Subject: [PATCH] fix(bugcollect): wire ingestion limiter constructor --- .../service/IngestionRateLimiter.java | 2 ++ .../service/IngestionRateLimiterTest.java | 29 +++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/xuqm-bugcollect-service/src/main/java/com/xuqm/bugcollect/service/IngestionRateLimiter.java b/xuqm-bugcollect-service/src/main/java/com/xuqm/bugcollect/service/IngestionRateLimiter.java index 00862e1..d586ca5 100644 --- a/xuqm-bugcollect-service/src/main/java/com/xuqm/bugcollect/service/IngestionRateLimiter.java +++ b/xuqm-bugcollect-service/src/main/java/com/xuqm/bugcollect/service/IngestionRateLimiter.java @@ -2,6 +2,7 @@ package com.xuqm.bugcollect.service; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.script.DefaultRedisScript; @@ -39,6 +40,7 @@ public class IngestionRateLimiter { private final Clock clock; private final Map localWindows = new ConcurrentHashMap<>(); + @Autowired public IngestionRateLimiter( StringRedisTemplate redis, @Value("${bugcollect-service.ingestion.max-events-per-minute:6000}") long maxEventsPerMinute, diff --git a/xuqm-bugcollect-service/src/test/java/com/xuqm/bugcollect/service/IngestionRateLimiterTest.java b/xuqm-bugcollect-service/src/test/java/com/xuqm/bugcollect/service/IngestionRateLimiterTest.java index 83658c1..ca90f6b 100644 --- a/xuqm-bugcollect-service/src/test/java/com/xuqm/bugcollect/service/IngestionRateLimiterTest.java +++ b/xuqm-bugcollect-service/src/test/java/com/xuqm/bugcollect/service/IngestionRateLimiterTest.java @@ -1,6 +1,10 @@ package com.xuqm.bugcollect.service; import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; import org.springframework.data.redis.core.StringRedisTemplate; import java.time.Clock; @@ -14,6 +18,22 @@ import static org.mockito.Mockito.when; class IngestionRateLimiterTest { + private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() + .withUserConfiguration(TestConfiguration.class); + + @Test + void startsAsSpringBeanWithConfiguredConstructor() { + contextRunner + .withPropertyValues( + "bugcollect-service.ingestion.max-events-per-minute=120", + "bugcollect-service.ingestion.window-seconds=30") + .run(context -> { + org.assertj.core.api.Assertions.assertThat(context).hasNotFailed(); + org.assertj.core.api.Assertions.assertThat(context) + .hasSingleBean(IngestionRateLimiter.class); + }); + } + @Test void usesDistributedRetryWindowReturnedByRedis() { StringRedisTemplate redis = mock(StringRedisTemplate.class); @@ -43,4 +63,13 @@ class IngestionRateLimiterTest { .satisfies(error -> org.assertj.core.api.Assertions.assertThat( ((IngestionRateLimitedException) error).retryAfterSeconds()).isEqualTo(60)); } + + @Configuration(proxyBeanMethods = false) + @Import(IngestionRateLimiter.class) + static class TestConfiguration { + @Bean + StringRedisTemplate stringRedisTemplate() { + return mock(StringRedisTemplate.class); + } + } }