test: add AgoraTokenServiceTest unit test
This commit is contained in:
parent
818aa27eb1
commit
2d0cf0f1a5
@ -0,0 +1,166 @@
|
|||||||
|
package com.walkguide.service;
|
||||||
|
|
||||||
|
import com.walkguide.dto.response.AgoraTokenResponse;
|
||||||
|
import com.walkguide.entity.User;
|
||||||
|
import com.walkguide.exception.ResourceNotFoundException;
|
||||||
|
import com.walkguide.repository.UserRepository;
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.api.DisplayName;
|
||||||
|
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.test.util.ReflectionTestUtils;
|
||||||
|
|
||||||
|
import java.time.Instant;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.*;
|
||||||
|
import static org.mockito.Mockito.*;
|
||||||
|
|
||||||
|
@ExtendWith(MockitoExtension.class)
|
||||||
|
@DisplayName("AgoraTokenService Unit Tests")
|
||||||
|
class AgoraTokenServiceTest {
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
UserRepository userRepository;
|
||||||
|
|
||||||
|
@InjectMocks
|
||||||
|
AgoraTokenService agoraTokenService;
|
||||||
|
|
||||||
|
private User caller;
|
||||||
|
private User receiver;
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
void setUp() {
|
||||||
|
caller = User.builder()
|
||||||
|
.id(3L)
|
||||||
|
.email("caller@test.com")
|
||||||
|
.displayName("Caller User")
|
||||||
|
.role("ROLE_USER")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
receiver = User.builder()
|
||||||
|
.id(7L)
|
||||||
|
.email("receiver@test.com")
|
||||||
|
.displayName("Receiver Guardian")
|
||||||
|
.role("ROLE_GUARDIAN")
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ===== generateToken - Mode Demo (tanpa App ID/Certificate) =====
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("generateToken - mode demo (appId kosong): token harus string kosong")
|
||||||
|
void generateToken_demoMode_shouldReturnEmptyToken() {
|
||||||
|
// appId dan appCertificate kosong (default @Value)
|
||||||
|
ReflectionTestUtils.setField(agoraTokenService, "agoraAppId", "");
|
||||||
|
ReflectionTestUtils.setField(agoraTokenService, "agoraAppCertificate", "");
|
||||||
|
|
||||||
|
when(userRepository.findById(3L)).thenReturn(Optional.of(caller));
|
||||||
|
when(userRepository.findById(7L)).thenReturn(Optional.of(receiver));
|
||||||
|
|
||||||
|
AgoraTokenResponse result = agoraTokenService.generateToken(3L, 7L);
|
||||||
|
|
||||||
|
assertThat(result).isNotNull();
|
||||||
|
assertThat(result.getToken()).isEmpty();
|
||||||
|
assertThat(result.getChannelName()).isEqualTo("call_3_7");
|
||||||
|
assertThat(result.getAppId()).isEmpty();
|
||||||
|
assertThat(result.getCallerName()).isEqualTo("Caller User");
|
||||||
|
assertThat(result.getUid()).isEqualTo((int) (3L % Integer.MAX_VALUE));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("generateToken - channel name harus deterministik: call_{min}_{max}")
|
||||||
|
void generateToken_channelName_shouldBeDeterministicWithMinMax() {
|
||||||
|
ReflectionTestUtils.setField(agoraTokenService, "agoraAppId", "");
|
||||||
|
ReflectionTestUtils.setField(agoraTokenService, "agoraAppCertificate", "");
|
||||||
|
|
||||||
|
when(userRepository.findById(3L)).thenReturn(Optional.of(caller));
|
||||||
|
when(userRepository.findById(7L)).thenReturn(Optional.of(receiver));
|
||||||
|
|
||||||
|
AgoraTokenResponse result1 = agoraTokenService.generateToken(3L, 7L);
|
||||||
|
|
||||||
|
// Caller dan receiver dibalik — channel name tetap sama
|
||||||
|
when(userRepository.findById(7L)).thenReturn(Optional.of(receiver));
|
||||||
|
when(userRepository.findById(3L)).thenReturn(Optional.of(caller));
|
||||||
|
AgoraTokenResponse result2 = agoraTokenService.generateToken(7L, 3L);
|
||||||
|
|
||||||
|
assertThat(result1.getChannelName()).isEqualTo("call_3_7");
|
||||||
|
assertThat(result2.getChannelName()).isEqualTo("call_3_7");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("generateToken - expiresAt harus ~1 jam dari sekarang")
|
||||||
|
void generateToken_expiresAt_shouldBeOneHourFromNow() {
|
||||||
|
ReflectionTestUtils.setField(agoraTokenService, "agoraAppId", "");
|
||||||
|
ReflectionTestUtils.setField(agoraTokenService, "agoraAppCertificate", "");
|
||||||
|
|
||||||
|
when(userRepository.findById(3L)).thenReturn(Optional.of(caller));
|
||||||
|
when(userRepository.findById(7L)).thenReturn(Optional.of(receiver));
|
||||||
|
|
||||||
|
long before = Instant.now().getEpochSecond();
|
||||||
|
AgoraTokenResponse result = agoraTokenService.generateToken(3L, 7L);
|
||||||
|
long after = Instant.now().getEpochSecond();
|
||||||
|
|
||||||
|
// expiresAt harus antara now+3600 dan now+3601 (toleransi 1 detik)
|
||||||
|
assertThat(result.getExpiresAt()).isBetween(before + 3600, after + 3601);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("generateToken - mode produksi (appId+cert valid): token harus diawali '006'")
|
||||||
|
void generateToken_productionMode_shouldReturnTokenStartingWith006() {
|
||||||
|
ReflectionTestUtils.setField(agoraTokenService, "agoraAppId", "abcdef1234567890abcdef1234567890");
|
||||||
|
ReflectionTestUtils.setField(agoraTokenService, "agoraAppCertificate", "aabbccddeeff00112233445566778899");
|
||||||
|
|
||||||
|
when(userRepository.findById(3L)).thenReturn(Optional.of(caller));
|
||||||
|
when(userRepository.findById(7L)).thenReturn(Optional.of(receiver));
|
||||||
|
|
||||||
|
AgoraTokenResponse result = agoraTokenService.generateToken(3L, 7L);
|
||||||
|
|
||||||
|
assertThat(result.getToken()).startsWith("006");
|
||||||
|
assertThat(result.getAppId()).isEqualTo("abcdef1234567890abcdef1234567890");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("generateToken - caller tidak ditemukan harus throw ResourceNotFoundException")
|
||||||
|
void generateToken_callerNotFound_shouldThrow() {
|
||||||
|
ReflectionTestUtils.setField(agoraTokenService, "agoraAppId", "");
|
||||||
|
ReflectionTestUtils.setField(agoraTokenService, "agoraAppCertificate", "");
|
||||||
|
|
||||||
|
when(userRepository.findById(99L)).thenReturn(Optional.empty());
|
||||||
|
|
||||||
|
assertThatThrownBy(() -> agoraTokenService.generateToken(99L, 7L))
|
||||||
|
.isInstanceOf(ResourceNotFoundException.class)
|
||||||
|
.hasMessageContaining("Caller not found");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("generateToken - receiver tidak ditemukan harus throw ResourceNotFoundException")
|
||||||
|
void generateToken_receiverNotFound_shouldThrow() {
|
||||||
|
ReflectionTestUtils.setField(agoraTokenService, "agoraAppId", "");
|
||||||
|
ReflectionTestUtils.setField(agoraTokenService, "agoraAppCertificate", "");
|
||||||
|
|
||||||
|
when(userRepository.findById(3L)).thenReturn(Optional.of(caller));
|
||||||
|
when(userRepository.findById(99L)).thenReturn(Optional.empty());
|
||||||
|
|
||||||
|
assertThatThrownBy(() -> agoraTokenService.generateToken(3L, 99L))
|
||||||
|
.isInstanceOf(ResourceNotFoundException.class)
|
||||||
|
.hasMessageContaining("Receiver not found");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("generateToken - uid harus modulo Integer.MAX_VALUE dari callerId")
|
||||||
|
void generateToken_uid_shouldBeCallerIdModMaxInt() {
|
||||||
|
ReflectionTestUtils.setField(agoraTokenService, "agoraAppId", "");
|
||||||
|
ReflectionTestUtils.setField(agoraTokenService, "agoraAppCertificate", "");
|
||||||
|
|
||||||
|
when(userRepository.findById(3L)).thenReturn(Optional.of(caller));
|
||||||
|
when(userRepository.findById(7L)).thenReturn(Optional.of(receiver));
|
||||||
|
|
||||||
|
AgoraTokenResponse result = agoraTokenService.generateToken(3L, 7L);
|
||||||
|
|
||||||
|
assertThat(result.getUid()).isEqualTo((int) (3L % Integer.MAX_VALUE));
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user