package com.ruoyi.app.utils.oauth; import com.ruoyi.common.constant.CacheConstants; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.MessageUtils; import org.junit.jupiter.api.Test; import org.mockito.MockedStatic; import java.util.Set; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.mockStatic; class LineOAuthPropertiesTest { @Test void resolvesEachLineProviderToItsOwnChannelAndAccountRole() { LineOAuthProperties properties = properties(); LineOAuthProperties.ResolvedChannel user = properties.requireChannel("line_user"); assertEquals("user-client", user.clientId()); assertEquals("https://api.test/auth/line/callback?provider=line_user", user.redirectUri()); assertEquals(CacheConstants.USER_TOKEN_KEY, user.tokenKey()); assertEquals(Set.of("0"), user.userTypes()); assertTrue(user.allowCreate()); LineOAuthProperties.ResolvedChannel rider = properties.requireChannel("line_rider"); assertEquals("rider-client", rider.clientId()); assertEquals(CacheConstants.QS_TOKEN_KEY, rider.tokenKey()); assertEquals(Set.of("2"), rider.userTypes()); assertFalse(rider.allowCreate()); LineOAuthProperties.ResolvedChannel merchant = properties.requireChannel("line_merchant"); assertEquals("merchant-client", merchant.clientId()); assertEquals(CacheConstants.SH_APP_TOKEN_KEY, merchant.tokenKey()); assertEquals(Set.of("1", "3", "4", "5"), merchant.userTypes()); assertFalse(merchant.allowCreate()); } @Test void rejectsLegacyOrUnknownLineProvider() { LineOAuthProperties properties = properties(); try (MockedStatic messages = mockStatic(MessageUtils.class)) { messages.when(() -> MessageUtils.message(org.mockito.ArgumentMatchers.anyString(), org.mockito.ArgumentMatchers.any())).thenReturn("unsupported"); assertThrows(ServiceException.class, () -> properties.requireChannel("line")); assertThrows(ServiceException.class, () -> properties.requireChannel("line_other")); } } @Test void rejectsChannelWithMissingSecret() { LineOAuthProperties properties = properties(); properties.getRider().setClientSecret(" "); try (MockedStatic messages = mockStatic(MessageUtils.class)) { messages.when(() -> MessageUtils.message("no.oauth.line.config.invalid")) .thenReturn("invalid config"); assertThrows(ServiceException.class, () -> properties.requireChannel("line_rider")); } } private LineOAuthProperties properties() { LineOAuthProperties properties = new LineOAuthProperties(); properties.setUser(channel("user")); properties.setRider(channel("rider")); properties.setMerchant(channel("merchant")); return properties; } private LineOAuthProperties.Channel channel(String name) { LineOAuthProperties.Channel channel = new LineOAuthProperties.Channel(); channel.setClientId(name + "-client"); channel.setClientSecret(name + "-secret"); channel.setRedirectUri("https://api.test/auth/line/callback?provider=line_" + name); channel.setAppRedirect("com.test." + name + "://pages/UserCenter/oauthLogin"); return channel; } }