Merge branch 'develop' into kPherox/pleroma-fe-iss-149/profile-fields-display
This commit is contained in:
commit
f8cf92a01f
303 changed files with 14875 additions and 9999 deletions
|
@ -36,7 +36,8 @@ describe('EmojiInput', () => {
|
|||
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) ')
|
||||
const inputEvents = wrapper.emitted().input
|
||||
expect(inputEvents[inputEvents.length - 1][0]).to.eql('Testing (test) ')
|
||||
})
|
||||
|
||||
it('inserts string at the end with trailing space (source has a trailing space)', () => {
|
||||
|
@ -46,7 +47,8 @@ describe('EmojiInput', () => {
|
|||
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) ')
|
||||
const inputEvents = wrapper.emitted().input
|
||||
expect(inputEvents[inputEvents.length - 1][0]).to.eql('Testing (test) ')
|
||||
})
|
||||
|
||||
it('inserts string at the begginning without leading space', () => {
|
||||
|
@ -56,7 +58,8 @@ describe('EmojiInput', () => {
|
|||
input.setValue(initialString)
|
||||
wrapper.setData({ caret: 0 })
|
||||
wrapper.vm.insert({ insertion: '(test)', keepOpen: false })
|
||||
expect(wrapper.emitted().input[0][0]).to.eql('(test) Testing')
|
||||
const inputEvents = wrapper.emitted().input
|
||||
expect(inputEvents[inputEvents.length - 1][0]).to.eql('(test) Testing')
|
||||
})
|
||||
|
||||
it('inserts string between words without creating extra spaces', () => {
|
||||
|
@ -66,7 +69,8 @@ describe('EmojiInput', () => {
|
|||
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')
|
||||
const inputEvents = wrapper.emitted().input
|
||||
expect(inputEvents[inputEvents.length - 1][0]).to.eql('Spurdo :ebin: Sparde')
|
||||
})
|
||||
|
||||
it('inserts string between words without creating extra spaces (other caret)', () => {
|
||||
|
@ -76,7 +80,8 @@ describe('EmojiInput', () => {
|
|||
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')
|
||||
const inputEvents = wrapper.emitted().input
|
||||
expect(inputEvents[inputEvents.length - 1][0]).to.eql('Spurdo :ebin: Sparde')
|
||||
})
|
||||
|
||||
it('inserts string without any padding if padEmoji setting is set to false', () => {
|
||||
|
@ -86,7 +91,8 @@ describe('EmojiInput', () => {
|
|||
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:')
|
||||
const inputEvents = wrapper.emitted().input
|
||||
expect(inputEvents[inputEvents.length - 1][0]).to.eql('Eat some spam!:spam:')
|
||||
})
|
||||
|
||||
it('correctly sets caret after insertion at beginning', (done) => {
|
||||
|
|
|
@ -19,6 +19,7 @@ const actions = {
|
|||
|
||||
const testGetters = {
|
||||
findUser: state => getters.findUser(state.users),
|
||||
relationship: state => getters.relationship(state.users),
|
||||
mergedConfig: state => ({
|
||||
colors: '',
|
||||
highlight: {},
|
||||
|
@ -96,7 +97,8 @@ const externalProfileStore = new Vuex.Store({
|
|||
credentials: ''
|
||||
},
|
||||
usersObject: { 100: extUser },
|
||||
users: [extUser]
|
||||
users: [extUser],
|
||||
relationships: {}
|
||||
}
|
||||
}
|
||||
})
|
||||
|
@ -164,7 +166,8 @@ const localProfileStore = new Vuex.Store({
|
|||
credentials: ''
|
||||
},
|
||||
usersObject: { 100: localUser, 'testuser': localUser },
|
||||
users: [localUser]
|
||||
users: [localUser],
|
||||
relationships: {}
|
||||
}
|
||||
}
|
||||
})
|
||||
|
|
|
@ -241,6 +241,54 @@ describe('Statuses module', () => {
|
|||
})
|
||||
})
|
||||
|
||||
describe('emojiReactions', () => {
|
||||
it('increments count in existing reaction', () => {
|
||||
const state = defaultState()
|
||||
const status = makeMockStatus({ id: '1' })
|
||||
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' } })
|
||||
expect(state.allStatusesObject['1'].emoji_reactions[0].count).to.eql(2)
|
||||
expect(state.allStatusesObject['1'].emoji_reactions[0].me).to.eql(true)
|
||||
expect(state.allStatusesObject['1'].emoji_reactions[0].accounts[0].id).to.eql('me')
|
||||
})
|
||||
|
||||
it('adds a new reaction', () => {
|
||||
const state = defaultState()
|
||||
const status = makeMockStatus({ id: '1' })
|
||||
status.emoji_reactions = []
|
||||
|
||||
mutations.addNewStatuses(state, { statuses: [status], showImmediately: true, timeline: 'public' })
|
||||
mutations.addOwnReaction(state, { id: '1', emoji: '😂', currentUser: { id: 'me' } })
|
||||
expect(state.allStatusesObject['1'].emoji_reactions[0].count).to.eql(1)
|
||||
expect(state.allStatusesObject['1'].emoji_reactions[0].me).to.eql(true)
|
||||
expect(state.allStatusesObject['1'].emoji_reactions[0].accounts[0].id).to.eql('me')
|
||||
})
|
||||
|
||||
it('decreases count in existing reaction', () => {
|
||||
const state = defaultState()
|
||||
const status = makeMockStatus({ id: '1' })
|
||||
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' } })
|
||||
expect(state.allStatusesObject['1'].emoji_reactions[0].count).to.eql(1)
|
||||
expect(state.allStatusesObject['1'].emoji_reactions[0].me).to.eql(false)
|
||||
expect(state.allStatusesObject['1'].emoji_reactions[0].accounts).to.eql([])
|
||||
})
|
||||
|
||||
it('removes a reaction', () => {
|
||||
const state = defaultState()
|
||||
const status = makeMockStatus({ id: '1' })
|
||||
status.emoji_reactions = [{ name: '😂', count: 1, accounts: [{ id: 'me' }] }]
|
||||
|
||||
mutations.addNewStatuses(state, { statuses: [status], showImmediately: true, timeline: 'public' })
|
||||
mutations.removeOwnReaction(state, { id: '1', emoji: '😂', currentUser: { id: 'me' } })
|
||||
expect(state.allStatusesObject['1'].emoji_reactions.length).to.eql(0)
|
||||
})
|
||||
})
|
||||
|
||||
describe('showNewStatuses', () => {
|
||||
it('resets the minId to the min of the visible statuses when adding new to visible statuses', () => {
|
||||
const state = defaultState()
|
||||
|
|
|
@ -18,20 +18,6 @@ describe('The users module', () => {
|
|||
expect(state.users).to.eql([user])
|
||||
expect(state.users[0].name).to.eql('Dude')
|
||||
})
|
||||
|
||||
it('sets a mute bit on users', () => {
|
||||
const state = cloneDeep(defaultState)
|
||||
const user = { id: '1', name: 'Guy' }
|
||||
|
||||
mutations.addNewUsers(state, [user])
|
||||
mutations.setMuted(state, { user, muted: true })
|
||||
|
||||
expect(user.muted).to.eql(true)
|
||||
|
||||
mutations.setMuted(state, { user, muted: false })
|
||||
|
||||
expect(user.muted).to.eql(false)
|
||||
})
|
||||
})
|
||||
|
||||
describe('findUser', () => {
|
||||
|
|
|
@ -351,9 +351,9 @@ describe('API Entities normalizer', () => {
|
|||
|
||||
describe('MastoAPI emoji adder', () => {
|
||||
const emojis = makeMockEmojiMasto()
|
||||
const imageHtml = '<img src="https://example.com/image.png" alt="image" title="image" class="emoji" />'
|
||||
const imageHtml = '<img src="https://example.com/image.png" alt=":image:" title=":image:" class="emoji" />'
|
||||
.replace(/"/g, '\'')
|
||||
const thinkHtml = '<img src="https://example.com/think.png" alt="thinking" title="thinking" class="emoji" />'
|
||||
const thinkHtml = '<img src="https://example.com/think.png" alt=":thinking:" title=":thinking:" class="emoji" />'
|
||||
.replace(/"/g, '\'')
|
||||
|
||||
it('correctly replaces shortcodes in supplied string', () => {
|
||||
|
@ -379,8 +379,8 @@ describe('API Entities normalizer', () => {
|
|||
shortcode: '[a-z] {|}*'
|
||||
}])
|
||||
const result = addEmojis('This post has :c++: emoji and :[a-z] {|}*: emoji', emojis)
|
||||
expect(result).to.include('title=\'c++\'')
|
||||
expect(result).to.include('title=\'[a-z] {|}*\'')
|
||||
expect(result).to.include('title=\':c++:\'')
|
||||
expect(result).to.include('title=\':[a-z] {|}*:\'')
|
||||
})
|
||||
})
|
||||
})
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import * as NotificationUtils from 'src/services/notification_utils/notification_utils.js'
|
||||
|
||||
describe('NotificationUtils', () => {
|
||||
describe('visibleNotificationsFromStore', () => {
|
||||
describe('filteredNotificationsFromStore', () => {
|
||||
it('should return sorted notifications with configured types', () => {
|
||||
const store = {
|
||||
state: {
|
||||
|
@ -47,7 +47,7 @@ describe('NotificationUtils', () => {
|
|||
type: 'like'
|
||||
}
|
||||
]
|
||||
expect(NotificationUtils.visibleNotificationsFromStore(store)).to.eql(expected)
|
||||
expect(NotificationUtils.filteredNotificationsFromStore(store)).to.eql(expected)
|
||||
})
|
||||
})
|
||||
|
||||
|
|
|
@ -1,17 +0,0 @@
|
|||
import { removeAttachmentLinks } from '../../../../../src/services/status_parser/status_parser.js'
|
||||
|
||||
const example = '<div class="status-content">@<a href="https://sealion.club/user/4" class="h-card mention" title="dewoo">dwmatiz</a> <a href="https://social.heldscal.la/file/3deb764ada10ce64a61b7a070b75dac45f86d2d5bf213bf18873da71d8714d86.png" title="https://social.heldscal.la/file/3deb764ada10ce64a61b7a070b75dac45f86d2d5bf213bf18873da71d8714d86.png" class="attachment" id="attachment-159853" rel="nofollow external">https://social.heldscal.la/attachment/159853</a></div>'
|
||||
|
||||
describe('statusParser.removeAttachmentLinks', () => {
|
||||
const exampleWithoutAttachmentLinks = '<div class="status-content">@<a href="https://sealion.club/user/4" class="h-card mention" title="dewoo">dwmatiz</a> </div>'
|
||||
|
||||
it('removes attachment links', () => {
|
||||
const parsed = removeAttachmentLinks(example)
|
||||
expect(parsed).to.eql(exampleWithoutAttachmentLinks)
|
||||
})
|
||||
|
||||
it('works when the class is empty', () => {
|
||||
const parsed = removeAttachmentLinks('<a></a>')
|
||||
expect(parsed).to.eql('<a></a>')
|
||||
})
|
||||
})
|
28
test/unit/specs/services/theme_data/sanity_checks.spec.js
Normal file
28
test/unit/specs/services/theme_data/sanity_checks.spec.js
Normal file
|
@ -0,0 +1,28 @@
|
|||
import { getColors } from 'src/services/theme_data/theme_data.service.js'
|
||||
|
||||
const checkColors = (output) => {
|
||||
expect(output).to.have.property('colors')
|
||||
Object.entries(output.colors).forEach(([key, v]) => {
|
||||
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') {
|
||||
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)
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
describe('Theme Data utility functions', () => {
|
||||
const context = require.context('static/themes/', false, /\.json$/)
|
||||
context.keys().forEach((key) => {
|
||||
it(`Should render all colors for ${key} properly`, () => {
|
||||
const { theme, source } = context(key)
|
||||
const data = source || theme
|
||||
const colors = getColors(data.colors, data.opacity, 1)
|
||||
checkColors(colors)
|
||||
})
|
||||
})
|
||||
})
|
89
test/unit/specs/services/theme_data/theme_data.spec.js
Normal file
89
test/unit/specs/services/theme_data/theme_data.spec.js
Normal file
|
@ -0,0 +1,89 @@
|
|||
import { getLayersArray, topoSort } from 'src/services/theme_data/theme_data.service.js'
|
||||
|
||||
describe('Theme Data utility functions', () => {
|
||||
describe('getLayersArray', () => {
|
||||
const fixture = {
|
||||
layer1: null,
|
||||
layer2: 'layer1',
|
||||
layer3a: 'layer2',
|
||||
layer3b: 'layer2'
|
||||
}
|
||||
|
||||
it('should expand layers properly (3b)', () => {
|
||||
const out = getLayersArray('layer3b', fixture)
|
||||
expect(out).to.eql(['layer1', 'layer2', 'layer3b'])
|
||||
})
|
||||
|
||||
it('should expand layers properly (3a)', () => {
|
||||
const out = getLayersArray('layer3a', fixture)
|
||||
expect(out).to.eql(['layer1', 'layer2', 'layer3a'])
|
||||
})
|
||||
|
||||
it('should expand layers properly (2)', () => {
|
||||
const out = getLayersArray('layer2', fixture)
|
||||
expect(out).to.eql(['layer1', 'layer2'])
|
||||
})
|
||||
|
||||
it('should expand layers properly (1)', () => {
|
||||
const out = getLayersArray('layer1', fixture)
|
||||
expect(out).to.eql(['layer1'])
|
||||
})
|
||||
})
|
||||
|
||||
describe('topoSort', () => {
|
||||
const fixture1 = {
|
||||
layerA: [],
|
||||
layer1A: ['layerA'],
|
||||
layer2A: ['layer1A'],
|
||||
layerB: [],
|
||||
layer1B: ['layerB'],
|
||||
layer2B: ['layer1B'],
|
||||
layer3AB: ['layer2B', 'layer2A']
|
||||
}
|
||||
|
||||
// Same thing but messed up order
|
||||
const fixture2 = {
|
||||
layer1A: ['layerA'],
|
||||
layer1B: ['layerB'],
|
||||
layer2A: ['layer1A'],
|
||||
layerB: [],
|
||||
layer3AB: ['layer2B', 'layer2A'],
|
||||
layer2B: ['layer1B'],
|
||||
layerA: []
|
||||
}
|
||||
|
||||
it('should make a topologically sorted array', () => {
|
||||
const out = topoSort(fixture1, (node, inheritance) => inheritance[node])
|
||||
// This basically checks all ordering that matters
|
||||
expect(out.indexOf('layerA')).to.be.below(out.indexOf('layer1A'))
|
||||
expect(out.indexOf('layer1A')).to.be.below(out.indexOf('layer2A'))
|
||||
expect(out.indexOf('layerB')).to.be.below(out.indexOf('layer1B'))
|
||||
expect(out.indexOf('layer1B')).to.be.below(out.indexOf('layer2B'))
|
||||
expect(out.indexOf('layer2A')).to.be.below(out.indexOf('layer3AB'))
|
||||
expect(out.indexOf('layer2B')).to.be.below(out.indexOf('layer3AB'))
|
||||
})
|
||||
|
||||
it('order in object shouldn\'t matter', () => {
|
||||
const out = topoSort(fixture2, (node, inheritance) => inheritance[node])
|
||||
// This basically checks all ordering that matters
|
||||
expect(out.indexOf('layerA')).to.be.below(out.indexOf('layer1A'))
|
||||
expect(out.indexOf('layer1A')).to.be.below(out.indexOf('layer2A'))
|
||||
expect(out.indexOf('layerB')).to.be.below(out.indexOf('layer1B'))
|
||||
expect(out.indexOf('layer1B')).to.be.below(out.indexOf('layer2B'))
|
||||
expect(out.indexOf('layer2A')).to.be.below(out.indexOf('layer3AB'))
|
||||
expect(out.indexOf('layer2B')).to.be.below(out.indexOf('layer3AB'))
|
||||
})
|
||||
|
||||
it('dependentless nodes should be first', () => {
|
||||
const out = topoSort(fixture2, (node, inheritance) => inheritance[node])
|
||||
// This basically checks all ordering that matters
|
||||
expect(out.indexOf('layerA')).to.eql(0)
|
||||
expect(out.indexOf('layerB')).to.eql(1)
|
||||
})
|
||||
|
||||
it('ignores cyclic dependencies', () => {
|
||||
const out = topoSort({ a: 'b', b: 'a', c: 'a' }, (node, inheritance) => [inheritance[node]])
|
||||
expect(out.indexOf('a')).to.be.below(out.indexOf('c'))
|
||||
})
|
||||
})
|
||||
})
|
Loading…
Add table
Add a link
Reference in a new issue