Panel Trenera (AccessTrainerPanelPage)
Ścieżka: /panel-informacji-trenera/:id Dostęp: Publiczny — wymaga aktywnego tokenu sesji (Access Token)
TC-ATP-001 — Walidacja sesji przy wejściu
| # | Akcja | Oczekiwany rezultat |
| 1 | Wejdź na stronę z aktywnym tokenem trenera | Strona ładuje się, dane trenera i harmonogram widoczne |
| 2 | Wejdź bez tokenu (czyste sessionStorage) | Przekierowanie na stronę logowania |
| 3 | Wejdź z wygasłym tokenem (access_expires_at w przeszłości) | Przekierowanie na stronę logowania |
| 4 | Wejdź z tokenem klienta (nie trenera) | Token odrzucony lub panel ładuje niepoprawne dane — zweryfikuj zachowanie |
| 5 | Wejdź z nieprawidłowym/sfałszowanym tokenem | Backend odrzuca token → przekierowanie na stronę logowania |
TC-ATP-002 — Dane trenera
| # | Akcja | Oczekiwany rezultat |
| 1 | Zaloguj jako trener | Widoczne imię, nazwisko i e-mail trenera z sesji |
| 2 | Sprawdź czas sesji | TTL trenera = 1 godzina (krótszy niż klienta — 2h) |
TC-ATP-003 — Lista activity items (harmonogram)
| # | Akcja | Oczekiwany rezultat |
| 1 | Zaloguj jako trener z przypisanymi activity items | Lista załadowana, widoczne: nazwa aktywności, data, godzina, poziom, dostępne miejsca |
| 2 | Zaloguj jako trener bez żadnych activity items | Komunikat o braku danych, brak błędów |
| 3 | Sprawdź pozycję ze statusem is_canceled = true | Pozycja oznaczona jako odwołana |
TC-ATP-004 — Filtrowanie harmonogramu
| # | Akcja | Oczekiwany rezultat |
| 1 | Filtruj po nazwie aktywności | Lista zawiera tylko pozycje pasujące do nazwy |
| 2 | Filtruj po dacie | Lista zawiera tylko pozycje z wybraną datą |
| 3 | Filtruj po poziomie (np. beginner) | Lista zawiera tylko pozycje z wybranym poziomem |
| 4 | Filtruj po statusie odwołania (is_canceled) | Lista zawiera tylko odwołane (lub aktywne) pozycje |
| 5 | Wyczyść filtry | Lista powraca do stanu domyślnego (wszystkie pozycje, per_page: 10) |
TC-ATP-005 — Paginacja
| # | Akcja | Oczekiwany rezultat |
| 1 | Trener ma > 10 activity items | Wyświetlone 10 na stronie 1, paginacja widoczna |
| 2 | Przejdź na stronę 2 | Kolejne pozycje załadowane, filtry zachowane |
| 3 | Zastosuj filtr, przejdź na stronę 2, wyczyść filtr | Powrót do strony 1 z pełną listą |
TC-ATP-006 — Ostrzeżenie o wygasaniu sesji
| # | Akcja | Oczekiwany rezultat |
| 1 | Ustaw access_expires_at = teraz + 9 minut, odśwież stronę | Modal ostrzegawczy pojawia się automatycznie z czasem do wygaśnięcia i liczbą pozostałych przedłużeń |
| 2 | Sesja ma pełny TTL (1h) | Modal nie pojawia się |
| 3 | Sesja wygaśnie samoistnie (timer co 30s) | Po wygaśnięciu sesja wyczyszczona, przekierowanie na logowanie bez akcji użytkownika |
TC-ATP-007 — Przedłużanie sesji
| # | Akcja | Oczekiwany rezultat |
| 1 | Kliknij „Przedłuż sesję" gdy dostępne przedłużenia | Sesja wydłużona o 1h, licznik spada o 1 (np. ⅔), sessionStorage zaktualizowany, modal zamknięty |
| 2 | Kliknij „Przedłuż sesję" gdy extensionsRemaining = 0 | Przycisk nieaktywny — przedłużenie niemożliwe |
| 3 | Błąd API podczas przedłużania | Sesja nie zostaje przedłużona, modal pozostaje otwarty |
TC-ATP-008 — Wylogowanie
| # | Akcja | Oczekiwany rezultat |
| 1 | Kliknij „Zamknij panel trenera" | Token unieważniony, sessionStorage wyczyszczony, przekierowanie na logowanie |
| 2 | Kliknij „Wyloguj" w modalu ostrzegawczym | Jak wyżej |
| 3 | Błąd API podczas wylogowania | sessionStorage wyczyszczony mimo błędu, użytkownik przekierowany na logowanie |
| 4 | Po wylogowaniu kliknij „Wstecz" w przeglądarce | Panel niedostępny — przekierowanie na logowanie |