parent
ee492c1765
commit
4ecb04588c
|
@ -4,7 +4,7 @@
|
|||
{#each options as option}
|
||||
<li class="poll-choice option">
|
||||
<div class="option-text">
|
||||
<strong>{option.share}%</strong> {option.title}
|
||||
<strong>{option.share}%</strong> <span>{@html option.title}</span>
|
||||
</div>
|
||||
<svg aria-hidden="true">
|
||||
<line x1="0" y1="0" x2="{option.share}%" y2="0" />
|
||||
|
@ -23,7 +23,7 @@
|
|||
value="{i}"
|
||||
on:change="onChange()"
|
||||
>
|
||||
<span>{option.title}</span>
|
||||
<span>{@html option.title}</span>
|
||||
</label>
|
||||
</li>
|
||||
{/each}
|
||||
|
@ -245,6 +245,8 @@
|
|||
import { registerClickDelegate } from '../../_utils/delegate'
|
||||
import { classname } from '../../_utils/classname'
|
||||
import { getPoll, voteOnPoll } from '../../_actions/polls'
|
||||
import escapeHtml from 'escape-html'
|
||||
import { emojifyText } from '../../_utils/emojifyText'
|
||||
|
||||
const REFRESH_MIN_DELAY = 1000
|
||||
|
||||
|
@ -284,10 +286,12 @@
|
|||
computed: {
|
||||
pollId: ({ originalStatus }) => originalStatus.poll.id,
|
||||
poll: ({ originalStatus, $polls, pollId }) => $polls[pollId] || originalStatus.poll,
|
||||
options: ({ poll }) => poll.options.map(({ title, votes_count: votesCount }) => ({
|
||||
title,
|
||||
options: ({ poll, originalStatusEmojis, $autoplayGifs }) => (
|
||||
poll.options.map(({ title, votes_count: votesCount }) => ({
|
||||
title: emojifyText(escapeHtml(title), originalStatusEmojis, $autoplayGifs),
|
||||
share: poll.votes_count ? Math.round(votesCount / poll.votes_count * 100) : 0
|
||||
})),
|
||||
}))
|
||||
),
|
||||
votesCount: ({ poll }) => poll.votes_count,
|
||||
voted: ({ poll }) => poll.voted,
|
||||
multiple: ({ poll }) => poll.multiple,
|
||||
|
|
|
@ -7,7 +7,13 @@ import {
|
|||
getComposePollNthInput,
|
||||
composePoll,
|
||||
composePollMultipleChoice,
|
||||
composePollExpiry, composePollAddButton, getComposePollRemoveNthButton, postStatusButton, composeInput, sleep
|
||||
composePollExpiry,
|
||||
composePollAddButton,
|
||||
getComposePollRemoveNthButton,
|
||||
postStatusButton,
|
||||
composeInput,
|
||||
sleep,
|
||||
getNthStatus
|
||||
} from '../utils'
|
||||
import { loginAsFoobar } from '../roles'
|
||||
import { POLL_EXPIRY_DEFAULT } from '../../src/routes/_static/polls'
|
||||
|
@ -18,6 +24,7 @@ fixture`127-compose-polls.js`
|
|||
test('Can add and remove poll', async t => {
|
||||
await loginAsFoobar(t)
|
||||
await t
|
||||
.expect(getNthStatus(1).exists).ok()
|
||||
.expect(composePoll.exists).notOk()
|
||||
.expect(pollButton.getAttribute('aria-label')).eql('Add poll')
|
||||
.click(pollButton)
|
||||
|
@ -36,6 +43,7 @@ test('Can add and remove poll', async t => {
|
|||
test('Can add and remove poll options', async t => {
|
||||
await loginAsFoobar(t)
|
||||
await t
|
||||
.expect(getNthStatus(1).exists).ok()
|
||||
.expect(composePoll.exists).notOk()
|
||||
.expect(pollButton.getAttribute('aria-label')).eql('Add poll')
|
||||
.click(pollButton)
|
||||
|
@ -73,3 +81,22 @@ test('Can add and remove poll options', async t => {
|
|||
.expect(getNthStatusPollResult(1, 4).exists).notOk()
|
||||
.expect(getNthStatusPollVoteCount(1).innerText).eql('0 votes')
|
||||
})
|
||||
|
||||
test('Properly escapes HTML and emojos in polls', async t => {
|
||||
await loginAsFoobar(t)
|
||||
await t
|
||||
.expect(getNthStatus(1).exists).ok()
|
||||
.click(pollButton)
|
||||
.expect(composePoll.exists).ok()
|
||||
await sleep(1000)
|
||||
await t
|
||||
.typeText(composeInput, 'vote vote vote', { paste: true })
|
||||
.typeText(getComposePollNthInput(1), '–', { paste: true })
|
||||
.typeText(getComposePollNthInput(2), ':blobpeek:', { paste: true })
|
||||
await sleep(1000)
|
||||
await t
|
||||
.click(postStatusButton)
|
||||
.expect(getNthStatusPollResult(1, 1).innerText).contains('–')
|
||||
.expect(getNthStatusPollResult(1, 2).find('img').exists).ok()
|
||||
.expect(getNthStatusPollResult(1, 2).find('img').getAttribute('alt')).eql(':blobpeek:')
|
||||
})
|
||||
|
|
Loading…
Reference in a new issue