mirror of
https://github.com/tenrok/vue-meta.git
synced 2026-05-23 08:14:06 +03:00
fc71e1f1c4
* refactor(examples): run ssr example from server * chore: switch to babel for build buble complains too much * feat: enable loaded callbacks feat: add skip option * examples: add async-callback browser example * examples: fix server * examples(ssr): add reactive script with callback * fix: also skip on ssr * chore: remove unused var * feat: only add mutationobserver if DOM is still loading feat: disconnect mutation observer once DOM has loaded * examples: pass vmid to loadCallback instead of el * feat: also support load callbacks for link/style tags * test: add unit tests for load * test: add load e2e test * chore: fix lint * chore: remove unused files * test: fix e2e load callback test * test: fix attempt * examples: ie9 compatiblity destructuring doesnt work in ie9 * fix: add onload attribute on ssr dont rely on mutationobserver * chore: lint ci conf * refactor: remove loadCallbackAttribute config option test: fix coverage for load * test: improve coverage * fix: only use console when it exists (for ie9) * chore: fix coverage
116 lines
3.5 KiB
JavaScript
116 lines
3.5 KiB
JavaScript
import _updateClientMetaInfo from '../../src/client/updateClientMetaInfo'
|
|
import { defaultOptions, ssrAppId, ssrAttribute } from '../../src/shared/constants'
|
|
import metaInfoData from '../utils/meta-info-data'
|
|
import * as load from '../../src/client/load'
|
|
|
|
const updateClientMetaInfo = (type, data) => _updateClientMetaInfo(ssrAppId, defaultOptions, { [type]: data })
|
|
|
|
describe('updaters', () => {
|
|
let html
|
|
|
|
beforeAll(() => {
|
|
html = document.getElementsByTagName('html')[0]
|
|
|
|
// remove default meta charset
|
|
Array.from(html.getElementsByTagName('meta')).forEach(el => el.parentNode.removeChild(el))
|
|
})
|
|
|
|
for (const type in metaInfoData) {
|
|
const typeTests = metaInfoData[type]
|
|
|
|
const testCases = {
|
|
add: (tags) => {
|
|
typeTests.add.expect.forEach((expected, index) => {
|
|
if (!['title', 'htmlAttrs', 'headAttrs', 'bodyAttrs'].includes(type)) {
|
|
expect(tags.addedTags[type][index].outerHTML).toBe(expected)
|
|
}
|
|
expect(html.outerHTML).toContain(expected)
|
|
})
|
|
},
|
|
change: (tags) => {
|
|
typeTests.add.expect.forEach((expected, index) => {
|
|
if (!typeTests.change.expect.includes(expected)) {
|
|
expect(html.outerHTML).not.toContain(expected)
|
|
}
|
|
})
|
|
|
|
typeTests.change.expect.forEach((expected, index) => {
|
|
if (!['title', 'htmlAttrs', 'headAttrs', 'bodyAttrs'].includes(type)) {
|
|
expect(tags.addedTags[type][index].outerHTML).toBe(expected)
|
|
}
|
|
expect(html.outerHTML).toContain(expected)
|
|
})
|
|
},
|
|
remove: (tags) => {
|
|
// TODO: i'd expect tags.removedTags to be populated
|
|
|
|
typeTests.add.expect.forEach((expected, index) => {
|
|
expect(html.outerHTML).not.toContain(expected)
|
|
})
|
|
|
|
typeTests.change.expect.forEach((expected, index) => {
|
|
expect(html.outerHTML).not.toContain(expected)
|
|
})
|
|
|
|
expect(html.outerHTML).not.toContain(`<${type}`)
|
|
}
|
|
}
|
|
|
|
describe(`${type} type tests`, () => {
|
|
Object.keys(typeTests).forEach((action) => {
|
|
const testInfo = typeTests[action]
|
|
|
|
// return when no test case available
|
|
if (!testCases[action] && !testInfo.test) {
|
|
return
|
|
}
|
|
|
|
const defaultTestFn = () => {
|
|
const tags = updateClientMetaInfo(type, testInfo.data)
|
|
|
|
if (testCases[action]) {
|
|
testCases[action](tags)
|
|
}
|
|
|
|
return tags
|
|
}
|
|
|
|
let testFn
|
|
if (testInfo.test) {
|
|
testFn = testInfo.test('client', defaultTestFn)
|
|
|
|
if (testFn === true) {
|
|
testFn = defaultTestFn
|
|
}
|
|
} else {
|
|
testFn = defaultTestFn
|
|
}
|
|
|
|
if (testFn && typeof testFn === 'function') {
|
|
test(`${action} a tag`, () => {
|
|
expect.hasAssertions()
|
|
testFn()
|
|
})
|
|
}
|
|
})
|
|
})
|
|
}
|
|
})
|
|
|
|
describe('extra tests', () => {
|
|
test('adds callback listener on hydration', () => {
|
|
const addListeners = load.addListeners
|
|
const addListenersSpy = jest.spyOn(load, 'addListeners').mockImplementation(addListeners)
|
|
|
|
const html = document.getElementsByTagName('html')[0]
|
|
html.setAttribute(ssrAttribute, 'true')
|
|
|
|
const data = [{ src: 'src1', [defaultOptions.tagIDKeyName]: 'content', callback: () => {} }]
|
|
const tags = updateClientMetaInfo('script', data)
|
|
|
|
expect(tags).toBe(false)
|
|
expect(html.hasAttribute(ssrAttribute)).toBe(false)
|
|
expect(addListenersSpy).toHaveBeenCalledTimes(1)
|
|
})
|
|
})
|