task ep.1.3.md

This commit is contained in:
phaichayon
2026-07-13 11:00:49 +07:00
parent e96320a24d
commit d78c56148e
18 changed files with 2944 additions and 8 deletions

View File

@@ -0,0 +1,84 @@
import assert from 'node:assert/strict';
import test from 'node:test';
import { createActivityBusinessEvent } from './business-events.ts';
import type { ActivityRecord } from '../api/types.ts';
function activity(overrides: Partial<ActivityRecord> = {}): ActivityRecord {
return {
id: 'activity-1',
activityCode: 'ACT2607-001',
organizationId: 'org-1',
primaryEntityType: 'opportunity',
primaryEntityId: 'opp-1',
primaryRecordLabel: 'EN-001 Project',
relatedRecords: [],
customerId: 'customer-1',
contactId: null,
leadId: null,
opportunityId: 'opp-1',
quotationId: null,
activityType: 'follow_up',
subject: 'Follow up',
description: 'Pricing detail',
ownerId: 'owner-1',
ownerName: 'Owner',
assignedToId: 'assignee-1',
assignedToName: 'Assignee',
scheduledStartAt: '2026-07-13T00:00:00.000Z',
scheduledEndAt: null,
dueAt: null,
completedAt: null,
cancelledAt: null,
skippedAt: null,
status: 'scheduled',
effectiveStatus: 'scheduled',
priority: 'normal',
outcomeSummary: 'Sensitive outcome',
cancellationReason: null,
skipReason: null,
nextAction: 'Call buyer',
branchId: 'branch-1',
productType: 'crane',
isInternalOnly: false,
isPricingSensitive: true,
parentActivityId: null,
metadata: null,
createdBy: 'user-1',
createdByName: 'User',
createdAt: '2026-07-13T00:00:00.000Z',
updatedBy: 'user-1',
updatedByName: 'User',
updatedAt: '2026-07-13T00:00:00.000Z',
deletedAt: null,
canViewPricingSensitiveContent: false,
isContentRedacted: true,
...overrides
};
}
test('activity business event redacts pricing-sensitive narrative fields', () => {
const event = createActivityBusinessEvent({
eventType: 'activity.completed',
activity: activity(),
actorUserId: 'user-1'
});
assert.equal(event.visibility.pricingSensitive, true);
assert.equal(event.payload.description, null);
assert.equal(event.payload.outcomeSummary, null);
assert.equal(event.payload.contentRedacted, true);
});
test('activity business event preserves correlation and related context', () => {
const event = createActivityBusinessEvent({
eventType: 'activity.created',
activity: activity({ isPricingSensitive: false, description: 'Normal note' }),
actorUserId: 'user-1',
correlationId: 'corr-1'
});
assert.equal(event.correlationId, 'corr-1');
assert.equal(event.primaryRecord.type, 'opportunity');
assert.equal(event.relatedRecords.some((record) => record.type === 'customer'), true);
assert.equal(event.payload.description, 'Normal note');
});