All files / src/tester testSegment.ts

3.57% Statements 1/28
0% Branches 0/5
0% Functions 0/2
3.57% Lines 1/28

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78              1x                                                                                                                                            
import type {
  TestSegment,
  Condition,
  TestResult,
  TestResultAssertion,
  TestResultAssertionError,
} from "@featurevisor/types";
import { allConditionsAreMatched } from "@featurevisor/sdk";
 
import { Datasource } from "../datasource";
 
export async function testSegment(
  datasource: Datasource,
  test: TestSegment,
  _options: { verbose?: boolean; quiet?: boolean } = {},
): Promise<TestResult> {
  void _options;
 
  const testStartTime = Date.now();
  const segmentKey = test.segment;
 
  const testResult: TestResult = {
    type: "segment",
    key: segmentKey,
 
    // to be updated later
    notFound: false,
    duration: 0,
    passed: true,
    assertions: [],
  };
 
  const segmentExists = await datasource.segmentExists(segmentKey);
 
  if (!segmentExists) {
    testResult.notFound = true;
    testResult.passed = false;
 
    return testResult;
  }
 
  const parsedSegment = await datasource.readSegment(segmentKey);
  const conditions = parsedSegment.conditions as Condition | Condition[];
 
  test.assertions.forEach(function (assertion) {
    const assertionStartTime = Date.now();
    const testResultAssertion: TestResultAssertion = {
      description: assertion.description as string,
      duration: 0,
      passed: true,
      errors: [],
    };
 
    const expected = assertion.expectedToMatch;
    const actual = allConditionsAreMatched(conditions, assertion.context);
    const passed = actual === expected;
 
    if (!passed) {
      const testResultAssertionError: TestResultAssertionError = {
        type: "segment",
        expected,
        actual,
      };
 
      (testResultAssertion.errors as TestResultAssertionError[]).push(testResultAssertionError);
      testResult.passed = false;
      testResultAssertion.passed = passed;
    }
 
    testResult.assertions.push(testResultAssertion);
    testResultAssertion.duration = Date.now() - assertionStartTime;
  });
 
  testResult.duration = Date.now() - testStartTime;
 
  return testResult;
}