add trackServiceTest

Change-Id: I53960283c01fed90efcbb5a9bdef817fd4624d4a
diff --git a/src/test/java/com/example/g8backend/service/TrackerServiceTest.java b/src/test/java/com/example/g8backend/service/TrackerServiceTest.java
new file mode 100644
index 0000000..829fe15
--- /dev/null
+++ b/src/test/java/com/example/g8backend/service/TrackerServiceTest.java
@@ -0,0 +1,138 @@
+package com.example.g8backend.service;
+
+import com.example.g8backend.dto.AnnounceRequestDTO;
+import com.example.g8backend.dto.AnnounceResponseDTO;
+import com.example.g8backend.entity.Peer;
+import com.example.g8backend.mapper.PeerMapper;
+import com.example.g8backend.service.impl.TrackerServiceImpl;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.*;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.SetOperations;
+
+import java.util.*;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.*;
+import static org.mockito.Mockito.*;
+
+@ExtendWith(MockitoExtension.class)
+public class TrackerServiceTest {
+
+    @InjectMocks
+    private TrackerServiceImpl trackerService;
+
+    @Mock
+    private PeerMapper peerMapper;
+
+    @Mock
+    private RedisTemplate<String, Object> redisTemplate;
+
+    @Mock
+    private SetOperations<String, Object> setOperations;
+
+    @BeforeEach
+    public void setUp() {
+        when(redisTemplate.opsForSet()).thenReturn(setOperations);
+    }
+
+    @Test
+    public void testHandleAnnounceStoppedEvent() {
+        AnnounceRequestDTO requestDTO = new AnnounceRequestDTO();
+        requestDTO.setEvent("stopped");
+        requestDTO.setInfoHash("infohash");
+        requestDTO.setPeerId("peer1");
+
+        AnnounceResponseDTO response = trackerService.handleAnnounce(requestDTO);
+
+        verify(setOperations).remove("peers:infohash", "peer1");
+        assertEquals(30, response.getInterval());
+        assertTrue(response.getPeers().isEmpty());
+    }
+
+    @Test
+    public void testHandleAnnounceWithNewPeer() {
+        AnnounceRequestDTO requestDTO = new AnnounceRequestDTO();
+        requestDTO.setPasskey("key123");
+        requestDTO.setInfoHash("infohash");
+        requestDTO.setPeerId("peer1");
+        requestDTO.setIp("192.168.0.1");
+        requestDTO.setPort(6881);
+        requestDTO.setUploaded(1000);
+        requestDTO.setDownloaded(500);
+        requestDTO.setEvent("started");
+
+        when(peerMapper.getPeerByPK("peer1", "infohash", "key123")).thenReturn(null);
+        when(setOperations.members("peers:infohash")).thenReturn(Set.of("peer1"));
+        when(peerMapper.getPeerByInfoHashAndPeerId("infohash", "peer1")).thenReturn(List.of(new Peer() {{
+            setIpAddress("192.168.0.1");
+            setPort(6881);
+        }}));
+
+        AnnounceResponseDTO response = trackerService.handleAnnounce(requestDTO);
+
+        verify(peerMapper).insert(any(Peer.class));
+        verify(setOperations).add("peers:infohash", "peer1");
+        assertEquals(30, response.getInterval());
+        assertEquals(1, response.getPeers().size());
+        assertEquals("192.168.0.1", response.getPeers().get(0).get("ip"));
+    }
+
+    @Test
+    public void testHandleAnnounceWithExistingPeer() {
+        AnnounceRequestDTO requestDTO = new AnnounceRequestDTO();
+        requestDTO.setPasskey("key123");
+        requestDTO.setInfoHash("infohash");
+        requestDTO.setPeerId("peer2");
+        requestDTO.setIp("192.168.1.1");
+        requestDTO.setPort(6882);
+        requestDTO.setUploaded(2000);
+        requestDTO.setDownloaded(1000);
+        requestDTO.setEvent("update");
+
+        Peer existing = new Peer();
+        existing.setPeerId("peer2");
+        existing.setPasskey("key123");
+        existing.setInfo_hash("infohash");
+        existing.setUploaded(1000.0);
+        existing.setDownloaded(500.0);
+
+        when(peerMapper.getPeerByPK("peer2", "infohash", "key123")).thenReturn(existing);
+        when(setOperations.members("peers:infohash")).thenReturn(Set.of("peer2"));
+        when(peerMapper.getPeerByInfoHashAndPeerId("infohash", "peer2")).thenReturn(List.of(new Peer() {{
+            setIpAddress("192.168.1.1");
+            setPort(6882);
+        }}));
+
+        AnnounceResponseDTO response = trackerService.handleAnnounce(requestDTO);
+
+        verify(peerMapper).updatePeer(eq("key123"), eq("peer2"), eq("infohash"), eq(2000.0), eq(1000.0));
+        verify(setOperations).add("peers:infohash", "peer2");
+        assertEquals(1, response.getPeers().size());
+        assertEquals("192.168.1.1", response.getPeers().get(0).get("ip"));
+    }
+
+    @Test
+    public void testHandleAnnounceExceptionInRedis() {
+        AnnounceRequestDTO requestDTO = new AnnounceRequestDTO();
+        requestDTO.setPasskey("keyX");
+        requestDTO.setInfoHash("hashX");
+        requestDTO.setPeerId("peerX");
+        requestDTO.setIp("10.0.0.1");
+        requestDTO.setPort(6883);
+        requestDTO.setUploaded(100);
+        requestDTO.setDownloaded(200);
+        requestDTO.setEvent("started");
+
+        when(peerMapper.getPeerByPK(any(), any(), any())).thenReturn(null);
+        when(setOperations.members(anyString())).thenReturn(new HashSet<>() );
+
+        AnnounceResponseDTO response = trackerService.handleAnnounce(requestDTO);
+
+        assertEquals(30, response.getInterval());
+        assertTrue(response.getPeers().isEmpty());
+    }
+}