refactor: extract cuesheet permissions

This commit is contained in:
Carlos Valente
2026-02-20 20:49:08 +01:00
committed by Carlos Valente
parent 5be504ce8f
commit df588b8845
9 changed files with 290 additions and 75 deletions
@@ -0,0 +1,94 @@
import { OntimeView, URLPreset } from 'ontime-types';
import { AppMode } from '../../../ontimeConfig';
import { getCuesheetColumnAccessPolicy, getCuesheetPermissionsPolicy } from '../cuesheet.policies';
describe('getCuesheetPermissionsPolicy()', () => {
test('returns full permissions when there is no preset', () => {
expect(getCuesheetPermissionsPolicy(undefined, true)).toEqual({
canChangeMode: true,
canCreateEntries: true,
canEditEntries: true,
canFlag: true,
canShare: true,
});
});
test('returns run-only permissions when write is disabled', () => {
const preset: URLPreset = {
enabled: true,
alias: 'cuesheet-read-only',
target: OntimeView.Cuesheet,
search: '',
options: {
read: 'full',
write: '-',
},
};
expect(getCuesheetPermissionsPolicy(preset, true)).toEqual({
canChangeMode: false,
canCreateEntries: false,
canEditEntries: false,
canFlag: false,
canShare: false,
});
});
test('allows flag changes when write includes flag only', () => {
const preset: URLPreset = {
enabled: true,
alias: 'cuesheet-flag',
target: OntimeView.Cuesheet,
search: '',
options: {
read: 'full',
write: 'flag',
},
};
expect(getCuesheetPermissionsPolicy(preset, true)).toEqual({
canChangeMode: true,
canCreateEntries: false,
canEditEntries: false,
canFlag: true,
canShare: false,
});
});
test('defaults to full read and write when cuesheet options are absent', () => {
const preset: URLPreset = {
enabled: true,
alias: 'cuesheet-default',
target: OntimeView.Cuesheet,
search: '',
};
const policy = getCuesheetColumnAccessPolicy(preset, AppMode.Edit);
expect(policy.canRead('title')).toBe(true);
expect(policy.canWrite('title')).toBe(true);
});
test('column access honors granular permissions and mode', () => {
const preset: URLPreset = {
enabled: true,
alias: 'cuesheet-granular',
target: OntimeView.Cuesheet,
search: '',
options: {
read: 'cue,title',
write: 'title',
},
};
const editPolicy = getCuesheetColumnAccessPolicy(preset, AppMode.Edit);
const runPolicy = getCuesheetColumnAccessPolicy(preset, AppMode.Run);
expect(editPolicy.canRead('cue')).toBe(true);
expect(editPolicy.canRead('duration')).toBe(false);
expect(editPolicy.canWrite('title')).toBe(true);
expect(editPolicy.canWrite('cue')).toBe(false);
expect(runPolicy.canWrite('title')).toBe(false);
});
});