2021-01-02 08:11:32 +01:00
|
|
|
/* eslint-disable jest/no-mocks-import */
|
|
|
|
import fs from 'fs';
|
2021-09-08 19:06:37 +02:00
|
|
|
import path from 'path';
|
|
|
|
import { dirSync } from 'tmp-promise';
|
2021-10-29 17:33:05 +02:00
|
|
|
|
2021-10-03 14:21:01 +02:00
|
|
|
import { Logger, Token } from '@verdaccio/types';
|
2021-01-02 08:11:32 +01:00
|
|
|
|
|
|
|
import LocalDatabase from '../src/local-database';
|
|
|
|
|
2021-10-03 14:21:01 +02:00
|
|
|
const logger: Logger = {
|
|
|
|
error: jest.fn(),
|
|
|
|
info: jest.fn(),
|
|
|
|
debug: jest.fn(),
|
|
|
|
child: jest.fn(),
|
|
|
|
warn: jest.fn(),
|
|
|
|
http: jest.fn(),
|
|
|
|
trace: jest.fn(),
|
|
|
|
};
|
2021-01-02 08:11:32 +01:00
|
|
|
|
|
|
|
describe('Local Database', () => {
|
2021-09-08 19:06:37 +02:00
|
|
|
let tmpFolder;
|
|
|
|
let locaDatabase;
|
|
|
|
beforeEach(async () => {
|
|
|
|
tmpFolder = dirSync({ unsafeCleanup: true });
|
|
|
|
const tempFolder = path.join(tmpFolder.name, 'verdaccio-test.yaml');
|
2021-01-02 08:11:32 +01:00
|
|
|
const writeMock = jest.spyOn(fs, 'writeFileSync').mockImplementation();
|
2021-09-08 19:06:37 +02:00
|
|
|
locaDatabase = new LocalDatabase( // @ts-expect-error
|
|
|
|
{
|
|
|
|
storage: 'storage',
|
|
|
|
config_path: tempFolder,
|
|
|
|
checkSecretKey: () => 'fooX',
|
|
|
|
},
|
|
|
|
logger
|
|
|
|
);
|
|
|
|
await (locaDatabase as any).init();
|
|
|
|
(locaDatabase as any).clean();
|
2021-01-02 08:11:32 +01:00
|
|
|
writeMock.mockClear();
|
|
|
|
});
|
|
|
|
|
|
|
|
afterEach(() => {
|
|
|
|
jest.clearAllMocks();
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('token', () => {
|
|
|
|
let token: Token = {
|
|
|
|
user: 'someUser',
|
2021-09-08 19:06:37 +02:00
|
|
|
token: 'foo..foo',
|
2021-01-02 08:11:32 +01:00
|
|
|
key: 'someHash',
|
|
|
|
readonly: true,
|
2021-09-08 19:06:37 +02:00
|
|
|
created: 1234,
|
2021-01-02 08:11:32 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
test('should save and get token', async () => {
|
|
|
|
await locaDatabase.saveToken(token);
|
|
|
|
const tokens = await locaDatabase.readTokens({ user: token.user });
|
|
|
|
expect(tokens).toHaveLength(1);
|
|
|
|
expect(tokens[0]).toEqual(token);
|
|
|
|
});
|
|
|
|
|
|
|
|
test('should revoke and get token', async () => {
|
|
|
|
await locaDatabase.saveToken(token);
|
|
|
|
const tokens = await locaDatabase.readTokens({ user: token.user });
|
|
|
|
expect(tokens).toHaveLength(1);
|
|
|
|
expect(tokens[0]).toEqual(token);
|
|
|
|
await locaDatabase.deleteToken(token.user, token.key);
|
|
|
|
const tokens2 = await locaDatabase.readTokens({ user: token.user });
|
|
|
|
expect(tokens2).toHaveLength(0);
|
|
|
|
});
|
|
|
|
|
|
|
|
test('should fail on revoke', async () => {
|
|
|
|
await expect(locaDatabase.deleteToken({ user: 'foo', key: 'bar' })).rejects.toThrow(
|
|
|
|
'user not found'
|
|
|
|
);
|
|
|
|
});
|
|
|
|
|
|
|
|
test('should verify save more than one token', async () => {
|
|
|
|
await locaDatabase.saveToken(token);
|
|
|
|
const tokens = await locaDatabase.readTokens({ user: token.user });
|
|
|
|
expect(tokens).toHaveLength(1);
|
|
|
|
expect(tokens[0]).toEqual(token);
|
|
|
|
await locaDatabase.saveToken({ ...token, key: 'foo' });
|
|
|
|
expect(tokens).toHaveLength(2);
|
|
|
|
expect(tokens[1].key).toEqual('foo');
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|