68 lines
4.5 KiB
TypeScript
68 lines
4.5 KiB
TypeScript
import { readFileSync } from 'node:fs';
|
|
import { createElement } from 'react';
|
|
import { renderToStaticMarkup } from 'react-dom/server';
|
|
import { describe, expect, it } from 'vitest';
|
|
import { hasSelectedTimeslotScope } from '../../src/app/work-scope';
|
|
import { ResultsBrowser } from '../../src/features/results-browser/ResultsBrowser';
|
|
|
|
describe('Result DB timeslot scope', () => {
|
|
it('forwards the active scan runs and applies them to facets and result rows', () => {
|
|
const appSource = readFileSync('src/app/App.tsx', 'utf8');
|
|
const browserSource = readFileSync('src/features/results-browser/ResultsBrowser.tsx', 'utf8');
|
|
const domainSource = readFileSync('src/domain/unified-result.ts', 'utf8');
|
|
const serverSource = readFileSync('server/assessor-http-server.ts', 'utf8');
|
|
const postgresSource = readFileSync('server/postgres/postgres-assessor-repository.ts', 'utf8');
|
|
|
|
expect(appSource).toContain('scanRunIds={app.activeScanRunIds}');
|
|
expect(appSource).toContain('assessmentIds={app.activeAssessmentIds}');
|
|
expect(browserSource).toContain("backendStatus !== 'connected' || !projectId || !hasTimeslotScope");
|
|
expect(browserSource).toContain('<h3>No timeslot selected</h3>');
|
|
expect(browserSource).toContain('assessmentIds');
|
|
expect(browserSource).toContain('queryUnifiedResultFacets(scopedQuery)');
|
|
expect(browserSource).toContain('queryUnifiedResults({ ...scopedQuery, offset: 0, limit })');
|
|
expect(browserSource).toContain('while (loadAll && items.length < firstPage.total)');
|
|
expect(browserSource).toContain('limit: MAX_QUERY_PAGE_SIZE');
|
|
expect(browserSource).toContain('>Load more</button>');
|
|
expect(browserSource).toContain('>Load all</button>');
|
|
expect(browserSource).toContain('DEFAULT_RESULT_DB_FILTERS: UnifiedResultQuery = { deviation: true }');
|
|
expect(browserSource).toContain('onReset={() => updateFilters({ ...DEFAULT_RESULT_DB_FILTERS })}');
|
|
expect(browserSource).toContain("'Export JSON'");
|
|
expect(browserSource).toContain('queryAllUnifiedResults');
|
|
expect(browserSource).toContain('resultsToPrivacySafeExportJson(results)');
|
|
expect(browserSource).toContain("item.sourceKind === 'environment-observation'");
|
|
expect(browserSource).toContain("item.sourceKind === 'policy-observation'");
|
|
expect(browserSource).toContain('item.policyValues');
|
|
expect(browserSource).toContain('item.environmentNormalizedValue');
|
|
expect(browserSource).not.toContain('item.environmentOriginalValue');
|
|
expect(browserSource).not.toContain('item.environmentSubjectIdentity');
|
|
expect(browserSource).toContain('item.supplementalDisclosurePolicyVersion');
|
|
expect(domainSource).toContain("query.scanRunIds.includes(item.scanRunId)");
|
|
expect(domainSource).toContain("sourceKind: 'environment-observation'");
|
|
expect(domainSource).toContain("sourceKind: 'policy-observation'");
|
|
expect(domainSource).toContain('environmentProperty: disclosure.property');
|
|
expect(domainSource).toContain('discloseSupplementalObservation(observation)');
|
|
expect(serverSource).toContain("scanRunIds: many('scanRunIds')");
|
|
expect(serverSource).toContain("assessmentIds: many('assessmentIds')");
|
|
expect(serverSource).toContain("environmentProperty: many('environmentProperty')");
|
|
expect(postgresSource).toContain("r.id = ANY(?::text[])");
|
|
expect(postgresSource).toContain('FROM assessor_environment_observations o');
|
|
expect(appSource).toContain("dataset && hasClientTimeslotScope && (graphVisited || activeArea === 'graph')");
|
|
expect(appSource).toContain('hasSelectedTimeslotScope(app.activeScanRunIds, app.activeAssessmentIds)');
|
|
expect(appSource).toContain('<ObsidianGraphView');
|
|
expect(appSource).toMatch(/app\.openProject\(projectId, projectId === targetProjectId \? app\.activeScanRunIds : undefined,\s*projectId === targetProjectId \? app\.activeAssessmentIds : undefined, activeProjectName\)/);
|
|
});
|
|
|
|
it('accepts an assessment-only scope for a GPO-only timeslot', () => {
|
|
expect(hasSelectedTimeslotScope([], ['gpo-assessment'])).toBe(true);
|
|
expect(hasSelectedTimeslotScope(['scanner-run'], [])).toBe(true);
|
|
expect(hasSelectedTimeslotScope([], [])).toBe(false);
|
|
expect(hasSelectedTimeslotScope()).toBe(false);
|
|
|
|
const markup = renderToStaticMarkup(createElement(ResultsBrowser, {
|
|
backendStatus: 'connected', projectId: 'gpo-client', scanRunIds: [], assessmentIds: ['gpo-assessment']
|
|
}));
|
|
expect(markup).toContain('Loading results …');
|
|
expect(markup).not.toContain('No timeslot selected');
|
|
});
|
|
});
|