import { afterEach, Assert, beforeEach, describe, it, UnitTest } from '@ephox/bedrock-client';
import { Testable } from '@ephox/dispute';
import { Class, Css, Hierarchy, Html, Insert, Remove, SugarElement, SugarNode } from '@ephox/sugar';
import * as Assertions from 'ephox/agar/api/Assertions';
import { Chain } from 'ephox/agar/api/Chain';
import { Pipeline } from 'ephox/agar/api/Pipeline';
import { Step } from 'ephox/agar/api/Step';
import * as UiFinder from 'ephox/agar/api/UiFinder';
UnitTest.asynctest('UiFinderTest', (success, failure) => {
const container = SugarElement.fromHtml(
'
' +
'
this is something bold here
' +
'
there is something else here
' +
'
'
);
Insert.append(SugarElement.fromDom(document.body), container);
const teardown = () => {
Remove.remove(container);
};
Pipeline.async({}, [
UiFinder.sNotExists(container, 'em'),
UiFinder.sExists(container, 'strong'),
Chain.asStep(container, [
UiFinder.cNotExists('em'),
UiFinder.cExists('strong'),
UiFinder.cFindIn('strong'),
Chain.op((strong) => {
Assertions.assertEq('Checking contents of strong tag', 'bold', Html.get(strong));
}),
Chain.inject(container),
UiFinder.cFindAllIn('strong'),
Chain.op((strongs) => {
Assertions.assertEq('Should only find 1 strong', 1, strongs.length);
}),
Chain.inject(container),
UiFinder.cFindAllIn('p'),
Chain.op((ps) => {
Assertions.assertEq('Should find two paragraphs', 2, ps.length);
Assertions.assertEq('Should be sugared paragraphs', 'p', SugarNode.name(ps[0]));
})
]),
Step.sync(() => {
const result = UiFinder.findIn(container, 'strong').getOrDie();
Assertions.assertDomEq(
'Checking findIn',
Hierarchy.follow(container, [ 0, 1 ]).getOrDie('Invalid test data'),
result
);
}),
Step.sync(() => {
const result = UiFinder.findAllIn(container, 'p');
Assertions.assertEq('Checking findAllIn length', 2, result.length);
}),
Chain.asStep(container, [
UiFinder.cFindIn('strong'),
Chain.op((strong) => {
// Intentionally not waiting before calling next.
Css.set(strong, 'display', 'none');
setTimeout(() => {
Css.remove(strong, 'display');
}, 200);
}),
Chain.inject(container),
UiFinder.cWaitForVisible('Waiting for the strong tag to reappear', 'strong')
]),
Chain.asStep(container, [
UiFinder.cFindIn('strong'),
Chain.op((strong) => {
// Intentionally not waiting before calling next.
setTimeout(() => {
Class.add(strong, 'changing-state');
}, 50);
}),
Chain.inject(container),
UiFinder.cWaitForState('Waiting for the strong tag to gain class: changing-state', 'strong', (elem) => Class.has(elem, 'changing-state'))
]),
Chain.asStep(container, [
UiFinder.cFindIn('strong'),
Chain.op((strong) => {
// Intentionally not waiting before calling next.
setTimeout(() => {
Class.add(strong, 'changing-state-waitfor');
}, 50);
}),
Chain.inject(container),
UiFinder.cWaitFor('Waiting for the strong tag to gain class: changing-state-waitfor', 'strong.changing-state-waitfor')
])
], () => {
teardown();
success();
}, failure);
});
describe('UiFinderTest', () => {
const body = SugarElement.fromDom(document.body);
let container: SugarElement;
beforeEach(() => {
container = SugarElement.fromHtml('');
Insert.append(body, container);
});
afterEach(() => {
Remove.remove(container);
});
it('Should find target by label', async () => {
const content = SugarElement.fromHtml(
'' +
'' +
'' +
'
'
);
Insert.append(container, content);
const input = container.dom.querySelector('#input-width');
Assert.eq('Should find target by label', input, UiFinder.findTargetByLabel(container, 'Width').getOrDie().dom, Testable.tStrict);
});
it('Should find input target by label when input inside label', async () => {
const content = SugarElement.fromHtml(
''
);
Insert.append(container, content);
const input = container.dom.querySelector('#has-border');
Assert.eq('Should find input inside label', input, UiFinder.findTargetByLabel(container, 'Has Border').getOrDie().dom, Testable.tStrict);
});
it('Should find textarea target by label when textarea inside label', async () => {
const content = SugarElement.fromHtml(
''
);
Insert.append(container, content);
const input = container.dom.querySelector('#description');
Assert.eq('Should find textarea inside label', input, UiFinder.findTargetByLabel(container, 'Description').getOrDie().dom, Testable.tStrict);
});
it('Should match full label', async () => {
const content = SugarElement.fromHtml(
'' +
'' +
'' +
'' +
'' +
'
'
);
Insert.append(container, content);
const sortByInput = container.dom.querySelector('#sort-by');
const sortInput = container.dom.querySelector('#sort');
Assert.eq('Should find sortBy', sortByInput, UiFinder.findTargetByLabel(container, 'Sort by').getOrDie().dom, Testable.tStrict);
Assert.eq('Should find sort', sortInput, UiFinder.findTargetByLabel(container, 'Sort').getOrDie().dom, Testable.tStrict);
});
});