Skip to content

Test Cases Without Tester

github-actions[bot] edited this page Oct 8, 2026 · 3 revisions

Test Cases Without Tester — Modernized Screen

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


Table of Contents

  1. Screen Layout
  2. Report Results
  3. i18n
  4. Permission Path and Empty States
  5. BFF API Reference
  6. Files

1. Screen Layout

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

2. Report Results

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.

3. i18n

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).

4. Permission Path and Empty States

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."

5. BFF API Reference

GET ?action=cases_without_tester

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
}

6. Files

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

Priority badge + column header localization — Issue #1877

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):

  1. Badge cells — the BFF (api/reports/index.php:2912-2915) intentionally ships the canonical tokens high|medium|low in priority_level (presentation-layer localization is the client's job, same contract as free_testcases), but priorityBadge() (gui/templates/results/casesWithoutTester.html:100-106) used the token as the visible text too (esc(level)), never mapping it through t().
  2. Column header — casesWithoutTester.html:150 looked up the key priority, which existed in none of the 10 locale bundles (verified: json.load → MISS in en/ro/de/es/fr/it/ja/pt/ru/zh), so t() always fell back to the English literal.

Fix (client-side + i18n keys, minimal — mirrors the accepted #1874 approach):

  1. priorityBadge() now maps the token through the existing keys search.highImportance / search.mediumImportance / search.lowImportance (already translated in all bundles; the CSS class logic priority-high/medium/low is 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'); }
  1. Header key fixed to the screen-scoped t('cwt.priority', 'Priority'), with one new key cwt.priority added to all 10 locale bundles (values mirror the already translated tnrap.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-free free_testcases payload 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.

Priority badges localized — Romanian Priority badges localized — English

Pre-fix raw state: issue-1877-caseswithouttester-priority-raw-ro-pre.png.

Refs: #1877 (Fixes #1877)

Clone this wiki locally