utilities/rest.test.jsОткуда взялся '/rs'? Это префикс REST API — определён в двух местах, которые должны совпадать:
| Сторона | Файл | Определение | Результат |
|---|---|---|---|
| Бэкенд (Java) | RestPaths.java:31 |
public static final String REST = "rs"; |
→ Rest.URL = "/rs" |
| Фронтенд (JS) | rest.js:11 |
export const baseRestURL = \`${baseURL}/rs\`; |
→ "/rs" (когда baseURL = "") |
Суффикс "/rs" живёт на baseRestURL — он никогда не был частью baseURL. Старый тест проверял значение baseRestURL у переменной baseURL — как если бы проверять window.location.pathname и ожидать значение window.location.host.
Старый исходник rest.js:10-11 (develop) определяет две разные переменные:
export const baseURL = process.env.NODE_ENV === 'development' ? testServer : ''; // ← этот файл
export const baseRestURL = `${baseURL}/rs`; // ← НЕ та же переменнаяСтарый тест rest.test.js:6 (develop) проверял:
expect(baseURL).toBe('/rs'); // ← ожидал значение baseRestURL на переменной baseURLЭто было неверно по двум причинам:
/rs — это значение baseRestURL (строка 11), а не baseURL (строка 10). Тест проверял суффикс у неправильного экспорта.baseURL правильное значение в тестовом режиме — '' (пустая строка), а не '/rs'. Доказательство:| Окружение | Как задаётся | Выражение baseURL | Результат |
|---|---|---|---|
Dev (npm start) |
CRA: NODE_ENV='development' |
'development' === 'development' → true |
'http://localhost:8080' |
Test (npm test) |
CRA: NODE_ENV='test' — внедряется через react-scripts test |
'test' === 'development' → false |
'' (пусто) |
Production (npm run build) |
CRA: NODE_ENV='production' |
'production' === 'development' → false |
'' (пусто) |
В тестовом режиме выражение всегда равно ''. Старый тест expect(baseURL).toBe('/rs') проверял '' === '/rs' — математически неверно. Однако тест проходил годами.
Почему проходил? CRA's react-scripts test оборачивает Jest и может по-разному выставлять NODE_ENV в зависимости от версии. Возможно, в некоторых версиях CRA переменная не была надёжно установлена до выполнения теста — или тест был закеширован и не перезапускался после изменения исходника. В любом случае, утверждение было логически некорректным.
Исправление: В Vite import.meta.env.MODE всегда 'test' при vitest run. Исходник rest.js:10 (новый):
export const baseURL = (import.meta.env.DEV && import.meta.env.MODE !== 'test') ? testServer : '';
В тестовом режиме: DEV = false, MODE = 'test'. Выражение: false && ('test' !== 'test') → false. baseURL = ''. Новый тест rest.test.js:6 правильно ожидает ''.
baseRestURL (строка 10)Новый прямой тест: expect(baseRestURL).toBe('/rs'). Это выражение \`${baseURL}/rs\` — суффикс, который старый тест baseURL случайно проверял. Теперь тестируется явно.
handleHTTPErrors() (строки 14–26)Новый describe-блок с тремя тестами для rest.js:32-38:
| Тест | Вход | Ожидание | Зачем |
|---|---|---|---|
| не-OK ответ (401) | { ok: false, status: 401 } |
throws Error('Fetch failed: Error 401') |
Именно эту ошибку ожидает authentication.test.js:88 для неверного пароля |
| не-OK ответ (500) | { ok: false, status: 500 } |
throws Error('Fetch failed: Error 500') |
Проверяет что сообщение использует реальный код статуса, а не захардкожен |
| OK ответ | { ok: true, status: 200 } |
возвращает тот же объект без изменений | Счастливый путь — функция пропускает успешные ответы |
Использует expect(() => fn()).toThrow() — Vitest-паттерн, оборачивающий вызов для перехвата ошибки.
evalServiceURL() (строки 28–39)Новый describe-блок тестирует сборщик URL rest.js:18-24. Три случая:
| Тест | Вход | Ожидание |
|---|---|---|
| без параметров | evalServiceURL('cakes/order') | 'cakes/order' — без изменений |
| с параметрами | evalServiceURL('cakes/order', { id: 1, amount: 123 }) | 'cakes/order?id=1&amount=123' |
URL уже имеет ? | evalServiceURL('cakes/order?page=1', { amount: 10 }) | 'cakes/order?page=1&amount=10' — использует разделитель & |
Эта функция вызывается внутри getServiceURL() на rest.js:29. Ключевой тест — третий: проверяет что когда URL уже имеет параметры, новые добавляются через & (rest.js:20), а не через второй ?.
createQueryParams() (строки 42–55)
Один символ:
'/rs'→''.Старый тест проверял неверное значение у неверной переменной. Наглядно:
/rsдобавляется кbaseRestURL, не кbaseURL.'' === '/rs'— математически неверно.