Files
umami/src/lib/boards.test.ts
T

110 lines
4.7 KiB
TypeScript

import { expect, test } from 'vitest';
import { getComponentDefinition } from '@/app/(main)/boards/boardComponentRegistry';
import {
BOARD_COMPONENT_COMPATIBILITY_MATRIX,
getSupportedBoardComponentEntityTypes,
} from './boardComponentCompatibility';
import { BOARD_ENTITY_TYPES, isBoardComponentSupported } from './boards';
test('isBoardComponentSupported allows events chart on website boards', () => {
expect(isBoardComponentSupported('EventsChart', BOARD_ENTITY_TYPES.website)).toBe(true);
});
test('isBoardComponentSupported rejects events chart on pixel and link boards', () => {
expect(isBoardComponentSupported('EventsChart', BOARD_ENTITY_TYPES.pixel)).toBe(false);
expect(isBoardComponentSupported('EventsChart', BOARD_ENTITY_TYPES.link)).toBe(false);
});
test('isBoardComponentSupported rejects event metrics bar and weekly traffic on pixel and link boards', () => {
expect(isBoardComponentSupported('EventsMetricsBar', BOARD_ENTITY_TYPES.pixel)).toBe(false);
expect(isBoardComponentSupported('EventsMetricsBar', BOARD_ENTITY_TYPES.link)).toBe(false);
expect(isBoardComponentSupported('WeeklyTraffic', BOARD_ENTITY_TYPES.pixel)).toBe(false);
expect(isBoardComponentSupported('WeeklyTraffic', BOARD_ENTITY_TYPES.link)).toBe(false);
});
test('board component compatibility matrix defines website-only components explicitly', () => {
expect(BOARD_COMPONENT_COMPATIBILITY_MATRIX.EventsMetricsBar).toEqual([
BOARD_ENTITY_TYPES.website,
]);
expect(BOARD_COMPONENT_COMPATIBILITY_MATRIX.EventsChart).toEqual([BOARD_ENTITY_TYPES.website]);
expect(BOARD_COMPONENT_COMPATIBILITY_MATRIX.Funnel).toEqual([BOARD_ENTITY_TYPES.website]);
expect(BOARD_COMPONENT_COMPATIBILITY_MATRIX.Goal).toEqual([BOARD_ENTITY_TYPES.website]);
expect(BOARD_COMPONENT_COMPATIBILITY_MATRIX.RealtimeActiveUsers).toEqual([
BOARD_ENTITY_TYPES.website,
]);
expect(BOARD_COMPONENT_COMPATIBILITY_MATRIX.RealtimeHeader).toEqual([BOARD_ENTITY_TYPES.website]);
expect(BOARD_COMPONENT_COMPATIBILITY_MATRIX.RealtimeChart).toEqual([BOARD_ENTITY_TYPES.website]);
expect(BOARD_COMPONENT_COMPATIBILITY_MATRIX.RevenueMetricsBar).toEqual([
BOARD_ENTITY_TYPES.website,
]);
expect(BOARD_COMPONENT_COMPATIBILITY_MATRIX.RevenueChart).toEqual([BOARD_ENTITY_TYPES.website]);
expect(BOARD_COMPONENT_COMPATIBILITY_MATRIX.RevenueMetricsTable).toEqual([
BOARD_ENTITY_TYPES.website,
]);
expect(BOARD_COMPONENT_COMPATIBILITY_MATRIX.UTM).toEqual([BOARD_ENTITY_TYPES.website]);
expect(BOARD_COMPONENT_COMPATIBILITY_MATRIX.WeeklyTraffic).toEqual([BOARD_ENTITY_TYPES.website]);
expect(getSupportedBoardComponentEntityTypes('EventsMetricsBar')).toEqual([
BOARD_ENTITY_TYPES.website,
]);
expect(getSupportedBoardComponentEntityTypes('EventsChart')).toEqual([
BOARD_ENTITY_TYPES.website,
]);
expect(getSupportedBoardComponentEntityTypes('Funnel')).toEqual([BOARD_ENTITY_TYPES.website]);
expect(getSupportedBoardComponentEntityTypes('Goal')).toEqual([BOARD_ENTITY_TYPES.website]);
expect(getSupportedBoardComponentEntityTypes('RealtimeActiveUsers')).toEqual([
BOARD_ENTITY_TYPES.website,
]);
expect(getSupportedBoardComponentEntityTypes('RealtimeHeader')).toEqual([
BOARD_ENTITY_TYPES.website,
]);
expect(getSupportedBoardComponentEntityTypes('RealtimeChart')).toEqual([
BOARD_ENTITY_TYPES.website,
]);
expect(getSupportedBoardComponentEntityTypes('RevenueMetricsBar')).toEqual([
BOARD_ENTITY_TYPES.website,
]);
expect(getSupportedBoardComponentEntityTypes('RevenueChart')).toEqual([
BOARD_ENTITY_TYPES.website,
]);
expect(getSupportedBoardComponentEntityTypes('RevenueMetricsTable')).toEqual([
BOARD_ENTITY_TYPES.website,
]);
expect(getSupportedBoardComponentEntityTypes('UTM')).toEqual([BOARD_ENTITY_TYPES.website]);
expect(getSupportedBoardComponentEntityTypes('WeeklyTraffic')).toEqual([
BOARD_ENTITY_TYPES.website,
]);
});
test('isBoardComponentSupported leaves other components available for all board entities', () => {
expect(isBoardComponentSupported('WebsiteChart', BOARD_ENTITY_TYPES.pixel)).toBe(true);
expect(isBoardComponentSupported('TextBlock', BOARD_ENTITY_TYPES.link)).toBe(true);
});
test('metrics table limits pixel and link boards to overview-page metric types', () => {
const definition = getComponentDefinition('MetricsTable');
const options = definition?.configFields?.find(
field => field.name === 'type',
)?.optionsByEntityType;
expect(options?.pixel?.map(option => option.value)).toEqual([
'referrer',
'channel',
'country',
'region',
'city',
'browser',
'os',
'device',
]);
expect(options?.link?.map(option => option.value)).toEqual([
'referrer',
'channel',
'country',
'region',
'city',
'browser',
'os',
'device',
]);
});