import { composeButton, composeInput, composeLengthIndicator, emojiButton, emojiSearchInput, getComposeSelectionStart, getNthStatusContent, getUrl, homeNavButton, modalDialog, notificationsNavButton, sleep, times } from '../utils' import { loginAsFoobar } from '../roles' fixture`012-compose.js` .page`http://localhost:4002` test('shows compose limits', async t => { await loginAsFoobar(t) await t .hover(composeInput) .expect(composeLengthIndicator.innerText).eql('500') .expect(composeButton.hasAttribute('disabled')).notOk() .typeText(composeInput, 'typing some text') .expect(composeLengthIndicator.innerText).eql('484') .expect(composeButton.hasAttribute('disabled')).notOk() .typeText(composeInput, times(50, () => 'hello world').join(' '), { replace: true, paste: true }) .expect(composeLengthIndicator.innerText).eql('-99') .expect(composeButton.getAttribute('disabled')).eql('') .typeText(composeInput, 'hello world', { replace: true }) .click(notificationsNavButton) .expect(getUrl()).contains('/notifications') .click(homeNavButton) .expect(getUrl()).eql('http://localhost:4002/') .expect(composeInput.value).eql('hello world') .expect(composeLengthIndicator.innerText).eql('489') .expect(composeButton.hasAttribute('disabled')).notOk() .selectText(composeInput) .pressKey('delete') .expect(composeInput.value).eql('') .expect(composeLengthIndicator.innerText).eql('500') .expect(composeButton.hasAttribute('disabled')).notOk() }) test('shows compose limits for URLs/handles', async t => { await loginAsFoobar(t) await t .expect(composeLengthIndicator.innerText).eql('500') .expect(composeButton.hasAttribute('disabled')).notOk() .typeText(composeInput, 'hello world ' + 'http://foo.bar.baz.whatever.example.com/hello ' + '@reallylongnamethatstretchesonandon@foo.example.com', { paste: true }) .expect(composeLengthIndicator.innerText).eql('429') .expect(composeButton.hasAttribute('disabled')).notOk() }) test('shows compose limits for emoji', async t => { await loginAsFoobar(t) await t .typeText(composeInput, 'hello world \ud83c\ude01 \ud83d\udc6a') .expect(composeLengthIndicator.innerText).eql('485') .expect(composeButton.hasAttribute('disabled')).notOk() }) test('shows compose limits for custom emoji', async t => { await loginAsFoobar(t) await t .typeText(composeInput, 'hello world ') .click(emojiButton) .typeText(emojiSearchInput, 'blobnom') .pressKey('enter') .expect(composeInput.value).eql('hello world :blobnom: ') .expect(composeLengthIndicator.innerText).eql('478') }) test('inserts custom emoji correctly', async t => { await loginAsFoobar(t) await t .typeText(composeInput, 'hello world') .selectText(composeInput, 6, 6) .expect(getComposeSelectionStart()).eql(6) .click(emojiButton) .typeText(emojiSearchInput, 'blobpats') .pressKey('enter') .expect(composeInput.value).eql('hello :blobpats: world') .selectText(composeInput, 0, 0) .expect(getComposeSelectionStart()).eql(0) .click(emojiButton) .typeText(emojiSearchInput, 'blobnom') .pressKey('enter') .expect(composeInput.value).eql(':blobnom: hello :blobpats: world') .typeText(composeInput, ' foobar ') .click(emojiButton) .typeText(emojiSearchInput, 'blobpeek') .pressKey('enter') .expect(composeInput.value).eql(':blobnom: hello :blobpats: world foobar :blobpeek: ') }) test('inserts emoji without typing anything', async t => { await loginAsFoobar(t) await sleep(1000) await t .click(emojiButton) .click(modalDialog.find('button[aria-label="blobpats"]')) .expect(composeInput.value).eql(':blobpats: ') await sleep(1000) await t .click(emojiButton) .click(modalDialog.find('button[aria-label="blobpeek"]')) .expect(composeInput.value).eql(':blobpeek: :blobpats: ') }) test('inserts native emoji without typing anything', async t => { await loginAsFoobar(t) await t .click(emojiButton) await sleep(1000) await t .expect(emojiSearchInput.value).eql('') .typeText(emojiSearchInput, 'pineapple', { paste: true }) await sleep(1000) await t .pressKey('enter') .expect(composeInput.value).eql('\ud83c\udf4d ') .click(emojiButton) await sleep(1000) await t .expect(emojiSearchInput.value).eql('') .typeText(emojiSearchInput, 'elephant', { paste: true }) await sleep(1000) await t .pressKey('enter') .expect(composeInput.value).eql('\ud83d\udc18 \ud83c\udf4d ') }) test('cannot post an empty status', async t => { await loginAsFoobar(t) await t .expect(getNthStatusContent(1).innerText).contains('pinned toot 1') .click(composeButton) await sleep(2) await t .expect(getNthStatusContent(1).innerText).contains('pinned toot 1') })