Defer locked-period supplements to a pending ledger, route duty-holder notifications, persist stage-scoped comments, and prefer Approver for reopen.
38 lines
1.5 KiB
TypeScript
38 lines
1.5 KiB
TypeScript
import { describe, it } from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import {
|
|
canAddBlockComment,
|
|
canResolveComment,
|
|
resolveCommentAuthorRole,
|
|
} from './commentPolicy';
|
|
|
|
describe('commentPolicy', () => {
|
|
it('applies stage matrix for add', () => {
|
|
assert.equal(canAddBlockComment('author', 'drafting'), true);
|
|
assert.equal(canAddBlockComment('reviewer', 'drafting'), true);
|
|
assert.equal(canAddBlockComment('approver', 'drafting'), false);
|
|
assert.equal(canAddBlockComment('author', 'reviewing'), true);
|
|
assert.equal(canAddBlockComment('approver', 'reviewing'), false);
|
|
assert.equal(canAddBlockComment('approver', 'approving'), true);
|
|
assert.equal(canAddBlockComment('author', 'approving'), false);
|
|
assert.equal(canAddBlockComment('reviewer', 'approved'), false);
|
|
});
|
|
|
|
it('keeps viewer read-only', () => {
|
|
assert.equal(canAddBlockComment('viewer', 'drafting'), false);
|
|
assert.equal(resolveCommentAuthorRole('viewer'), null);
|
|
});
|
|
|
|
it('resolves author role literally', () => {
|
|
assert.equal(resolveCommentAuthorRole('author'), 'author');
|
|
assert.equal(resolveCommentAuthorRole('reviewer'), 'reviewer');
|
|
assert.equal(resolveCommentAuthorRole('approver'), 'approver');
|
|
});
|
|
|
|
it('gates resolve by stage', () => {
|
|
assert.equal(canResolveComment('author', 'drafting'), true);
|
|
assert.equal(canResolveComment('author', 'reviewing'), false);
|
|
assert.equal(canResolveComment('reviewer', 'reviewing'), true);
|
|
});
|
|
});
|