Files
CRM_Montzar/apps/api/test/record-scope.test.ts
T

70 lines
2.6 KiB
TypeScript
Raw Normal View History

import { describe, it } from 'node:test';
import assert from 'node:assert/strict';
import {
noteAccessWhere,
normalizeDataVisibility,
ownerWhere,
parseVisibilityScopes,
resolveOwnerId,
scopedOwnerIds,
seesAllRecords,
} from '../src/common/record-scope';
const sales = { userId: 'u1', role: 'sales' };
describe('سطح دسترسی به پرونده‌ها', () => {
it('مدیر و مالک همه را می‌بینند', () => {
assert.ok(seesAllRecords({ role: 'owner' }));
assert.ok(seesAllRecords({ role: 'admin' }));
assert.deepEqual(ownerWhere({ userId: 'a', role: 'admin' }), {});
});
it('کارشناس فروش فقط پرونده‌های خودش را می‌بیند', () => {
assert.ok(!seesAllRecords(sales));
assert.deepEqual(scopedOwnerIds(sales), ['u1']);
assert.deepEqual(ownerWhere(sales), { ownerId: 'u1' });
});
it('دید تیمی', () => {
const actor = { ...sales, dataVisibility: 'team' as const, visibleUserIds: ['u1', 'u2', 'u2'] };
assert.deepEqual(ownerWhere(actor), { ownerId: { in: ['u1', 'u2'] } });
});
it('دید سازمانی یا visibleUserIds=null یعنی همه', () => {
assert.deepEqual(ownerWhere({ ...sales, dataVisibility: 'org' as const }), {});
assert.deepEqual(ownerWhere({ ...sales, visibleUserIds: null }), {});
});
it('سطح دید تفکیکی هر بخش بر پیش‌فرض اولویت دارد', () => {
const actor = {
...sales,
dataVisibility: 'org' as const,
scopes: { finance: { dataVisibility: 'own' as const, visibleUserIds: ['u1'] } },
};
assert.deepEqual(ownerWhere(actor, 'contacts'), {});
assert.deepEqual(ownerWhere(actor, 'finance'), { ownerId: 'u1' });
});
it('یادداشت شخصی فقط برای نویسنده', () => {
const where = noteAccessWhere({ userId: 'a', role: 'admin' });
assert.deepEqual(where, {
OR: [
{ visibility: { not: 'personal' } },
{ visibility: 'personal', authorId: 'a' },
],
});
});
it('فقط مدیر می‌تواند مالک را عوض کند', () => {
assert.equal(resolveOwnerId(sales, 'u9'), 'u1');
assert.equal(resolveOwnerId({ userId: 'a', role: 'admin' }, ' u9 '), 'u9');
assert.equal(resolveOwnerId({ userId: 'a', role: 'admin' }, ''), 'a');
});
it('پارس تنظیمات دید', () => {
assert.deepEqual(parseVisibilityScopes({ contacts: 'team', finance: 'bad' }), { contacts: 'team' });
assert.deepEqual(parseVisibilityScopes(null), {});
assert.equal(normalizeDataVisibility('weird'), 'own');
});
});