All files / server/services/course-content tutor-quality-schema.ts

75% Statements 9/12
62.5% Branches 5/8
100% Functions 4/4
70% Lines 7/10

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    1x   1x           6x     6x 6x         1x       6x        
import { z } from "zod";
 
const SAFE_ID = /^[a-z][a-z0-9-]{0,63}$/;
 
const tutorQualityCaseSchema = z.object({
  id: z.string().regex(SAFE_ID),
  example: z.string().regex(/^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$/),
  expectedTopics: z.array(z.string().regex(SAFE_ID)).max(64).default([]),
  forbiddenTopics: z.array(z.string().regex(SAFE_ID)).max(64).default([]),
}).strict().superRefine((value, context) => {
  Iif (value.expectedTopics.length === 0 && value.forbiddenTopics.length === 0) {
    context.addIssue({ code: z.ZodIssueCode.custom, message: "A quality case must declare an expected or forbidden Topic" });
  }
  const overlap = value.expectedTopics.find((topicId) => value.forbiddenTopics.includes(topicId));
  Iif (overlap) {
    context.addIssue({ code: z.ZodIssueCode.custom, message: `Topic cannot be expected and forbidden: ${overlap}` });
  }
});
 
export const tutorQualityCasesSchema = z.object({
  schemaVersion: z.literal(1),
  cases: z.array(tutorQualityCaseSchema).min(1).max(256),
}).strict().superRefine((value, context) => {
  Iif (new Set(value.cases.map(({ id }) => id)).size !== value.cases.length) {
    context.addIssue({ code: z.ZodIssueCode.custom, path: ["cases"], message: "Quality case ids must be unique" });
  }
});