From b9a7369342d0a27cdd76c281f2064d05cdff7743 Mon Sep 17 00:00:00 2001 From: Florian Imdahl Date: Sun, 22 Feb 2026 14:25:02 +0100 Subject: [PATCH 1/3] refactor: Expect errors in tests --- .../src/DoubleLinkedList.test.ts | 68 +++---------------- packages/jszip-cli/src/JSZipCLI.test.ts | 2 +- packages/mock-udp/src/index.test.ts | 51 +++++--------- packages/ntpclient/src/index.test.ts | 15 ++-- packages/scrabble-cheater/src/index.test.ts | 7 +- 5 files changed, 32 insertions(+), 111 deletions(-) diff --git a/packages/double-linked-list/src/DoubleLinkedList.test.ts b/packages/double-linked-list/src/DoubleLinkedList.test.ts index 52d88408..cf3dae9b 100644 --- a/packages/double-linked-list/src/DoubleLinkedList.test.ts +++ b/packages/double-linked-list/src/DoubleLinkedList.test.ts @@ -35,56 +35,21 @@ describe('ListElement', () => { test(`doesn't connect an invalid next element`, () => { const element1 = new ListElement('one'); - - try { - element1.setNext('error' as any); - assert.fail(); - } catch (error) { - expect((error as Error).message).toBe('Invalid next element.'); - } + expect(element1.setNext('error' as any)).toThrowError('Invalid next element.'); }); test(`doesn't connect an invalid previous element`, () => { const element1 = new ListElement('one'); - - try { - element1.setPrev('error' as any); - assert.fail(); - } catch (error) { - expect((error as Error).message).toBe('Invalid previous element.'); - } + expect(element1.setPrev('error' as any)).toThrowError('Invalid previous element.'); }); test(`doesn't accept an invalid value`, () => { - try { - new (ListElement as any)(); - assert.fail(); - } catch (error) { - expect((error as Error).message).toBe('Invalid value.'); - } - - try { - new ListElement(null); - assert.fail(); - } catch (error) { - expect((error as Error).message).toBe('Invalid value.'); - } + expect(new (ListElement as any)()).toThrowError('Invalid value.'); + expect(new ListElement(null)).toThrowError('Invalid value.'); const element1 = new ListElement(''); - - try { - element1.setValue(undefined as any); - assert.fail(); - } catch (error) { - expect((error as Error).message).toBe('Invalid value.'); - } - - try { - element1.setValue(null); - assert.fail(); - } catch (error) { - expect((error as Error).message).toBe('Invalid value.'); - } + expect(element1.setValue(undefined as any)).toThrowError('Invalid value.'); + expect(element1.setValue(null)).toThrowError('Invalid value.'); }); }); @@ -133,28 +98,13 @@ describe('LinkedList', () => { }); test(`doesn't go outside the list's bounds`, () => { - try { - list.get(0); - assert.fail(); - } catch (error) { - expect((error as Error).message).toBe('Index 0 is out of bounds.'); - } + expect(list.get(0)).toThrowError('Index 0 is out of bounds.'); list.add('zero'); - try { - list.get(2); - assert.fail(); - } catch (error) { - expect((error as Error).message).toBe('Index 2 is out of bounds.'); - } + expect(list.get(2)).toThrowError('Index 2 is out of bounds.'); - try { - list.remove(2); - assert.fail(); - } catch (error) { - expect((error as Error).message).toBe('Index 2 is out of bounds.'); - } + expect(list.remove(2)).toThrowError('Index 2 is out of bounds.'); }); test(`gets the list's head and tail`, () => { diff --git a/packages/jszip-cli/src/JSZipCLI.test.ts b/packages/jszip-cli/src/JSZipCLI.test.ts index 777f4a45..35818510 100644 --- a/packages/jszip-cli/src/JSZipCLI.test.ts +++ b/packages/jszip-cli/src/JSZipCLI.test.ts @@ -38,7 +38,7 @@ describe('JSZipCLI', () => { try { await fs.mkdir(tempDir); } catch { - // no-op + // directory already exists } }); afterAll(() => fs.rm(tempDir, {force: true, recursive: true})); diff --git a/packages/mock-udp/src/index.test.ts b/packages/mock-udp/src/index.test.ts index cdeee1c3..5b4437b1 100644 --- a/packages/mock-udp/src/index.test.ts +++ b/packages/mock-udp/src/index.test.ts @@ -37,13 +37,8 @@ describe('mock-udp.clean', () => { mockudp.clean(); const client = dgram.createSocket('udp4'); range.forEach(index => { - try { - // eslint-disable-next-line no-magic-numbers - client.send(buffer, 0, buffer.length, 1000 + index, 'localhost'); - assert.fail(); - } catch { - // no-op - } + // eslint-disable-next-line no-magic-numbers + expect(client.send(buffer, 0, buffer.length, 1000 + index, 'localhost')).toThrowError(); }); }); }); @@ -106,6 +101,7 @@ describe('mock-udp.overriddenSocketSend', () => { const scope1 = mockudp.add('localhost:1000'); const scope2 = mockudp.add('localhost:1000'); const client = dgram.createSocket('udp4'); + // eslint-disable-next-line no-magic-numbers client.send(buffer, 0, buffer.length, 1000, 'localhost', () => { scope1.done(); @@ -119,16 +115,13 @@ describe('mock-udp.overriddenSocketSend', () => { return new Promise(done => { const scope = mockudp.add('localhost:1000'); const client = dgram.createSocket('udp4'); + // eslint-disable-next-line no-magic-numbers client.send(buffer, 0, buffer.length, 1000, 'localhost', () => { scope.done(); - try { - // eslint-disable-next-line no-magic-numbers - client.send(buffer, 0, buffer.length, 1000, 'localhost'); - assert.fail(); - } catch { - done(void 0); - } + // eslint-disable-next-line no-magic-numbers + expect(client.send(buffer, 0, buffer.length, 1000, 'localhost')).toThrowError(); + done(void 0); }); }); }); @@ -136,39 +129,27 @@ describe('mock-udp.overriddenSocketSend', () => { test('should throw an error if offset is equal to the length of the buffer', () => { const scope = mockudp.add('localhost:1000'); const client = dgram.createSocket('udp4'); - try { - // eslint-disable-next-line no-magic-numbers - client.send(buffer, buffer.length, buffer.length, 1000, 'localhost'); - assert.fail(); - } catch { - // no-op - } + + // eslint-disable-next-line no-magic-numbers + expect(client.send(buffer, buffer.length, buffer.length, 1000, 'localhost')).toThrowError(); expect(scope.done()).toBe(false); }); test('should throw an error if offset is greater than the length of the buffer', () => { const scope = mockudp.add('localhost:1000'); const client = dgram.createSocket('udp4'); - try { - // eslint-disable-next-line no-magic-numbers - client.send(buffer, buffer.length + 1, buffer.length, 1000, 'localhost'); - assert.fail(); - } catch { - // no-op - } + + // eslint-disable-next-line no-magic-numbers + expect(client.send(buffer, buffer.length + 1, buffer.length, 1000, 'localhost')).toThrowError(); expect(scope.done()).toBe(false); }); test('should throw an error if the length is greater than the length of the buffer', () => { const scope = mockudp.add('localhost:1000'); const client = dgram.createSocket('udp4'); - try { - // eslint-disable-next-line no-magic-numbers - client.send(buffer, 0, buffer.length + 1, 1000, 'localhost'); - assert.fail(); - } catch { - // no-op - } + + // eslint-disable-next-line no-magic-numbers + expect(client.send(buffer, 0, buffer.length + 1, 1000, 'localhost')).toThrowError(); expect(scope.done()).toBe(false); }); }); diff --git a/packages/ntpclient/src/index.test.ts b/packages/ntpclient/src/index.test.ts index 121a2bd8..7aa59938 100644 --- a/packages/ntpclient/src/index.test.ts +++ b/packages/ntpclient/src/index.test.ts @@ -54,15 +54,10 @@ describe.skip('NTP', () => { ); it("doesn't work with an invalid NTP server", async () => { - try { - const ntpClient = new NTPClient({ - replyTimeout: SECOND_IN_MILLIS, - server: 'google.com', - }); - await ntpClient.getNetworkTime(); - assert.fail(); - } catch (error) { - expect((error as Error).message).toContain('Timeout'); - } + const ntpClient = new NTPClient({ + replyTimeout: SECOND_IN_MILLIS, + server: 'google.com', + }); + await expect(ntpClient.getNetworkTime()).rejects.toThrowError(); }); }); diff --git a/packages/scrabble-cheater/src/index.test.ts b/packages/scrabble-cheater/src/index.test.ts index c856c056..1bdf4411 100644 --- a/packages/scrabble-cheater/src/index.test.ts +++ b/packages/scrabble-cheater/src/index.test.ts @@ -19,11 +19,6 @@ describe('ScrabbleCheater', () => { test(`Doesn't accept an empty file`, async () => { const sc = new ScrabbleCheater(emptyList); - try { - await sc.start(); - assert.fail(); - } catch { - // nothing to do - } + await expect(sc.start()).rejects.toThrowError(); }); }); From 7c957a3a5dd3a0b5de1468782b17dc389701cdfc Mon Sep 17 00:00:00 2001 From: Florian Imdahl Date: Sun, 22 Feb 2026 14:34:52 +0100 Subject: [PATCH 2/3] refactor: Expect errors in tests --- .../src/DoubleLinkedList.test.ts | 22 +++++++++++-------- packages/mock-udp/src/index.test.ts | 10 ++++----- packages/ntpclient/src/index.test.ts | 2 +- 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/packages/double-linked-list/src/DoubleLinkedList.test.ts b/packages/double-linked-list/src/DoubleLinkedList.test.ts index cf3dae9b..422c9af9 100644 --- a/packages/double-linked-list/src/DoubleLinkedList.test.ts +++ b/packages/double-linked-list/src/DoubleLinkedList.test.ts @@ -35,21 +35,25 @@ describe('ListElement', () => { test(`doesn't connect an invalid next element`, () => { const element1 = new ListElement('one'); - expect(element1.setNext('error' as any)).toThrowError('Invalid next element.'); + // @ts-expect-error test invalid value + expect(() => element1.setNext('error')).toThrowError('Invalid next element.'); }); test(`doesn't connect an invalid previous element`, () => { const element1 = new ListElement('one'); - expect(element1.setPrev('error' as any)).toThrowError('Invalid previous element.'); + // @ts-expect-error test invalid value + expect(() => element1.setPrev('error')).toThrowError('Invalid previous element.'); }); test(`doesn't accept an invalid value`, () => { - expect(new (ListElement as any)()).toThrowError('Invalid value.'); - expect(new ListElement(null)).toThrowError('Invalid value.'); + // @ts-expect-error test invalid value + expect(() => new ListElement()).toThrowError('Invalid value.'); + expect(() => new ListElement(null)).toThrowError('Invalid value.'); const element1 = new ListElement(''); - expect(element1.setValue(undefined as any)).toThrowError('Invalid value.'); - expect(element1.setValue(null)).toThrowError('Invalid value.'); + // @ts-expect-error test invalid value + expect(() => element1.setValue(undefined)).toThrowError('Invalid value.'); + expect(() => element1.setValue(null)).toThrowError('Invalid value.'); }); }); @@ -98,13 +102,13 @@ describe('LinkedList', () => { }); test(`doesn't go outside the list's bounds`, () => { - expect(list.get(0)).toThrowError('Index 0 is out of bounds.'); + expect(() => list.get(0)).toThrowError('Index 0 is out of bounds.'); list.add('zero'); - expect(list.get(2)).toThrowError('Index 2 is out of bounds.'); + expect(() => list.get(2)).toThrowError('Index 2 is out of bounds.'); - expect(list.remove(2)).toThrowError('Index 2 is out of bounds.'); + expect(() => list.remove(2)).toThrowError('Index 2 is out of bounds.'); }); test(`gets the list's head and tail`, () => { diff --git a/packages/mock-udp/src/index.test.ts b/packages/mock-udp/src/index.test.ts index 5b4437b1..e506f6a1 100644 --- a/packages/mock-udp/src/index.test.ts +++ b/packages/mock-udp/src/index.test.ts @@ -38,7 +38,7 @@ describe('mock-udp.clean', () => { const client = dgram.createSocket('udp4'); range.forEach(index => { // eslint-disable-next-line no-magic-numbers - expect(client.send(buffer, 0, buffer.length, 1000 + index, 'localhost')).toThrowError(); + expect(() => client.send(buffer, 0, buffer.length, 1000 + index, 'localhost')).toThrowError(); }); }); }); @@ -120,7 +120,7 @@ describe('mock-udp.overriddenSocketSend', () => { client.send(buffer, 0, buffer.length, 1000, 'localhost', () => { scope.done(); // eslint-disable-next-line no-magic-numbers - expect(client.send(buffer, 0, buffer.length, 1000, 'localhost')).toThrowError(); + expect(() => client.send(buffer, 0, buffer.length, 1000, 'localhost')).toThrowError(); done(void 0); }); }); @@ -131,7 +131,7 @@ describe('mock-udp.overriddenSocketSend', () => { const client = dgram.createSocket('udp4'); // eslint-disable-next-line no-magic-numbers - expect(client.send(buffer, buffer.length, buffer.length, 1000, 'localhost')).toThrowError(); + expect(() => client.send(buffer, buffer.length, buffer.length, 1000, 'localhost')).toThrowError(); expect(scope.done()).toBe(false); }); @@ -140,7 +140,7 @@ describe('mock-udp.overriddenSocketSend', () => { const client = dgram.createSocket('udp4'); // eslint-disable-next-line no-magic-numbers - expect(client.send(buffer, buffer.length + 1, buffer.length, 1000, 'localhost')).toThrowError(); + expect(() => client.send(buffer, buffer.length + 1, buffer.length, 1000, 'localhost')).toThrowError(); expect(scope.done()).toBe(false); }); @@ -149,7 +149,7 @@ describe('mock-udp.overriddenSocketSend', () => { const client = dgram.createSocket('udp4'); // eslint-disable-next-line no-magic-numbers - expect(client.send(buffer, 0, buffer.length + 1, 1000, 'localhost')).toThrowError(); + expect(() => client.send(buffer, 0, buffer.length + 1, 1000, 'localhost')).toThrowError(); expect(scope.done()).toBe(false); }); }); diff --git a/packages/ntpclient/src/index.test.ts b/packages/ntpclient/src/index.test.ts index 7aa59938..4537ce2f 100644 --- a/packages/ntpclient/src/index.test.ts +++ b/packages/ntpclient/src/index.test.ts @@ -58,6 +58,6 @@ describe.skip('NTP', () => { replyTimeout: SECOND_IN_MILLIS, server: 'google.com', }); - await expect(ntpClient.getNetworkTime()).rejects.toThrowError(); + await expect(ntpClient.getNetworkTime()).rejects.toThrowError(/Timeout/); }); }); From b838de181a97590b8180aa15e42c0d8a4c57b666 Mon Sep 17 00:00:00 2001 From: Florian Imdahl Date: Sun, 22 Feb 2026 14:38:09 +0100 Subject: [PATCH 3/3] fix auto-merge test --- packages/auto-merge/src/AutoMerge.test.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/auto-merge/src/AutoMerge.test.ts b/packages/auto-merge/src/AutoMerge.test.ts index 5e9264c6..d5cb5e03 100644 --- a/packages/auto-merge/src/AutoMerge.test.ts +++ b/packages/auto-merge/src/AutoMerge.test.ts @@ -53,7 +53,12 @@ describe('AutoMerge', () => { }); nock(autoMerge['baseURL']!) - .post(/^\/repos\/.+?\/.+?\/pulls\/\d+(\/(reviews|merge))?\/?$/) + .post(/^\/repos\/.+?\/.+?\/pulls\/\d+(\/reviews)?\/?$/) + .reply(HTTP_STATUS.OK, {data: 'not-used'}) + .persist(); + + nock(autoMerge['baseURL']!) + .put(/^\/repos\/.+?\/.+?\/pulls\/\d+(\/merge)?\/?$/) .reply(HTTP_STATUS.OK, {data: 'not-used'}) .persist();