QA: Speciály a rezervace (CHK-438)
Ruční průchod větve feat/chk-438-specials-reservations. Větev dotahuje MR !274 (zrušení s potvrzením, změna počtu hráčů z e-mailu, obnovení rezervace, připomínka týden předem) a přidává skrytí speciálu z webu, povinný počet hráčů u pozvaného náhradníka a serverové vynucení minima hráčů na speciálech. Zadání: Asana Speciály rezervace - update.
Co se v tomto kole změnilo
Section titled “Co se v tomto kole změnilo”| Oblast | Změna |
|---|---|
| Zrušení rezervace z e-mailu | Odkaz vede na stránku s potvrzením, ne rovnou na zrušení. |
| Počet hráčů | V potvrzovacím e-mailu a v připomínce týden předem jsou chipsy, kliknutí rovnou uloží. Rozsah je 2 až 8 na běžném kvízu a 3 až 8 na speciálu. |
| Obnovení rezervace | E-mail o zrušení má tlačítko Obnovit rezervaci, stůl se přiděluje znovu. |
| Připomínka týden předem | Nová notifikace pro rezervace založené aspoň 4 týdny před kvízem. |
| Náhradník | Potvrzení pozvánky vyžaduje počet hráčů, pole je předvyplněné z čekací listiny. |
| Minimum na speciálu | Tři hráči na speciál hlídá server, ne jen formulář. Platí i pro náhradníky, změnu počtu z e-mailu, obnovení rezervace a potvrzení stálé rezervace. |
| Chyby validace | Rezervační stránky vypisují, proč byl formulář odmítnut. Dřív se jen znovu načetly. |
| Tlačítka v potvrzení | Potvrzovací e-mail má Upravit počet hráčů, Přidat se do skupiny a Zrušit rezervaci. Skupina jen tam, kde ji kvíz má. |
| Připomínka den předem | Nově i úprava počtu hráčů, tlačítkem a chipsy. |
| Města u turnaje | Výběr města štítky s počty, filtruje bez načtení stránky, volba drží v adrese. |
| Detail speciálu v adminu | Tlačítko Zobrazit na webu vedle Upravit, funguje i u skrytého speciálu. |
| Poptávka po místě | K hlídce jde připsat, kam by zájemce jel. Admin ji vidí na detailu speciálu sečtenou podle měst. |
| Hlídka lokalit | Pod výpisem termínů je Nenašli jste svůj podnik? Jednou denně ve 12:00 odejde souhrn podniků přidaných od poslední zprávy, každý s odkazem na rezervaci. Nastavenou hlídku stránka pozná a nabídne zrušení. |
| Skrytí speciálu | Toggle Skrýt z webu v adminu. Skrytý speciál není ve výpisu a jeho stránka vrací 404, admin ji vidí. |
| Cache výpisu speciálů | Uložení speciálu maže 12hodinovou cache výpisu. |
| Žádost o změnu rezervace | V potvrzení a v připomínce týden předem je odkaz Upravte rezervaci. Stránka mění počet hráčů hned, text „Jiná změna” založí žádost do CRM (Systém → Žádosti o změnu). Autor bez účtu je identifikovaný e-mailem z rezervace. |
| Úprava rezervace v adminu | Rezervace → tužka. Admin mění název týmu, počet hráčů, kontakt a přesouvá rezervaci na jiný termín nebo podnik téhož speciálu. Po přesunu dostane tým nové potvrzení. Na stejné stránce vyřizuje žádosti. |
Známá mezera proti ticketu, kterou tento průchod jen potvrzuje:
- Potvrzovací stránka zrušení neukazuje název speciálu, jen tým, datum a podnik.
Příprava testovacího prostředí
Section titled “Příprava testovacího prostředí”- Web: http://chytrykviz.local
- Admin: http://admin.chytrykviz.local ([email protected] / password)
- Mailpit: http://localhost:8025
Testovací data vytvoří tento skript (uložit jako qa-seed.php, spustit docker compose exec -T fpm php artisan tinker < qa-seed.php):
$config = \App\Modules\QuizzConfig::query()->firstOrFail();$mkPub = fn (string $name) => \App\Modules\Pub\Pub::factory()->create(['display_name' => $name, 'online_reservations' => true]);$pubA = $mkPub('QA Hospoda A (2 stoly)');$pubB = $mkPub('QA Hospoda B (reminder tyden)');$pubC = $mkPub('QA Hospoda C (reminder zitra)');foreach ([1, 2] as $i) { \App\Models\PubTable::create(['pub_id' => $pubA->id, 'optimal_capacity' => 4, 'max_capacity' => 8, 'sort_order' => $i, 'is_active' => true]); }$start = now()->addDays(14)->setTime(19, 0);$special = \App\Special::create(['quizz_id' => 0, 'type' => 'TOURNAMENT', 'name' => 'qa-special-chk-438', 'display_name' => 'QA speciál CHK-438', 'start_time' => $start, 'moderator_reward' => 500, 'player_fee' => 50, 'config' => $config->id, 'is_hidden' => false]);$mkEvent = fn ($pub, $when) => \App\Models\QuizzEvent::createQuietly(['special_id' => $special->id, 'quizz_config_id' => $config->id, 'pub_id' => $pub->id, 'status' => \App\Enums\EventState::ACTIVE, 'mode' => \App\Enums\QuizzMode::ACTIVE, 'start_time' => $when, 'week' => $when->format('yW')]);$eventA = $mkEvent($pubA, $start);$eventB = $mkEvent($pubB, now()->addDays(7)->setTime(19, 0));$eventC = $mkEvent($pubC, now()->addDay()->setTime(19, 0));// createQuietly obchází generování tokenu, bez něj by odkazy v e-mailech nefungovaly.\App\Models\TeamReservation::query()->createQuietly(['event_id' => $eventB->id, 'token' => \Illuminate\Support\Str::random(64), 'team_name' => 'QA tym reminder tyden', 'email' => '[email protected]', 'phone' => '777000001', 'players' => 4, 'created_at' => now()->subWeeks(5), 'updated_at' => now()->subWeeks(5)]);\App\Models\TeamReservation::query()->createQuietly(['event_id' => $eventC->id, 'token' => \Illuminate\Support\Str::random(64), 'team_name' => 'QA tym reminder zitra', 'email' => '[email protected]', 'phone' => '777000002', 'players' => 4]);echo "special={$special->id} eventA={$eventA->id} eventB={$eventB->id} eventC={$eventC->id}\n";Výsledek: speciál QA speciál CHK-438 (web /specialy/qa-special-chk-438) se třemi událostmi.
| Událost | Podnik | Kdy | K čemu |
|---|---|---|---|
| A | QA Hospoda A, 2 stoly (kapacita 2 týmy) | za 14 dní | rezervace, změna počtu, zrušení, obnovení, čekací listina |
| B | QA Hospoda B, bez stolů | za 7 dní, rezervace stará 5 týdnů | připomínka týden předem |
| C | QA Hospoda C, bez stolů | zítra | připomínka den předem |
Část notifikací (pozvánka náhradníka, připomínky) jde přes frontu. Lokálně je fronta Redis, takže musí běžet worker: docker compose exec -d fpm php artisan horizon. Stav: docker compose exec fpm php artisan horizon:status.
SC-01 · Skrytí speciálu z webu
Section titled “SC-01 · Skrytí speciálu z webu”Příprava: Speciál QA speciál CHK-438 je viditelný, web /specialy ho ukazuje mezi nadcházejícími.
- Admin → Speciály →
QA speciál CHK-438→ Upravit → zapnout Skrýt z webu → Uložit. - Ověřit: v tabulce speciálů má řádek ve sloupci Skrytý ikonu přeškrtnutého oka.
- Otevřít
/specialyv anonymním okně. Ověřit: speciál chybí, a to hned, ne až po vypršení cache. - Otevřít
/specialy/qa-special-chk-438v anonymním okně. Ověřit: 404. - Otevřít stejnou adresu v okně, kde je přihlášený admin. Ověřit: stránka se zobrazí.
- Otevřít
/rezervace/<eventA>anonymně. Ověřit: rezervační stránka funguje dál (skrytí nemá blokovat přímé odkazy). - Vypnout přepínač a uložit. Ověřit: speciál je zpět ve výpisu.
Očekávání:
| Test | Výsledek |
|---|---|
| Výpis po skrytí | speciál chybí okamžitě |
| Detail anonymně | 404 |
| Detail jako admin | 200 |
| Rezervační stránka události | 200 |
SC-02 · Rezervace na speciál a potvrzovací e-mail
Section titled “SC-02 · Rezervace na speciál a potvrzovací e-mail”Příprava: Událost A bez rezervací. Anonymní okno.
- Web →
/specialy/qa-special-chk-438→ událost A → Rezervovat. - Ověřit: pole Počet hráčů má minimum 3 (speciál) a je předvyplněné.
- Vyplnit tým
QA Alfa, e-mail[email protected], telefon, 3 hráči → odeslat. - Mailpit: e-mail „Potvrzení přihlášky týmu”.
- Ověřit: e-mail obsahuje tlačítko „Potvrdit počet hráčů (3)“, řádek chipsů 4 až 8 (dvojka na speciálu chybí) a odkaz „zrušte rezervaci”.
SC-03 · Změna počtu hráčů z e-mailu
Section titled “SC-03 · Změna počtu hráčů z e-mailu”Příprava: SC-02 hotové, e-mail otevřený v Mailpitu.
- Kliknout na chips 5.
- Ověřit: stránka
/rezervace/pocet-hracu/...s hláškou „Počet hráčů jsme upravili na 5”. - Admin → Rezervace → událost A. Ověřit: tým QA Alfa má 5 hráčů a sedí u stolu s max. kapacitou 8.
- Vrátit se na stránku změny, zvolit 8. Ověřit: uloží se 8, stůl zůstává (vejde se).
SC-04 · Zrušení rezervace s potvrzením a obnovení
Section titled “SC-04 · Zrušení rezervace s potvrzením a obnovení”Příprava: Tým QA Alfa má rezervaci na události A.
- V e-mailu z SC-02 kliknout na „zrušte rezervaci”.
- Ověřit: načte se stránka „Opravdu chcete zrušit rezervaci?” s týmem, datem a podnikem. Rezervace ještě existuje (admin ji vidí).
- Kliknout Potvrdit zrušení. Ověřit: stránka s potvrzením, v adminu rezervace zmizela.
- Mailpit: e-mail „Potvrzení odhlášení týmu”. Ověřit: tlačítko „Obnovit rezervaci”.
- Kliknout na Obnovit. Ověřit: formulář s předvyplněným počtem hráčů. Odeslat.
- Ověřit: rezervace je zpět, má přidělený stůl, v adminu je vidět.
- Otevřít odkaz na obnovení znovu. Ověřit: hláška, že rezervace je platná a není co obnovovat.
SC-05 · Čekací listina: zápis vyžaduje počet hráčů
Section titled “SC-05 · Čekací listina: zápis vyžaduje počet hráčů”Příprava: Událost A plná: QA Alfa obnovená (SC-04) plus druhý tým QA Beta (jiný e-mail) přes formulář. Kapacita jsou 2 stoly.
- Anonymně otevřít
/rezervace/<eventA>. Ověřit: místo rezervačního formuláře je formulář čekací listiny. - Vyplnit tým
QA Gama, e-mail[email protected], telefon, počet hráčů nechat prázdný → odeslat. - Ověřit: prohlížeč formulář nepustí (pole je povinné). V devtools odebrat atribut
requireda odeslat znovu. Ověřit: stránka vrátí chybu „Počet hráčů je povinný.” - Vyplnit 4 hráče → odeslat. Ověřit: hláška o zapsání jako náhradní, e-mail „Hlídací pes nastaven”.
SC-06 · Pozvaný náhradník musí zadat počet hráčů
Section titled “SC-06 · Pozvaný náhradník musí zadat počet hráčů”Příprava: SC-05 hotové, QA Gama na čekací listině se 4 hráči.
- Jako QA Beta zrušit rezervaci přes e-mail (SC-04 kroky 1 až 3).
- Mailpit: QA Gama dostala „Uvolnilo se místo na kvízu!” → kliknout Přihlásit tým.
- Ověřit: formulář má pole Počet hráčů předvyplněné na 4 a označené jako povinné.
- V devtools odebrat
required, vymazat hodnotu, odeslat. Ověřit: návrat na formulář s chybou u počtu hráčů, rezervace nevznikla, QA Gama je stále na listině. - Zadat 1 a odeslat. Ověřit: chyba „alespoň 2”.
- Zadat 6 a odeslat. Ověřit: stránka „Budeme se na vás těšit”, v adminu rezervace QA Gama se 6 hráči, náhradník z listiny zmizel.
Očekávání:
| Vstup | Výsledek |
|---|---|
| prázdné | chyba validace, nic se nezaložilo |
| 1 | chyba validace |
| 6 | rezervace se 6 hráči |
SC-07 · Připomínka týden předem
Section titled “SC-07 · Připomínka týden předem”Příprava: Událost B za 7 dní, rezervace QA tým reminder týden založená před 5 týdny.
- Spustit
docker compose exec fpm php artisan reservations:remind(a případně worker fronty). - Mailpit: e-mail „Za týden vás čeká kvíz …” pro
[email protected]. - Ověřit: e-mail vyká, má tlačítko „Potvrdit počet hráčů (4)“, chipsy a odkaz na zrušení.
- Spustit příkaz znovu. Ověřit: druhý e-mail nepřišel (
early_reminder_sent_atje vyplněné). - Založit na události B novou rezervaci přes web (vzniká dnes) a spustit příkaz. Ověřit: připomínka týden předem jí nepřijde, práh jsou 4 týdny mezi rezervací a kvízem.
SC-08 · Připomínka den předem
Section titled “SC-08 · Připomínka den předem”Příprava: Událost C zítra, rezervace QA tým reminder zítra se čtyřmi hráči.
- Vývojář spustí
reservations:remind. - Mailpit: e-mail „Už zítra … jdete na kvíz!” pro
[email protected]. - Ověřit: e-mail uvádí, že se počítá se čtyřmi hráči, a nabízí tlačítka Upravit počet hráčů a Odhlásit tým.
- Ověřit: pod tlačítky je řádek chipsů s ostatními počty, čtyřka mezi nimi chybí.
- Kliknout na chips 6. Ověřit: stránka hlásí „Počet hráčů jsme upravili na 6”.
Očekávání:
| Prvek | Stav |
|---|---|
| Upravit počet hráčů | tlačítko, vede na /rezervace/pocet-hracu/... |
| Odhlásit tým | tlačítko, méně výrazné |
| Chipsy | 2 až 8 bez aktuálního počtu, na speciálu od 3 |
SC-09 · Minimum 3 hráčů na speciál
Section titled “SC-09 · Minimum 3 hráčů na speciál”Příprava: Speciál s volným místem a běžný kvíz v témže podniku.
- Rezervační formulář speciálu: v devtools změnit
min="3"namin="1", poslat 1 hráče. - Ověřit: formulář se vrátí s chybou „Počet hráčů musí být alespoň 3.” Rezervace nevznikla.
- Totéž zopakovat s 2 hráči. Ověřit: stejná chyba.
- Poslat 3 hráče. Ověřit: rezervace projde.
- Na běžném kvízu poslat 2 hráče. Ověřit: projde, minimum 3 platí jen na speciálech.
- U rezervace na speciál otevřít odkaz na změnu počtu z e-mailu. Ověřit: nabízené volby začínají trojkou.
- Do adresy ručně dopsat
?players=2a odeslat. Ověřit: vrátí chybu, počet se nezmění.
Očekávání:
| Cesta | 2 hráči na speciálu |
|---|---|
| Rezervační formulář | odmítnuto |
| Formulář náhradníka | odmítnuto |
| Změna počtu z e-mailu | odmítnuto |
| Obnovení zrušené rezervace | odmítnuto |
| Potvrzení stálé rezervace | odmítnuto |
SC-10 · Hlídka lokalit u speciálu
Section titled “SC-10 · Hlídka lokalit u speciálu”Příprava: Nový turnajový speciál s termínem za měsíc a jednou událostí bez přiřazeného podniku.
- Otevřít stránku speciálu na webu.
- Ověřit: pod větou „Podrobnosti k tomuto speciálu brzy doplníme.” je šedá karta „Kde se bude hrát, zatím nevíme” s polem pro e-mail a tlačítkem Chci připomínku.
- Vyplnit
[email protected], odeslat. - Ověřit: karta se přepne na „Hlídání máte nastavené” s tou adresou.
- Odeslat formulář znovu se stejnou adresou. Ověřit: druhá hlídka nevznikne, chování se nemění.
- V adminu přiřadit události podnik a uložit. Ověřit: v Mailpitu žádná nová zpráva, e-mail neodchází hned.
- Vývojář spustí
docker compose exec fpm php artisan specials:notify-location-watchers(a případně worker fronty). Na produkci to dělá plánovač denně ve 12:00. - Mailpit: ověřit zprávu „Nové místo pro …” se seznamem přidaných podniků, název podniku vede na jeho rezervaci, pod seznamem tlačítko Podívejte se na nové lokality a odkaz na odhlášení.
- Spustit příkaz znovu. Ověřit: druhá zpráva nepřijde, nic nového nepřibylo.
- Znovu otevřít stránku speciálu. Ověřit: karta hlídky je pod výpisem podniků s nadpisem „Hlídání máte nastavené”. Návštěvník bez hlídky tam vidí „Nenašli jste svůj podnik?“.
- V adminu změnit u události s podnikem čas a spustit příkaz. Ověřit: zpráva nepřijde, úprava události z podniku nové místo nedělá.
- Přiřadit podnik další události a spustit příkaz. Ověřit: přijde zpráva jen s tím novým podnikem.
- Kliknout v e-mailu na odhlášení. Ověřit: stránka „Upozornění zrušeno”.
- Přihlásit další dvě hlídky s poptávkou
Olomoucaolomouc. - Admin → Speciály → detail. Ověřit: dlaždice Čeká na lokality, sekce Kdo čeká na lokality,
štítek
olomouc 2×(různý zápis se sečte) a tabulka s e-maily.
Očekávání:
| Situace | Chování |
|---|---|
| Speciál bez podniků | karta hlídky se nabízí |
| Speciál s podniky | karta hlídky se nabízí pod výpisem podniků |
| Série speciálů (více termínů v jednom podniku) | karta hlídky se nenabízí |
| Speciál po odehrání | karta hlídky zmizí |
| Přidání podniku | e-mail neodejde hned, přijde v denním souhrnu ve 12:00 |
| Více podniků přidaných během dne | jeden e-mail se všemi |
| Přidání dalšího podniku další den | další souhrn, hlídka je trvalá |
| Úprava události s podnikem (čas, název) | žádný e-mail |
| Zrušená nebo proběhlá událost | v souhrnu není |
| Přihlášení téhož e-mailu na speciál | hlídka zaniká, zpráva nedorazí |
| Neznámý odhlašovací token | stejná stránka jako u platného |
SC-10 · Žádost o změnu rezervace z e-mailu
Section titled “SC-10 · Žádost o změnu rezervace z e-mailu”Příprava: Tým QA Alfa má rezervaci na události A, potvrzovací e-mail v Mailpitu.
- V e-mailu kliknout na „Upravte rezervaci”.
- Ověřit: stránka Změna rezervace s chipsy počtu hráčů (aktuální je vybraný) a textovým polem Jiná změna.
- Zvolit jiný počet, textové pole nechat prázdné, odeslat. Ověřit: hláška o úpravě počtu, v adminu (Systém → Žádosti o změnu) žádná nová žádost.
- Znovu otevřít stránku, do Jiná změna napsat „Chceme hrát v Hospodě B”, odeslat.
- Ověřit: hláška „Žádost o změnu jsme přijali”. Mailpit: e-mail „Žádost o změnu vytvořena” na adresu rezervace.
- Otevřít stránku potřetí. Ověřit: modrý box, že žádost čeká, textové pole je zablokované, počet hráčů jde měnit dál.
- Admin → Systém → Žádosti o změnu. Ověřit: řádek s typem Rezervace, položkou „tým QA Alfa, …” a autorem
[email protected].
SC-11 · Admin vyřídí žádost a přesune rezervaci
Section titled “SC-11 · Admin vyřídí žádost a přesune rezervaci”Příprava: SC-10 hotové. Speciál potřebuje druhou událost: v adminu u QA speciál CHK-438 přidat event v podniku QA Hospoda B (nebo jiném) a uložit.
- V Žádostech o změnu kliknout na Vyřešit. Ověřit: stránka Úprava rezervace, nahoře žádost s textem a e-mailem autora, dole formulář.
- Ve výběru Termín a podnik ověřit: jsou tam jen události tohoto speciálu, událost jiného speciálu chybí.
- Změnit název týmu na „QA Alfa Sovy”, vybrat druhou událost, uložit.
- Ověřit: hláška o přesunu, Rezervace → seznam ukazuje rezervaci u nové události, stůl přidělený v novém podniku.
- Mailpit: tým dostal nové „Potvrzení přihlášky týmu” s novým místem. Odkazy v něm vedou na stejnou rezervaci (token se nemění).
- Zpět na stránce úpravy napsat odpověď „Přesunuto do Hospody B” a kliknout Vyřešit.
- Ověřit: Mailpit: e-mail „Žádost o změnu vyřízena” s odpovědí na
[email protected]. V CRM je žádost ve skupině Vyřízené. - Zkusit přesun na událost, kde tým už rezervaci má. Ověřit: chyba u výběru události, nic se nezměnilo.
Regresní checklist
Section titled “Regresní checklist”Po testování výše ověřit, že tyto oblasti nespadly:
- Rezervace na běžný kvíz z podniku (ne speciál) včetně e-mailu
- Stálá rezervace: potvrzení přes
/rezervace/potvrzeni-stale/... - Admin → Rezervace → náhradníci → akce Povýšit na rezervaci
- Výpis
/specialya detail seriálového speciálu (typ SERIES) - Admin formulář speciálu uloží beze změny přepínače (výchozí je viditelný)
- Rezervace na běžný kvíz projde se dvěma hráči a e-mail nabízí chipsy od dvojky
- Pozvánka náhradníka vede na potvrzení s předvyplněným a povinným počtem hráčů
- Speciál v jednom městě štítky s městy nezobrazuje
- Speciál s podniky nabízí hlídku pod výpisem podniků
- Moderátorská žádost o změnu události (panel moderátora → Nahlásit změnu) jde založit i vyřídit, autor se zobrazí
Automatizované testy
Section titled “Automatizované testy”docker compose exec fpm php artisan test tests/Feature/Special/ --compactdocker compose exec fpm php artisan test tests/Feature/Reservations/ --compact- [ ] Rezervace na běžný kvíz projde se dvěma hráči a e-mail nabízí chipsy od dvojky- [ ] Pozvánka náhradníka vede na potvrzení s předvyplněným a povinným počtem hráčů- [ ] Speciál v jednom městě štítky s městy nezobrazuje- [ ] Speciál s podniky nabízí hlídku pod výpisem podniků- [ ] Moderátorská žádost o změnu události (panel moderátora → Nahlásit změnu) jde založit i vyřídit, autor se zobrazídocker compose exec fpm php artisan test --filter='Reservation|Special' --compact