blob: d276724b50ec467cca9d0b1da6f5913e09dd19be [file] [log] [blame]
import './index';
import { assert } from 'chai';
import fetchMock from 'fetch-mock';
import { JSONSourceSk } from './json-source-sk';
import { setUpElementUnderTest } from '../../../infra-sk/modules/test_util';
import { CommitNumber } from '../json';
describe('json-source-sk', () => {
const newInstance = setUpElementUnderTest<JSONSourceSk>('json-source-sk');
let element: JSONSourceSk;
beforeEach(async () => {
element = newInstance();
await new Promise((resolve) => setTimeout(resolve, 0));
});
afterEach(() => {
fetchMock.restore();
});
it('is hidden when traceid is invalid', () => {
element.traceid = '';
const controls = element.querySelector('.controls');
assert.isNotNull(controls);
assert.isTrue(controls!.hasAttribute('hidden'));
});
it('is visible when traceid is valid', () => {
element.traceid = ',config=8888,';
const controls = element.querySelector('.controls');
assert.isNotNull(controls);
assert.isFalse(controls!.hasAttribute('hidden'));
});
it('loads source when "View Json File" is clicked', async () => {
element.traceid = ',config=8888,';
element.cid = CommitNumber(100);
const response = { foo: 'bar' };
fetchMock.post('/_/details/', response);
element.querySelector<HTMLButtonElement>('#view-source')!.click();
const _ = await fetchMock.flush(true);
await new Promise((resolve) => setTimeout(resolve, 0));
const dialog = element.querySelector<HTMLDialogElement>('#json-dialog')!;
assert.isTrue(dialog.open);
assert.include(element.querySelector('pre')!.textContent, '"foo": "bar"');
});
it('loads source when "View Short Json File" is clicked', async () => {
element.traceid = ',config=8888,';
element.cid = CommitNumber(100);
const response = { short: 'data' };
fetchMock.post('/_/details/?results=false', response);
element.querySelector<HTMLButtonElement>('#load-source')!.click();
const _ = await fetchMock.flush(true);
await new Promise((resolve) => setTimeout(resolve, 0));
const dialog = element.querySelector<HTMLDialogElement>('#json-dialog')!;
assert.isTrue(dialog.open);
assert.include(element.querySelector('pre')!.textContent, '"short": "data"');
});
it('closes the dialog', async () => {
element.traceid = ',config=8888,';
element.cid = CommitNumber(100);
fetchMock.post('/_/details/', {});
element.querySelector<HTMLButtonElement>('#view-source')!.click();
const _ = await fetchMock.flush(true);
await new Promise((resolve) => setTimeout(resolve, 0));
const dialog = element.querySelector<HTMLDialogElement>('#json-dialog')!;
assert.isTrue(dialog.open);
element.querySelector<HTMLButtonElement>('#closeIcon')!.click();
await new Promise((resolve) => setTimeout(resolve, 0));
assert.isFalse(dialog.open);
assert.isNull(element.querySelector('pre'));
});
it('handles fetch error', async () => {
element.traceid = ',config=8888,';
element.cid = CommitNumber(100);
fetchMock.post('/_/details/', { status: 500, body: 'Error' });
const errorPromise = new Promise<void>((resolve) => {
document.addEventListener('error-sk', () => resolve(), { once: true });
});
element.querySelector<HTMLButtonElement>('#view-source')!.click();
const _ = await fetchMock.flush(true);
await errorPromise;
const dialog = element.querySelector<HTMLDialogElement>('#json-dialog')!;
assert.isFalse(dialog.open);
});
});