Repository navigation
Test Cases Without Tester

The Test Cases Without Tester report shows test cases linked to a test plan that
have NOT been executed AND have NO tester assigned, across all active builds. It
replaces the legacy 1.9.20 lib/results/testCasesWithoutTester.php HTML view
with a modern Dashio-styled page backed by a plain-PHP REST BFF.
Path: ASIDE menu → Reports → Test Cases without Tester Assignment
URL: gui/templates/results/casesWithoutTester.html?tproject_id=<id>&tplan_id=<id> (loaded inside the main frame)
BFF API: api/reports/index.php — GET ?action=cases_without_tester
Rights: testplan_metrics (same right the legacy controller enforces via checkRights(); BFF returns 403 otherwise)
Tracking issue: #689
The screen follows the same Dashio layout as all modernized report screens:
- Header bar (teal): screen title ("Test Cases Without Tester"), "for test plan" subtitle with plan name, and locale switcher
- Toolbar (dark): project name context, count badge
- Report area: DataTable with results (shown after data loads)
- Footer: elapsed time
The BFF calls tlTestPlanMetrics::getNotRunWOTesterAssigned() which identifies
test cases that have zero executions across all active builds AND have no tester
assignment for the given plan.
The results DataTable shows:
- Test Suite: full path (e.g. "TestProject / Suite A")
- Test Case: external ID + name (e.g. "1: TC Without Tester 1")
- Priority: colored badge (high/medium/low) — only shown when the project has the "Testing Priority" option enabled
- Platform: platform name — only shown when the test plan has linked platforms
- Summary: test case summary text
The table supports DataTables features: search, pagination (25 per page default), column sorting.
All user-facing strings use the TLi18n client-side module with keys in the
cwt.* namespace:
| Key | English value |
|---|---|
cwt.header |
Test Cases Without Tester |
cwt.forPlan |
for test plan |
cwt.testProject |
Test Project |
cwt.noLinkedTcversions |
No test cases linked to this test plan. |
cwt.elapsedSeconds |
Elapsed seconds |
cwt.allHaveTester |
All test cases have a tester assigned. |
cwt.matchCount |
Match count |
cwt.testCases |
test cases |
cwt.priority |
Priority |
Keys are present in ALL locale bundles (en.json, ro.json, de.json, fr.json, es.json, pt.json, it.json, ja.json, zh.json, ru.json).
Rights gate: The BFF checks $user->hasRight($db, 'testplan_metrics', $tprojectId, $tplanId).
Users without this right receive HTTP 403.
Empty states:
- When the test plan has zero linked test cases: screen shows "No test cases linked to this test plan."
- When all test cases have a tester assigned: screen shows "All test cases have a tester assigned."
Parameters: tproject_id, tplan_id
{
"status": "ok",
"hasContext": true,
"tproject_id": 1,
"tplan_id": 100,
"tproject_name": "TestProject",
"tplan_name": "TestPlan1",
"has_linked_tcs": true,
"hasData": true,
"show_platforms": false,
"priority_enabled": true,
"rows": [
{
"suite_path": "TestProject / Suite A",
"tcase_id": 300,
"external_id": 1,
"name": "TC Without Tester 1",
"summary": "Summary for TC1 - no tester",
"priority_level": "high"
}
],
"elapsed_time": 0.01
}Empty result (all TCs have testers):
{
"status": "ok",
"has_linked_tcs": true,
"hasData": false,
"show_platforms": false,
"priority_enabled": false,
"rows": [],
"elapsed_time": 0.003
}| File | Purpose |
|---|---|
gui/templates/results/casesWithoutTester.html |
Modernized HTML/JS/CSS screen |
api/reports/index.php |
BFF API — cases_without_tester action |
lib/general/asideMenu.php |
Aside link switched to modernized screen |
gui/templates/i18n/*.json |
i18n keys (cwt.* namespace) in all locale bundles |
lib/results/testCasesWithoutTester.php |
Legacy controller (kept for reference) |
lib/functions/tlTestPlanMetrics.class.php |
getNotRunWOTesterAssigned() — core query |
The Priority column (shown when the project has Testing Priority enabled) rendered the
raw canonical value high / low / medium as the visible badge text in every
locale, and the column header itself fell back to the English literal Priority in
every locale — while the rest of the screen was fully translated. Same defect class as
#1874 (Free Test Cases Importance badge), which fixed only its own screen.
Root cause (two independent gaps, same column):
-
Badge cells — the BFF (
api/reports/index.php:2912-2915) intentionally ships the canonical tokenshigh|medium|lowinpriority_level(presentation-layer localization is the client's job, same contract asfree_testcases), butpriorityBadge()(gui/templates/results/casesWithoutTester.html:100-106) used the token as the visible text too (esc(level)), never mapping it throught(). -
Column header —
casesWithoutTester.html:150looked up the keypriority, which existed in none of the 10 locale bundles (verified:json.load→ MISS in en/ro/de/es/fr/it/ja/pt/ru/zh), sot()always fell back to the English literal.
Fix (client-side + i18n keys, minimal — mirrors the accepted #1874 approach):
-
priorityBadge()now maps the token through the existing keyssearch.highImportance/search.mediumImportance/search.lowImportance(already translated in all bundles; the CSS class logicpriority-high/medium/lowis untouched):
if (level === 'high') { cls = 'priority-high'; label = t('search.highImportance', 'High'); }
else if (level === 'medium') { cls = 'priority-medium'; label = t('search.mediumImportance', 'Medium'); }
else if (level === 'low') { label = t('search.lowImportance', 'Low'); }- Header key fixed to the screen-scoped
t('cwt.priority', 'Priority'), with one new keycwt.priorityadded to all 10 locale bundles (values mirror the already translatedtnrap.priority: Priority / Prioritate / Priorität / Prioridad / Priorité / Priorità / 優先度 / Prioridade / Приоритет / 优先级). Rejected: reusing another screen's namespace (tnrap.priority) — every report screen keeps its own<screen>.prefix; localizing server-side — would break the shared token contract used for the header-freefree_testcasespayload and put labels into data instead of the view.
Verification (fixture FTC1262 id=1 + plan CWT1874 Plan id=12, 4 linked TCs, 0
executions/assignments): RO cells Ridicată / Scăzută / Ridicată / Medie + header
Prioritate; EN cells High / Low / High / Medium + header Priority; DE cells
Hoch / Niedrig / Hoch / Mittel + header Priorität; badge classes/colors unchanged
(rgb(245,198,203) / rgb(255,236,181) / rgb(212,237,218)); priority_enabled=0
project → column hidden, table clean, no JS error; python3 -m json.tool ×10 +
ai/verify_i18n_coverage.sh PASS (7031 keys × 9 bundles, 0 missing); console clean
(pre-existing a11y hint only); Event Viewer: no new Error/Warning rows. Regression suite
Regression — Issue #1877 (10 cases) PASS, suite gate 7/7.

Pre-fix raw state: issue-1877-caseswithouttester-priority-raw-ro-pre.png.
Refs: #1877 (Fixes #1877)