UNPKG

@tsmx/secure-config-tool

Version:

Command-line tool for @tsmx/secure-config.

176 lines (159 loc) 9.35 kB
const { verifyEncryptedJson, verifyUnencryptedJson, verifyUnencryptedJsonArray, verifyEncryptedValue } = require('./test-utils'); describe('secure-config-tool create-file test suite', () => { var testOutput = []; const originalConsoleLog = console.log; const testConsoleLog = (output) => { testOutput.push(output); }; const unencryptedHost = '127.0.0.1'; const unencryptedUsername = 'SecretDbUser'; const unencryptedPassword = 'SecretDbPassword'; const unencryptedDatabase = 'MyDB'; const unencryptedArrayItemValue1 = 'arrayItemValue1'; const unencryptedArrayItemValue2 = 'arrayItemValue2'; const unencryptedSubArrayItemValue1 = 'subArrayItemValue1'; const TEST_KEY = 'iC771qNLe+OGVcduw8fqpDIIK7lK0T5p'; const TEST_KEY_HEX = '9af7d400be4705147dc724db25bfd2513aa11d6013d7bf7bdb2bfe050593bd0f'; beforeEach(() => { delete process.env['CONFIG_ENCRYPTION_KEY']; jest.resetModules(); console.log = testConsoleLog; testOutput = []; }); afterEach(() => { console.log = originalConsoleLog; }); it('tests a successful command line file encryption with default patterns', () => { process.env['CONFIG_ENCRYPTION_KEY'] = TEST_KEY; const createFile = require('../functions/create-file'); createFile('./test/testfiles/config.json'); expect(testOutput.length).toBe(1); let encryptedJson = JSON.parse(testOutput[0]); verifyEncryptedJson(encryptedJson); }); it('tests a successful command line file encryption with a hex key and default patterns', () => { process.env['CONFIG_ENCRYPTION_KEY'] = TEST_KEY_HEX; const oh = require('@tsmx/object-hmac'); const originalConfig = require('./testfiles/config.json'); const expectedHmac = oh.calculateHmac(originalConfig, TEST_KEY_HEX); const createFile = require('../functions/create-file'); createFile('./test/testfiles/config.json'); expect(testOutput.length).toBe(1); let encryptedJson = JSON.parse(testOutput[0]); verifyEncryptedJson(encryptedJson); verifyUnencryptedJsonArray(encryptedJson); expect(encryptedJson['__hmac']).toBeDefined(); expect(encryptedJson['__hmac']).toStrictEqual(expectedHmac); }); it('tests a successful command line file encryption with a hex key and custom patterns', () => { process.env['CONFIG_ENCRYPTION_KEY'] = TEST_KEY_HEX; const oh = require('@tsmx/object-hmac'); const originalConfig = require('./testfiles/config.json'); const expectedHmac = oh.calculateHmac(originalConfig, TEST_KEY_HEX); const createFile = require('../functions/create-file'); createFile('./test/testfiles/config.json', { patterns: 'host,pass' }); expect(testOutput.length).toBe(1); let encryptedJson = JSON.parse(testOutput[0]); expect(encryptedJson).toBeDefined(); expect(encryptedJson.database).toBeDefined(); expect(encryptedJson.database.host).toBeDefined(); verifyEncryptedValue(encryptedJson.database.host, unencryptedHost); expect(encryptedJson.database.username).toBeDefined(); expect(encryptedJson.database.username).toBe(unencryptedUsername); expect(encryptedJson.database.password).toBeDefined(); verifyEncryptedValue(encryptedJson.database.password, unencryptedPassword); verifyUnencryptedJsonArray(encryptedJson); expect(encryptedJson['__hmac']).toBeDefined(); expect(encryptedJson['__hmac']).toStrictEqual(expectedHmac); }); it('tests a successful command line file encryption with a hex key and custom patterns and object array encryption', () => { process.env['CONFIG_ENCRYPTION_KEY'] = TEST_KEY_HEX; const oh = require('@tsmx/object-hmac'); const originalConfig = require('./testfiles/config.json'); const expectedHmac = oh.calculateHmac(originalConfig, TEST_KEY_HEX); const createFile = require('../functions/create-file'); createFile('./test/testfiles/config.json', { patterns: 'host,pass,itemkey' }); expect(testOutput.length).toBe(1); let encryptedJson = JSON.parse(testOutput[0]); expect(encryptedJson).toBeDefined(); expect(encryptedJson.database).toBeDefined(); expect(encryptedJson.database.host).toBeDefined(); verifyEncryptedValue(encryptedJson.database.host, unencryptedHost); expect(encryptedJson.database.username).toBeDefined(); expect(encryptedJson.database.username).toBe(unencryptedUsername); expect(encryptedJson.database.password).toBeDefined(); verifyEncryptedValue(encryptedJson.database.password, unencryptedPassword); expect(encryptedJson.testarray).toBeDefined(); expect(encryptedJson.testarray.length).toStrictEqual(6); verifyEncryptedValue(encryptedJson.testarray[3].arrayItemKey, unencryptedArrayItemValue1); verifyEncryptedValue(encryptedJson.testarray[4].arrayItemKey, unencryptedArrayItemValue2); verifyEncryptedValue(encryptedJson.testarray[5][0].subArrayItemKey, unencryptedSubArrayItemValue1); expect(encryptedJson['__hmac']).toBeDefined(); expect(encryptedJson['__hmac']).toStrictEqual(expectedHmac); }); it('tests a successful command line file encryption with a hex key and custom patterns and an ambiguous property name', () => { process.env['CONFIG_ENCRYPTION_KEY'] = TEST_KEY_HEX; const oh = require('@tsmx/object-hmac'); const originalConfig = require('./testfiles/config-ambiguous-prop.json'); const expectedHmac = oh.calculateHmac(originalConfig, TEST_KEY_HEX); const createFile = require('../functions/create-file'); createFile('./test/testfiles/config-ambiguous-prop.json', { patterns: 'host,pass,database' }); expect(testOutput.length).toBe(1); let encryptedJson = JSON.parse(testOutput[0]); expect(encryptedJson).toBeDefined(); expect(encryptedJson.database).toBeDefined(); expect(encryptedJson.database.host).toBeDefined(); verifyEncryptedValue(encryptedJson.database.host, unencryptedHost); expect(encryptedJson.database.username).toBeDefined(); expect(encryptedJson.database.username).toBe(unencryptedUsername); expect(encryptedJson.database.password).toBeDefined(); verifyEncryptedValue(encryptedJson.database.password, unencryptedPassword); expect(encryptedJson.database.database).toBeDefined(); verifyEncryptedValue(encryptedJson.database.database, unencryptedDatabase); expect(encryptedJson['__hmac']).toBeDefined(); expect(encryptedJson['__hmac']).toStrictEqual(expectedHmac); }); it('tests a successful command line file encryption without HMAC generation', () => { process.env['CONFIG_ENCRYPTION_KEY'] = TEST_KEY_HEX; const createFile = require('../functions/create-file'); createFile('./test/testfiles/config.json', { hmac: false }); expect(testOutput.length).toBe(1); let encryptedJson = JSON.parse(testOutput[0]); expect(encryptedJson['__hmac']).toBeUndefined(); }); it('tests a successful command line file encryption with a custom HMAC property', () => { process.env['CONFIG_ENCRYPTION_KEY'] = TEST_KEY_HEX; const oh = require('@tsmx/object-hmac'); const originalConfig = require('./testfiles/config.json'); const expectedHmac = oh.calculateHmac(originalConfig, TEST_KEY_HEX); const createFile = require('../functions/create-file'); createFile('./test/testfiles/config.json', { hmacProp: '_signature' }); expect(testOutput.length).toBe(1); let encryptedJson = JSON.parse(testOutput[0]); expect(encryptedJson).toBeDefined(); expect(encryptedJson['_signature']).toBeDefined(); expect(encryptedJson['_signature']).toStrictEqual(expectedHmac); }); it('tests a successful command line processing without any encryption but HMAC generation with a hex key', () => { process.env['CONFIG_ENCRYPTION_KEY'] = TEST_KEY_HEX; const oh = require('@tsmx/object-hmac'); const originalConfig = require('./testfiles/config.json'); const expectedHmac = oh.calculateHmac(originalConfig, TEST_KEY_HEX); const createFile = require('../functions/create-file'); createFile('./test/testfiles/config.json', { encryption: false }); expect(testOutput.length).toBe(1); let unencryptedJson = JSON.parse(testOutput[0]); verifyUnencryptedJson(unencryptedJson); verifyUnencryptedJsonArray(unencryptedJson); expect(unencryptedJson['__hmac']).toBeDefined(); expect(unencryptedJson['__hmac']).toStrictEqual(expectedHmac); }); it('tests a failed command line file encryption because of a missing key', () => { const mockExit = jest.spyOn(process, 'exit') .mockImplementation((number) => { throw new Error('process.exit: ' + number); }); const createFile = require('../functions/create-file'); expect(() => { createFile('./test/testfiles/config.json'); }).toThrow(); expect(mockExit).toHaveBeenCalledWith(-1); mockExit.mockRestore(); }); });