Skip to content

Commit 0a1bd2e

Browse files
authored
Live-набор Allure и документация отчёта (#71)
Closes #64 Стек Allure-каталога: 5/6. Аннотации live-набора наравне с обычным; README: просмотр по умолчанию и явный live-запуск. Живого бэкенда в конвейере нет.
1 parent 71ffc0d commit 0a1bd2e

5 files changed

Lines changed: 90 additions & 0 deletions

File tree

‎README.md‎

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,3 +133,26 @@ docker compose up -d
133133

134134
mvn test -Dgroups=integration -DexcludedGroups=
135135
```
136+
137+
### Allure-отчёт
138+
139+
Просмотр по умолчанию — по штатному прогону, без живого бэкенда
140+
(`integration`-группа исключена, живого бэкенда в конвейере нет):
141+
142+
```bash
143+
mvn test
144+
mvn io.qameta.allure:allure-maven:2.17.0:report
145+
# открыть target/allure-report/index.html
146+
```
147+
148+
Полный отчёт с live-интеграцией собирается только явным запуском против
149+
локального бэкенда. Требования окружения: поднятый бэкенд на `localhost:8080`
150+
(см. «Запуск с реальным бэкендом» выше) и `.env` с `IT_ADMIN_EMAIL` /
151+
`IT_ADMIN_PASSWORD` сид-админа локального бэкенда (без пароля live-тесты
152+
скипаются):
153+
154+
```bash
155+
mvn test -Dgroups=integration -DexcludedGroups=
156+
mvn io.qameta.allure:allure-maven:2.17.0:report
157+
# открыть target/allure-report/index.html
158+
```

‎src/test/java/com/DesktopApplicationClientJava/ui/integration/LoginIntegrationTest.java‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@
33
import static org.junit.jupiter.api.Assertions.assertThrows;
44

55
import com.DesktopApplicationClientJava.services.ServiceException;
6+
import io.qameta.allure.Epic;
7+
import io.qameta.allure.Feature;
8+
import io.qameta.allure.Story;
9+
import org.junit.jupiter.api.DisplayName;
10+
import org.junit.jupiter.api.Tag;
611
import org.junit.jupiter.api.Test;
712

813
/**
@@ -13,9 +18,15 @@
1318
* explicitly: {@code mvn test -Dgroups=integration -DexcludedGroups=} ({@code @Tag} inherited from
1419
* IntegrationTestCase).
1520
*/
21+
@Epic("Проверка ввода")
22+
@Feature("Вход (email + пароль)")
23+
@Story("Страница входа")
24+
@Tag("role:admin")
25+
@DisplayName("Вход через живой API")
1626
class LoginIntegrationTest extends IntegrationTestCase {
1727

1828
@Test
29+
@DisplayName("Чужие учётные данные отклоняются живым API")
1930
void invalidCredentialsAreRejectedByRealApi() {
2031
assertThrows(
2132
ServiceException.class,

‎src/test/java/com/DesktopApplicationClientJava/ui/integration/ResourceDetailsIntegrationTest.java‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,12 @@
77

88
import com.DesktopApplicationClientJava.entities.Resource;
99
import com.DesktopApplicationClientJava.services.ServiceException;
10+
import io.qameta.allure.Epic;
11+
import io.qameta.allure.Feature;
12+
import io.qameta.allure.Story;
1013
import java.util.UUID;
14+
import org.junit.jupiter.api.DisplayName;
15+
import org.junit.jupiter.api.Tag;
1116
import org.junit.jupiter.api.Test;
1217

1318
/**
@@ -18,13 +23,20 @@
1823
* explicitly: {@code mvn test -Dgroups=integration -DexcludedGroups=} ({@code @Tag} inherited from
1924
* IntegrationTestCase).
2025
*/
26+
@Epic("Ресурс")
27+
@Feature("Просмотр метаданных ресурса")
28+
@Story("Страница деталей ресурса")
29+
@Tag("role:admin")
30+
@DisplayName("Детали ресурса через живой API")
2131
class ResourceDetailsIntegrationTest extends IntegrationTestCase {
2232
@Test
33+
@DisplayName("Неизвестный идентификатор бросает сервисную ошибку")
2334
void unknownIdThrowsServiceException() {
2435
assertThrows(ServiceException.class, () -> resourceService.getById(UUID.randomUUID()));
2536
}
2637

2738
@Test
39+
@DisplayName("Созданный ресурс читается обратно")
2840
void createdResourceRoundTrip() {
2941
assumeTrue(
3042
adminPassword != null && !adminPassword.isBlank(),

‎src/test/java/com/DesktopApplicationClientJava/ui/integration/ResourceFormIntegrationTest.java‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@
2121
import com.DesktopApplicationClientJava.session.Session;
2222
import com.DesktopApplicationClientJava.ui.FxTestBase;
2323
import com.DesktopApplicationClientJava.utils.ControllerWiring;
24+
import io.qameta.allure.Epic;
25+
import io.qameta.allure.Feature;
26+
import io.qameta.allure.Story;
2427
import java.util.UUID;
2528
import javafx.event.ActionEvent;
2629
import javafx.fxml.FXMLLoader;
@@ -35,6 +38,8 @@
3538
import org.junit.jupiter.api.AfterAll;
3639
import org.junit.jupiter.api.BeforeAll;
3740
import org.junit.jupiter.api.BeforeEach;
41+
import org.junit.jupiter.api.DisplayName;
42+
import org.junit.jupiter.api.Tag;
3843
import org.junit.jupiter.api.Test;
3944
import org.testfx.api.FxRobot;
4045
import org.testfx.api.FxToolkit;
@@ -52,6 +57,11 @@
5257
* excludedGroups} in pom.xml). Run explicitly: {@code mvn test -Dgroups=integration
5358
* -DexcludedGroups= -Dtest=ResourceFormIntegrationTest}.
5459
*/
60+
@Epic("Ресурс")
61+
@Feature("Создание и правка ресурса")
62+
@Story("Страница формы ресурса")
63+
@Tag("role:admin")
64+
@DisplayName("Форма ресурса через живой API")
5565
class ResourceFormIntegrationTest extends IntegrationTestCase {
5666

5767
private final FxRobot robot = new FxRobot();
@@ -99,6 +109,7 @@ void setUpServices() {
99109
}
100110

101111
@Test
112+
@DisplayName("Создание с корректными полями читается обратно")
102113
void createValidRoundTrip() {
103114
loginAsAdmin();
104115
String title = "IT ResourceForm " + UUID.randomUUID();
@@ -113,6 +124,7 @@ void createValidRoundTrip() {
113124
}
114125

115126
@Test
127+
@DisplayName("Создание без описания читается обратно")
116128
void createNullDescriptionRoundTrip() {
117129
loginAsAdmin();
118130
String title = "IT ResourceForm " + UUID.randomUUID();
@@ -125,6 +137,7 @@ void createNullDescriptionRoundTrip() {
125137
}
126138

127139
@Test
140+
@DisplayName("Правка названия и описания сохраняется")
128141
void updateValidRoundTrip() {
129142
loginAsAdmin();
130143
String updatedTitle = "IT ResourceForm updated " + UUID.randomUUID();
@@ -141,6 +154,7 @@ void updateValidRoundTrip() {
141154
}
142155

143156
@Test
157+
@DisplayName("Некорректные названия отклоняются с 400")
144158
void invalidTitlesAreRejectedWith400() {
145159
loginAsAdmin();
146160

@@ -150,6 +164,7 @@ void invalidTitlesAreRejectedWith400() {
150164
}
151165

152166
@Test
167+
@DisplayName("Пустое описание отклоняется с 400")
153168
void emptyDescriptionIsRejectedWith400() {
154169
loginAsAdmin();
155170

@@ -159,13 +174,15 @@ void emptyDescriptionIsRejectedWith400() {
159174
}
160175

161176
@Test
177+
@DisplayName("Правка неизвестного ресурса возвращает 404")
162178
void updateUnknownIdReturns404() {
163179
loginAsAdmin();
164180

165181
assertStatus(404, () -> resourceService.update(UUID.randomUUID(), "IT ResourceForm", null));
166182
}
167183

168184
@Test
185+
@DisplayName("Сохранение с чужими токенами показывает ошибку без перехода")
169186
void saveWithInvalidTokensShowsErrorAndDoesNotNavigate() {
170187
// Garbage tokens (not a fresh session) force a real HTTP 401 round-trip instead of the
171188
// client's offline "no refresh token" shortcut, proving server-side auth enforcement.

‎src/test/java/com/DesktopApplicationClientJava/ui/integration/ResourceListIntegrationTest.java‎

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@
1919
import com.DesktopApplicationClientJava.session.Session;
2020
import com.DesktopApplicationClientJava.ui.FxTestBase;
2121
import com.DesktopApplicationClientJava.utils.ControllerWiring;
22+
import io.qameta.allure.Epic;
23+
import io.qameta.allure.Feature;
24+
import io.qameta.allure.Story;
2225
import java.util.List;
2326
import java.util.UUID;
2427
import java.util.concurrent.TimeUnit;
@@ -40,6 +43,8 @@
4043
import org.junit.jupiter.api.BeforeAll;
4144
import org.junit.jupiter.api.BeforeEach;
4245
import org.junit.jupiter.api.Disabled;
46+
import org.junit.jupiter.api.DisplayName;
47+
import org.junit.jupiter.api.Tag;
4348
import org.junit.jupiter.api.Test;
4449
import org.testfx.api.FxRobot;
4550
import org.testfx.api.FxToolkit;
@@ -54,6 +59,10 @@
5459
* the default build and CI (see surefire {@code excludedGroups} in pom.xml). Run explicitly: {@code
5560
* mvn test -Dgroups=integration -DexcludedGroups= -Dtest=ResourceListIntegrationTest}.
5661
*/
62+
@Epic("Ресурс")
63+
@Feature("Список ресурсов")
64+
@Story("Страница списка ресурсов")
65+
@DisplayName("Список ресурсов через живой API")
5766
class ResourceListIntegrationTest extends IntegrationTestCase {
5867

5968
private final FxRobot robot = new FxRobot();
@@ -103,6 +112,8 @@ void setUpServices() {
103112
}
104113

105114
@Test
115+
@Tag("role:admin")
116+
@DisplayName("Пустой поиск показывает заглушку и нулевой счётчик")
106117
void emptySearchShowsPlaceholderAndZeroCounter() {
107118
loginAsAdmin();
108119
loadListPage(robot);
@@ -116,6 +127,8 @@ void emptySearchShowsPlaceholderAndZeroCounter() {
116127
}
117128

118129
@Test
130+
@Tag("role:admin")
131+
@DisplayName("Созданный ресурс находится поиском")
119132
void seededResourceAppearsInSearch() {
120133
loginAsAdmin();
121134
String title = "IT ResourceList " + UUID.randomUUID();
@@ -136,6 +149,8 @@ void seededResourceAppearsInSearch() {
136149
}
137150

138151
@Test
152+
@Tag("role:admin")
153+
@DisplayName("Сортировка по названию упорядочивает ресурсы")
139154
void sortByTitleAscOrdersSeededResources() {
140155
loginAsAdmin();
141156
String prefix = "IT ResourceSort " + UUID.randomUUID() + " ";
@@ -161,6 +176,8 @@ void sortByTitleAscOrdersSeededResources() {
161176
}
162177

163178
@Test
179+
@Tag("role:admin")
180+
@DisplayName("Поиск без входа показывает ошибку и пустую таблицу")
164181
void unauthenticatedSearchShowsErrorAndLeavesTableEmpty() {
165182
// Fresh session, no login: the request cannot be authenticated.
166183
session.clear();
@@ -182,6 +199,8 @@ void unauthenticatedSearchShowsErrorAndLeavesTableEmpty() {
182199
* that lenient contract: unknown sort fields must still return 200 ordered by creation time.
183200
*/
184201
@Test
202+
@Tag("role:admin")
203+
@DisplayName("Неизвестное поле сортировки откатывается к дате создания")
185204
void invalidSortFieldFallsBackToCreatedAtDesc() {
186205
loginAsAdmin();
187206
String prefix = "IT SortFallback " + UUID.randomUUID() + " ";
@@ -206,6 +225,8 @@ void invalidSortFieldFallsBackToCreatedAtDesc() {
206225
* модалку, подтверждение закрывает её и удаляет ресурс на бэкенде.
207226
*/
208227
@Test
228+
@Tag("role:admin")
229+
@DisplayName("Удаление через модалку убирает ресурс с бэкенда")
209230
void deleteCycleRemovesResourceFromBackend() {
210231
loginAsAdmin();
211232
String title = "IT ResourceDelete " + UUID.randomUUID();
@@ -240,6 +261,8 @@ void deleteCycleRemovesResourceFromBackend() {
240261
}
241262

242263
@Test
264+
@Tag("role:moder")
265+
@DisplayName("Удаление глазами модератора")
243266
@Disabled("Невоспроизводим: в дев-бэкенде засеян только ADMIN, сида MODER нет")
244267
void deleteCycleAsModerator() {
245268
// Живой цикл удаления за МОДЕР (не админа) невоспроизводим: интеграционное окружение
@@ -255,6 +278,8 @@ private void loginAsAdmin() {
255278
}
256279

257280
@Test
281+
@Tag("role:admin")
282+
@DisplayName("Поиск по описанию находит ресурс")
258283
void searchByDescriptionFindsSeededResource() {
259284
loginAsAdmin();
260285
String description = "IT описание " + UUID.randomUUID();
@@ -277,6 +302,8 @@ void searchByDescriptionFindsSeededResource() {
277302
}
278303

279304
@Test
305+
@Tag("role:admin")
306+
@DisplayName("Отмена удаления оставляет ресурс на бэкенде")
280307
void cancelledDeleteKeepsResourceOnBackend() {
281308
loginAsAdmin();
282309
String title = "IT ResourceCancel " + UUID.randomUUID();

0 commit comments

Comments
 (0)