Pinafore-Web-Client-Frontend/tests/spec/138-word-filters.js

178 lines
5.8 KiB
JavaScript

import { Selector as $ } from 'testcafe'
import { loginAsFoobar } from '../roles'
import { createWordFilterAs, deleteAllWordFiltersAs, postAs, reblogStatusAs } from '../serverActions'
import { WORD_FILTER_CONTEXT_NOTIFICATIONS, WORD_FILTER_CONTEXTS } from '../../src/routes/_static/wordFilters'
import {
getNthStatusContent, getUrl,
homeNavButton,
modalDialog,
notificationsNavButton,
settingsNavButton,
sleep
} from '../utils'
fixture`138-word-filters.js`
.page`http://localhost:4002`
.afterEach(async () => {
await deleteAllWordFiltersAs('foobar')
})
const goToWordFilterSettings = async t => {
await t
.click(settingsNavButton)
.click($('a').withText('Instances'))
.click($('a').withText('localhost:3000'))
.hover($('h2').withText('Word filters'))
}
const addFilter = async (t, phrase, tweak) => {
await t
.click($('button').withText('Add filter'))
.expect(modalDialog.hasAttribute('aria-hidden')).notOk()
.typeText($('input[type=text]#word-filter-word-or-phrase'), phrase)
if (tweak) {
await tweak(t)
}
await t
.click($('button').withText('Save'))
.expect(modalDialog.exists).notOk()
}
// TODO: test broken by Mastodon v4 bug https://github.com/mastodon/mastodon/issues/21965
test.skip('Can filter basic words', async t => {
await postAs('admin', 'do not filter me!')
await postAs('admin', 'filterMeOut okay!')
await postAs('admin', 'filterMeOutTooEvenThoughItIsOneBigWord!')
await sleep(500)
await loginAsFoobar(t)
await goToWordFilterSettings(t)
await addFilter(t, 'filterMeOut', async t => {
// uncheck "whole word"
await t
.click($('input#word-filter-whole'))
await sleep(500)
})
await t
.click(homeNavButton)
.expect(getUrl()).eql('http://localhost:4002/')
await t
.expect(getNthStatusContent(1).innerText).eql('do not filter me!')
})
test('Can filter whole words', async t => {
await postAs('admin', 'do not filter me!')
await postAs('admin', 'anotherFilter okay!')
await postAs('admin', 'anotherFilterEvenThoughItIsOneBigWord!')
await sleep(500)
await loginAsFoobar(t)
await goToWordFilterSettings(t)
await addFilter(t, 'filterMeOut')
await t
.click(homeNavButton)
.expect(getUrl()).eql('http://localhost:4002/')
await t
.expect(getNthStatusContent(1).innerText).eql('anotherFilterEvenThoughItIsOneBigWord!')
})
test('Can add filters on the fly', async t => {
await postAs('admin', 'hehehehehehe')
await postAs('admin', 'hohohohohoho')
await postAs('admin', 'hahahahahaha')
await sleep(500)
await loginAsFoobar(t)
await t
.expect(getNthStatusContent(1).innerText).eql('hahahahahaha')
await goToWordFilterSettings(t)
await t
.expect($('body').innerText).contains('You don\'t have any word filters.')
await addFilter(t, 'hahahahahaha')
await t
.click(homeNavButton)
.expect(getUrl()).eql('http://localhost:4002/')
.expect(getNthStatusContent(1).innerText).eql('hohohohohoho')
await goToWordFilterSettings(t)
await addFilter(t, 'hohohohohoho')
await t
.click(homeNavButton)
.expect(getUrl()).eql('http://localhost:4002/')
.expect(getNthStatusContent(1).innerText).eql('hehehehehehe')
})
test('Can delete filters on the fly', async t => {
await postAs('admin', 'yalayala')
await postAs('admin', 'yoloyolo')
await sleep(500)
await loginAsFoobar(t)
await t
.expect(getNthStatusContent(1).innerText).eql('yoloyolo')
await goToWordFilterSettings(t)
await addFilter(t, 'yoloyolo')
await t
.click(homeNavButton)
.expect(getUrl()).eql('http://localhost:4002/')
.expect(getNthStatusContent(1).innerText).eql('yalayala')
await goToWordFilterSettings(t)
await t
.click($('button[aria-label="Delete"]'))
.expect($('body').innerText).contains('You don\'t have any word filters.')
.click(homeNavButton)
.expect(getUrl()).eql('http://localhost:4002/')
await t
.expect(getNthStatusContent(1).innerText).eql('yoloyolo')
})
test('Can update filters when change comes from the server', async t => {
await postAs('admin', 'ohwowohwow')
await postAs('admin', 'ohboyohboy')
await sleep(500)
await loginAsFoobar(t)
await t
.expect(getNthStatusContent(1).innerText).eql('ohboyohboy')
await sleep(500)
await createWordFilterAs('foobar', {
phrase: 'ohboyohboy',
context: [...WORD_FILTER_CONTEXTS],
whole_word: false
})
await t
.expect(getNthStatusContent(1).innerText).eql('ohwowohwow')
})
test('Can filter notifications', async t => {
await postAs('admin', 'hey @foobar do not filter this pretty please')
await postAs('admin', 'hey @foobar filterthisplease')
await sleep(500)
await loginAsFoobar(t)
await goToWordFilterSettings(t)
await addFilter(t, 'filterthisplease', async t => {
// uncheck all contexts except notifications
const contexts = WORD_FILTER_CONTEXTS.filter(_ => _ !== WORD_FILTER_CONTEXT_NOTIFICATIONS)
for (const context of contexts) {
await t.click(`input[id="where-to-filter-${context}"]`)
}
await sleep(200)
})
await t
.click(homeNavButton)
.expect(getUrl()).eql('http://localhost:4002/')
.expect(getNthStatusContent(1).innerText).contains('filterthisplease')
.click(notificationsNavButton)
.expect(getUrl()).contains('notifications')
.expect(getNthStatusContent(1).innerText).contains('do not filter this pretty please')
})
test('Can filter reblogs', async t => {
await postAs('admin', 'you definitely want to see this')
const { id } = await postAs('baz', 'dontwanttoseethis')
await reblogStatusAs('admin', id)
await sleep(500)
await loginAsFoobar(t)
await goToWordFilterSettings(t)
await addFilter(t, 'dontwanttoseethis')
await t
.click(homeNavButton)
.expect(getUrl()).eql('http://localhost:4002/')
.expect(getNthStatusContent(1).innerText).contains('you definitely want to see this')
})