From 19524561643a85e71c26ce9cd001093d164d4423 Mon Sep 17 00:00:00 2001 From: Jokebear777 Date: Tue, 11 Aug 2026 21:39:42 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20appVariant=20=EB=8C=80=EC=86=8C=EB=AC=B8?= =?UTF-8?q?=EC=9E=90=20=EA=B5=AC=EB=B6=84=20=EC=97=86=EC=9D=B4=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/NotificationWebConfig.java | 15 +++++ .../converter/AppVariantConverter.java | 16 ++++++ .../AdminNotificationControllerTest.java | 56 ++++++++++++++++++- 3 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 src/main/java/devkor/com/teamcback/domain/notification/config/NotificationWebConfig.java create mode 100644 src/main/java/devkor/com/teamcback/domain/notification/converter/AppVariantConverter.java diff --git a/src/main/java/devkor/com/teamcback/domain/notification/config/NotificationWebConfig.java b/src/main/java/devkor/com/teamcback/domain/notification/config/NotificationWebConfig.java new file mode 100644 index 00000000..5e541a4a --- /dev/null +++ b/src/main/java/devkor/com/teamcback/domain/notification/config/NotificationWebConfig.java @@ -0,0 +1,15 @@ +package devkor.com.teamcback.domain.notification.config; + +import devkor.com.teamcback.domain.notification.converter.AppVariantConverter; +import org.springframework.context.annotation.Configuration; +import org.springframework.format.FormatterRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class NotificationWebConfig implements WebMvcConfigurer { + + @Override + public void addFormatters(FormatterRegistry registry) { + registry.addConverter(new AppVariantConverter()); + } +} diff --git a/src/main/java/devkor/com/teamcback/domain/notification/converter/AppVariantConverter.java b/src/main/java/devkor/com/teamcback/domain/notification/converter/AppVariantConverter.java new file mode 100644 index 00000000..ed9e5896 --- /dev/null +++ b/src/main/java/devkor/com/teamcback/domain/notification/converter/AppVariantConverter.java @@ -0,0 +1,16 @@ +package devkor.com.teamcback.domain.notification.converter; + +import devkor.com.teamcback.domain.notification.entity.type.AppVariant; +import org.springframework.core.convert.converter.Converter; + +public class AppVariantConverter implements Converter { + + @Override + public AppVariant convert(String source) { + if (source == null || source.isEmpty()) { + return null; + } + + return AppVariant.from(source); + } +} diff --git a/src/test/java/devkor/com/teamcback/domain/notification/controller/AdminNotificationControllerTest.java b/src/test/java/devkor/com/teamcback/domain/notification/controller/AdminNotificationControllerTest.java index 55d5c870..5596750c 100644 --- a/src/test/java/devkor/com/teamcback/domain/notification/controller/AdminNotificationControllerTest.java +++ b/src/test/java/devkor/com/teamcback/domain/notification/controller/AdminNotificationControllerTest.java @@ -1,6 +1,8 @@ package devkor.com.teamcback.domain.notification.controller; import devkor.com.teamcback.domain.notification.dto.response.AdminPushEventFlagRes; +import devkor.com.teamcback.domain.notification.converter.AppVariantConverter; +import devkor.com.teamcback.domain.notification.entity.type.AppVariant; import devkor.com.teamcback.domain.notification.entity.type.PushEventType; import devkor.com.teamcback.domain.notification.service.AdminNotificationService; import devkor.com.teamcback.domain.notification.service.PushEventFlagService; @@ -8,12 +10,18 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.format.support.DefaultFormattingConversionService; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch; @@ -37,7 +45,12 @@ void setUp() { adminNotificationService, pushEventFlagService ); - mockMvc = MockMvcBuilders.standaloneSetup(controller).build(); + DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService(); + conversionService.addConverter(new AppVariantConverter()); + + mockMvc = MockMvcBuilders.standaloneSetup(controller) + .setConversionService(conversionService) + .build(); } @Test @@ -63,4 +76,45 @@ void updatedEventFlagIsReflectedInAdminApiQueryResult() throws Exception { .andExpect(jsonPath("$.data[1].eventType").value("REPORT")) .andExpect(jsonPath("$.data[1].enabled").value(true)); } + + @ParameterizedTest + @CsvSource({ + "dev,DEV", + "DEV,DEV", + "preview,PREVIEW", + "PREVIEW,PREVIEW", + "production,PRODUCTION", + "PRODUCTION,PRODUCTION" + }) + void searchInstallationsBindsAppVariantIgnoringCase(String requestValue, AppVariant expected) throws Exception { + when(adminNotificationService.searchInstallations(1L, null, expected)) + .thenReturn(List.of()); + + mockMvc.perform(get("/api/admin/notifications/installations/search") + .param("userId", "1") + .param("appVariant", requestValue)) + .andExpect(status().isOk()); + + verify(adminNotificationService).searchInstallations(1L, null, expected); + } + + @Test + void getDispatchesBindsAppVariantIgnoringCase() throws Exception { + when(adminNotificationService.getDispatches(1, 20, AppVariant.PREVIEW, null)) + .thenReturn(new PageImpl<>(List.of(), PageRequest.of(0, 20), 0)); + + mockMvc.perform(get("/api/admin/notifications/dispatches") + .param("appVariant", "preview")) + .andExpect(status().isOk()); + + verify(adminNotificationService).getDispatches(1, 20, AppVariant.PREVIEW, null); + } + + @Test + void invalidAppVariantReturnsBadRequest() throws Exception { + mockMvc.perform(get("/api/admin/notifications/installations/search") + .param("userId", "1") + .param("appVariant", "invalid")) + .andExpect(status().isBadRequest()); + } }