spb/cancerindex
Public
TypeScript 97.2%
SQL 1.5%
CSS 0.6%
JavaScript 0.5%
1import { describe, expect, it } from 'vitest';2import { dataRelease, dedupeSources, envelope, paginate } from '../src/lib/envelope.js';34const src = (id: string, slug: string) => ({ id, slug, name: slug, license: 'CC BY 4.0', attribution: null, url: null });56describe('envelope', () => {7 it('wraps data with sources, dataRelease and generatedAt', () => {8 const out = envelope({ a: 1 }, [src('CI-SOURCE-00000001', 'oncotree')], undefined, new Date('2026-09-08T10:00:00Z'));9 expect(out.data).toEqual({ a: 1 });10 expect(out.sources).toHaveLength(1);11 expect(out.dataRelease).toBe('CancerIndex 2026-09');12 expect(new Date(out.generatedAt).getTime()).toBeGreaterThan(0);13 expect(out).not.toHaveProperty('total');14 });1516 it('spreads pagination fields when provided', () => {17 const out = envelope([], [], paginate(250, 50, 200));18 expect(out.total).toBe(250);19 expect(out.limit).toBe(50);20 expect(out.offset).toBe(200);21 expect(out.hasMore).toBe(false);22 expect(paginate(250, 50, 100).hasMore).toBe(true);23 });2425 it('deduplicates sources by id and sorts by slug', () => {26 const out = dedupeSources([src('CI-SOURCE-00000002', 'seer'), src('CI-SOURCE-00000001', 'oncotree'), src('CI-SOURCE-00000002', 'seer')]);27 expect(out.map((s) => s.slug)).toEqual(['oncotree', 'seer']);28 });2930 it('formats the data release as CancerIndex YYYY-MM', () => {31 expect(dataRelease(new Date('2025-01-31T23:59:59Z'))).toBe('CancerIndex 2025-01');32 });33});34