From a8afaa32e16d0fa1494a99a853dcabbf1ae410b2 Mon Sep 17 00:00:00 2001 From: Juan Picado Date: Sun, 4 Aug 2024 20:04:12 +0200 Subject: [PATCH] chore: migrate plugin local-storage --- packages/plugins/local-storage/jest.config.js | 10 - packages/plugins/local-storage/package.json | 2 +- .../local-storage/tests/dir-utils.test.ts | 1 + .../tests/local-database.test.ts | 16 +- .../local-storage/tests/local-fs.test.ts | 195 +++++++++--------- .../plugins/local-storage/tests/token.test.ts | 19 +- .../plugins/local-storage/tests/utils.test.ts | 32 +-- 7 files changed, 136 insertions(+), 139 deletions(-) delete mode 100644 packages/plugins/local-storage/jest.config.js diff --git a/packages/plugins/local-storage/jest.config.js b/packages/plugins/local-storage/jest.config.js deleted file mode 100644 index ea189b943..000000000 --- a/packages/plugins/local-storage/jest.config.js +++ /dev/null @@ -1,10 +0,0 @@ -const config = require('../../../jest/config'); - -module.exports = Object.assign({}, config, { - coverageThreshold: { - global: { - // FIXME: increase to 90 - lines: 51, - }, - }, -}); diff --git a/packages/plugins/local-storage/package.json b/packages/plugins/local-storage/package.json index 831ca212e..6907a63c6 100644 --- a/packages/plugins/local-storage/package.json +++ b/packages/plugins/local-storage/package.json @@ -58,7 +58,7 @@ }, "scripts": { "clean": "rimraf ./build", - "test": "jest --runInBand", + "test": "vitest run", "type-check": "tsc --noEmit -p tsconfig.build.json", "build:types": "tsc --emitDeclarationOnly -p tsconfig.build.json", "build:js": "babel src/ --out-dir build/ --copy-files --extensions \".ts,.tsx\" --source-maps", diff --git a/packages/plugins/local-storage/tests/dir-utils.test.ts b/packages/plugins/local-storage/tests/dir-utils.test.ts index 391cbc6fc..845572a7b 100644 --- a/packages/plugins/local-storage/tests/dir-utils.test.ts +++ b/packages/plugins/local-storage/tests/dir-utils.test.ts @@ -1,4 +1,5 @@ import { join } from 'path'; +import { describe, expect, test } from 'vitest'; import { getFolders, searchOnStorage } from '../src/dir-utils'; diff --git a/packages/plugins/local-storage/tests/local-database.test.ts b/packages/plugins/local-storage/tests/local-database.test.ts index 789c5f6e8..ed3a6437a 100644 --- a/packages/plugins/local-storage/tests/local-database.test.ts +++ b/packages/plugins/local-storage/tests/local-database.test.ts @@ -1,22 +1,23 @@ /* eslint-disable jest/no-mocks-import */ import path from 'path'; +import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest'; import { fileUtils, pluginUtils } from '@verdaccio/core'; import { logger, setup } from '@verdaccio/logger'; import LocalDatabase, { ERROR_DB_LOCKED } from '../src/local-database'; -const mockWrite = jest.fn(() => Promise.resolve()); -const mockmkdir = jest.fn(() => Promise.resolve()); -const mockRead = jest.fn(() => Promise.resolve()); +const mockWrite = vi.fn(() => Promise.resolve()); +const mockmkdir = vi.fn(() => Promise.resolve()); +const mockRead = vi.fn(() => Promise.resolve()); -jest.mock('../src/fs', () => ({ +vi.mock('../src/fs', () => ({ mkdirPromise: () => mockRead(), readFilePromise: () => mockmkdir(), writeFilePromise: () => mockWrite(), })); -setup(); +setup({}); const optionsPlugin: pluginUtils.PluginOptions = { logger, @@ -31,7 +32,6 @@ describe('Local Database', () => { beforeEach(async () => { tmpFolder = await fileUtils.createTempFolder('local-storage-plugin-'); const tempFolder = path.join(tmpFolder, 'verdaccio-test.yaml'); - // @ts-expect-error locaDatabase = new LocalDatabase( // @ts-expect-error { @@ -46,8 +46,8 @@ describe('Local Database', () => { }); afterEach(() => { - jest.resetAllMocks(); - jest.clearAllMocks(); + vi.resetAllMocks(); + vi.clearAllMocks(); }); test('should create an instance', () => { diff --git a/packages/plugins/local-storage/tests/local-fs.test.ts b/packages/plugins/local-storage/tests/local-fs.test.ts index e8fa99526..9534729a0 100644 --- a/packages/plugins/local-storage/tests/local-fs.test.ts +++ b/packages/plugins/local-storage/tests/local-fs.test.ts @@ -1,10 +1,11 @@ import fs from 'fs'; import path from 'path'; import { Readable } from 'stream'; +import { beforeEach, describe, expect, test, vi } from 'vitest'; import { fileUtils } from '@verdaccio/core'; import { createTempFolder } from '@verdaccio/test-helper'; -import { ILocalPackageManager, Logger, Manifest } from '@verdaccio/types'; +import { Logger, Manifest } from '@verdaccio/types'; import LocalDriver from '../src/local-fs'; import pkg from './__fixtures__/pkg'; @@ -21,15 +22,17 @@ function checkFileExists(filepath) { } const logger: Logger = { - error: jest.fn(), - info: jest.fn(), - debug: jest.fn(), - child: jest.fn(), - warn: jest.fn(), - http: jest.fn(), - trace: jest.fn(), + error: vi.fn(), + info: vi.fn(), + debug: vi.fn(), + child: vi.fn(), + warn: vi.fn(), + http: vi.fn(), + trace: vi.fn(), }; +vi.setConfig({ testTimeout: 20000 }); + describe('Local FS test', () => { let tmpFolder; beforeEach(async () => { @@ -40,7 +43,7 @@ describe('Local FS test', () => { describe.skip('deletePackage() group', () => { test('should delete a package', async () => { const localFs = new LocalDriver(path.join(localTempStorage, 'createPackage'), logger); - await localFs.createPackag('createPackage', pkg as unknown as Manifest); + await localFs.createPackage('createPackage', pkg as unknown as Manifest); // verdaccio removes the package.json instead the package name await localFs.deletePackage('package.json'); // verify if the `package.json` does not exist anymore @@ -60,119 +63,119 @@ describe('Local FS test', () => { }); test('should successfully remove the package', async () => { - const localFs: ILocalPackageManager = new LocalDriver( - path.join(localTempStorage, '_toDelete'), - logger - ); + const localFs = new LocalDriver(path.join(localTempStorage, '_toDelete'), logger); await expect(localFs.removePackage()).resolves.toBeUndefined(); }); test('removePackage() fails', async () => { - const localFs: ILocalPackageManager = new LocalDriver( - path.join(localTempStorage, '_toDelete_fake'), - logger - ); + const localFs = new LocalDriver(path.join(localTempStorage, '_toDelete_fake'), logger); await expect(localFs.removePackage()).rejects.toThrow(/ENOENT/); }); }); describe('writeTarballNext', () => { - test('should write a tarball', (done) => { - const abort = new AbortController(); - const tmp = createTempFolder('local-fs-write-tarball'); - const localFs = new LocalDriver(tmp, logger); - const readableStream = Readable.from('foooo'); - // TODO: verify file exist - localFs.writeTarball('juan-1.0.0.tgz', { signal: abort.signal }).then((stream) => { - stream.on('finish', () => { - done(); + test('should write a tarball', () => + new Promise((done) => { + const abort = new AbortController(); + const tmp = createTempFolder('local-fs-write-tarball'); + const localFs = new LocalDriver(tmp, logger); + const readableStream = Readable.from('foooo'); + // TODO: verify file exist + localFs.writeTarball('juan-1.0.0.tgz', { signal: abort.signal }).then((stream) => { + stream.on('finish', () => { + done(true); + }); + readableStream.pipe(stream); }); - readableStream.pipe(stream); - }); - }); + })); }); describe('writeTarballNextNoFolder', () => { - test('should write a tarball even if folder does not exist', (done) => { - const abort = new AbortController(); - const tmp = path.join(localTempStorage, 'local-fs-write-tarball-new-folder'); - const localFs = new LocalDriver(tmp, logger); - const readableStream = Readable.from('foooo'); - localFs.writeTarball('juan-1.0.0.tgz', { signal: abort.signal }).then((stream) => { - stream.on('finish', () => { - done(); + test('should write a tarball even if folder does not exist', () => + new Promise((done) => { + const abort = new AbortController(); + const tmp = path.join(localTempStorage, 'local-fs-write-tarball-new-folder'); + const localFs = new LocalDriver(tmp, logger); + const readableStream = Readable.from('foooo'); + localFs.writeTarball('juan-1.0.0.tgz', { signal: abort.signal }).then((stream) => { + stream.on('finish', () => { + done(true); + }); + readableStream.pipe(stream); }); - readableStream.pipe(stream); - }); - }); + })); }); describe('readTarballNext', () => { - test('should read a tarball', (done) => { - const abort = new AbortController(); - const localFs = new LocalDriver( - path.join(__dirname, '__fixtures__/readme-test-next'), - logger - ); - localFs.readTarball('test-readme-0.0.1.tgz', { signal: abort.signal }).then((stream) => { - stream.on('data', (data) => { - expect(data.length).toEqual(352); + test('should read a tarball', () => + new Promise((done) => { + const abort = new AbortController(); + const localFs = new LocalDriver( + path.join(__dirname, '__fixtures__/readme-test-next'), + logger + ); + localFs.readTarball('test-readme-0.0.1.tgz', { signal: abort.signal }).then((stream) => { + stream.on('data', (data) => { + expect(data.length).toEqual(352); + }); + stream.on('end', () => { + done(true); + }); }); - stream.on('end', () => { - done(); - }); - }); - }); + })); - test('should abort read a tarball', (done) => { - const abort = new AbortController(); - const localFs = new LocalDriver( - path.join(__dirname, '__fixtures__/readme-test-next'), - logger - ); - localFs.readTarball('test-readme-0.0.3.tgz', { signal: abort.signal }).then((stream) => { - stream.on('error', (error: any) => { - // FIXME: might be different results sometimes, need research - // expect(error.code).toEqual('ABORT_ERR'); - expect(error).toBeDefined(); - done(); + test('should abort read a tarball', () => + new Promise((done) => { + const abort = new AbortController(); + const localFs = new LocalDriver( + path.join(__dirname, '__fixtures__/readme-test-next'), + logger + ); + localFs.readTarball('test-readme-0.0.3.tgz', { signal: abort.signal }).then((stream) => { + stream.on('error', (error: any) => { + // FIXME: might be different results sometimes, need research + // expect(error.code).toEqual('ABORT_ERR'); + expect(error).toBeDefined(); + done(true); + }); + abort.abort(); }); - abort.abort(); - }); - }); + })); - test('fails on read a tarball doex not exist', (done) => { - const abort = new AbortController(); + test('fails on read a tarball doex not exist', () => + new Promise((done) => { + const abort = new AbortController(); - const localFs = new LocalDriver( - path.join(__dirname, '__fixtures__/readme-test-next'), - logger - ); - localFs.readTarball('does-not-exist-0.0.0.tgz', { signal: abort.signal }).then((stream) => { - stream.on('error', (error: any) => { - expect(error.code).toEqual('ENOENT'); - done(); + const localFs = new LocalDriver( + path.join(__dirname, '__fixtures__/readme-test-next'), + logger + ); + localFs.readTarball('does-not-exist-0.0.0.tgz', { signal: abort.signal }).then((stream) => { + stream.on('error', (error: any) => { + expect(error.code).toEqual('ENOENT'); + done(true); + }); }); - }); - }); + })); - test('should return content-length', (done) => { - const localFs = new LocalDriver( - path.join(__dirname, '__fixtures__/readme-test-next'), - logger - ); - const abort = new AbortController(); - localFs.readTarball('test-readme-0.0.0.tgz', { signal: abort.signal }).then((stream) => { - stream.on('data', (data) => { - expect(data.length).toEqual(352); - }); + test('should return content-length', () => + new Promise((done) => { + const localFs = new LocalDriver( + path.join(__dirname, '__fixtures__/readme-test-next'), + logger + ); + const abort = new AbortController(); + localFs.readTarball('test-readme-0.0.0.tgz', { signal: abort.signal }).then((stream) => { + stream.on('data', (data) => { + expect(data.length).toEqual(352); + }); - stream.on('content-length', (content) => { - expect(content).toEqual(352); - done(); + stream.on('content-length', (content) => { + expect(content).toEqual(352); + done(true); + }); }); - }); - }, 100000); + })); }); }); diff --git a/packages/plugins/local-storage/tests/token.test.ts b/packages/plugins/local-storage/tests/token.test.ts index 1a136ceb6..f652e004a 100644 --- a/packages/plugins/local-storage/tests/token.test.ts +++ b/packages/plugins/local-storage/tests/token.test.ts @@ -1,6 +1,7 @@ /* eslint-disable jest/no-mocks-import */ import fs from 'fs'; import path from 'path'; +import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest'; import { fileUtils } from '@verdaccio/core'; import { Logger, Token } from '@verdaccio/types'; @@ -8,13 +9,13 @@ import { Logger, Token } from '@verdaccio/types'; import LocalDatabase from '../src/local-database'; const logger: Logger = { - error: jest.fn(), - info: jest.fn(), - debug: jest.fn(), - child: jest.fn(), - warn: jest.fn(), - http: jest.fn(), - trace: jest.fn(), + error: vi.fn(), + info: vi.fn(), + debug: vi.fn(), + child: vi.fn(), + warn: vi.fn(), + http: vi.fn(), + trace: vi.fn(), }; describe('Local Database', () => { @@ -23,7 +24,7 @@ describe('Local Database', () => { beforeEach(async () => { tmpFolder = await fileUtils.createTempFolder('local-storage-plugin-'); const tempFolder = path.join(tmpFolder, 'verdaccio-test.yaml'); - const writeMock = jest.spyOn(fs, 'writeFileSync').mockImplementation(); + const writeMock = vi.spyOn(fs, 'writeFileSync').mockImplementation(() => {}); locaDatabase = new LocalDatabase( // @ts-expect-error { storage: 'storage', @@ -38,7 +39,7 @@ describe('Local Database', () => { }); afterEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); describe('token', () => { diff --git a/packages/plugins/local-storage/tests/utils.test.ts b/packages/plugins/local-storage/tests/utils.test.ts index 81a581f44..7e97d63a6 100644 --- a/packages/plugins/local-storage/tests/utils.test.ts +++ b/packages/plugins/local-storage/tests/utils.test.ts @@ -1,4 +1,5 @@ import path from 'path'; +import { beforeEach, describe, expect, test, vi } from 'vitest'; import { Logger } from '@verdaccio/types'; @@ -8,20 +9,20 @@ import { loadPrivatePackages } from '../src/pkg-utils'; import { _dbGenPath, findPackages } from '../src/utils'; const logger: Logger = { - error: jest.fn(), - info: jest.fn(), - debug: jest.fn(), - child: jest.fn(), - warn: jest.fn(), - http: jest.fn(), - trace: jest.fn(), + error: vi.fn(), + info: vi.fn(), + debug: vi.fn(), + child: vi.fn(), + warn: vi.fn(), + http: vi.fn(), + trace: vi.fn(), }; describe('Utitlies', () => { const loadDb = (name): string => path.join(__dirname, '__fixtures__/databases', `${name}.json`); beforeEach(() => { - jest.resetModules(); + vi.resetModules(); }); test('should load private packages', async () => { @@ -45,7 +46,7 @@ describe('Utitlies', () => { }); test('should handle null read values and return empty database', async () => { - const spy = jest.spyOn(readFile, 'readFilePromise'); + const spy = vi.spyOn(readFile, 'readFilePromise'); spy.mockResolvedValue(null); const database = loadDb('ok'); const db = await loadPrivatePackages(database, logger); @@ -60,7 +61,7 @@ describe('Utitlies', () => { try { await findPackages( './no_such_folder_fake', - jest.fn(() => true) + vi.fn(() => true) ); } catch (e: any) { expect(e.code).toEqual(noSuchFile); @@ -69,7 +70,7 @@ describe('Utitlies', () => { test('should fetch all packages from valid storage', async () => { const storage = path.join(__dirname, '__fixtures__/findPackages'); - const validator = jest.fn((file) => file.indexOf('.') === -1); + const validator = vi.fn((file) => file.indexOf('.') === -1); const pkgs = await findPackages(storage, validator); // the result is 7 due number of packages on "findPackages" directory expect(pkgs).toHaveLength(5); @@ -82,7 +83,7 @@ describe('Utitlies', () => { expect( _dbGenPath('local.db', { storage: './storage', - config_path: '/etc/foo/config.yaml', + configPath: '/etc/foo/config.yaml', }) ).toMatch('local.db'); }); @@ -91,7 +92,7 @@ describe('Utitlies', () => { expect( _dbGenPath('local.db', { storage: '', - config_path: '/etc/foo/config.yaml', + configPath: '/etc/foo/config.yaml', }) ).toMatch('local.db'); }); @@ -100,7 +101,7 @@ describe('Utitlies', () => { expect( _dbGenPath('local.db', { storage: '', - config_path: '/etc/foo/config.yaml', + configPath: '/etc/foo/config.yaml', }) ).toMatch('local.db'); }); @@ -109,7 +110,8 @@ describe('Utitlies', () => { expect( _dbGenPath('local.db', { storage: './storage', - config_path: undefined, + // @ts-expect-error + configPath: undefined, }) ).toMatch('local.db'); });