From 3f7943b51226612199c89d7f385378ee20fb430b Mon Sep 17 00:00:00 2001 From: harshiltewari2004 Date: Sun, 2 Aug 2026 01:48:39 +0530 Subject: [PATCH] Wait for the download click instead of a fixed timeout in saveCanvas tests --- test/unit/image/downloading.js | 32 ++++++++++++++++++++++++------- test/unit/webgl/p5.Framebuffer.js | 20 +++++++++++++++++-- 2 files changed, 43 insertions(+), 9 deletions(-) diff --git a/test/unit/image/downloading.js b/test/unit/image/downloading.js index 3d37d979e3..6de520dfdf 100644 --- a/test/unit/image/downloading.js +++ b/test/unit/image/downloading.js @@ -10,6 +10,18 @@ const mockAnchorElement = vi.mockObject({ download: null, click: () => {} }); + +let onDownload = null; + +mockAnchorElement.click.mockImplementation(()=>{ + if(onDownload) onDownload(); +}); + +const downloadHappened = () => + new Promise(resolve =>{ + onDownload = resolve; + }); + const originalCreateElement = document.createElement; vi.spyOn(document, 'createElement').mockImplementation((...args) => { if(args[0] !== 'a'){ @@ -61,10 +73,6 @@ expect.extend({ } }); -const wait = async time => { - return new Promise(resolve => setTimeout(resolve, time)); -}; - suite('Downloading', () => { beforeAll(async function() { image(mockP5, mockP5Prototype); @@ -77,6 +85,10 @@ suite('Downloading', () => { vi.clearAllMocks(); }); + beforeEach(() => { + onDownload = null; + }); + suite('downloading animated gifs', function() { let myGif; const imagePath = '/test/unit/assets/nyan_cat.gif'; @@ -112,24 +124,30 @@ suite('Downloading', () => { }); test('should download a png file', async () => { + const downloaded = downloadHappened(); mockP5Prototype.saveCanvas(); - await wait(100); + await downloaded; + expect(document.createElement).toHaveBeenCalledTimes(1); expect(mockAnchorElement.click).toHaveBeenCalledTimes(1); assert.equal(mockAnchorElement.download, 'untitled.png'); }); test('should download a jpg file I', async () => { + const downloaded = downloadHappened(); mockP5Prototype.saveCanvas('filename.jpg'); - await wait(100); + await downloaded; + expect(document.createElement).toHaveBeenCalledTimes(1); expect(mockAnchorElement.click).toHaveBeenCalledTimes(1); assert.equal(mockAnchorElement.download, 'filename.jpg'); }); test('should download a jpg file II', async () => { + const downloaded = downloadHappened(); mockP5Prototype.saveCanvas('filename', 'jpg'); - await wait(100); + await downloaded; + expect(document.createElement).toHaveBeenCalledTimes(1); expect(mockAnchorElement.click).toHaveBeenCalledTimes(1); assert.equal(mockAnchorElement.download, 'filename.jpg'); diff --git a/test/unit/webgl/p5.Framebuffer.js b/test/unit/webgl/p5.Framebuffer.js index 4ff9b128cb..fd69275082 100644 --- a/test/unit/webgl/p5.Framebuffer.js +++ b/test/unit/webgl/p5.Framebuffer.js @@ -6,6 +6,17 @@ const mockAnchorElement = vi.mockObject({ download: null, click: () => {} }); + +let onDownload = null; +mockAnchorElement.click.mockImplementation(() => { + if(onDownload) onDownload(); +}); + +const downloadHappened = () => + new Promise(resolve => { + onDownload = resolve; + }); + const originalCreateElement = document.createElement; vi.spyOn(document, 'createElement').mockImplementation((...args) => { if(args[0] !== 'a'){ @@ -53,6 +64,10 @@ suite('p5.Framebuffer', function() { vi.clearAllMocks(); }); + beforeEach(function(){ + onDownload = null; + }); + suite('formats and channels', function() { function testWithConfiguration( version, @@ -674,9 +689,10 @@ suite('p5.Framebuffer', function() { myp5.createCanvas(100, 100, myp5.WEBGL); const fbo = myp5.createFramebuffer(); fbo.draw(() => myp5.background('red')); - myp5.saveCanvas(fbo); - await new Promise(res => setTimeout(res, 500)); + const downloaded = downloadHappened(); + myp5.saveCanvas(fbo); + await downloaded; expect(document.createElement).toHaveBeenCalledWith('a'); expect(mockAnchorElement.click).toHaveBeenCalledTimes(1);