mirror of
https://github.com/tenrok/vue-meta.git
synced 2026-05-17 14:09:38 +03:00
117 lines
3.6 KiB
JavaScript
117 lines
3.6 KiB
JavaScript
/**
|
|
* @jest-environment node
|
|
*/
|
|
import fs from 'fs'
|
|
import path from 'path'
|
|
import env from 'node-env-file'
|
|
import { createBrowser } from 'tib'
|
|
|
|
const browserString = process.env.BROWSER_STRING || 'puppeteer/core'
|
|
|
|
describe(browserString, () => {
|
|
let browser
|
|
let page
|
|
const folder = path.resolve(__dirname, '..', 'fixtures/basic/.vue-meta/')
|
|
|
|
beforeAll(async () => {
|
|
if (browserString.includes('browserstack') && browserString.includes('local')) {
|
|
const envFile = path.resolve(__dirname, '..', '..', '.env-browserstack')
|
|
if (fs.existsSync(envFile)) {
|
|
env(envFile)
|
|
}
|
|
}
|
|
|
|
browser = await createBrowser(browserString, {
|
|
BrowserStackLocal: { folder },
|
|
extendPage(page) {
|
|
return {
|
|
async navigate(path) {
|
|
// IMPORTANT: use (arrow) function with block'ed body
|
|
// see: https://github.com/tunnckoCoreLabs/parse-function/issues/179
|
|
await page.runAsyncScript((path) => {
|
|
return new Promise((resolve) => {
|
|
const oldTitle = document.title
|
|
|
|
// local firefox has sometimes not updated the title
|
|
// even when the DOM is supposed to be fully updated
|
|
const waitTitleChanged = function () {
|
|
setTimeout(function () {
|
|
if (oldTitle !== document.title) {
|
|
resolve()
|
|
} else {
|
|
waitTitleChanged()
|
|
}
|
|
}, 50)
|
|
}
|
|
|
|
window.$vueMeta.$once('routeChanged', waitTitleChanged)
|
|
window.$vueMeta.$router.push(path)
|
|
})
|
|
}, path)
|
|
},
|
|
routeData() {
|
|
return page.runScript(() => ({
|
|
path: window.$vueMeta.$route.path,
|
|
query: window.$vueMeta.$route.query
|
|
}))
|
|
}
|
|
}
|
|
}
|
|
})
|
|
})
|
|
|
|
afterAll(async () => {
|
|
if (browser) {
|
|
await browser.close()
|
|
}
|
|
})
|
|
|
|
test('open page', async () => {
|
|
const webPath = '/index.html'
|
|
|
|
let url
|
|
if (browser.getLocalFolderUrl) {
|
|
url = browser.getLocalFolderUrl(webPath)
|
|
} else {
|
|
url = `file://${path.join(folder, webPath)}`
|
|
}
|
|
|
|
page = await browser.page(url)
|
|
|
|
expect(await page.getAttribute('html', 'data-vue-meta-server-rendered')).toBe(null)
|
|
expect(await page.getAttribute('html', 'lang')).toBe('en')
|
|
expect(await page.getAttribute('html', 'amp')).toBe('')
|
|
expect(await page.getAttribute('html', 'allowfullscreen')).toBe(null)
|
|
expect(await page.getAttribute('head', 'test')).toBe('true')
|
|
expect(await page.getText('h1')).toBe('Basic')
|
|
expect(await page.getText('title')).toBe('Home | Vue Meta Test')
|
|
expect(await page.getElementCount('meta')).toBe(2)
|
|
|
|
let sanitizeCheck = await page.getTexts('script')
|
|
sanitizeCheck.push(...(await page.getTexts('noscript')))
|
|
sanitizeCheck = sanitizeCheck.filter(v => !!v)
|
|
|
|
expect(sanitizeCheck.length).toBe(3)
|
|
expect(() => JSON.parse(sanitizeCheck[0])).not.toThrow()
|
|
// TODO: check why this doesnt Throw when Home is dynamic loaded
|
|
// (but that causes hydration error)
|
|
expect(() => JSON.parse(sanitizeCheck[1])).toThrow()
|
|
expect(() => JSON.parse(sanitizeCheck[2])).not.toThrow()
|
|
})
|
|
|
|
test('/about', async () => {
|
|
try {
|
|
await page.navigate('/about', false)
|
|
} catch (e) {
|
|
if (e.constructor.name !== 'ScriptTimeoutError') {
|
|
throw e
|
|
} else {
|
|
console.warn(e) // eslint-disable-line no-console
|
|
}
|
|
}
|
|
|
|
expect(await page.getText('title')).toBe('About')
|
|
expect(await page.getElementCount('meta')).toBe(1)
|
|
})
|
|
})
|