| import { UnexpectedError } from 'n8n-workflow'; | |
| import nock from 'nock'; | |
| import { verifyIntegrity } from '../npm-utils'; | |
| describe('verifyIntegrity', () => { | |
| const registryUrl = 'https://registry.npmjs.org'; | |
| const packageName = 'test-package'; | |
| const version = '1.0.0'; | |
| const integrity = 'sha512-hash=='; | |
| afterEach(() => { | |
| nock.cleanAll(); | |
| }); | |
| it('should verify integrity successfully', async () => { | |
| nock(registryUrl) | |
| .get(`/${encodeURIComponent(packageName)}/${version}`) | |
| .reply(200, { | |
| dist: { integrity }, | |
| }); | |
| await expect( | |
| verifyIntegrity(packageName, version, registryUrl, integrity), | |
| ).resolves.not.toThrow(); | |
| }); | |
| it('should throw error if checksum does not match', async () => { | |
| const wrongHash = 'sha512-nottherighthash=='; | |
| nock(registryUrl) | |
| .get(`/${encodeURIComponent(packageName)}/${version}`) | |
| .reply(200, { | |
| dist: { integrity }, | |
| }); | |
| await expect(verifyIntegrity(packageName, version, registryUrl, wrongHash)).rejects.toThrow( | |
| UnexpectedError, | |
| ); | |
| }); | |
| it('should throw error if metadata request fails', async () => { | |
| nock(registryUrl) | |
| .get(`/${encodeURIComponent(packageName)}/${version}`) | |
| .reply(500); | |
| await expect(verifyIntegrity(packageName, version, registryUrl, integrity)).rejects.toThrow(); | |
| }); | |
| it('should throw UnexpectedError and preserve original error as cause', async () => { | |
| const integrity = 'sha512-somerandomhash=='; | |
| nock(registryUrl) | |
| .get(`/${encodeURIComponent(packageName)}/${version}`) | |
| .replyWithError('Network failure'); | |
| try { | |
| await verifyIntegrity(packageName, version, registryUrl, integrity); | |
| throw new Error('Expected error was not thrown'); | |
| } catch (error: any) { | |
| expect(error).toBeInstanceOf(UnexpectedError); | |
| expect(error.message).toBe('Checksum verification failed'); | |
| expect(error.cause).toBeDefined(); | |
| expect(error.cause.message).toContain('Network failure'); | |
| } | |
| }); | |
| }); | |