Repository navigation
Platforme Management
O Platformă este un mediu specific pe care testezi aplicația:
Platforme Tipice:
Hardware:
├─ Windows 10
├─ Windows 11
├─ macOS 12
├─ macOS 13
├─ Ubuntu Linux
└─ CentOS Linux
Browsers:
├─ Chrome 120+
├─ Firefox 121+
├─ Safari 17+
└─ Edge 120+
Mobile:
├─ iOS 15
├─ iOS 16
├─ iOS 17
├─ Android 11
├─ Android 12
└─ Android 13
Combinații:
├─ Windows 11 + Chrome 120
├─ macOS 13 + Safari 17
├─ iOS 17 + Safari
├─ Android 13 + Chrome
└─ etc
Cine poate: Administrator, Project Manager
- Mergi la Proiect → Setări → Platforme
- Apasă Adaugă Platformă Nouă
- Completează:
| Camp | Descriere | Exemplu |
|---|---|---|
| Nume | Identificator clar | Windows 11 + Chrome 120 |
| Descriere | Detalii | "Enterprise OS, latest Chrome" |
- Apasă Salvează
Nume: iOS 17 + Safari
Descriere:
Latest iOS version with native Safari browser.
For iPad and iPhone testing.
Supports latest web standards.
Când creezi Test Plan, selectezi platformele:
Plan: Banking v1.5 Release
Platforme Selectate:
├─ Windows 11 + Chrome 120
├─ macOS 13 + Safari 17
├─ iOS 17 (iPhone 15)
└─ Android 13 (Samsung Galaxy)
Fiecare Test Case se execută pe FIECARE platformă!
Exemplu:
TC-001 (Login) va rula pe:
├─ Windows → PASS
├─ macOS → PASS
├─ iOS → FAIL (bug: autofill)
└─ Android → PASS
Fiecare combinație (test case + platform) are propriul rezultat:
Test Case | Windows | macOS | iOS | Android
-----------|---------|-------|-----|--------
TC-001 | PASS | PASS | FAIL| PASS
TC-002 | PASS | PASS | PASS| PASS
TC-050 | FAIL | PASS | PASS| FAIL
TC-100 | PASS | FAIL | N/R | PASS
Raport: Pe care platforme suntem bine / rău?
Platform Analysis:
Windows 11 + Chrome 120:
├─ Tests Pass: 95%
├─ Tests Fail: 3%
├─ Tests N/R: 2%
└─ Status: ✅ GOOD
macOS 13 + Safari 17:
├─ Tests Pass: 92%
├─ Tests Fail: 5%
├─ Tests N/R: 3%
└─ Status: 🟡 MEDIUM
iOS 17 + Safari:
├─ Tests Pass: 85%
├─ Tests Fail: 12%
├─ Tests N/R: 3%
└─ Status: 🔴 NEEDS WORK
Android 13 + Chrome:
├─ Tests Pass: 88%
├─ Tests Fail: 8%
├─ Tests N/R: 4%
└─ Status: 🟡 MEDIUM
Unele bug-uri apar DOAR pe anumite platforme:
BUG-2024-0045: Autofill not working
├─ Platform: iOS 17 + Safari
├─ Other platforms: N/A (works fine)
├─ Cause: Mobile Safari specific
├─ Fix: Safari custom handling
└─ Status: In Development
BUG-2024-0046: Font rendering issue
├─ Platform: Windows 10 + Chrome
├─ Other platforms: N/A (renders fine)
├─ Cause: Font cache issue
├─ Fix: Clear cache on load
└─ Status: Resolved
- Proiect → Platforme → [Selectează]
- Apasă Editează
- Schimbă:
- Nume
- Descriere
- Status (Active/Inactive)
- Apasă Salvează
- Editează Platform
- Status: Inactive
- Rămâne în sistem, dar nu apare în teste noi
Poți grupa platforme similar:
Desktop:
├─ Windows 11 + Chrome
├─ macOS 13 + Safari
└─ Linux + Firefox
Mobile:
├─ iOS 17
├─ Android 13
└─ Android 12
Legacy (Deprecated):
├─ Windows 7 (no longer test)
├─ IE 11 (no longer test)
└─ (archived for reference)
✅ DO:
- Defini clar: Ce versiune exactă?
- Documenare: Unde testezi?
- Coverage: Minimum 3 platforme
- Track bugs: Platform-specific
- Update: Adaugă noi versiuni
❌ DON'T:
- Nu amesteca versiuni (Chrome 115 + Chrome 120)
- Nu lansa fără testat pe principal platforme
- Nu ștergi platforme cu rezultate
- Nu ignora mobile testing
Platforme: Critical pentru release! Verifica totul pe fiecare! 🎯
Simptom. GET /api/platforms/index.php/export?tproject_id=<id real> fără
parametrul filename întorcea HTTP 500 (ArgumentCountError: Too few arguments to function testproject::getName()). Ramura de nume de fișier implicit din
exportul BFF de platforme era complet nefuncțională pentru orice consumator
direct al API-ului. Ecranul Platform Management nu era afectat vizibil,
pentru că modalul de export trimite întotdeauna un filename.
Cauza root. api/platforms/index.php:369 apela
$tname = str_ireplace(" ", "", $tproject_mgr->getName($tproject_id));— apel de instanță — dar în acest codebase testproject::getName(&$dbh, $id)
(librărie: lib/functions/testproject.class.php:4282) este static și
primește mai întâi handler-ul de bază de date; apelul de instanță transmite un
singur argument, deci PHP 8 aruncă ArgumentCountError. Exact același tipar ca
bug-ul din keywords BFF reparat în issue #531.
Abordarea fix-ului. Apelul a fost schimbat în apel static corect:
$tname = str_ireplace(" ", "", testproject::getName($db, $tproject_id));Alternative respinse: wrapper de instanță nou în clasa testproject (dublă
mentenanță pentru același query) sau duplicarea SQL-ului în BFF (pierde sursa
unică de adevăr). Soluția aleasă reproduce 1:1 fix-ul deja validat din
api/keywords/index.php:138, deci comportamentul este consistent între cele
două BFF-uri și identic cu legacy platformsExport.php doExport()
(<NumeProiectFărăSpații>-platforms.xml).
Stare. Fix livrat pe branch-ul sebiboga (commit 1c2fac63b). Verificat
cap-coadă: export fără filename → HTTP 200 cu
Content-Disposition: filename="DemoProject-platforms.xml"; export cu
filename=custom.xml → numele custom păstrat; export cu platforme definite
produce documentul ADODB_XML legacy (<platforms><platform>…<is_open>); butonul
Export Platforms din UI funcționează (HTTP 200); rutele surioare
(list/create/delete) re-testate OK; Event Viewer fără erori noi.

Ecran: Platform Management (gui/templates/platforms/platformsView.html)
Platformele create din 2.0.1 se nășteau mereu cu toate cele trei flag-uri
ACTIVE: enable_on_design=1, enable_on_execution=1, is_open=1. Legacy
1.9.20 deschide formularul de creare cu toate cele trei căsuțe debifate.
-
lib/platforms/platformsEdit.php:364-378init_gui()fixează explicit$gui->enable_on_design = 0; $gui->enable_on_execution = 0; $gui->is_open = 0; -
gui/templates/dashio/platforms/platformsEdit.tpl:60-77randeazăcheckeddoar cu{if $gui-><flag> eq 1}⇒ formularul de creare apare gol. -
lib/platforms/platformsEdit.php:158-169init_args()— o căsuță nebifată lipsește din POST,tlInputParameter::CB_BOOLîntoarcenull, iar toate cele trei sunt coerționate la0. -
lib/platforms/platformsEdit.php:260-269do_create()—$k2care default'enable_on_design' => 0, 'enable_on_execution' => 0, 'is_open' => 0.
⇒ Legacy salvează 0/0/0.
-
gui/templates/platforms/platformsView.html:304-306openCreate()bifa toate trei căsuțe (prop('checked', true)) ⇒ rând 1/1/1 în DB. -
api/platforms/index.php:208-209— câmpulis_openlipsit din body primea default 1, iar comentariul care o explica („legacy create() defaults is_open to 1") era factual greșit: el cita ramura,1dintlPlatform::create()(lib/functions/tlPlatform.class.php:76-80), care este inaccesibil de pe calea de creare a luiplatformsEdit—do_create()atribuie întotdeauna proprietatea prin$k2c, deciproperty_exists($platform,'is_open')e mereu adevărat. BFF-ul re-expunea în sursă a doua ramura a modelului ca comportament viu. Ramura respectivă rămâne activă pentru XML-RPCcreatePlatform(lib/api/xmlrpc/v1/xmlrpc.class.php:6909-6917construiește$plotfărăis_open), motiv pentru care corecția elimină default-ul doar din ruta REST și nu atingetlPlatform::create().
-
openCreate()bifează acumfalsepentru toate trei (cu referință la sursa legacy în comentariu). Modalul de editare rămâne neatins: acoloeditPlat()trebuie să continue să reflecte valorile stocate. - BFF-ul tratează un flag absent ca
0, exact ca pe celelalte două.
Este o schimbare de default, nu de coerție: cine bifează toate trei tot primește 1/1/1, iar flag-urile unei platforme existente nu sunt atinse niciodată. Nu e necesară nicio cheie i18n (niciun șir nou afișat utilizatorului).
| Caz | Așteptat | Măsurat | Verdict |
|---|---|---|---|
| Creare, toate nebifate | 0/0/0 |
{onDesign:false, onExec:false, isOpen:false}; DB Solaris 0 0 0
|
PASS |
| Creare, doar Open for Execution | 0/0/1 | DB LinuxOpenOnly 0 0 1
|
PASS |
| Creare, toate bifate | 1/1/1 | DB WinAllOn 1 1 1
|
PASS |
| Editare platformă existentă | reflectă valorile stocate |
WinAllOn 1/1/1; după debifarea On Design → 0/1/1 |
PASS |
POST / fără flag-uri |
0/0/0 (înainte: 0/0/1) |
{"status":"ok","id":6}; DB OmitFlagsAfterFix 0 0 0
|
PASS |
Toggle-uri rapide PUT /{id}/flags
|
funcționează | 3× {"status":"ok"}; DB 1/1/1 → 0/1/1 |
PASS |
| Nume gol la creare | eroare inline | Empty platform name is not allowed |
PASS |
| Ștergere | rândul dispare | listă (3)
|
PASS |
| Event Viewer | 0 rânduri noi ERROR/WARNING | doar (log_level 16, count 1) = audit_login_succeeded
|
PASS |
| Consolă browser | fără erori JS | fără erori | PASS |
Suita de teste: 16/16 PASS (tmp/TLU_Test_Cases.md, secțiunea
„Task — Issue #1012"). node --check + php -l curate.
