or run

npx @tessl/cli init
Log in

Version

Files

tile.json

task.mdevals/scenario-3/

QUnit-Karma Test Result Filter

Overview

You are building a test result processor that filters and sanitizes test results from a QUnit test runner before sending them to a reporting system. Your processor needs to handle various edge cases that can occur in real-world testing environments.

Requirements

Implement a JavaScript module that exports a processTestResults function with the following behavior:

Core Functionality

The function should accept an array of test result objects and return a filtered/processed array. Each test result object has this structure:

{
  name: string,           // Test name
  module: string,         // Test module/suite name
  passed: boolean,        // Whether test passed
  failed: boolean,        // Whether test failed
  total: number,          // Total assertions
  runtime: number         // Execution time in ms
}

Edge Case Requirements

  1. Filter Global Failures: Remove any test results where the test name is exactly "global failure". These are framework artifacts that should not be reported.

  2. Handle Missing Properties: Some test results may come from older testing framework versions and might be missing the runtime property. When runtime is missing or undefined, set it to 0.

  3. Validate Test Objects: If a test result object is missing required properties (name, passed, or failed), skip it entirely (don't include it in the output).

  4. Normalize Module Names: If the module property is missing, null, or undefined, set it to an empty string "".

Output

Return a new array containing only the valid, processed test results.

Dependencies { .dependencies }

karma-qunit { .dependency }

Provides the QUnit testing framework adapter for Karma test runner.

Test Cases

Test Case 1: Filter global failures @test

Input:

[
  { name: "test 1", module: "Suite A", passed: true, failed: false, total: 3, runtime: 45 },
  { name: "global failure", module: "Suite A", passed: false, failed: true, total: 1, runtime: 0 },
  { name: "test 2", module: "Suite B", passed: true, failed: false, total: 2, runtime: 30 }
]

Expected Output:

[
  { name: "test 1", module: "Suite A", passed: true, failed: false, total: 3, runtime: 45 },
  { name: "test 2", module: "Suite B", passed: true, failed: false, total: 2, runtime: 30 }
]

Test Case 2: Handle missing runtime property @test

Input:

[
  { name: "old test", module: "Legacy", passed: true, failed: false, total: 1 },
  { name: "new test", module: "Modern", passed: true, failed: false, total: 2, runtime: 100 }
]

Expected Output:

[
  { name: "old test", module: "Legacy", passed: true, failed: false, total: 1, runtime: 0 },
  { name: "new test", module: "Modern", passed: true, failed: false, total: 2, runtime: 100 }
]

Test Case 3: Skip invalid test objects @test

Input:

[
  { name: "valid test", passed: true, failed: false, total: 1, runtime: 20 },
  { module: "Suite A", passed: true, failed: false, total: 1 },
  { name: "another valid", module: "Suite B", passed: false, failed: true, total: 2, runtime: 15 }
]

Expected Output:

[
  { name: "valid test", module: "", passed: true, failed: false, total: 1, runtime: 20 },
  { name: "another valid", module: "Suite B", passed: false, failed: true, total: 2, runtime: 15 }
]

Test Case 4: Normalize missing module names @test

Input:

[
  { name: "test without module", passed: true, failed: false, total: 1, runtime: 10 },
  { name: "test with null module", module: null, passed: true, failed: false, total: 1, runtime: 15 }
]

Expected Output:

[
  { name: "test without module", module: "", passed: true, failed: false, total: 1, runtime: 10 },
  { name: "test with null module", module: "", passed: true, failed: false, total: 1, runtime: 15 }
]

Implementation Notes

  • Create your implementation in a file named processTestResults.js
  • Create tests in processTestResults.test.js
  • Export the processTestResults function as the default export
  • Ensure all edge cases are handled robustly