2023-10-23 04:39:35 -07:00
|
|
|
import { Container } from 'typedi';
|
|
|
|
import { mock } from 'jest-mock-extended';
|
|
|
|
import type { CredentialInformation } from 'n8n-workflow';
|
|
|
|
import { Cipher } from '@/Cipher';
|
2022-11-09 06:25:00 -08:00
|
|
|
import { Credentials } from '@/Credentials';
|
2023-10-23 04:39:35 -07:00
|
|
|
import type { InstanceSettings } from '@/InstanceSettings';
|
2019-06-23 03:35:23 -07:00
|
|
|
|
|
|
|
describe('Credentials', () => {
|
2023-10-23 04:39:35 -07:00
|
|
|
const cipher = new Cipher(mock<InstanceSettings>({ encryptionKey: 'password' }));
|
|
|
|
Container.set(Cipher, cipher);
|
|
|
|
|
|
|
|
const setDataKey = (credentials: Credentials, key: string, data: CredentialInformation) => {
|
|
|
|
let fullData;
|
|
|
|
try {
|
|
|
|
fullData = credentials.getData();
|
|
|
|
} catch (e) {
|
|
|
|
fullData = {};
|
|
|
|
}
|
|
|
|
fullData[key] = data;
|
|
|
|
return credentials.setData(fullData);
|
|
|
|
};
|
|
|
|
|
2020-10-22 06:46:03 -07:00
|
|
|
describe('without nodeType set', () => {
|
|
|
|
test('should be able to set and read key data without initial data set', () => {
|
2021-10-13 15:21:00 -07:00
|
|
|
const credentials = new Credentials({ id: null, name: 'testName' }, 'testType', []);
|
2019-06-23 03:35:23 -07:00
|
|
|
|
2020-10-22 06:46:03 -07:00
|
|
|
const key = 'key1';
|
|
|
|
const newData = 1234;
|
2019-06-23 03:35:23 -07:00
|
|
|
|
2023-10-23 04:39:35 -07:00
|
|
|
setDataKey(credentials, key, newData);
|
2019-06-23 03:35:23 -07:00
|
|
|
|
2023-10-23 04:39:35 -07:00
|
|
|
expect(credentials.getData()[key]).toEqual(newData);
|
2020-10-22 06:46:03 -07:00
|
|
|
});
|
2019-06-23 03:35:23 -07:00
|
|
|
|
2020-10-22 06:46:03 -07:00
|
|
|
test('should be able to set and read key data with initial data set', () => {
|
|
|
|
const key = 'key2';
|
2019-06-23 03:35:23 -07:00
|
|
|
|
2020-10-22 06:46:03 -07:00
|
|
|
// Saved under "key1"
|
|
|
|
const initialData = 4321;
|
|
|
|
const initialDataEncoded = 'U2FsdGVkX1+0baznXt+Ag/ub8A2kHLyoLxn/rR9h4XQ=';
|
2019-06-23 03:35:23 -07:00
|
|
|
|
2021-10-13 15:21:00 -07:00
|
|
|
const credentials = new Credentials(
|
|
|
|
{ id: null, name: 'testName' },
|
|
|
|
'testType',
|
|
|
|
[],
|
|
|
|
initialDataEncoded,
|
|
|
|
);
|
2019-06-23 03:35:23 -07:00
|
|
|
|
2020-10-22 06:46:03 -07:00
|
|
|
const newData = 1234;
|
2019-06-23 03:35:23 -07:00
|
|
|
|
2020-10-22 06:46:03 -07:00
|
|
|
// Set and read new data
|
2023-10-23 04:39:35 -07:00
|
|
|
setDataKey(credentials, key, newData);
|
|
|
|
expect(credentials.getData()[key]).toEqual(newData);
|
2019-06-23 03:35:23 -07:00
|
|
|
|
2020-10-22 06:46:03 -07:00
|
|
|
// Read the data which got provided encrypted on init
|
2023-10-23 04:39:35 -07:00
|
|
|
expect(credentials.getData().key1).toEqual(initialData);
|
2020-10-22 06:46:03 -07:00
|
|
|
});
|
2021-08-29 11:58:11 -07:00
|
|
|
});
|
|
|
|
|
2020-10-22 06:46:03 -07:00
|
|
|
describe('with nodeType set', () => {
|
|
|
|
test('should be able to set and read key data without initial data set', () => {
|
|
|
|
const nodeAccess = [
|
|
|
|
{
|
|
|
|
nodeType: 'base.noOp',
|
|
|
|
user: 'userName',
|
|
|
|
date: new Date(),
|
|
|
|
},
|
|
|
|
];
|
2021-08-29 11:58:11 -07:00
|
|
|
|
2021-10-13 15:21:00 -07:00
|
|
|
const credentials = new Credentials({ id: null, name: 'testName' }, 'testType', nodeAccess);
|
2021-08-29 11:58:11 -07:00
|
|
|
|
2020-10-22 06:46:03 -07:00
|
|
|
const key = 'key1';
|
|
|
|
const nodeType = 'base.noOp';
|
|
|
|
const newData = 1234;
|
2021-08-29 11:58:11 -07:00
|
|
|
|
2023-10-23 04:39:35 -07:00
|
|
|
setDataKey(credentials, key, newData);
|
2021-08-29 11:58:11 -07:00
|
|
|
|
2020-10-22 06:46:03 -07:00
|
|
|
// Should be able to read with nodeType which has access
|
2023-10-23 04:39:35 -07:00
|
|
|
expect(credentials.getData(nodeType)[key]).toEqual(newData);
|
2021-08-29 11:58:11 -07:00
|
|
|
|
2020-10-22 06:46:03 -07:00
|
|
|
// Should not be able to read with nodeType which does NOT have access
|
2023-10-23 04:39:35 -07:00
|
|
|
// expect(credentials.getData('base.otherNode')[key]).toThrowError(Error);
|
2020-10-22 06:46:03 -07:00
|
|
|
try {
|
2023-10-23 04:39:35 -07:00
|
|
|
credentials.getData('base.otherNode');
|
2020-10-22 06:46:03 -07:00
|
|
|
expect(true).toBe(false);
|
|
|
|
} catch (e) {
|
|
|
|
expect(e.message).toBe(
|
|
|
|
'The node of type "base.otherNode" does not have access to credentials "testName" of type "testType".',
|
|
|
|
);
|
|
|
|
}
|
2021-08-29 11:58:11 -07:00
|
|
|
|
2020-10-22 06:46:03 -07:00
|
|
|
// Get the data which will be saved in database
|
|
|
|
const dbData = credentials.getDataToSave();
|
|
|
|
expect(dbData.name).toEqual('testName');
|
|
|
|
expect(dbData.type).toEqual('testType');
|
|
|
|
expect(dbData.nodesAccess).toEqual(nodeAccess);
|
|
|
|
// Compare only the first 6 characters as the rest seems to change with each execution
|
|
|
|
expect(dbData.data!.slice(0, 6)).toEqual(
|
|
|
|
'U2FsdGVkX1+wpQWkj+YTzaPSNTFATjnlmFKIsUTZdhk='.slice(0, 6),
|
|
|
|
);
|
|
|
|
});
|
2021-08-29 11:58:11 -07:00
|
|
|
});
|
2019-06-23 03:35:23 -07:00
|
|
|
});
|