pinafore/tests/spec/012-compose.js
Nolan Lawson 098a20db49
feat: add full emoji picker using emoji-mart (#836)
* feat: add full emoji picker using emoji-mart

Fixes #4

* use a sailboat as the default emoji in the emoji picker

* fix tests

* fix lint
2018-12-18 00:43:51 -08:00

129 lines
4.5 KiB
JavaScript

import {
composeButton, composeInput, composeLengthIndicator, emojiButton, emojiSearchInput, getComposeSelectionStart,
getNthStatusContent, getUrl,
homeNavButton,
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 t
.click(emojiButton)
.typeText(emojiSearchInput, 'blobpats')
.pressKey('enter')
.expect(composeInput.value).eql(':blobpats: ')
.click(emojiButton)
.typeText(emojiSearchInput, 'blobpeek')
.pressKey('enter')
.expect(composeInput.value).eql(':blobpeek: :blobpats: ')
})
test('inserts native emoji without typing anything', async t => {
await loginAsFoobar(t)
await t
.click(emojiButton)
.typeText(emojiSearchInput, 'pineapple')
.pressKey('enter')
.expect(composeInput.value).eql('\ud83c\udf4d ')
.click(emojiButton)
.typeText(emojiSearchInput, 'elephant')
.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(0).innerText).contains('pinned toot 1')
.click(composeButton)
await sleep(2)
await t
.expect(getNthStatusContent(0).innerText).contains('pinned toot 1')
})