aboutsummaryrefslogtreecommitdiff
path: root/test/unit/specs/components
diff options
context:
space:
mode:
Diffstat (limited to 'test/unit/specs/components')
-rw-r--r--test/unit/specs/components/emoji_input.spec.js131
-rw-r--r--test/unit/specs/components/timeline.spec.js27
-rw-r--r--test/unit/specs/components/user_profile.spec.js18
3 files changed, 168 insertions, 8 deletions
diff --git a/test/unit/specs/components/emoji_input.spec.js b/test/unit/specs/components/emoji_input.spec.js
new file mode 100644
index 00000000..b1b98802
--- /dev/null
+++ b/test/unit/specs/components/emoji_input.spec.js
@@ -0,0 +1,131 @@
+import { shallowMount, createLocalVue } from '@vue/test-utils'
+import EmojiInput from 'src/components/emoji_input/emoji_input.vue'
+
+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
+ }
+ }
+ }
+ },
+ slots: {
+ default: '<input />'
+ },
+ localVue
+ })
+ return [wrapper, localVue]
+}
+
+describe('EmojiInput', () => {
+ describe('insertion mechanism', () => {
+ it('inserts string at the end with trailing space', () => {
+ const initialString = 'Testing'
+ const [wrapper] = generateInput(initialString)
+ const input = wrapper.find('input')
+ input.setValue(initialString)
+ wrapper.setData({ caret: initialString.length })
+ wrapper.vm.insert({ insertion: '(test)', keepOpen: false })
+ expect(wrapper.emitted().input[0][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 input = wrapper.find('input')
+ input.setValue(initialString)
+ wrapper.setData({ caret: initialString.length })
+ wrapper.vm.insert({ insertion: '(test)', keepOpen: false })
+ expect(wrapper.emitted().input[0][0]).to.eql('Testing (test) ')
+ })
+
+ it('inserts string at the begginning without leading space', () => {
+ const initialString = 'Testing'
+ const [wrapper] = generateInput(initialString)
+ const input = wrapper.find('input')
+ input.setValue(initialString)
+ wrapper.setData({ caret: 0 })
+ wrapper.vm.insert({ insertion: '(test)', keepOpen: false })
+ expect(wrapper.emitted().input[0][0]).to.eql('(test) Testing')
+ })
+
+ it('inserts string between words without creating extra spaces', () => {
+ const initialString = 'Spurdo Sparde'
+ const [wrapper] = generateInput(initialString)
+ const input = wrapper.find('input')
+ input.setValue(initialString)
+ wrapper.setData({ caret: 6 })
+ wrapper.vm.insert({ insertion: ':ebin:', keepOpen: false })
+ expect(wrapper.emitted().input[0][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 input = wrapper.find('input')
+ input.setValue(initialString)
+ wrapper.setData({ caret: 7 })
+ wrapper.vm.insert({ insertion: ':ebin:', keepOpen: false })
+ expect(wrapper.emitted().input[0][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 input = wrapper.find('input')
+ input.setValue(initialString)
+ wrapper.setData({ caret: initialString.length, keepOpen: false })
+ wrapper.vm.insert({ insertion: ':spam:' })
+ expect(wrapper.emitted().input[0][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 input = wrapper.find('input')
+ input.setValue(initialString)
+ wrapper.setData({ caret: 0 })
+ wrapper.vm.insert({ insertion: '1234', keepOpen: false })
+ vue.nextTick(() => {
+ expect(wrapper.vm.caret).to.eql(5)
+ done()
+ })
+ })
+
+ it('correctly sets caret after insertion at end', (done) => {
+ const initialString = '1234'
+ const [wrapper, vue] = generateInput(initialString)
+ const input = wrapper.find('input')
+ input.setValue(initialString)
+ wrapper.setData({ caret: initialString.length })
+ wrapper.vm.insert({ insertion: '1234', keepOpen: false })
+ vue.nextTick(() => {
+ expect(wrapper.vm.caret).to.eql(10)
+ done()
+ })
+ })
+
+ it('correctly sets caret after insertion if padEmoji setting is set to false', (done) => {
+ const initialString = '1234'
+ const [wrapper, vue] = 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(() => {
+ expect(wrapper.vm.caret).to.eql(8)
+ done()
+ })
+ })
+ })
+})
diff --git a/test/unit/specs/components/timeline.spec.js b/test/unit/specs/components/timeline.spec.js
new file mode 100644
index 00000000..0c8674a8
--- /dev/null
+++ b/test/unit/specs/components/timeline.spec.js
@@ -0,0 +1,27 @@
+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 847481f3..1b6a47d7 100644
--- a/test/unit/specs/components/user_profile.spec.js
+++ b/test/unit/specs/components/user_profile.spec.js
@@ -18,7 +18,14 @@ const actions = {
}
const testGetters = {
- findUser: state => getters.findUser(state.users)
+ findUser: state => getters.findUser(state.users),
+ mergedConfig: state => ({
+ colors: '',
+ highlight: {},
+ customTheme: {
+ colors: []
+ }
+ })
}
const localUser = {
@@ -39,18 +46,12 @@ const externalProfileStore = new Vuex.Store({
getters: testGetters,
state: {
api: {
+ fetchers: {},
backendInteractor: backendInteractorService('')
},
interface: {
browserSupport: ''
},
- config: {
- colors: '',
- highlight: {},
- customTheme: {
- colors: []
- }
- },
instance: {
hideUserStats: true
},
@@ -106,6 +107,7 @@ const localProfileStore = new Vuex.Store({
getters: testGetters,
state: {
api: {
+ fetchers: {},
backendInteractor: backendInteractorService('')
},
interface: {