dsh-ops-cron/test/ownership.test.js
oliver 7d27179e51 Isolate scheduled tasks by empNo, aligned with uds-auth workspaces.
Super/fallback admins see all jobs grouped by user folder; admin/user only see their own. Stamp ownership on create, filter HTTP/tools, and prefer the owner's provisioned cwd on fire.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-08 15:49:54 +08:00

74 lines
2.5 KiB
JavaScript

import assert from 'node:assert/strict'
import { test } from 'node:test'
import {
assertCanAccessJob,
canViewAllJobs,
filterJobsForIdentity,
filterRunsForJobs,
inferOwnerEmpNo,
jobVisibleToIdentity,
migrateJobOwners,
UNASSIGNED_OWNER,
viewerPayload,
} from '../lib/ownership.js'
test('jobVisibleToIdentity respects canViewAll and owner', () => {
const user = { empNo: 'u1', permissions: { canViewAllSessions: false } }
const admin = { empNo: 'a1', permissions: { canViewAllSessions: true } }
assert.equal(jobVisibleToIdentity({ ownerEmpNo: 'u1' }, user), true)
assert.equal(jobVisibleToIdentity({ ownerEmpNo: 'u2' }, user), false)
assert.equal(jobVisibleToIdentity({ ownerEmpNo: UNASSIGNED_OWNER }, user), false)
assert.equal(jobVisibleToIdentity({ ownerEmpNo: UNASSIGNED_OWNER }, admin), true)
assert.equal(canViewAllJobs(admin), true)
})
test('assertCanAccessJob throws NOT_FOUND for foreigners', () => {
const user = { empNo: 'u1', permissions: { canViewAllSessions: false } }
assert.throws(
() => assertCanAccessJob({ id: 'j', ownerEmpNo: 'u2' }, user),
(err) => err && err.code === 'NOT_FOUND',
)
assert.equal(assertCanAccessJob({ id: 'j', ownerEmpNo: 'u1' }, user).id, 'j')
})
test('filterJobsForIdentity and filterRunsForJobs', () => {
const user = { empNo: 'u1', permissions: { canViewAllSessions: false } }
const jobs = [
{ id: '1', ownerEmpNo: 'u1' },
{ id: '2', ownerEmpNo: 'u2' },
]
const visible = filterJobsForIdentity(jobs, user)
assert.deepEqual(visible.map((j) => j.id), ['1'])
const runs = filterRunsForJobs([
{ id: 'r1', jobId: '1' },
{ id: 'r2', jobId: '2' },
], visible)
assert.deepEqual(runs.map((r) => r.id), ['r1'])
})
test('inferOwnerEmpNo and migrateJobOwners', () => {
assert.equal(inferOwnerEmpNo({ origin: { kind: 'im' } }), UNASSIGNED_OWNER)
assert.equal(
inferOwnerEmpNo({ origin: { kind: 'web', sessionId: 's' } }, { getSessionOwner: () => 'own' }),
'own',
)
const { changed, state } = migrateJobOwners({
jobs: [{ id: 'x', name: 'n' }],
})
assert.equal(changed, true)
assert.equal(state.jobs[0].ownerEmpNo, UNASSIGNED_OWNER)
})
test('viewerPayload', () => {
assert.equal(viewerPayload(null), null)
const v = viewerPayload({
empNo: 'u1',
role: 'user',
displayName: 'U',
permissions: { canViewAllSessions: false },
workspacePath: '/w/u1',
})
assert.equal(v.empNo, 'u1')
assert.equal(v.canViewAll, false)
assert.equal(v.workspacePath, '/w/u1')
})