Fix draft saving and add tests

This commit is contained in:
tusooa 2025-02-18 17:42:50 -05:00
commit 690812f27c
No known key found for this signature in database
GPG key ID: 42AEC43D48433C51
8 changed files with 364 additions and 2 deletions

52
test/fixtures/mock_store.js vendored Normal file
View file

@ -0,0 +1,52 @@
import { createStore } from 'vuex'
import { cloneDeep } from 'lodash'
import instanceModule from 'src/modules/instance.js'
import statusesModule from 'src/modules/statuses.js'
import notificationsModule from 'src/modules/notifications.js'
import usersModule from 'src/modules/users.js'
import apiModule from 'src/modules/api.js'
import configModule from 'src/modules/config.js'
import profileConfigModule from 'src/modules/profileConfig.js'
import serverSideStorageModule from 'src/modules/serverSideStorage.js'
import adminSettingsModule from 'src/modules/adminSettings.js'
import oauthModule from 'src/modules/oauth.js'
import authFlowModule from 'src/modules/auth_flow.js'
import oauthTokensModule from 'src/modules/oauth_tokens.js'
import draftsModule from 'src/modules/drafts.js'
import chatsModule from 'src/modules/chats.js'
import bookmarkFoldersModule from 'src/modules/bookmark_folders.js'
const tweakModules = modules => {
const res = {}
Object.entries(modules).forEach(([name, module]) => {
const m = { ...module }
m.state = cloneDeep(module.state)
res[name] = m
})
return res
}
const makeMockStore = () => {
return createStore({
modules: tweakModules({
instance: instanceModule,
// TODO refactor users/statuses modules, they depend on each other
users: usersModule,
statuses: statusesModule,
notifications: notificationsModule,
api: apiModule,
config: configModule,
profileConfig: profileConfigModule,
serverSideStorage: serverSideStorageModule,
adminSettings: adminSettingsModule,
oauth: oauthModule,
authFlow: authFlowModule,
oauthTokens: oauthTokensModule,
drafts: draftsModule,
chats: chatsModule,
bookmarkFolders: bookmarkFoldersModule
}),
})
}
export default makeMockStore

132
test/fixtures/setup_test.js vendored Normal file
View file

@ -0,0 +1,132 @@
import { config } from '@vue/test-utils'
import { createRouter, createMemoryHistory } from 'vue-router'
import VueVirtualScroller from 'vue-virtual-scroller'
import { FontAwesomeIcon, FontAwesomeLayers } from '@fortawesome/vue-fontawesome'
import routes from 'src/boot/routes'
import makeMockStore from './mock_store'
export const $t = msg => msg
const $i18n = { t: msg => msg }
const applyAfterStore = (store, afterStore) => {
afterStore(store)
return store
}
const getDefaultOpts = ({ afterStore = () => {} } = {}) => ({
global: {
plugins: [
applyAfterStore(makeMockStore(), afterStore),
VueVirtualScroller,
createRouter({
history: createMemoryHistory(),
routes: routes({ state: {
users: {
currentUser: {}
},
instance: {}
}})
}),
(Vue) => { Vue.directive('body-scroll-lock', {}) }
],
components: {
},
stubs: {
I18nT: true,
teleport: true,
FAIcon: true,
FALayers: true,
},
mocks: {
$t,
$i18n
}
}
})
// https://github.com/vuejs/vue-test-utils/issues/960
const customBehaviors = () => {
const filterByText = keyword => {
const match = keyword instanceof RegExp
? (target) => target && keyword.test(target)
: (target) => keyword === target
return wrapper => (
match(wrapper.text()) ||
match(wrapper.attributes('aria-label')) ||
match(wrapper.attributes('title'))
)
}
return {
findComponentByText(searchedComponent, text) {
return this.findAllComponents(searchedComponent)
.filter(filterByText(text))
.at(0)
},
findByText(searchedElement, text) {
return this.findAll(searchedElement)
.filter(filterByText(text))
.at(0)
},
};
};
config.plugins.VueWrapper.install(customBehaviors)
export const mountOpts = (allOpts = {}) => {
const { afterStore, ...opts } = allOpts
const defaultOpts = getDefaultOpts({ afterStore })
const mergedOpts = {
...opts,
global: {
...defaultOpts.global
}
}
if (opts.global) {
mergedOpts.global.plugins = mergedOpts.global.plugins.concat(opts.global.plugins || [])
Object.entries(opts.global).forEach(([k, v]) => {
if (k === 'plugins') {
return
}
if (defaultOpts.global[k]) {
mergedOpts.global[k] = {
...defaultOpts.global[k],
...v,
}
} else {
mergedOpts.global[k] = v
}
})
}
return mergedOpts
}
// https://stackoverflow.com/questions/78033718/how-can-i-wait-for-an-emitted-event-of-a-mounted-component-in-vue-test-utils
export const waitForEvent = (wrapper, event, {
timeout = 1000,
timesEmitted = 1
} = {}) => {
const tick = 10
const totalTries = timeout / tick
return new Promise((resolve, reject) => {
let currentTries = 0
const wait = () => {
const e = wrapper.emitted(event)
if (e && e.length >= timesEmitted) {
resolve()
return
}
if (currentTries >= totalTries) {
reject(new Error('Event did not fire'))
return
}
++currentTries
setTimeout(wait, tick)
}
wait()
})
}