UNPKG

@querc/squidex-client

Version:

NodeJS client for the [Squidex](https://squidex.io/) CMS

212 lines (206 loc) 29.1 kB
"use strict"; require("jest"); var _content = require("./content"); var _httpClient = require("../http/http-client"); var _authenticationManager = require("../authentication/authentication-manager"); var _squidexQuery = require("./squidex-query"); jest.mock('../http/http-client'); const TOKEN = 'abc-123'; const CONFIG = { url: 'https://foo', appName: 'my-app', clientId: 'my-app:default', clientSecret: 'SEKRIT' }; describe('Content Schema should...', () => { let httpClient; let authenticationManager; let contentSchema; beforeEach(() => { // Mock the API response _httpClient.HttpClient.prototype.send = jest.fn().mockResolvedValue({ items: [{ data: { test: 'TEST1' }, created: '1970-01-01T00:00:00.000Z', lastModified: '1978-01-24T03:17:00.000Z' }, { data: { test: 'TEST2' }, created: '1970-01-01T00:00:00.000Z', lastModified: '1978-01-24T03:17:00.000Z' }, { data: { test: 'TEST3' }, created: '1970-01-01T00:00:00.000Z', lastModified: '1978-01-24T03:17:00.000Z' }] }); httpClient = new _httpClient.HttpClient(); _authenticationManager.AuthenticationManager.prototype.authenticate = jest.fn().mockResolvedValue(TOKEN); authenticationManager = new _authenticationManager.AuthenticationManager(CONFIG, httpClient); contentSchema = new _content.ContentSchema(CONFIG, httpClient, authenticationManager); contentSchema.schema = 'test'; }); test('exist', () => { expect(_authenticationManager.AuthenticationManager).toBeDefined(); }); test('call the API server', async () => { await contentSchema.query(); expect(httpClient.send).toHaveBeenCalledTimes(1); expect(httpClient.send).toHaveBeenCalledWith(expect.objectContaining({ path: '/api/content/my-app/test/?' })); }); test('send the token', async () => { await contentSchema.query(); expect(httpClient.send).toHaveBeenCalledTimes(1); expect(httpClient.send).toHaveBeenCalledWith(expect.objectContaining({ token: 'abc-123' })); }); test('include the serialised query in the URL', async () => { await contentSchema.query({ $top: 10 }); expect(httpClient.send).toHaveBeenCalledTimes(1); expect(httpClient.send).toHaveBeenCalledWith(expect.objectContaining({ path: '/api/content/my-app/test/?%24top=10' })); }); test('include drafts', async () => { await contentSchema.query({}, true); expect(httpClient.send).toHaveBeenCalledTimes(1); expect(httpClient.send).toHaveBeenCalledWith(expect.objectContaining({ draft: true })); }); test('deserialise dates correctly', async () => { const result = await contentSchema.query(); expect(result.items[0].created).toBeInstanceOf(Date); expect(result.items[0].created.getFullYear()).toBe(1970); expect(result.items[0].lastModified).toBeInstanceOf(Date); expect(result.items[0].lastModified.getFullYear()).toBe(1978); }); test('not overwrite JSON query for querySingle()', async () => { const query = new _squidexQuery.SquidexJsonQuery(); query.q = { skip: 2 }; await contentSchema.querySingle(query); expect(httpClient.send).toHaveBeenCalledTimes(1); expect(httpClient.send).toHaveBeenCalledWith(expect.objectContaining({ path: '/api/content/my-app/test/?q=%7B%22skip%22%3A2%7D' })); }); test('only request the first result for querySingle()', async () => { await contentSchema.querySingle(); expect(httpClient.send).toHaveBeenCalledTimes(1); expect(httpClient.send).toHaveBeenCalledWith(expect.objectContaining({ path: '/api/content/my-app/test/?%24top=1' })); }); test('return all data for query()', async () => { const result = await contentSchema.query(); expect(result.items.length).toBe(3); }); test('return first result for querySingle()', async () => { const result = await contentSchema.querySingle(); expect(result).toMatchObject({ data: { test: 'TEST1' } }); }); test('send a POST request with the content for create()', async () => { await contentSchema.create({ test: 'TEST' }); expect(httpClient.send).toHaveBeenCalledTimes(1); expect(httpClient.send).toHaveBeenCalledWith(expect.objectContaining({ path: '/api/content/my-app/test/?publish=false', method: 'POST', data: { test: 'TEST' } })); }); test('include the publish parameter for create({}, true)', async () => { await contentSchema.create({}, true); expect(httpClient.send).toHaveBeenCalledTimes(1); expect(httpClient.send).toHaveBeenCalledWith(expect.objectContaining({ path: '/api/content/my-app/test/?publish=true' })); }); test('send a PUT request with the content for update()', async () => { await contentSchema.update('123-456', { test: 'TEST' }); expect(httpClient.send).toHaveBeenCalledTimes(1); expect(httpClient.send).toHaveBeenCalledWith(expect.objectContaining({ path: '/api/content/my-app/test/123-456', method: 'PUT', data: { test: 'TEST' } })); }); test('send a PATCH request with the content for patch()', async () => { await contentSchema.patch('123-456', { test: 'TEST' }); expect(httpClient.send).toHaveBeenCalledTimes(1); expect(httpClient.send).toHaveBeenCalledWith(expect.objectContaining({ path: '/api/content/my-app/test/123-456', method: 'PATCH', data: { test: 'TEST' } })); }); test('send a DELETE request for delete()', async () => { await contentSchema.delete('123-456'); expect(httpClient.send).toHaveBeenCalledTimes(1); expect(httpClient.send).toHaveBeenCalledWith(expect.objectContaining({ path: '/api/content/my-app/test/123-456', method: 'DELETE' })); }); test('send a PUT request for updateStatus()', async () => { await contentSchema.updateStatus('123-456', { status: 'Testing' }); expect(httpClient.send).toHaveBeenCalledTimes(1); expect(httpClient.send).toHaveBeenCalledWith(expect.objectContaining({ path: '/api/content/my-app/test/123-456/status', method: 'PUT' })); }); test('send DueTime for updateStatus() if provided', async () => { await contentSchema.updateStatus('123-456', { status: 'Testing', dueTime: new Date('2424-01-24T00:00Z') }); expect(httpClient.send).toHaveBeenCalledTimes(1); expect(httpClient.send).toHaveBeenCalledWith(expect.objectContaining({ path: '/api/content/my-app/test/123-456/status', method: 'PUT', data: { DueTime: '2424-01-24T00:00:00.000Z', Status: 'Testing' } })); }); test('send a PUT request for discard()', async () => { await contentSchema.discard('123-456'); expect(httpClient.send).toHaveBeenCalledTimes(1); expect(httpClient.send).toHaveBeenCalledWith(expect.objectContaining({ path: '/api/content/my-app/test/123-456/discard', method: 'PUT' })); }); }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY2hlbWFzL2NvbnRlbnQudGVzdC50cyJdLCJuYW1lcyI6WyJqZXN0IiwibW9jayIsIlRPS0VOIiwiQ09ORklHIiwidXJsIiwiYXBwTmFtZSIsImNsaWVudElkIiwiY2xpZW50U2VjcmV0IiwiZGVzY3JpYmUiLCJodHRwQ2xpZW50IiwiYXV0aGVudGljYXRpb25NYW5hZ2VyIiwiY29udGVudFNjaGVtYSIsImJlZm9yZUVhY2giLCJIdHRwQ2xpZW50IiwicHJvdG90eXBlIiwic2VuZCIsImZuIiwibW9ja1Jlc29sdmVkVmFsdWUiLCJpdGVtcyIsImRhdGEiLCJ0ZXN0IiwiY3JlYXRlZCIsImxhc3RNb2RpZmllZCIsIkF1dGhlbnRpY2F0aW9uTWFuYWdlciIsImF1dGhlbnRpY2F0ZSIsIkNvbnRlbnRTY2hlbWEiLCJzY2hlbWEiLCJleHBlY3QiLCJ0b0JlRGVmaW5lZCIsInF1ZXJ5IiwidG9IYXZlQmVlbkNhbGxlZFRpbWVzIiwidG9IYXZlQmVlbkNhbGxlZFdpdGgiLCJvYmplY3RDb250YWluaW5nIiwicGF0aCIsInRva2VuIiwiJHRvcCIsImRyYWZ0IiwicmVzdWx0IiwidG9CZUluc3RhbmNlT2YiLCJEYXRlIiwiZ2V0RnVsbFllYXIiLCJ0b0JlIiwiU3F1aWRleEpzb25RdWVyeSIsInEiLCJza2lwIiwicXVlcnlTaW5nbGUiLCJsZW5ndGgiLCJ0b01hdGNoT2JqZWN0IiwiY3JlYXRlIiwibWV0aG9kIiwidXBkYXRlIiwicGF0Y2giLCJkZWxldGUiLCJ1cGRhdGVTdGF0dXMiLCJzdGF0dXMiLCJkdWVUaW1lIiwiRHVlVGltZSIsIlN0YXR1cyIsImRpc2NhcmQiXSwibWFwcGluZ3MiOiI7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0FBLElBQUksQ0FBQ0MsSUFBTCxDQUFVLHFCQUFWO0FBRUEsTUFBTUMsS0FBSyxHQUFHLFNBQWQ7QUFDQSxNQUFNQyxNQUFNLEdBQUc7QUFDWEMsRUFBQUEsR0FBRyxFQUFFLGFBRE07QUFF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LEVBQXNDO0FBQUVDLE1BQUFBLE1BQU0sRUFBRSxTQUFWO0FBQXFCQyxNQUFBQSxPQUFPLEVBQUUsSUFBSWhCLElBQUosQ0FBUyxtQkFBVDtBQUE5QixLQUF0QyxDQUFOO0FBRUFaLElBQUFBLE1BQU0sQ0FBQ2xCLFVBQVUsQ0FBQ00sSUFBWixDQUFOLENBQXdCZSxxQkFBeEIsQ0FBOEMsQ0FBOUM7QUFDQUgsSUFBQUEsTUFBTSxDQUFDbEIsVUFBVSxDQUFDTSxJQUFaLENBQU4sQ0FBd0JnQixvQkFBeEIsQ0FDSUosTUFBTSxDQUFDSyxnQkFBUCxDQUF3QjtBQUNwQkMsTUFBQUEsSUFBSSxFQUFFLHlDQURjO0FBRXBCZ0IsTUFBQUEsTUFBTSxFQUFFLEtBRlk7QUFHcEI5QixNQUFBQSxJQUFJLEVBQUU7QUFBRXFDLFFBQUFBLE9BQU8sRUFBRSwwQkFBWDtBQUF1Q0MsUUFBQUEsTUFBTSxFQUFFO0FBQS9DO0FBSGMsS0FBeEIsQ0FESjtBQU9ILEdBWEcsQ0FBSjtBQWFBckMsRUFBQUEsSUFBSSxDQUFDLGtDQUFELEVBQXFDLFlBQVk7QUFDakQsVUFBTVQsYUFBYSxDQUFDK0MsT0FBZCxDQUFzQixTQUF0QixDQUFOO0FBRUEvQixJQUFBQSxNQUFNLENBQUNsQixVQUFVLENBQUNNLElBQVosQ0FBTixDQUF3QmUscUJBQXhCLENBQThDLENBQTlDO0FBQ0FILElBQUFBLE1BQU0sQ0FBQ2xCLFVBQVUsQ0FBQ00sSUFBWixDQUFOLENBQXdCZ0Isb0JBQXhCLENBQ0lKLE1BQU0sQ0FBQ0ssZ0JBQVAsQ0FBd0I7QUFDcEJDLE1BQUFBLElBQUksRUFBRSwwQ0FEYztBQUVwQmdCLE1BQUFBLE1BQU0sRUFBRTtBQUZZLEtBQXhCLENBREo7QUFNSCxHQVZHLENBQUo7QUFXSCxDQW5PTyxDQUFSIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICdqZXN0JztcbmltcG9ydCB7IENvbnRlbnRTY2hlbWEgfSBmcm9tICcuL2NvbnRlbnQnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJy4uL2h0dHAvaHR0cC1jbGllbnQnO1xuaW1wb3J0IHsgQXV0aGVudGljYXRpb25NYW5hZ2VyIH0gZnJvbSAnLi4vYXV0aGVudGljYXRpb24vYXV0aGVudGljYXRpb24tbWFuYWdlcic7XG5pbXBvcnQgeyBTcXVpZGV4SnNvblF1ZXJ5IH0gZnJvbSAnLi9zcXVpZGV4LXF1ZXJ5Jztcbmplc3QubW9jaygnLi4vaHR0cC9odHRwLWNsaWVudCcpO1xuXG5jb25zdCBUT0tFTiA9ICdhYmMtMTIzJztcbmNvbnN0IENPTkZJRyA9IHtcbiAgICB1cmw6ICdodHRwczovL2ZvbycsXG4gICAgYXBwTmFtZTogJ215LWFwcCcsXG4gICAgY2xpZW50SWQ6ICdteS1hcHA6ZGVmYXVsdCcsXG4gICAgY2xpZW50U2VjcmV0OiAnU0VLUklUJyxcbn07XG5cbmRlc2NyaWJlKCdDb250ZW50IFNjaGVtYSBzaG91bGQuLi4nLCAoKSA9PiB7XG4gICAgbGV0IGh0dHBDbGllbnQ6IEh0dHBDbGllbnQ7XG4gICAgbGV0IGF1dGhlbnRpY2F0aW9uTWFuYWdlcjogQXV0aGVudGljYXRpb25NYW5hZ2VyO1xuICAgIGxldCBjb250ZW50U2NoZW1hOiBDb250ZW50U2NoZW1hO1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgIC8vIE1vY2sgdGhlIEFQSSByZXNwb25zZVxuICAgICAgICBIdHRwQ2xpZW50LnByb3RvdHlwZS5zZW5kID0gamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKHtcbiAgICAgICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiB7IHRlc3Q6ICdURVNUMScgfSxcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlZDogJzE5NzAtMDEtMDFUMDA6MDA6MDAuMDAwWicsXG4gICAgICAgICAgICAgICAgICAgIGxhc3RNb2RpZmllZDogJzE5NzgtMDEtMjRUMDM6MTc6MDAuMDAwWicsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHsgdGVzdDogJ1RFU1QyJyB9LFxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVkOiAnMTk3MC0wMS0wMVQwMDowMDowMC4wMDBaJyxcbiAgICAgICAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiAnMTk3OC0wMS0yNFQwMzoxNzowMC4wMDBaJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogeyB0ZXN0OiAnVEVTVDMnIH0sXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQ6ICcxOTcwLTAxLTAxVDAwOjAwOjAwLjAwMFonLFxuICAgICAgICAgICAgICAgICAgICBsYXN0TW9kaWZpZWQ6ICcxOTc4LTAxLTI0VDAzOjE3OjAwLjAwMFonLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICB9KTtcblxuICAgICAgICBodHRwQ2xpZW50ID0gbmV3IChIdHRwQ2xpZW50IGFzIGFueSkoKTtcblxuICAgICAgICBBdXRoZW50aWNhdGlvbk1hbmFnZXIucHJvdG90eXBlLmF1dGhlbnRpY2F0ZSA9IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZShUT0tFTik7XG4gICAgICAgIGF1dGhlbnRpY2F0aW9uTWFuYWdlciA9IG5ldyAoQXV0aGVudGljYXRpb25NYW5hZ2VyIGFzIGFueSkoQ09ORklHLCBodHRwQ2xpZW50KTtcblxuICAgICAgICBjb250ZW50U2NoZW1hID0gbmV3IENvbnRlbnRTY2hlbWEoQ09ORklHLCBodHRwQ2xpZW50LCBhdXRoZW50aWNhdGlvbk1hbmFnZXIpO1xuICAgICAgICBjb250ZW50U2NoZW1hLnNjaGVtYSA9ICd0ZXN0JztcbiAgICB9KTtcblxuICAgIHRlc3QoJ2V4aXN0JywgKCkgPT4ge1xuICAgICAgICBleHBlY3QoQXV0aGVudGljYXRpb25NYW5hZ2VyKS50b0JlRGVmaW5lZCgpO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnY2FsbCB0aGUgQVBJIHNlcnZlcicsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgY29udGVudFNjaGVtYS5xdWVyeSgpO1xuXG4gICAgICAgIGV4cGVjdChodHRwQ2xpZW50LnNlbmQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICAgICAgZXhwZWN0KGh0dHBDbGllbnQuc2VuZCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICAgICAgcGF0aDogJy9hcGkvY29udGVudC9teS1hcHAvdGVzdC8/JyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnc2VuZCB0aGUgdG9rZW4nLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGNvbnRlbnRTY2hlbWEucXVlcnkoKTtcblxuICAgICAgICBleHBlY3QoaHR0cENsaWVudC5zZW5kKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gICAgICAgIGV4cGVjdChodHRwQ2xpZW50LnNlbmQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgICAgIHRva2VuOiAnYWJjLTEyMycsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2luY2x1ZGUgdGhlIHNlcmlhbGlzZWQgcXVlcnkgaW4gdGhlIFVSTCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgY29udGVudFNjaGVtYS5xdWVyeSh7ICR0b3A6IDEwIH0pO1xuXG4gICAgICAgIGV4cGVjdChodHRwQ2xpZW50LnNlbmQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICAgICAgZXhwZWN0KGh0dHBDbGllbnQuc2VuZCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICAgICAgcGF0aDogJy9hcGkvY29udGVudC9teS1hcHAvdGVzdC8/JTI0dG9wPTEwJyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnaW5jbHVkZSBkcmFmdHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGNvbnRlbnRTY2hlbWEucXVlcnkoe30sIHRydWUpO1xuXG4gICAgICAgIGV4cGVjdChodHRwQ2xpZW50LnNlbmQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICAgICAgZXhwZWN0KGh0dHBDbGllbnQuc2VuZCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICAgICAgZHJhZnQ6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2Rlc2VyaWFsaXNlIGRhdGVzIGNvcnJlY3RseScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29udGVudFNjaGVtYS5xdWVyeSgpO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQuaXRlbXNbMF0uY3JlYXRlZCkudG9CZUluc3RhbmNlT2YoRGF0ZSk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQuaXRlbXNbMF0uY3JlYXRlZC5nZXRGdWxsWWVhcigpKS50b0JlKDE5NzApO1xuICAgICAgICBleHBlY3QocmVzdWx0Lml0ZW1zWzBdLmxhc3RNb2RpZmllZCkudG9CZUluc3RhbmNlT2YoRGF0ZSk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQuaXRlbXNbMF0ubGFzdE1vZGlmaWVkLmdldEZ1bGxZZWFyKCkpLnRvQmUoMTk3OCk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdub3Qgb3ZlcndyaXRlIEpTT04gcXVlcnkgZm9yIHF1ZXJ5U2luZ2xlKCknLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFNxdWlkZXhKc29uUXVlcnkoKTtcbiAgICAgICAgcXVlcnkucSA9IHsgc2tpcDogMiB9O1xuICAgICAgICBhd2FpdCBjb250ZW50U2NoZW1hLnF1ZXJ5U2luZ2xlKHF1ZXJ5KTtcblxuICAgICAgICBleHBlY3QoaHR0cENsaWVudC5zZW5kKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gICAgICAgIGV4cGVjdChodHRwQ2xpZW50LnNlbmQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgICAgIHBhdGg6ICcvYXBpL2NvbnRlbnQvbXktYXBwL3Rlc3QvP3E9JTdCJTIyc2tpcCUyMiUzQTIlN0QnLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdvbmx5IHJlcXVlc3QgdGhlIGZpcnN0IHJlc3VsdCBmb3IgcXVlcnlTaW5nbGUoKScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgY29udGVudFNjaGVtYS5xdWVyeVNpbmdsZSgpO1xuXG4gICAgICAgIGV4cGVjdChodHRwQ2xpZW50LnNlbmQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICAgICAgZXhwZWN0KGh0dHBDbGllbnQuc2VuZCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICAgICAgcGF0aDogJy9hcGkvY29udGVudC9teS1hcHAvdGVzdC8/JTI0dG9wPTEnLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdyZXR1cm4gYWxsIGRhdGEgZm9yIHF1ZXJ5KCknLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvbnRlbnRTY2hlbWEucXVlcnkoKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0Lml0ZW1zLmxlbmd0aCkudG9CZSgzKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ3JldHVybiBmaXJzdCByZXN1bHQgZm9yIHF1ZXJ5U2luZ2xlKCknLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvbnRlbnRTY2hlbWEucXVlcnlTaW5nbGUoKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0KS50b01hdGNoT2JqZWN0KHsgZGF0YTogeyB0ZXN0OiAnVEVTVDEnIH0gfSk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdzZW5kIGEgUE9TVCByZXF1ZXN0IHdpdGggdGhlIGNvbnRlbnQgZm9yIGNyZWF0ZSgpJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBjb250ZW50U2NoZW1hLmNyZWF0ZSh7IHRlc3Q6ICdURVNUJyB9KTtcblxuICAgICAgICBleHBlY3QoaHR0cENsaWVudC5zZW5kKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gICAgICAgIGV4cGVjdChodHRwQ2xpZW50LnNlbmQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgICAgIHBhdGg6ICcvYXBpL2NvbnRlbnQvbXktYXBwL3Rlc3QvP3B1Ymxpc2g9ZmFsc2UnLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGRhdGE6IHsgdGVzdDogJ1RFU1QnIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2luY2x1ZGUgdGhlIHB1Ymxpc2ggcGFyYW1ldGVyIGZvciBjcmVhdGUoe30sIHRydWUpJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBjb250ZW50U2NoZW1hLmNyZWF0ZSh7fSwgdHJ1ZSk7XG5cbiAgICAgICAgZXhwZWN0KGh0dHBDbGllbnQuc2VuZCkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICAgICAgICBleHBlY3QoaHR0cENsaWVudC5zZW5kKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgICAgICBwYXRoOiAnL2FwaS9jb250ZW50L215LWFwcC90ZXN0Lz9wdWJsaXNoPXRydWUnLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdzZW5kIGEgUFVUIHJlcXVlc3Qgd2l0aCB0aGUgY29udGVudCBmb3IgdXBkYXRlKCknLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGNvbnRlbnRTY2hlbWEudXBkYXRlKCcxMjMtNDU2JywgeyB0ZXN0OiAnVEVTVCcgfSk7XG5cbiAgICAgICAgZXhwZWN0KGh0dHBDbGllbnQuc2VuZCkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICAgICAgICBleHBlY3QoaHR0cENsaWVudC5zZW5kKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgICAgICBwYXRoOiAnL2FwaS9jb250ZW50L215LWFwcC90ZXN0LzEyMy00NTYnLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICAgICAgICAgICAgZGF0YTogeyB0ZXN0OiAnVEVTVCcgfSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnc2VuZCBhIFBBVENIIHJlcXVlc3Qgd2l0aCB0aGUgY29udGVudCBmb3IgcGF0Y2goKScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgY29udGVudFNjaGVtYS5wYXRjaCgnMTIzLTQ1NicsIHsgdGVzdDogJ1RFU1QnIH0pO1xuXG4gICAgICAgIGV4cGVjdChodHRwQ2xpZW50LnNlbmQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICAgICAgZXhwZWN0KGh0dHBDbGllbnQuc2VuZCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICAgICAgcGF0aDogJy9hcGkvY29udGVudC9teS1hcHAvdGVzdC8xMjMtNDU2JyxcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQQVRDSCcsXG4gICAgICAgICAgICAgICAgZGF0YTogeyB0ZXN0OiAnVEVTVCcgfSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnc2VuZCBhIERFTEVURSByZXF1ZXN0IGZvciBkZWxldGUoKScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgY29udGVudFNjaGVtYS5kZWxldGUoJzEyMy00NTYnKTtcblxuICAgICAgICBleHBlY3QoaHR0cENsaWVudC5zZW5kKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gICAgICAgIGV4cGVjdChodHRwQ2xpZW50LnNlbmQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgICAgIHBhdGg6ICcvYXBpL2NvbnRlbnQvbXktYXBwL3Rlc3QvMTIzLTQ1NicsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnREVMRVRFJyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnc2VuZCBhIFBVVCByZXF1ZXN0IGZvciB1cGRhdGVTdGF0dXMoKScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgY29udGVudFNjaGVtYS51cGRhdGVTdGF0dXMoJzEyMy00NTYnLCB7IHN0YXR1czogJ1Rlc3RpbmcnIH0pO1xuXG4gICAgICAgIGV4cGVjdChodHRwQ2xpZW50LnNlbmQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICAgICAgZXhwZWN0KGh0dHBDbGllbnQuc2VuZCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICAgICAgcGF0aDogJy9hcGkvY29udGVudC9teS1hcHAvdGVzdC8xMjMtNDU2L3N0YXR1cycsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUFVUJyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnc2VuZCBEdWVUaW1lIGZvciB1cGRhdGVTdGF0dXMoKSBpZiBwcm92aWRlZCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgY29udGVudFNjaGVtYS51cGRhdGVTdGF0dXMoJzEyMy00NTYnLCB7IHN0YXR1czogJ1Rlc3RpbmcnLCBkdWVUaW1lOiBuZXcgRGF0ZSgnMjQyNC0wMS0yNFQwMDowMFonKSB9KTtcblxuICAgICAgICBleHBlY3QoaHR0cENsaWVudC5zZW5kKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gICAgICAgIGV4cGVjdChodHRwQ2xpZW50LnNlbmQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgICAgIHBhdGg6ICcvYXBpL2NvbnRlbnQvbXktYXBwL3Rlc3QvMTIzLTQ1Ni9zdGF0dXMnLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICAgICAgICAgICAgZGF0YTogeyBEdWVUaW1lOiAnMjQyNC0wMS0yNFQwMDowMDowMC4wMDBaJywgU3RhdHVzOiAnVGVzdGluZycgfSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnc2VuZCBhIFBVVCByZXF1ZXN0IGZvciBkaXNjYXJkKCknLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGNvbnRlbnRTY2hlbWEuZGlzY2FyZCgnMTIzLTQ1NicpO1xuXG4gICAgICAgIGV4cGVjdChodHRwQ2xpZW50LnNlbmQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICAgICAgZXhwZWN0KGh0dHBDbGllbnQuc2VuZCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICAgICAgcGF0aDogJy9hcGkvY29udGVudC9teS1hcHAvdGVzdC8xMjMtNDU2L2Rpc2NhcmQnLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICB9KTtcbn0pO1xuIl19