Repository navigation
Страница №3: просмотр метаданных документа (read-only) - #18
Conversation
Read-only страница №3: метаданные ресурса + таблица файлов со скачиванием, кнопка Назад. Подготовка: Navigator.goTo с Consumer-колбэком, List<FileInfo> в Resource, hasRole по иерархии USER<MODER<ADMIN.
️✅ There are no secrets present in this pull request anymore.If these secrets were true positive and are still valid, we highly recommend you to revoke them. 🦉 GitGuardian detects secrets in your source code to help developers and security teams secure the modern development process. You are seeing this because you or someone else with access to this repository has authorized GitGuardian to scan your pull request. |
|
Интеграционные прогнаны против живого бэкенда — 3/3 зелёные (LoginIntegrationTest + 2 новых ResourceDetailsIntegrationTest: 404 на случайном UUID, create/getById/delete под admin). Команда: По ходу добавлен коммит |
Unit (TestFX + моки): метаданные + 2 файла, 404 в errorLabel, скачивание (статус/ошибка/отмена диалога), Назад; иерархия hasRole USER<MODER<ADMIN. Интеграционные (@tag integration, без моков): 404 на случайном UUID, create/getById/delete под admin. Дока: №3 помечена готовой, зафиксированы решения про Navigator-параметр и hasRole-иерархию.
Бэкенд возвращает firstname/lastname вместо firstName/lastName — строгий ObjectMapper ронял getMe в IOException (маскировался под ошибку соединения). Любой успешный логин против живого API падал.
FAIL_ON_UNKNOWN_PROPERTIES — временный костыль под firstname/lastname бэкенда. Убрать, когда бэкенд перейдёт на camelCase.
Интеграционные тесты тащили дублирующийся сетап (проверка бэкенда, сервисы, креды) и захардкоженный пароль сид-админа, на который ругнулся GitGuardian. - Общая база ui.integration.IntegrationTestCase: .env через dotenv-java (JUnit/Surefire сами .env не читают, путь приходит из surefire dotenv.path), проверка живого бэкенда, инициализация сервисов. - Пароль только из окружения или .env (IT_ADMIN_PASSWORD); без него тест скипается через assumeTrue. Секретов в исходниках больше нет, переменные IT_* задокументированы в .env.example. - Тесты переехали в ui/integration/, @tag("integration") наследуется от базы.
abb64b6 to
857c22c
Compare
INITIAL_PAGE_PATH берётся из окружения с дефолтом /fxml/LoginForm.fxml — удобно стартовать сразу с нужной страницы для ручной проверки UI (например /fxml/ResourceDetails.fxml). Переменная задокументирована в .env.example.
Запуск UI без бэкенда: MOCK_DATA=true собирает ServiceRegistry.mock() вместо ApiClient-версии, окно помечается [MOCK]. - Новый пакет services.mock: MockStore с сидами, MockAuthService (роль по сиду или префиксу email), MockResourceService/MockUsersService (in-memory CRUD + фильтры), MockFileService (скачивание пишет реальный файл-плейсхолдер), MockExportService. - Контракт MockService с default-хуком doIfInitialPage(); детали без id в мок-режиме сами открывают первый сид (иначе страница пуста). - Покрыто MockServicesTest (10) и MockFlowTest (mock→UI, 3); MOCK_DATA задокументирована в .env.example.
VS Code без Lombok-плагина не видит сгенерированные геттеры (Maven собирает через annotationProcessorPaths, падает только подсветка). Файл подскажет установить vscjava.vscode-lombok при открытии репо.
Session/Controller → @Getter/@Setter, ServiceRegistry → @AllArgsConstructor, ServiceException/ApiException → @Getter. Вычисляемый getStatus() и конструкторы с super() оставлены вручную — Lombok их не генерирует. Минус 54 строки, поведение не менялось (verify + IT зелёные).
Два режима запуска рядом (реальный бэкенд / MOCK_DATA без бэкенда), таблица переменных .env и кто их читает. Убран устаревший совет править INITIAL_PAGE_PATH в коде.
Что сделано
Read-only страница «Просмотр метаданных документа» (№3 из docs/страницы.md, доступ USER):
Подготовка (коммит 1)
goTo(fxml, Consumer<Object> withController)— отдаёт контроллер в колбэк после wiring, до смены root. СтарыйgoTo(path)без изменений.Resource.files: List<FileInfo>, маппинг FileDto→FileInfo в toEntity (null → пустой список).hasRoleсравнивает по уровню USER=0 < MODER=1 < ADMIN=2, поэтомуisModerator()true и для ADMIN (соответствует RBAC в доке). Сегодня hasRole в прод-коде нигде не использовался — ничего не ломает.Тесты (коммит 2)
chooseDirectory), Назад → ResourceList.Проверка
mvn verify: 42 unit-теста зелёные, spotless + checkstyle чистые (хуки тоже прошли).mvn test -Dgroups=integration -DexcludedGroups=setResourceIdиз ResourceList.Вне скоупа (следующие шаги): загрузка/удаление файлов, экспорт, редактирование/удаление ресурса.