/
Artem276
/
arch
Обзор
Документация
Войти
/
Artem276
/
arch
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/test/java/org/example/api/ExchangeServletTest.java
126 строк
4 KB
Nazarova Ekaterina
1 commit
29 дек 2025, 11:43
29 дек 2025, 11:43
14775dd
Код
Авторство
О чём код?
package org.example.api; import com.fasterxml.jackson.databind.ObjectMapper; import org.example.api.mocks.MockServletInputStream; import org.example.api.requests.OrderRequest; import org.example.api.requests.UserRequest; import org.example.domain.*; import org.junit.jupiter.api.Test; import jakarta.servlet.http.*; import java.io.PrintWriter; import java.io.StringWriter; import java.nio.charset.StandardCharsets; import java.util.List; import static org.mockito.Mockito.*; import static org.junit.jupiter.api.Assertions.*; public class ExchangeServletTest { @Test void testPostOrderDelegatesToCorrectShard() throws Exception { // --- Моки --- ExchangeShard shard = mock(ExchangeShard.class); when(shard.placeOrder(any())).thenReturn(List.of()); ShardRouter router = mock(ShardRouter.class); when(router.shardForPair("USD/EUR")).thenReturn(shard); ExchangeServlet servlet = new ExchangeServlet(router); // --- JSON запроса --- OrderRequest order = new OrderRequest(); order.userId = "alice"; order.side = OrderSide.BUY; order.pair = "USD/EUR"; order.quantity = 10; order.price = 100; ObjectMapper mapper = new ObjectMapper(); String jsonBody = mapper.writeValueAsString(order); HttpServletRequest req = mock(HttpServletRequest.class); HttpServletResponse resp = mock(HttpServletResponse.class); when(req.getPathInfo()).thenReturn("/order"); when(req.getInputStream()).thenReturn(new MockServletInputStream(jsonBody.getBytes(StandardCharsets.UTF_8))); StringWriter out = new StringWriter(); when(resp.getWriter()).thenReturn(new PrintWriter(out)); // --- Выполнение --- servlet.doPost(req, resp); // --- Проверка --- verify(shard, times(1)).placeOrder(any(Order.class)); assertTrue(out.toString().contains("[]")); // пустой список трейдов } @Test void testGetBalanceAggregatesAcrossShards() throws Exception { // --- Моки --- ExchangeShard shard1 = mock(ExchangeShard.class); ExchangeShard shard2 = mock(ExchangeShard.class); when(shard1.getUserBalance("alice", "USD")).thenReturn(100L); when(shard2.getUserBalance("alice", "USD")).thenReturn(50L); ShardRouter router = mock(ShardRouter.class); when(router.allShards()).thenReturn(new ExchangeShard[]{shard1, shard2}); ExchangeServlet servlet = new ExchangeServlet(router); HttpServletRequest req = mock(HttpServletRequest.class); HttpServletResponse resp = mock(HttpServletResponse.class); when(req.getPathInfo()).thenReturn("/balance"); when(req.getParameter("user")).thenReturn("alice"); when(req.getParameter("currency")).thenReturn("USD"); StringWriter out = new StringWriter(); when(resp.getWriter()).thenReturn(new PrintWriter(out)); // --- Выполнение --- servlet.doGet(req, resp); // --- Проверка --- assertTrue(out.toString().contains("\"balance\":150")); // 100 + 50 } @Test void testPostUserCreatesUserOnAllShards() throws Exception { ExchangeShard shard1 = mock(ExchangeShard.class); ExchangeShard shard2 = mock(ExchangeShard.class); ShardRouter router = mock(ShardRouter.class); when(router.allShards()).thenReturn(new ExchangeShard[]{shard1, shard2}); ExchangeServlet servlet = new ExchangeServlet(router); UserRequest user = new UserRequest(); user.id = "alice"; user.usd = 1000; user.eur = 500; ObjectMapper mapper = new ObjectMapper(); String jsonBody = mapper.writeValueAsString(user); HttpServletRequest req = mock(HttpServletRequest.class); HttpServletResponse resp = mock(HttpServletResponse.class); when(req.getPathInfo()).thenReturn("/user"); when(req.getInputStream()).thenReturn(new MockServletInputStream(jsonBody.getBytes(StandardCharsets.UTF_8))); StringWriter out = new StringWriter(); when(resp.getWriter()).thenReturn(new PrintWriter(out)); // --- Выполнение --- servlet.doPost(req, resp); // --- Проверка --- verify(shard1, times(1)).login("alice", 1000, 500); verify(shard2, times(1)).login("alice", 1000, 500); assertTrue(out.toString().contains("\"status\":\"ok\"")); } }