aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/e2e/custom-assertions/elementCount.js2
-rw-r--r--test/e2e/nightwatch.conf.js54
-rw-r--r--test/e2e/runner.js8
-rw-r--r--test/unit/karma.conf.js14
-rw-r--r--test/unit/specs/boot/routes.spec.js42
-rw-r--r--test/unit/specs/components/emoji_input.spec.js78
-rw-r--r--test/unit/specs/components/rich_content.spec.js193
-rw-r--r--test/unit/specs/components/timeline.spec.js27
-rw-r--r--test/unit/specs/components/user_profile.spec.js50
-rw-r--r--test/unit/specs/modules/statuses.spec.js4
-rw-r--r--test/unit/specs/services/chat_service/chat_service.spec.js24
-rw-r--r--test/unit/specs/services/date_utils/date_utils.spec.js10
-rw-r--r--test/unit/specs/services/entity_normalizer/entity_normalizer.spec.js8
-rw-r--r--test/unit/specs/services/file_size_format/file_size_format.spec.js4
-rw-r--r--test/unit/specs/services/theme_data/sanity_checks.spec.js2
15 files changed, 289 insertions, 231 deletions
diff --git a/test/e2e/custom-assertions/elementCount.js b/test/e2e/custom-assertions/elementCount.js
index c0d5fe00..5d5a57b9 100644
--- a/test/e2e/custom-assertions/elementCount.js
+++ b/test/e2e/custom-assertions/elementCount.js
@@ -16,7 +16,7 @@ exports.assertion = function (selector, count) {
return res.value
}
this.command = function (cb) {
- var self = this
+ const self = this
return this.api.execute(function (selector) {
return document.querySelectorAll(selector).length
}, [selector], function (res) {
diff --git a/test/e2e/nightwatch.conf.js b/test/e2e/nightwatch.conf.js
index 07d974df..4041c698 100644
--- a/test/e2e/nightwatch.conf.js
+++ b/test/e2e/nightwatch.conf.js
@@ -1,45 +1,45 @@
require('@babel/register')
-var config = require('../../config')
+const config = require('../../config')
// http://nightwatchjs.org/guide#settings-file
module.exports = {
- 'src_folders': ['test/e2e/specs'],
- 'output_folder': 'test/e2e/reports',
- 'custom_assertions_path': ['test/e2e/custom-assertions'],
+ src_folders: ['test/e2e/specs'],
+ output_folder: 'test/e2e/reports',
+ custom_assertions_path: ['test/e2e/custom-assertions'],
- 'selenium': {
- 'start_process': true,
- 'server_path': 'node_modules/selenium-server/lib/runner/selenium-server-standalone-2.53.1.jar',
- 'host': '127.0.0.1',
- 'port': 4444,
- 'cli_args': {
+ selenium: {
+ start_process: true,
+ server_path: 'node_modules/selenium-server/lib/runner/selenium-server-standalone-2.53.1.jar',
+ host: '127.0.0.1',
+ port: 4444,
+ cli_args: {
'webdriver.chrome.driver': require('chromedriver').path
}
},
- 'test_settings': {
- 'default': {
- 'selenium_port': 4444,
- 'selenium_host': 'localhost',
- 'silent': true,
- 'globals': {
- 'devServerURL': 'http://localhost:' + (process.env.PORT || config.dev.port)
+ test_settings: {
+ default: {
+ selenium_port: 4444,
+ selenium_host: 'localhost',
+ silent: true,
+ globals: {
+ devServerURL: 'http://localhost:' + (process.env.PORT || config.dev.port)
}
},
- 'chrome': {
- 'desiredCapabilities': {
- 'browserName': 'chrome',
- 'javascriptEnabled': true,
- 'acceptSslCerts': true
+ chrome: {
+ desiredCapabilities: {
+ browserName: 'chrome',
+ javascriptEnabled: true,
+ acceptSslCerts: true
}
},
- 'firefox': {
- 'desiredCapabilities': {
- 'browserName': 'firefox',
- 'javascriptEnabled': true,
- 'acceptSslCerts': true
+ firefox: {
+ desiredCapabilities: {
+ browserName: 'firefox',
+ javascriptEnabled: true,
+ acceptSslCerts: true
}
}
}
diff --git a/test/e2e/runner.js b/test/e2e/runner.js
index 2a5c6ef9..57abc2e1 100644
--- a/test/e2e/runner.js
+++ b/test/e2e/runner.js
@@ -1,6 +1,6 @@
// 1. start the dev server using production config
process.env.NODE_ENV = 'testing'
-var server = require('../../build/dev-server.js')
+const server = require('../../build/dev-server.js')
// 2. run the nightwatch test suite against it
// to run in additional browsers:
@@ -9,7 +9,7 @@ var server = require('../../build/dev-server.js')
// or override the environment flag, for example: `npm run e2e -- --env chrome,firefox`
// For more information on Nightwatch's config file, see
// http://nightwatchjs.org/guide#settings-file
-var opts = process.argv.slice(2)
+let opts = process.argv.slice(2)
if (opts.indexOf('--config') === -1) {
opts = opts.concat(['--config', 'test/e2e/nightwatch.conf.js'])
}
@@ -17,8 +17,8 @@ if (opts.indexOf('--env') === -1) {
opts = opts.concat(['--env', 'chrome'])
}
-var spawn = require('cross-spawn')
-var runner = spawn('./node_modules/.bin/nightwatch', opts, { stdio: 'inherit' })
+const spawn = require('cross-spawn')
+const runner = spawn('./node_modules/.bin/nightwatch', opts, { stdio: 'inherit' })
runner.on('exit', function (code) {
server.close()
diff --git a/test/unit/karma.conf.js b/test/unit/karma.conf.js
index 45d74f14..8959e009 100644
--- a/test/unit/karma.conf.js
+++ b/test/unit/karma.conf.js
@@ -4,14 +4,14 @@
// https://github.com/webpack/karma-webpack
// var path = require('path')
-var merge = require('webpack-merge')
-var HtmlWebpackPlugin = require('html-webpack-plugin')
-var baseConfig = require('../../build/webpack.base.conf')
-var utils = require('../../build/utils')
-var webpack = require('webpack')
+const merge = require('webpack-merge')
+const HtmlWebpackPlugin = require('html-webpack-plugin')
+const baseConfig = require('../../build/webpack.base.conf')
+const utils = require('../../build/utils')
+const webpack = require('webpack')
// var projectRoot = path.resolve(__dirname, '../../')
-var webpackConfig = merge(baseConfig, {
+const webpackConfig = merge(baseConfig, {
// use inline sourcemap for karma-sourcemap-loader
module: {
rules: utils.styleLoaders()
@@ -63,7 +63,7 @@ module.exports = function (config) {
frameworks: ['mocha', 'sinon-chai'],
reporters: ['mocha'],
customLaunchers: {
- 'FirefoxHeadless': {
+ FirefoxHeadless: {
base: 'Firefox',
flags: [
'-headless'
diff --git a/test/unit/specs/boot/routes.spec.js b/test/unit/specs/boot/routes.spec.js
index 3673256f..5cffefbb 100644
--- a/test/unit/specs/boot/routes.spec.js
+++ b/test/unit/specs/boot/routes.spec.js
@@ -1,45 +1,43 @@
-import Vuex from 'vuex'
import routes from 'src/boot/routes'
-import { createLocalVue } from '@vue/test-utils'
-import VueRouter from 'vue-router'
+import { createRouter, createMemoryHistory } from 'vue-router'
+import { createStore } from 'vuex'
-const localVue = createLocalVue()
-localVue.use(Vuex)
-localVue.use(VueRouter)
-
-const store = new Vuex.Store({
+const store = createStore({
state: {
instance: {}
}
})
describe('routes', () => {
- const router = new VueRouter({
- mode: 'abstract',
+ const router = createRouter({
+ history: createMemoryHistory(),
routes: routes(store)
})
- it('root path', () => {
- router.push('/main/all')
+ it('root path', async () => {
+ await router.push('/main/all')
- const matchedComponents = router.getMatchedComponents()
+ const matchedComponents = router.currentRoute.value.matched
- expect(matchedComponents[0].components.hasOwnProperty('Timeline')).to.eql(true)
+ // eslint-disable-next-line no-prototype-builtins
+ expect(matchedComponents[0].components.default.components.hasOwnProperty('Timeline')).to.eql(true)
})
- it('user\'s profile', () => {
- router.push('/fake-user-name')
+ it('user\'s profile', async () => {
+ await router.push('/fake-user-name')
- const matchedComponents = router.getMatchedComponents()
+ const matchedComponents = router.currentRoute.value.matched
- expect(matchedComponents[0].components.hasOwnProperty('UserCard')).to.eql(true)
+ // eslint-disable-next-line no-prototype-builtins
+ expect(matchedComponents[0].components.default.components.hasOwnProperty('UserCard')).to.eql(true)
})
- it('user\'s profile at /users', () => {
- router.push('/users/fake-user-name')
+ it('user\'s profile at /users', async () => {
+ await router.push('/users/fake-user-name')
- const matchedComponents = router.getMatchedComponents()
+ const matchedComponents = router.currentRoute.value.matched
- expect(matchedComponents[0].components.hasOwnProperty('UserCard')).to.eql(true)
+ // eslint-disable-next-line no-prototype-builtins
+ expect(matchedComponents[0].components.default.components.hasOwnProperty('UserCard')).to.eql(true)
})
})
diff --git a/test/unit/specs/components/emoji_input.spec.js b/test/unit/specs/components/emoji_input.spec.js
index 045b47fd..752111ef 100644
--- a/test/unit/specs/components/emoji_input.spec.js
+++ b/test/unit/specs/components/emoji_input.spec.js
@@ -1,108 +1,116 @@
-import { shallowMount, createLocalVue } from '@vue/test-utils'
+import { h } from 'vue'
+import { shallowMount } from '@vue/test-utils'
import EmojiInput from 'src/components/emoji_input/emoji_input.vue'
+import vClickOutside from 'click-outside-vue3'
const generateInput = (value, padEmoji = true) => {
- const localVue = createLocalVue()
- localVue.directive('click-outside', () => {})
const wrapper = shallowMount(EmojiInput, {
- propsData: {
- suggest: () => [],
- enableEmojiPicker: true,
- value
- },
- mocks: {
- $store: {
- getters: {
- mergedConfig: {
- padEmoji
+ global: {
+ renderStubDefaultSlot: true,
+ mocks: {
+ $store: {
+ getters: {
+ mergedConfig: {
+ padEmoji
+ }
}
}
+ },
+ stubs: {
+ FAIcon: true
+ },
+ directives: {
+ 'click-outside': vClickOutside
}
},
- slots: {
- default: '<input />'
+ props: {
+ suggest: () => [],
+ enableEmojiPicker: true,
+ modelValue: value
},
- localVue
+ slots: {
+ default: () => h('input', '')
+ }
})
- return [wrapper, localVue]
+ return wrapper
}
describe('EmojiInput', () => {
describe('insertion mechanism', () => {
it('inserts string at the end with trailing space', () => {
const initialString = 'Testing'
- const [wrapper] = generateInput(initialString)
+ const wrapper = generateInput(initialString)
const input = wrapper.find('input')
input.setValue(initialString)
wrapper.setData({ caret: initialString.length })
wrapper.vm.insert({ insertion: '(test)', keepOpen: false })
- const inputEvents = wrapper.emitted().input
+ const inputEvents = wrapper.emitted()['update:modelValue']
expect(inputEvents[inputEvents.length - 1][0]).to.eql('Testing (test) ')
})
it('inserts string at the end with trailing space (source has a trailing space)', () => {
const initialString = 'Testing '
- const [wrapper] = generateInput(initialString)
+ const wrapper = generateInput(initialString)
const input = wrapper.find('input')
input.setValue(initialString)
wrapper.setData({ caret: initialString.length })
wrapper.vm.insert({ insertion: '(test)', keepOpen: false })
- const inputEvents = wrapper.emitted().input
+ const inputEvents = wrapper.emitted()['update:modelValue']
expect(inputEvents[inputEvents.length - 1][0]).to.eql('Testing (test) ')
})
it('inserts string at the begginning without leading space', () => {
const initialString = 'Testing'
- const [wrapper] = generateInput(initialString)
+ const wrapper = generateInput(initialString)
const input = wrapper.find('input')
input.setValue(initialString)
wrapper.setData({ caret: 0 })
wrapper.vm.insert({ insertion: '(test)', keepOpen: false })
- const inputEvents = wrapper.emitted().input
+ const inputEvents = wrapper.emitted()['update:modelValue']
expect(inputEvents[inputEvents.length - 1][0]).to.eql('(test) Testing')
})
it('inserts string between words without creating extra spaces', () => {
const initialString = 'Spurdo Sparde'
- const [wrapper] = generateInput(initialString)
+ const wrapper = generateInput(initialString)
const input = wrapper.find('input')
input.setValue(initialString)
wrapper.setData({ caret: 6 })
wrapper.vm.insert({ insertion: ':ebin:', keepOpen: false })
- const inputEvents = wrapper.emitted().input
+ const inputEvents = wrapper.emitted()['update:modelValue']
expect(inputEvents[inputEvents.length - 1][0]).to.eql('Spurdo :ebin: Sparde')
})
it('inserts string between words without creating extra spaces (other caret)', () => {
const initialString = 'Spurdo Sparde'
- const [wrapper] = generateInput(initialString)
+ const wrapper = generateInput(initialString)
const input = wrapper.find('input')
input.setValue(initialString)
wrapper.setData({ caret: 7 })
wrapper.vm.insert({ insertion: ':ebin:', keepOpen: false })
- const inputEvents = wrapper.emitted().input
+ const inputEvents = wrapper.emitted()['update:modelValue']
expect(inputEvents[inputEvents.length - 1][0]).to.eql('Spurdo :ebin: Sparde')
})
it('inserts string without any padding if padEmoji setting is set to false', () => {
const initialString = 'Eat some spam!'
- const [wrapper] = generateInput(initialString, false)
+ const wrapper = generateInput(initialString, false)
const input = wrapper.find('input')
input.setValue(initialString)
wrapper.setData({ caret: initialString.length, keepOpen: false })
wrapper.vm.insert({ insertion: ':spam:' })
- const inputEvents = wrapper.emitted().input
+ const inputEvents = wrapper.emitted()['update:modelValue']
expect(inputEvents[inputEvents.length - 1][0]).to.eql('Eat some spam!:spam:')
})
it('correctly sets caret after insertion at beginning', (done) => {
const initialString = '1234'
- const [wrapper, vue] = generateInput(initialString)
+ const wrapper = generateInput(initialString)
const input = wrapper.find('input')
input.setValue(initialString)
wrapper.setData({ caret: 0 })
wrapper.vm.insert({ insertion: '1234', keepOpen: false })
- vue.nextTick(() => {
+ wrapper.vm.$nextTick(() => {
expect(wrapper.vm.caret).to.eql(5)
done()
})
@@ -110,12 +118,12 @@ describe('EmojiInput', () => {
it('correctly sets caret after insertion at end', (done) => {
const initialString = '1234'
- const [wrapper, vue] = generateInput(initialString)
+ const wrapper = generateInput(initialString)
const input = wrapper.find('input')
input.setValue(initialString)
wrapper.setData({ caret: initialString.length })
wrapper.vm.insert({ insertion: '1234', keepOpen: false })
- vue.nextTick(() => {
+ wrapper.vm.$nextTick(() => {
expect(wrapper.vm.caret).to.eql(10)
done()
})
@@ -123,12 +131,12 @@ describe('EmojiInput', () => {
it('correctly sets caret after insertion if padEmoji setting is set to false', (done) => {
const initialString = '1234'
- const [wrapper, vue] = generateInput(initialString, false)
+ const wrapper = generateInput(initialString, false)
const input = wrapper.find('input')
input.setValue(initialString)
wrapper.setData({ caret: initialString.length })
wrapper.vm.insert({ insertion: '1234', keepOpen: false })
- vue.nextTick(() => {
+ wrapper.vm.$nextTick(() => {
expect(wrapper.vm.caret).to.eql(8)
done()
})
diff --git a/test/unit/specs/components/rich_content.spec.js b/test/unit/specs/components/rich_content.spec.js
index f6c478a9..616df6a0 100644
--- a/test/unit/specs/components/rich_content.spec.js
+++ b/test/unit/specs/components/rich_content.spec.js
@@ -1,8 +1,23 @@
-import { mount, shallowMount, createLocalVue } from '@vue/test-utils'
+import { mount, shallowMount } from '@vue/test-utils'
import RichContent from 'src/components/rich_content/rich_content.jsx'
-const localVue = createLocalVue()
const attentions = []
+const global = {
+ mocks: {
+ $store: {
+ state: {},
+ getters: {
+ mergedConfig: () => ({
+ mentionLinkShowTooltip: true
+ }),
+ findUserByUrl: () => null
+ }
+ }
+ },
+ stubs: {
+ FAIcon: true
+ }
+}
const makeMention = (who) => {
attentions.push({ statusnet_profile_url: `https://fake.tld/@${who}` })
@@ -11,17 +26,17 @@ const makeMention = (who) => {
const p = (...data) => `<p>${data.join('')}</p>`
const compwrap = (...data) => `<span class="RichContent">${data.join('')}</span>`
const mentionsLine = (times) => [
- '<mentionsline-stub mentions="',
+ '<mentions-line-stub mentions="',
new Array(times).fill('[object Object]').join(','),
- '"></mentionsline-stub>'
+ '"></mentions-line-stub>'
].join('')
describe('RichContent', () => {
it('renders simple post without exploding', () => {
const html = p('Hello world!')
const wrapper = shallowMount(RichContent, {
- localVue,
- propsData: {
+ global,
+ props: {
attentions,
handleLinks: true,
greentext: true,
@@ -30,7 +45,7 @@ describe('RichContent', () => {
}
})
- expect(wrapper.html()).to.eql(compwrap(html))
+ expect(wrapper.html().replace(/\n/g, '')).to.eql(compwrap(html))
})
it('unescapes everything as needed', () => {
@@ -43,8 +58,8 @@ describe('RichContent', () => {
'Testing \'em all'
].join('')
const wrapper = shallowMount(RichContent, {
- localVue,
- propsData: {
+ global,
+ props: {
attentions,
handleLinks: true,
greentext: true,
@@ -53,7 +68,7 @@ describe('RichContent', () => {
}
})
- expect(wrapper.html()).to.eql(compwrap(expected))
+ expect(wrapper.html().replace(/\n/g, '')).to.eql(compwrap(expected))
})
it('replaces mention with mentionsline', () => {
@@ -62,8 +77,8 @@ describe('RichContent', () => {
' how are you doing today?'
)
const wrapper = shallowMount(RichContent, {
- localVue,
- propsData: {
+ global,
+ props: {
attentions,
handleLinks: true,
greentext: true,
@@ -72,7 +87,7 @@ describe('RichContent', () => {
}
})
- expect(wrapper.html()).to.eql(compwrap(p(
+ expect(wrapper.html().replace(/\n/g, '')).to.eql(compwrap(p(
mentionsLine(1),
' how are you doing today?'
)))
@@ -93,17 +108,17 @@ describe('RichContent', () => {
),
// TODO fix this extra line somehow?
p(
- '<mentionsline-stub mentions="',
+ '<mentions-line-stub mentions="',
'[object Object],',
'[object Object],',
'[object Object]',
- '"></mentionsline-stub>'
+ '"></mentions-line-stub>'
)
].join('')
const wrapper = shallowMount(RichContent, {
- localVue,
- propsData: {
+ global,
+ props: {
attentions,
handleLinks: true,
greentext: true,
@@ -112,7 +127,7 @@ describe('RichContent', () => {
}
})
- expect(wrapper.html()).to.eql(compwrap(expected))
+ expect(wrapper.html().replace(/\n/g, '')).to.eql(compwrap(expected))
})
it('Does not touch links if link handling is disabled', () => {
@@ -124,14 +139,13 @@ describe('RichContent', () => {
].join(''),
[
makeMention('John'),
- makeMention('Josh'),
- makeMention('Jeremy')
+ makeMention('Josh'), makeMention('Jeremy')
].join('')
].join('\n')
const wrapper = shallowMount(RichContent, {
- localVue,
- propsData: {
+ global,
+ props: {
attentions,
handleLinks: false,
greentext: true,
@@ -154,8 +168,8 @@ describe('RichContent', () => {
].join('\n')
const wrapper = shallowMount(RichContent, {
- localVue,
- propsData: {
+ global,
+ props: {
attentions,
handleLinks: false,
greentext: true,
@@ -174,8 +188,8 @@ describe('RichContent', () => {
].join('\n')
const wrapper = shallowMount(RichContent, {
- localVue,
- propsData: {
+ global,
+ props: {
attentions,
handleLinks: false,
greentext: false,
@@ -191,12 +205,12 @@ describe('RichContent', () => {
const html = p('Ebin :DDDD :spurdo:')
const expected = p(
'Ebin :DDDD ',
- '<anonymous-stub alt=":spurdo:" src="about:blank" title=":spurdo:" class="emoji img"></anonymous-stub>'
+ '<anonymous-stub src="about:blank" alt=":spurdo:" class="emoji img" title=":spurdo:"></anonymous-stub>'
)
const wrapper = shallowMount(RichContent, {
- localVue,
- propsData: {
+ global,
+ props: {
attentions,
handleLinks: false,
greentext: false,
@@ -205,15 +219,15 @@ describe('RichContent', () => {
}
})
- expect(wrapper.html()).to.eql(compwrap(expected))
+ expect(wrapper.html().replace(/\n/g, '')).to.eql(compwrap(expected))
})
it('Doesn\'t add nonexistent emoji to post', () => {
const html = p('Lol :lol:')
const wrapper = shallowMount(RichContent, {
- localVue,
- propsData: {
+ global,
+ props: {
attentions,
handleLinks: false,
greentext: false,
@@ -222,7 +236,7 @@ describe('RichContent', () => {
}
})
- expect(wrapper.html()).to.eql(compwrap(html))
+ expect(wrapper.html().replace(/\n/g, '')).to.eql(compwrap(html))
})
it('Greentext + last mentions', () => {
@@ -240,8 +254,8 @@ describe('RichContent', () => {
].join('\n')
const wrapper = shallowMount(RichContent, {
- localVue,
- propsData: {
+ global,
+ props: {
attentions,
handleLinks: true,
greentext: true,
@@ -272,8 +286,8 @@ describe('RichContent', () => {
].join('<br>')
const wrapper = shallowMount(RichContent, {
- localVue,
- propsData: {
+ global,
+ props: {
attentions,
handleLinks: true,
greentext: true,
@@ -282,7 +296,7 @@ describe('RichContent', () => {
}
})
- expect(wrapper.html()).to.eql(compwrap(expected))
+ expect(wrapper.html().replace(/\n/g, '')).to.eql(compwrap(expected))
})
it('buggy example/hashtags', () => {
@@ -300,16 +314,16 @@ describe('RichContent', () => {
'<p>',
'<a href="http://macrochan.org/images/N/H/NHCMDUXJPPZ6M3Z2CQ6D2EBRSWGE7MZY.jpg" target="_blank">',
'NHCMDUXJPPZ6M3Z2CQ6D2EBRSWGE7MZY.jpg</a>',
- ' <hashtaglink-stub url="https://shitposter.club/tag/nou" content="#nou" tag="nou">',
- '</hashtaglink-stub>',
- ' <hashtaglink-stub url="https://shitposter.club/tag/screencap" content="#screencap" tag="screencap">',
- '</hashtaglink-stub>',
+ ' <hashtag-link-stub url="https://shitposter.club/tag/nou" content="#nou" tag="nou">',
+ '</hashtag-link-stub>',
+ ' <hashtag-link-stub url="https://shitposter.club/tag/screencap" content="#screencap" tag="screencap">',
+ '</hashtag-link-stub>',
' </p>'
].join('')
const wrapper = shallowMount(RichContent, {
- localVue,
- propsData: {
+ global,
+ props: {
attentions,
handleLinks: true,
greentext: true,
@@ -318,7 +332,7 @@ describe('RichContent', () => {
}
})
- expect(wrapper.html()).to.eql(compwrap(expected))
+ expect(wrapper.html().replace(/\n/g, '')).to.eql(compwrap(expected))
})
it('rich contents of a mention are handled properly', () => {
@@ -342,7 +356,7 @@ describe('RichContent', () => {
p(
'<span class="MentionsLine">',
'<span class="MentionLink mention-link">',
- '<a href="lol" target="_blank" class="original">',
+ '<a href="lol" class="original" target="_blank">',
'<span>',
'https://</span>',
'<span>',
@@ -350,10 +364,7 @@ describe('RichContent', () => {
'<span>',
'</span>',
'</a>',
- ' ',
- '<!---->', // v-if placeholder, mentionlink's "new" (i.e. rich) display
'</span>',
- '<!---->', // v-if placeholder, mentionsline's extra mentions and stuff
'</span>'
),
p(
@@ -362,8 +373,8 @@ describe('RichContent', () => {
].join('')
const wrapper = mount(RichContent, {
- localVue,
- propsData: {
+ global,
+ props: {
attentions,
handleLinks: true,
greentext: true,
@@ -372,7 +383,75 @@ describe('RichContent', () => {
}
})
- expect(wrapper.html()).to.eql(compwrap(expected))
+ expect(wrapper.html().replace(/\n/g, '').replace(/<!--.*?-->/g, '')).to.eql(compwrap(expected))
+ })
+
+ it('rich contents of nested mentions are handled properly', () => {
+ attentions.push({ statusnet_profile_url: 'lol' })
+ const html = [
+ '<span class="poast-style">',
+ '<a href="lol" class="mention">',
+ '<span>',
+ 'https://</span>',
+ '<span>',
+ 'lol.tld/</span>',
+ '<span>',
+ '</span>',
+ '</a>',
+ ' ',
+ '<a href="lol" class="mention">',
+ '<span>',
+ 'https://</span>',
+ '<span>',
+ 'lol.tld/</span>',
+ '<span>',
+ '</span>',
+ '</a>',
+ ' ',
+ '</span>',
+ 'Testing'
+ ].join('')
+ const expected = [
+ '<span class="poast-style">',
+ '<span class="MentionsLine">',
+ '<span class="MentionLink mention-link">',
+ '<a href="lol" class="original" target="_blank">',
+ '<span>',
+ 'https://</span>',
+ '<span>',
+ 'lol.tld/</span>',
+ '<span>',
+ '</span>',
+ '</a>',
+ '</span>',
+ '<span class="MentionLink mention-link">',
+ '<a href="lol" class="original" target="_blank">',
+ '<span>',
+ 'https://</span>',
+ '<span>',
+ 'lol.tld/</span>',
+ '<span>',
+ '</span>',
+ '</a>',
+ '</span>',
+ '</span>',
+ ' ',
+ '</span>',
+ 'Testing'
+ ].join('')
+
+ const wrapper = mount(RichContent, {
+ global,
+ props: {
+ attentions,
+ handleLinks: true,
+ greentext: true,
+ emoji: [],
+ html
+ }
+ })
+
+ expect(wrapper.html().replace(/\n/g, '').replace(/<!--.*?-->/g, '')).to.eql(compwrap(expected))
})
it('rich contents of a link are handled properly', () => {
@@ -406,8 +485,8 @@ describe('RichContent', () => {
].join('')
const wrapper = shallowMount(RichContent, {
- localVue,
- propsData: {
+ global,
+ props: {
attentions,
handleLinks: true,
greentext: true,
@@ -416,7 +495,7 @@ describe('RichContent', () => {
}
})
- expect(wrapper.html()).to.eql(compwrap(expected))
+ expect(wrapper.html().replace(/\n/g, '')).to.eql(compwrap(expected))
})
it.skip('[INFORMATIVE] Performance testing, 10 000 simple posts', () => {
@@ -453,8 +532,8 @@ describe('RichContent', () => {
const t0 = performance.now()
const wrapper = mount(TestComponent, {
- localVue,
- propsData: {
+ global,
+ props: {
attentions,
handleLinks,
vhtml
diff --git a/test/unit/specs/components/timeline.spec.js b/test/unit/specs/components/timeline.spec.js
deleted file mode 100644
index 0c8674a8..00000000
--- a/test/unit/specs/components/timeline.spec.js
+++ /dev/null
@@ -1,27 +0,0 @@
-import { getExcludedStatusIdsByPinning } from 'src/components/timeline/timeline.js'
-
-describe('Timeline', () => {
- describe('getExcludedStatusIdsByPinning', () => {
- const mockStatuses = (ids) => ids.map(id => ({ id }))
-
- it('should return only members of both pinnedStatusIds and ids of the given statuses', () => {
- const statusIds = [1, 2, 3, 4]
- const statuses = mockStatuses(statusIds)
- const pinnedStatusIds = [1, 3, 5]
- const result = getExcludedStatusIdsByPinning(statuses, pinnedStatusIds)
- result.forEach(item => {
- expect(item).to.be.oneOf(statusIds)
- expect(item).to.be.oneOf(pinnedStatusIds)
- })
- })
-
- it('should return ids of pinned statuses not posted before any unpinned status', () => {
- const pinnedStatusIdSet1 = ['PINNED1', 'PINNED2']
- const pinnedStatusIdSet2 = ['PINNED3', 'PINNED4']
- const pinnedStatusIds = [...pinnedStatusIdSet1, ...pinnedStatusIdSet2]
- const statusIds = [...pinnedStatusIdSet1, 'UNPINNED1', ...pinnedStatusIdSet2]
- const statuses = mockStatuses(statusIds)
- expect(getExcludedStatusIdsByPinning(statuses, pinnedStatusIds)).to.eql(pinnedStatusIdSet1)
- })
- })
-})
diff --git a/test/unit/specs/components/user_profile.spec.js b/test/unit/specs/components/user_profile.spec.js
index 142db73c..0fbab722 100644
--- a/test/unit/specs/components/user_profile.spec.js
+++ b/test/unit/specs/components/user_profile.spec.js
@@ -1,12 +1,9 @@
-import { mount, createLocalVue } from '@vue/test-utils'
-import Vuex from 'vuex'
+import { mount } from '@vue/test-utils'
+import { createStore } from 'vuex'
import UserProfile from 'src/components/user_profile/user_profile.vue'
import backendInteractorService from 'src/services/backend_interactor_service/backend_interactor_service.js'
import { getters } from 'src/modules/users.js'
-const localVue = createLocalVue()
-localVue.use(Vuex)
-
const mutations = {
clearTimeline: () => {}
}
@@ -42,7 +39,7 @@ const extUser = {
screen_name_ui: 'testUser@test.instance'
}
-const externalProfileStore = new Vuex.Store({
+const externalProfileStore = createStore({
mutations,
actions,
getters: testGetters,
@@ -104,7 +101,7 @@ const externalProfileStore = new Vuex.Store({
}
})
-const localProfileStore = new Vuex.Store({
+const localProfileStore = createStore({
mutations,
actions,
getters: testGetters,
@@ -166,24 +163,26 @@ const localProfileStore = new Vuex.Store({
currentUser: {
credentials: ''
},
- usersObject: { 100: localUser, 'testuser': localUser },
+ usersObject: { 100: localUser, testuser: localUser },
users: [localUser],
relationships: {}
}
}
})
-describe('UserProfile', () => {
+// https://github.com/vuejs/test-utils/issues/1382
+describe.skip('UserProfile', () => {
it('renders external profile', () => {
const wrapper = mount(UserProfile, {
- localVue,
- store: externalProfileStore,
- mocks: {
- $route: {
- params: { id: 100 },
- name: 'external-user-profile'
- },
- $t: (msg) => msg
+ global: {
+ plugins: [externalProfileStore],
+ mocks: {
+ $route: {
+ params: { id: 100 },
+ name: 'external-user-profile'
+ },
+ $t: (msg) => msg
+ }
}
})
@@ -192,14 +191,15 @@ describe('UserProfile', () => {
it('renders local profile', () => {
const wrapper = mount(UserProfile, {
- localVue,
- store: localProfileStore,
- mocks: {
- $route: {
- params: { name: 'testUser' },
- name: 'user-profile'
- },
- $t: (msg) => msg
+ global: {
+ plugins: [localProfileStore],
+ mocks: {
+ $route: {
+ params: { name: 'testUser' },
+ name: 'user-profile'
+ },
+ $t: (msg) => msg
+ }
}
})
diff --git a/test/unit/specs/modules/statuses.spec.js b/test/unit/specs/modules/statuses.spec.js
index b790b231..a8d0e5a3 100644
--- a/test/unit/specs/modules/statuses.spec.js
+++ b/test/unit/specs/modules/statuses.spec.js
@@ -245,7 +245,7 @@ describe('Statuses module', () => {
it('increments count in existing reaction', () => {
const state = defaultState()
const status = makeMockStatus({ id: '1' })
- status.emoji_reactions = [ { name: '😂', count: 1, accounts: [] } ]
+ status.emoji_reactions = [{ name: '😂', count: 1, accounts: [] }]
mutations.addNewStatuses(state, { statuses: [status], showImmediately: true, timeline: 'public' })
mutations.addOwnReaction(state, { id: '1', emoji: '😂', currentUser: { id: 'me' } })
@@ -269,7 +269,7 @@ describe('Statuses module', () => {
it('decreases count in existing reaction', () => {
const state = defaultState()
const status = makeMockStatus({ id: '1' })
- status.emoji_reactions = [ { name: '😂', count: 2, accounts: [{ id: 'me' }] } ]
+ status.emoji_reactions = [{ name: '😂', count: 2, accounts: [{ id: 'me' }] }]
mutations.addNewStatuses(state, { statuses: [status], showImmediately: true, timeline: 'public' })
mutations.removeOwnReaction(state, { id: '1', emoji: '😂', currentUser: { id: 'me' } })
diff --git a/test/unit/specs/services/chat_service/chat_service.spec.js b/test/unit/specs/services/chat_service/chat_service.spec.js
index fbbca436..a42269b4 100644
--- a/test/unit/specs/services/chat_service/chat_service.spec.js
+++ b/test/unit/specs/services/chat_service/chat_service.spec.js
@@ -24,23 +24,23 @@ describe('chatService', () => {
describe('.add', () => {
it("Doesn't add duplicates", () => {
const chat = chatService.empty()
- chatService.add(chat, { messages: [ message1 ] })
- chatService.add(chat, { messages: [ message1 ] })
+ chatService.add(chat, { messages: [message1] })
+ chatService.add(chat, { messages: [message1] })
expect(chat.messages.length).to.eql(1)
- chatService.add(chat, { messages: [ message2 ] })
+ chatService.add(chat, { messages: [message2] })
expect(chat.messages.length).to.eql(2)
})
it('Updates minId and lastMessage and newMessageCount', () => {
const chat = chatService.empty()
- chatService.add(chat, { messages: [ message1 ] })
+ chatService.add(chat, { messages: [message1] })
expect(chat.maxId).to.eql(message1.id)
expect(chat.minId).to.eql(message1.id)
expect(chat.newMessageCount).to.eql(1)
- chatService.add(chat, { messages: [ message2 ] })
+ chatService.add(chat, { messages: [message2] })
expect(chat.maxId).to.eql(message2.id)
expect(chat.minId).to.eql(message1.id)
expect(chat.newMessageCount).to.eql(2)
@@ -50,7 +50,7 @@ describe('chatService', () => {
expect(chat.lastSeenMessageId).to.eql(message2.id)
// Add message with higher id
- chatService.add(chat, { messages: [ message3 ] })
+ chatService.add(chat, { messages: [message3] })
expect(chat.newMessageCount).to.eql(1)
})
})
@@ -59,9 +59,9 @@ describe('chatService', () => {
it('Updates minId and lastMessage', () => {
const chat = chatService.empty()
- chatService.add(chat, { messages: [ message1 ] })
- chatService.add(chat, { messages: [ message2 ] })
- chatService.add(chat, { messages: [ message3 ] })
+ chatService.add(chat, { messages: [message1] })
+ chatService.add(chat, { messages: [message2] })
+ chatService.add(chat, { messages: [message3] })
expect(chat.maxId).to.eql(message3.id)
expect(chat.minId).to.eql(message1.id)
@@ -80,9 +80,9 @@ describe('chatService', () => {
it('Inserts date separators', () => {
const chat = chatService.empty()
- chatService.add(chat, { messages: [ message1 ] })
- chatService.add(chat, { messages: [ message2 ] })
- chatService.add(chat, { messages: [ message3 ] })
+ chatService.add(chat, { messages: [message1] })
+ chatService.add(chat, { messages: [message2] })
+ chatService.add(chat, { messages: [message3] })
const view = chatService.getView(chat)
expect(view.map(i => i.type)).to.eql(['date', 'message', 'message', 'date', 'message'])
diff --git a/test/unit/specs/services/date_utils/date_utils.spec.js b/test/unit/specs/services/date_utils/date_utils.spec.js
index 2d61dbac..bd1efe81 100644
--- a/test/unit/specs/services/date_utils/date_utils.spec.js
+++ b/test/unit/specs/services/date_utils/date_utils.spec.js
@@ -11,30 +11,30 @@ describe('DateUtils', () => {
it('rounds down for past', () => {
const time = Date.now() - 1.8 * DateUtils.HOUR
- expect(DateUtils.relativeTime(time)).to.eql({ num: 1, key: 'time.hour' })
+ expect(DateUtils.relativeTime(time)).to.eql({ num: 1, key: 'time.unit.hours' })
})
it('rounds up for future', () => {
const time = Date.now() + 1.8 * DateUtils.HOUR
- expect(DateUtils.relativeTime(time)).to.eql({ num: 2, key: 'time.hours' })
+ expect(DateUtils.relativeTime(time)).to.eql({ num: 2, key: 'time.unit.hours' })
})
it('uses plural when necessary', () => {
const time = Date.now() - 3.8 * DateUtils.WEEK
- expect(DateUtils.relativeTime(time)).to.eql({ num: 3, key: 'time.weeks' })
+ expect(DateUtils.relativeTime(time)).to.eql({ num: 3, key: 'time.unit.weeks' })
})
it('works with date string', () => {
const time = Date.now() - 4 * DateUtils.MONTH
const dateString = new Date(time).toISOString()
- expect(DateUtils.relativeTime(dateString)).to.eql({ num: 4, key: 'time.months' })
+ expect(DateUtils.relativeTime(dateString)).to.eql({ num: 4, key: 'time.unit.months' })
})
})
describe('relativeTimeShort', () => {
it('returns the short version of the same relative time', () => {
const time = Date.now() + 2 * DateUtils.YEAR
- expect(DateUtils.relativeTimeShort(time)).to.eql({ num: 2, key: 'time.years_short' })
+ expect(DateUtils.relativeTimeShort(time)).to.eql({ num: 2, key: 'time.unit.years_short' })
})
})
})
diff --git a/test/unit/specs/services/entity_normalizer/entity_normalizer.spec.js b/test/unit/specs/services/entity_normalizer/entity_normalizer.spec.js
index 03fb32c9..525e57a5 100644
--- a/test/unit/specs/services/entity_normalizer/entity_normalizer.spec.js
+++ b/test/unit/specs/services/entity_normalizer/entity_normalizer.spec.js
@@ -314,8 +314,8 @@ describe('API Entities normalizer', () => {
const linkHeader = '<https://example.com/api/v1/notifications?max_id=861676>; rel="next", <https://example.com/api/v1/notifications?min_id=861741>; rel="prev"'
const result = parseLinkHeaderPagination(linkHeader)
expect(result).to.eql({
- 'maxId': 861676,
- 'minId': 861741
+ maxId: 861676,
+ minId: 861741
})
})
@@ -323,8 +323,8 @@ describe('API Entities normalizer', () => {
const linkHeader = '<http://example.com/api/v1/timelines/home?max_id=9waQx5IIS48qVue2Ai>; rel="next", <http://example.com/api/v1/timelines/home?min_id=9wi61nIPnfn674xgie>; rel="prev"'
const result = parseLinkHeaderPagination(linkHeader, { flakeId: true })
expect(result).to.eql({
- 'maxId': '9waQx5IIS48qVue2Ai',
- 'minId': '9wi61nIPnfn674xgie'
+ maxId: '9waQx5IIS48qVue2Ai',
+ minId: '9wi61nIPnfn674xgie'
})
})
})
diff --git a/test/unit/specs/services/file_size_format/file_size_format.spec.js b/test/unit/specs/services/file_size_format/file_size_format.spec.js
index e02ac379..6804b6eb 100644
--- a/test/unit/specs/services/file_size_format/file_size_format.spec.js
+++ b/test/unit/specs/services/file_size_format/file_size_format.spec.js
@@ -25,8 +25,8 @@ describe('fileSizeFormat', () => {
}
]
- var res = []
- for (var value in values) {
+ const res = []
+ for (const value in values) {
res.push(fileSizeFormatService.fileSizeFormat(values[value]))
}
expect(res).to.eql(expected)
diff --git a/test/unit/specs/services/theme_data/sanity_checks.spec.js b/test/unit/specs/services/theme_data/sanity_checks.spec.js
index f0072e7d..f94c6a08 100644
--- a/test/unit/specs/services/theme_data/sanity_checks.spec.js
+++ b/test/unit/specs/services/theme_data/sanity_checks.spec.js
@@ -6,7 +6,7 @@ const checkColors = (output) => {
expect(v, key).to.be.an('object')
expect(v, key).to.include.all.keys('r', 'g', 'b')
'rgba'.split('').forEach(k => {
- if ((k === 'a' && v.hasOwnProperty('a')) || k !== 'a') {
+ if ((k === 'a' && Object.prototype.hasOwnProperty.call(v, 'a')) || k !== 'a') {
expect(v[k], key + '.' + k).to.be.a('number')
expect(v[k], key + '.' + k).to.be.least(0)
expect(v[k], key + '.' + k).to.be.most(k === 'a' ? 1 : 255)