2
0
mirror of https://github.com/tenrok/vue-meta.git synced 2026-06-13 04:32:25 +03:00

begin testing getMetaInfo

This commit is contained in:
Declan de Wet
2016-11-05 08:32:27 +02:00
parent 8aec696ffa
commit 4c49c52c49
2 changed files with 57 additions and 13 deletions
+31 -13
View File
@@ -1,3 +1,4 @@
import deepmerge from 'deepmerge'
import getComponentOption from './getComponentOption'
/**
@@ -8,12 +9,32 @@ import getComponentOption from './getComponentOption'
* @return {Object} - returned meta info
*/
export default function getMetaInfo (component) {
// set some sane defaults
const defaultInfo = {
title: '',
titleChunk: '',
titleTemplate: '%s',
htmlAttrs: {},
bodyAttrs: {},
meta: [],
base: [],
link: [],
style: [],
script: [],
noscript: []
}
// collect & aggregate all metaInfo $options
let info = getComponentOption({
const info = getComponentOption({
component,
option: 'metaInfo',
deep: true,
arrayMerge (target, source) {
// we concat the arrays without merging objects contained therein,
// but we check for a `vmid` property on each object in the array
// using an O(1) lookup associative array exploit
// note the use of "for in" - we are looping through arrays here, not
// plain objects
const destination = []
for (let targetIndex in target) {
const targetItem = target[targetIndex]
@@ -35,29 +56,26 @@ export default function getMetaInfo (component) {
})
// if any info options are a function, coerce them to the result of a call
for (let key in info) {
if (info.hasOwnProperty(key)) {
const value = info[key]
if (typeof value === 'function' && key !== 'changed') {
info[key] = value()
}
}
}
Object.keys(info).forEach((key) => {
const val = info[key]
info[key] = typeof val === 'function' && key !== 'changed' ? val() : val
})
// backup the title chunk
// backup the title chunk in case user wants access to it
if (info.title) {
info.titleChunk = info.title
}
// replace title with populated template
if (info.titleTemplate && info.titleChunk) {
if (info.titleTemplate) {
info.title = info.titleTemplate.replace(/%s/g, info.titleChunk)
}
// convert base tag to an array
// convert base tag to an array so it can be handled the same way
// as the other tags
if (info.base) {
info.base = Object.keys(info.base).length ? [info.base] : []
}
return info
return deepmerge(defaultInfo, info)
}
+26
View File
@@ -0,0 +1,26 @@
import Vue from 'vue'
import getMetaInfo from '../src/shared/getMetaInfo'
describe('getMetaInfo', () => {
// const container = document.createElement('div')
let component
afterEach(() => component.$destroy())
it('returns appropriate defaults when no meta info is found', () => {
component = new Vue()
expect(getMetaInfo(component)).to.eql({
title: '',
titleChunk: '',
titleTemplate: '%s',
htmlAttrs: {},
bodyAttrs: {},
meta: [],
base: [],
link: [],
style: [],
script: [],
noscript: []
})
})
})