package com.talentcard.server.business.portal; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.when; import java.lang.reflect.Method; import java.util.List; import java.util.Map; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.jdbc.core.JdbcTemplate; @ExtendWith(MockitoExtension.class) class PortalServiceTests { @Mock private JdbcTemplate jdbc; @InjectMocks private PortalService service; @Test void cinemaMerchantOnlyShowsCouponTagWhenAnActiveCouponExists() { when(jdbc.queryForList(anyString(), any(Object[].class))).thenReturn(List.of( Map.of("id", 1L, "merchant_name", "有券影院", "merchant_type", "cinema", "status", 1, "coupon_available", 1), Map.of("id", 2L, "merchant_name", "无券影院", "merchant_type", "cinema", "status", 1, "coupon_available", 0))); when(jdbc.queryForObject(anyString(), eq(Long.class), any(Object[].class))).thenReturn(2L); var result = service.entertainmentMerchants(1, 4); assertThat(result.records().get(0)) .containsEntry("couponAvailable", true) .containsEntry("discountText", "券"); assertThat(result.records().get(1)) .containsEntry("couponAvailable", false) .containsEntry("discountText", ""); } @Test void shoppingMerchantUsesConfiguredStoreDiscountInsteadOfRightsTag() throws Exception { Method method = PortalService.class.getDeclaredMethod("merchantRightDiscountText", Map.class); method.setAccessible(true); String discount = (String) method.invoke(service, Map.of( "enabled", true, "tag", "卓越人才到店消费可用", "storeConsume", true, "consumeEnabled", true, "discount", "8.50")); assertThat(discount).isEqualTo("8.5折"); } @Test @SuppressWarnings("unchecked") void recommendedMerchantTagsFollowCategoryListRules() throws Exception { Method method = PortalService.class.getDeclaredMethod( "merchantListBenefitTags", Map.class, Map.class, Long.class); method.setAccessible(true); List foodTags = (List) method.invoke(service, Map.of("merchantType", "food", "couponAvailable", true, "discountText", "8.5折"), Map.of(), null); List cinemaTags = (List) method.invoke(service, Map.of("merchantType", "cinema", "couponAvailable", false, "discountText", "7折"), Map.of(), null); assertThat(foodTags).containsExactly("券", "8.5折"); assertThat(cinemaTags).isEmpty(); } }