feat: harden content workflows and staging smoke tests
CI — Test & Build / 🧪 Run Tests & Generate Reports (push) Waiting to run
CI — Test & Build / 🏗️ Build Docker Image (push) Blocked by required conditions
CI — Test & Build / 🐳 Docker integration & API E2E (push) Blocked by required conditions
CI — Test & Build / 🌐 Staging Playwright smoke (push) Waiting to run
CI — Test & Build / 🧪 Run Tests & Generate Reports (push) Waiting to run
CI — Test & Build / 🏗️ Build Docker Image (push) Blocked by required conditions
CI — Test & Build / 🐳 Docker integration & API E2E (push) Blocked by required conditions
CI — Test & Build / 🌐 Staging Playwright smoke (push) Waiting to run
This commit is contained in:
@@ -0,0 +1,24 @@
|
||||
# Kapcsolatfelvételi üzenetek perzisztenciája
|
||||
|
||||
## Működés
|
||||
|
||||
A `POST /api/contact` érvényes, nem spamnek minősített üzenetet a MongoDB `contact_submissions` kollekciójába ment. A rekord a következő, feldolgozáshoz szükséges mezőket tartalmazza:
|
||||
|
||||
- név, e-mail cím, tárgy és üzenet;
|
||||
- GDPR-hozzájárulás;
|
||||
- `new` feldolgozási státusz;
|
||||
- szerveroldali `createdAt` időbélyeg.
|
||||
|
||||
A végpont csak sikeres `insertOne` után ad 200-as választ, és visszaadja a `submissionId` azonosítót. Ha az adatbázis nem érhető el vagy az írás hibás, 500-as választ küld; a felhasználó nem kap hamis sikerjelzést.
|
||||
|
||||
## Ellenőrzések
|
||||
|
||||
- Unit teszt: sikeres mentésnél a beszúrandó dokumentum és válasz-ID ellenőrzése; MongoDB-hibánál 500-as válasz.
|
||||
- Docker integrációs teszt: a `POST /api/contact` után a teszt azonosító alapján visszaolvassa a MongoDB-dokumentumot.
|
||||
|
||||
A Docker integráció a `docker-compose.dev.yml` szerinti `http://localhost:8080` alkalmazás- és `localhost:27018` MongoDB-portot használja. A futtatáshoz Docker daemon szükséges:
|
||||
|
||||
```sh
|
||||
npm run docker:dev
|
||||
npm run test:integration
|
||||
```
|
||||
@@ -0,0 +1,79 @@
|
||||
# Content Editor – strukturális helyreállítás
|
||||
|
||||
## Cél és hatókör
|
||||
|
||||
Ez a dokumentum a `MITHOME-30` feltárását és a kezdeti adathelyreállítást rögzíti. A Content Editor a `proto/src/content/**/*.json` fájlokat írja, ezért a hiba a megjelenő weboldal-tartalmat közvetlenül érinti.
|
||||
|
||||
## Talált hiba
|
||||
|
||||
A böngészős mentési kód minden mező értékét szövegként írta vissza. Mentés előtt kiürítette az összes tömböt, majd a `a.b[0].c` útvonalat törékeny reguláris kifejezéssel dolgozta fel. Emiatt:
|
||||
|
||||
- a tömbök `[]` értékre ürültek, az elemek pedig hibás, például `items[0]` nevű objektumkulcsokba kerültek;
|
||||
- az objektumokat és beágyazott tömböket a felület `"[object Object]"` szöveggé alakíthatta;
|
||||
- a számok és logikai értékek szöveggé alakultak;
|
||||
- egyes kulcsok sérültek (`id` helyett `i.$1`, `description` helyett `0.$1escription`).
|
||||
|
||||
## Helyreállítás – 2026-08-17
|
||||
|
||||
Az alábbi fájlok strukturálisan helyreálltak:
|
||||
|
||||
- `pages/home.json` – a Git-történet utolsó ép változatából, a későbbi `https://mail.mozdit.hu` webmail-címet megtartva;
|
||||
- `pages/about.json` – a helyes tömbök és objektumok visszaállításával;
|
||||
- `pages/services.json` – a részletes szolgáltatás-specifikációk beágyazott objektumaival együtt;
|
||||
- `pages/adatvedelem.json` és `pages/hasznalati-feltetelek.json` – a későbbi, üzletileg releváns `Szigetszentmiklós` szöveg megtartásával.
|
||||
|
||||
Minden `src/content/pages/*.json` fájl JSON-szintaktikája és a korábbi sérülési mintákra végzett ellenőrzése rendben van. A teljes unit tesztcsomag 55 sikeres teszttel lefutott.
|
||||
|
||||
## A hiba megelőzése a kliensben
|
||||
|
||||
A `content-editor.js` mentési logikája most karakterenként elemzi az útvonalakat, ezért a HTML-sablon escape-elése nem módosíthatja a parser működését. A felület rekurzívan rendereli az objektumokat és a beágyazott tömböket; a boolean checkboxként, a szám number-inputként szerkeszthető. A mentés ezek típusát megőrzi.
|
||||
|
||||
A ténylegesen generált böngésző-kódot ellenőrző regressziós teszt:
|
||||
|
||||
```sh
|
||||
node scripts/test-content-editor-serializer.js
|
||||
```
|
||||
|
||||
A teszt egy beágyazott tömböket és objektumokat, valamint string-, boolean- és numerikus mezőket tartalmazó mintán ellenőrzi a mentési körutazást.
|
||||
|
||||
## Szerveroldali védelmi réteg
|
||||
|
||||
A `MITHOME-41` részeként a `proto/src/content/schema.js` az összes szerkeszthető content-fájl kötelező mezőit, típusait és megengedett kulcsait írja le. A Next.js loader és a Content Editor ezt az egy közös validátort használja.
|
||||
|
||||
A mentés csak sikeres validáció után történik. Az Editor legfeljebb 256 KiB-os request body-t fogad; hibás JSON vagy sémahiba `422` választ ad, és az eredeti fájlt érintetlenül hagyja. Érvényes mentéskor:
|
||||
|
||||
1. az eredeti JSON időbélyeges példánya a `.content-backups/` könyvtárba kerül;
|
||||
2. az új tartalom egy célfájllal azonos könyvtárban létrehozott ideiglenes fájlba íródik;
|
||||
3. az ideiglenes fájl atomikus átnevezéssel váltja fel a célfájlt.
|
||||
|
||||
A backup-könyvtár szándékosan nincs Gitben. A séma- és atomikus mentési tesztek:
|
||||
|
||||
```sh
|
||||
node scripts/test-content-schema.js
|
||||
node scripts/test-content-editor-save.js
|
||||
```
|
||||
|
||||
## Hozzáférésvédelem
|
||||
|
||||
A Content Editor csak akkor indul el, ha a környezetben mindkét változó meg van adva:
|
||||
|
||||
```sh
|
||||
CMS_USER=<egyedi-felhasználónév>
|
||||
CMS_PASS=<erős-egyedi-jelszó>
|
||||
```
|
||||
|
||||
Nincs beégetett alapértelmezett belépési adat. A szerver kizárólag a `127.0.0.1` címen figyel, ezért távoli használathoz Nginx/VPN vagy SSH tunnel szükséges. A böngésző minden módosító kéréshez szerver által kiadott CSRF-tokent küld.
|
||||
|
||||
Az ismételt hibás bejelentkezést és a publikálási kéréseket IP-alapú, 15 perces csúszóablakos limit védi. A mentések és publikálások minimális auditbejegyzést írnak a `.content-editor-audit.jsonl` fájlba (időpont, esemény, felhasználó, célfájl, eredmény); secretet és teljes contentet nem naplóz. Ez a fájl, valamint a backupok nincs Gitben.
|
||||
|
||||
A védelmi alapteszt:
|
||||
|
||||
```sh
|
||||
node scripts/test-content-editor-security.js
|
||||
```
|
||||
|
||||
## Következő védelmi lépések
|
||||
|
||||
1. A szerveroldali mentésnek sémaellenőrzést, atomikus írást és visszaállítható mentést kell használnia (`MITHOME-41`).
|
||||
2. A publikálási folyamatot a natív, systemd-alapú kiadási eljáráshoz kell igazítani (`MITHOME-42`).
|
||||
3. A Content Editor alapértelmezett hitelesítő adatait és a hiányzó CSRF-, audit- és rate-limit védelmet meg kell szüntetni (`MITHOME-43`).
|
||||
@@ -0,0 +1,64 @@
|
||||
# Staging UI smoke tesztterv
|
||||
|
||||
## Cél
|
||||
|
||||
A staging deploy után 2–3 perc alatt jelezze, ha a publikus weboldal alapvetően nem használható. A cél nem a teljes regresszió, hanem a kritikus útvonalak gyors, stabil ellenőrzése.
|
||||
|
||||
**Célkörnyezet:** `https://stage.mozdit.hu`
|
||||
**Futás:** minden staging deploy után, valamint manuálisan kiadás előtt.
|
||||
**Eszköz:** Playwright MCP feltáráshoz; az automatizált futtatáshoz Playwright Test alapú tesztfájl javasolt.
|
||||
|
||||
## Határok
|
||||
|
||||
- A smoke teszt csak a staging környezetet használja.
|
||||
- Nem ment tartalmat, nem publikál és nem küld valódi kapcsolatfelvételi üzenetet.
|
||||
- Nem támaszkodik a magyar marketing-szövegek teljes egyezésére; stabil szerepköröket, URL-eket, címeket és státuszkódokat ellenőriz.
|
||||
- Az olyan részletes üzleti folyamatok, mint az üzenet tartós MongoDB-mentése, külön integrációs/E2E tesztbe tartoznak.
|
||||
|
||||
## Kötelező ellenőrzések
|
||||
|
||||
| Azonosító | Forgatókönyv | Várható eredmény |
|
||||
| --- | --- | --- |
|
||||
| SMOKE-01 | Health endpoint | `GET /api/health` 200-as választ és `status: "ok"` értéket ad. |
|
||||
| SMOKE-02 | Kezdőlap renderelése | A `/` oldal betölt; látható a főcím, a fejléc navigációja, a kapcsolat CTA és a lábléc. Nincs böngésző-konzolhiba. |
|
||||
| SMOKE-03 | Fő navigáció | A Kezdőlap, Rólunk, Szolgáltatások és Kapcsolat linkek a megfelelő publikus útvonalra vezetnek; minden céloldalon egyetlen `h1` található. |
|
||||
| SMOKE-04 | Kritikus szolgáltatási tartalom | A kezdőlapon vagy a szolgáltatások oldalon látható legalább egy szolgáltatáskártya és a kapcsolat CTA. Ezzel korán észlelhető a content JSON vagy a Footer/Home integráció sérülése. |
|
||||
| SMOKE-05 | Kapcsolati űrlap kliensoldali védelme | Üres űrlap elküldésekor a kötelező mezők hibajelzései megjelennek, és nem történik hálózati `POST /api/contact` kérés. |
|
||||
|
||||
## Opcionális, nem blokkoló ellenőrzések
|
||||
|
||||
- A dark-mode kapcsoló működik és az oldal olvasható marad.
|
||||
- A webmail link külső URL-re mutat.
|
||||
- A jogi oldalak elérhetők és tartalmaznak főcímet.
|
||||
|
||||
## Automatikus futtatási szerződés
|
||||
|
||||
1. A teszt a `BASE_URL=https://stage.mozdit.hu` változót használja; lokális cím nincs beégetve.
|
||||
2. Az összes kötelező teszt legfeljebb 30 másodperc alatt lefut.
|
||||
3. Sikertelenségkor a futás ment accessibility snapshotot, konzolhibákat és Playwright trace-t.
|
||||
4. A CI a staging deploy után futtatja; sikertelenség esetén a staging kiadás hibásnak minősül, de production deployt csak explicit release szabály blokkol.
|
||||
5. A teszt a `MITHOME-35` CI/staging feladathoz tartozik.
|
||||
|
||||
## Első manuális eredmény
|
||||
|
||||
2026-08-17-én Playwright MCP-vel a `SMOKE-01` és `SMOKE-02` sikeresen lefutott a stagingen: a kezdőlap renderelt, nem volt konzolhiba, a health endpoint `status: "ok"` választ adott.
|
||||
|
||||
## Megvalósítás és első automatizált futás
|
||||
|
||||
A tesztcsomag helye: `proto/e2e/staging-smoke.spec.ts`; a konfiguráció: `proto/playwright.config.ts`.
|
||||
|
||||
```sh
|
||||
cd proto
|
||||
npm run test:smoke:staging
|
||||
```
|
||||
|
||||
Az első teljes automatizált futás 2026-08-17-én sikeres volt: mind az öt smoke teszt átment 12,2 másodperc alatt a `stage.mozdit.hu` környezeten.
|
||||
|
||||
## Gitea CI bekötés
|
||||
|
||||
A `.gitea/workflows/ci.yml` két további minőségi kaput tartalmaz:
|
||||
|
||||
- **Docker integration & API E2E:** minden normál CI futáskor elindítja a fejlesztői Compose stack-et, megvárja az alkalmazás health endpointját, majd futtatja az integration és API E2E Jest teszteket.
|
||||
- **Staging Playwright smoke:** csak kézi Gitea indításkor vagy napi ütemezéssel fut a `https://stage.mozdit.hu` ellen. A Playwright HTML riport és a trace/screenshot output artifactként megmarad.
|
||||
|
||||
Automatikus staging vagy production deploy nincs ebben a workflow-ban. A staging deploy továbbra is az elkülönített szerveroldali deploy eljárás feladata; annak sikeres befejezése után kell a staging smoke futást elindítani.
|
||||
Reference in New Issue
Block a user