@v4fire/client
Version:
V4Fire client core library
238 lines (197 loc) • 5 kB
JavaScript
// @ts-check
/*!
* V4Fire Client Core
* https://github.com/V4Fire/Client
*
* Released under the MIT license
* https://github.com/V4Fire/Client/blob/master/LICENSE
*/
/**
* @typedef {import('playwright').Page} Page
*/
const
{initTextarea} = include('src/form/b-textarea/test/helpers');
/** @param {Page} page */
module.exports = (page) => {
beforeEach(async () => {
await page.evaluate(() => {
globalThis.removeCreatedComponents();
});
});
describe('b-textarea simple usage', () => {
it('providing `value` and checking `text`', async () => {
const target = await initTextarea(page, {
value: 'baz'
});
expect(
await target.evaluate((ctx) => {
const
res = [ctx.text];
ctx.value = 'bla';
res.push(ctx.text);
return res;
})
).toEqual(['baz', 'bla']);
});
it('providing `text` and checking `value`', async () => {
const target = await initTextarea(page, {
text: 'baz'
});
expect(
await target.evaluate((ctx) => {
const
res = [ctx.value];
ctx.text = 'bla';
res.push(ctx.value);
return res;
})
).toEqual(['baz', 'bla']);
});
it('providing of attributes', async () => {
await initTextarea(page, {
id: 'foo',
name: 'bla',
value: 'baz'
});
const
input = await page.$('#foo');
expect(
await input.evaluate((ctx) => [
ctx.tagName,
ctx.name,
ctx.value
])
).toEqual(['TEXTAREA', 'bla', 'baz']);
});
it('loading from a data provider', async () => {
const
target = await initTextarea(page, {name: 'baz', dataProvider: 'demo.InputValue'});
expect(
await target.evaluate((ctx) => [
ctx.name,
ctx.value
])
).toEqual(['baz', 'bar2']);
});
it('loading from a data provider and interpolation', async () => {
const
target = await initTextarea(page, {dataProvider: 'demo.Input'});
expect(
await target.evaluate((ctx) => [
ctx.name,
ctx.value,
ctx.mods.someMod,
ctx.mods.anotherMod
])
).toEqual(['foo', 'bar', 'bar', 'bla']);
});
it('auto resizing', async () => {
const target = await initTextarea(page);
expect(
await target.evaluate(async (ctx) => {
const {input} = ctx.$refs;
input.style.maxHeight = '100px';
const
res = [];
const values = [
'',
'bla\nbla\nbla\n',
'bla\nbla\nbla\nbla\nbla\nbla\n',
'bla\nbla\nbla\nbla\nbla\nbla\nbla\nbla\nbla\n',
'bla\nbla\nbla\n',
''
];
for (const value of values) {
ctx.value = value;
await ctx.nextTick();
res.push([input.clientHeight, input.scrollHeight]);
}
return res;
})
).toEqual([
[36, 36],
[72, 72],
[98, 126],
[98, 180],
[72, 72],
[36, 36]
]);
});
it('providing `maxLength` and `messageHelpers`', async () => {
const target = await initTextarea(page, {
maxLength: 20,
messageHelpers: true
});
expect(
await target.evaluate(async (ctx) => {
const
res = [],
limitEl = ctx.block.element('limit');
const values = [
'',
'bla',
'bla bla',
'bla bla bla bla',
'bla bla bla bla bla bla bla bla',
'bla bla bla',
''
];
for (const value of values) {
ctx.value = value;
await ctx.nextTick();
res.push([
limitEl.innerText,
ctx.block.getElMod(limitEl, 'limit', 'hidden'),
ctx.block.getElMod(limitEl, 'limit', 'warning')
]);
}
return res;
})
).toEqual([
['', 'true', undefined],
['', 'true', undefined],
['Characters left: 13', 'false', 'false'],
['Characters left: 5', 'false', 'true'],
['Characters left: 0', 'false', 'true'],
['Characters left: 9', 'false', 'false'],
['Characters left: 9', 'true', 'false']
]);
});
it('providing `maxLength` and the `limit` slot', async () => {
const target = await initTextarea(page, {
maxLength: 20,
limit: 'return ({limit, maxLength}) => "Characters left: " + limit + ". The maximum characters is " + maxLength'
});
expect(
await target.evaluate(async (ctx) => {
const
res = [],
limitEl = ctx.block.element('limit');
const values = [
'',
'bla',
'bla bla',
'bla bla bla bla',
'bla bla bla bla bla bla bla bla',
'bla bla bla',
''
];
for (const value of values) {
ctx.value = value;
await ctx.nextTick();
res.push(limitEl.innerText);
}
return res;
})
).toEqual([
'Characters left: 20. The maximum characters is 20',
'Characters left: 17. The maximum characters is 20',
'Characters left: 13. The maximum characters is 20',
'Characters left: 5. The maximum characters is 20',
'Characters left: 0. The maximum characters is 20',
'Characters left: 9. The maximum characters is 20',
'Characters left: 20. The maximum characters is 20'
]);
});
});
};