mirror of
https://github.com/verdaccio/verdaccio.git
synced 2024-11-13 03:35:52 +01:00
106 lines
3.8 KiB
TypeScript
106 lines
3.8 KiB
TypeScript
|
import os from 'os';
|
||
|
import { findConfigFile } from '../src/config-path';
|
||
|
|
||
|
const mockmkDir = jest.fn();
|
||
|
const mockaccessSync = jest.fn();
|
||
|
const mockwriteFile = jest.fn();
|
||
|
|
||
|
jest.mock('fs', () => {
|
||
|
const fsOri = jest.requireActual('fs');
|
||
|
return {
|
||
|
...fsOri,
|
||
|
statSync: (path) => ({
|
||
|
isDirectory: () => {
|
||
|
if (path.match(/fail/)) {
|
||
|
throw Error('file does not exist');
|
||
|
}
|
||
|
return true;
|
||
|
},
|
||
|
}),
|
||
|
accessSync: (a) => mockaccessSync(a),
|
||
|
mkdirSync: (a) => mockmkDir(a),
|
||
|
writeFileSync: (a) => mockwriteFile(a),
|
||
|
};
|
||
|
});
|
||
|
|
||
|
jest.mock('fs');
|
||
|
|
||
|
describe('config-path', () => {
|
||
|
beforeEach(() => {
|
||
|
jest.clearAllMocks();
|
||
|
jest.resetAllMocks();
|
||
|
});
|
||
|
|
||
|
describe('findConfigFile', () => {
|
||
|
if (os.platform() !== 'win32') {
|
||
|
describe('using defiled location from arguments', () => {
|
||
|
test('with custom location', () => {
|
||
|
expect(findConfigFile('/home/user/custom/location/config.yaml')).toEqual(
|
||
|
'/home/user/custom/location/config.yaml'
|
||
|
);
|
||
|
expect(mockwriteFile).not.toHaveBeenCalled();
|
||
|
expect(mockmkDir).not.toHaveBeenCalled();
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe('whith env variables', () => {
|
||
|
test('with XDG_CONFIG_HOME if directory exist but config file is missing', () => {
|
||
|
process.env.XDG_CONFIG_HOME = '/home/user';
|
||
|
expect(findConfigFile()).toEqual('/home/user/verdaccio/config.yaml');
|
||
|
expect(mockwriteFile).toHaveBeenCalledWith('/home/user/verdaccio/config.yaml');
|
||
|
expect(mockmkDir).toHaveBeenCalledWith('/home/user/verdaccio');
|
||
|
});
|
||
|
|
||
|
test('with HOME if directory exist but config file is missing', () => {
|
||
|
delete process.env.XDG_CONFIG_HOME;
|
||
|
process.env.HOME = '/home/user';
|
||
|
expect(findConfigFile()).toEqual('/home/user/.config/verdaccio/config.yaml');
|
||
|
expect(mockwriteFile).toHaveBeenCalledWith('/home/user/.config/verdaccio/config.yaml');
|
||
|
expect(mockmkDir).toHaveBeenCalledWith('/home/user/.config/verdaccio');
|
||
|
});
|
||
|
|
||
|
describe('error handling', () => {
|
||
|
test('XDG_CONFIG_HOME is not directory fallback to default', () => {
|
||
|
process.env.XDG_CONFIG_HOME = '/home/user/fail';
|
||
|
mockaccessSync.mockImplementation(() => {});
|
||
|
mockwriteFile.mockImplementation(() => {});
|
||
|
expect(findConfigFile()).toMatch('packages/config/verdaccio/config.yaml');
|
||
|
});
|
||
|
|
||
|
test('no permissions on read default config file', () => {
|
||
|
process.env.XDG_CONFIG_HOME = '/home/user';
|
||
|
mockaccessSync.mockImplementation(() => {
|
||
|
throw new Error('error on write file');
|
||
|
});
|
||
|
|
||
|
expect(function () {
|
||
|
findConfigFile();
|
||
|
}).toThrow(/configuration file does not have enough permissions for reading/);
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe('with no env variables', () => {
|
||
|
test('with relative location', () => {
|
||
|
mockaccessSync.mockImplementation(() => {});
|
||
|
delete process.env.XDG_CONFIG_HOME;
|
||
|
delete process.env.HOME;
|
||
|
process.env.APPDATA = '/app/data/';
|
||
|
expect(findConfigFile()).toMatch('packages/config/verdaccio/config.yaml');
|
||
|
expect(mockwriteFile).toHaveBeenCalled();
|
||
|
expect(mockmkDir).toHaveBeenCalled();
|
||
|
});
|
||
|
});
|
||
|
} else {
|
||
|
test('with windows as directory exist but config file is missing', () => {
|
||
|
delete process.env.XDG_CONFIG_HOME;
|
||
|
delete process.env.HOME;
|
||
|
process.env.APPDATA = '/app/data/';
|
||
|
expect(findConfigFile()).toEqual('D:\\app\\data\\verdaccio\\config.yaml');
|
||
|
expect(mockwriteFile).toHaveBeenCalledWith('D:\\app\\data\\verdaccio\\config.yaml');
|
||
|
expect(mockmkDir).toHaveBeenCalledWith('D:\\app\\data\\verdaccio');
|
||
|
});
|
||
|
}
|
||
|
});
|
||
|
});
|