Skip to content

Commit d530e5e

Browse files
committed
test: add handling for discarding drafts during save operations
- Implemented a test to verify that discarding a draft while a save is in progress waits for the save to complete before discarding. - Updated the `handleDraftDiscard` function to resolve the draft ID before attempting to discard, ensuring proper draft management.
1 parent fe64568 commit d530e5e

2 files changed

Lines changed: 29 additions & 4 deletions

File tree

src/components/compose-message/hooks/useDraftMessage.test.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,31 @@ describe('Draft Message', () => {
244244
expect(resolvedId).toBe('new-draft-1');
245245
});
246246

247+
test('When discarding while a save is in flight, then it waits for the save to resolve and discards the fresh draft id', async () => {
248+
vi.spyOn(MailEncryptionService.instance, 'buildEncryptionBlock').mockResolvedValue(mockEncryptionBlock);
249+
250+
let resolveCreate!: (value: { id: string; receivedAt: string }) => void;
251+
mocks.createDraft.mockReturnValue({
252+
unwrap: () =>
253+
new Promise((resolve) => {
254+
resolveCreate = resolve;
255+
}),
256+
});
257+
mocks.discardDraft.mockReturnValue({ unwrap: () => Promise.resolve(undefined) });
258+
259+
const { result } = renderDraft({ subject: 'Discard race', toRecipients: [recipient('bob@inxt.me')] });
260+
261+
await act(async () => {
262+
const save = result.current.saveDraft();
263+
await vi.advanceTimersByTimeAsync(0);
264+
const discard = result.current.handleDraftDiscard();
265+
resolveCreate({ id: 'new-draft-1', receivedAt: '2026-06-22T13:42:30Z' });
266+
await Promise.all([save, discard]);
267+
});
268+
269+
expect(mocks.discardDraft).toHaveBeenCalledWith({ draftId: 'new-draft-1' });
270+
});
271+
247272
test('When the body is edited, then autosave re-arms from the editor update event', async () => {
248273
vi.spyOn(MailEncryptionService.instance, 'buildEncryptionBlock').mockResolvedValue(mockEncryptionBlock);
249274

src/components/compose-message/hooks/useDraftMessage.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -165,10 +165,10 @@ export const useDraftMessage = ({
165165
}, [clearAutosaveTimer]);
166166

167167
const handleDraftDiscard = useCallback(async () => {
168-
clearAutosaveTimer();
169-
if (!draftIdRef.current) return;
170-
await discardDraft({ draftId: draftIdRef.current }).unwrap();
171-
}, [discardDraft, clearAutosaveTimer]);
168+
const draftId = await resolveDraftId();
169+
if (!draftId) return;
170+
await discardDraft({ draftId }).unwrap();
171+
}, [discardDraft, resolveDraftId]);
172172

173173
const clearDraftRef = useCallback(() => {
174174
clearAutosaveTimer();

0 commit comments

Comments
 (0)