73 lines
2.4 KiB
TypeScript
73 lines
2.4 KiB
TypeScript
|
|
/**
|
||
|
|
* The documents-hub "awaiting my signature" tab matches a document's pending
|
||
|
|
* signer against the set of emails the caller owns — their login email AND
|
||
|
|
* their signing_email override. So a user who logs in as `abbie@` but signs as
|
||
|
|
* `sales@` still sees the `sales@`-signer documents in their personal tab.
|
||
|
|
*/
|
||
|
|
import { describe, it, expect } from 'vitest';
|
||
|
|
|
||
|
|
import { db } from '@/lib/db';
|
||
|
|
import { documents, documentSigners } from '@/lib/db/schema/documents';
|
||
|
|
import { listDocuments } from '@/lib/services/documents.service';
|
||
|
|
import { makePort, makeClient } from '../helpers/factories';
|
||
|
|
|
||
|
|
async function seedPendingDoc(portId: string, clientId: string, signerEmail: string) {
|
||
|
|
const [doc] = await db
|
||
|
|
.insert(documents)
|
||
|
|
.values({
|
||
|
|
portId,
|
||
|
|
clientId,
|
||
|
|
documentType: 'eoi',
|
||
|
|
title: 'EOI awaiting signature',
|
||
|
|
status: 'sent',
|
||
|
|
createdBy: 'seed',
|
||
|
|
})
|
||
|
|
.returning();
|
||
|
|
await db.insert(documentSigners).values({
|
||
|
|
documentId: doc!.id,
|
||
|
|
signerName: 'Approver',
|
||
|
|
signerEmail,
|
||
|
|
signerRole: 'approver',
|
||
|
|
signingOrder: 1,
|
||
|
|
status: 'pending',
|
||
|
|
});
|
||
|
|
return doc!.id;
|
||
|
|
}
|
||
|
|
|
||
|
|
const baseQuery = {
|
||
|
|
page: 1,
|
||
|
|
limit: 50,
|
||
|
|
sort: 'createdAt' as const,
|
||
|
|
order: 'desc' as const,
|
||
|
|
includeArchived: false,
|
||
|
|
tab: 'awaiting_me' as const,
|
||
|
|
};
|
||
|
|
|
||
|
|
describe('documents hub - awaiting_me matches owned email set', () => {
|
||
|
|
it('includes a doc whose pending signer matches the caller signing_email (not their login)', async () => {
|
||
|
|
const port = await makePort();
|
||
|
|
const client = await makeClient({ portId: port.id });
|
||
|
|
const docId = await seedPendingDoc(port.id, client.id, 'sales@portnimara.com');
|
||
|
|
|
||
|
|
const result = await listDocuments(port.id, baseQuery, {
|
||
|
|
currentUserEmails: ['abbie@portnimara.com', 'sales@portnimara.com'],
|
||
|
|
});
|
||
|
|
|
||
|
|
const ids = (result.data as Array<{ id: string }>).map((d) => d.id);
|
||
|
|
expect(ids).toContain(docId);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('excludes the doc when the caller owns neither the signer email', async () => {
|
||
|
|
const port = await makePort();
|
||
|
|
const client = await makeClient({ portId: port.id });
|
||
|
|
const docId = await seedPendingDoc(port.id, client.id, 'sales@portnimara.com');
|
||
|
|
|
||
|
|
const result = await listDocuments(port.id, baseQuery, {
|
||
|
|
currentUserEmails: ['abbie@portnimara.com'],
|
||
|
|
});
|
||
|
|
|
||
|
|
const ids = (result.data as Array<{ id: string }>).map((d) => d.id);
|
||
|
|
expect(ids).not.toContain(docId);
|
||
|
|
});
|
||
|
|
});
|