forked from github/docs
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsite-data-references.js
135 lines (112 loc) · 4.56 KB
/
site-data-references.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
import { fileURLToPath } from 'url'
import path from 'path'
import { isEqual, get, uniqWith } from 'lodash-es'
import loadSiteData from '../../lib/site-data.js'
import { loadPages } from '../../lib/page-data.js'
import getDataReferences from '../../lib/get-liquid-data-references.js'
import frontmatter from '../../lib/read-frontmatter.js'
import fs from 'fs/promises'
import readFileAsync from '../../lib/readfile-async.js'
import { jest } from '@jest/globals'
const __dirname = path.dirname(fileURLToPath(import.meta.url))
describe('data references', () => {
jest.setTimeout(60 * 1000)
let data, pages
beforeAll(async () => {
data = await loadSiteData()
pages = await loadPages()
pages = pages.filter((page) => page.languageCode === 'en')
})
test('every data reference found in English content files is defined and has a value', () => {
let errors = []
expect(pages.length).toBeGreaterThan(0)
pages.forEach((page) => {
const file = path.join('content', page.relativePath)
const pageRefs = getDataReferences(page.markdown)
pageRefs.forEach((key) => {
const value = get(data.en, key)
if (typeof value !== 'string') errors.push({ key, value, file })
})
})
errors = uniqWith(errors, isEqual) // remove duplicates
expect(errors.length, JSON.stringify(errors, null, 2)).toBe(0)
})
test('every data reference found in metadata of English content files is defined and has a value', async () => {
let errors = []
expect(pages.length).toBeGreaterThan(0)
await Promise.all(
pages.map(async (page) => {
const metadataFile = path.join('content', page.relativePath)
const fileContents = await readFileAsync(path.join(__dirname, '../..', metadataFile))
const { data: metadata } = frontmatter(fileContents, { filepath: page.fullPath })
const metadataRefs = getDataReferences(JSON.stringify(metadata))
metadataRefs.forEach((key) => {
const value = get(data.en, key)
if (typeof value !== 'string') errors.push({ key, value, metadataFile })
})
})
)
errors = uniqWith(errors, isEqual) // remove duplicates
expect(errors.length, JSON.stringify(errors, null, 2)).toBe(0)
})
test('every data reference found in English reusable files is defined and has a value', async () => {
let errors = []
const allReusables = data.en.site.data.reusables
const reusables = Object.values(allReusables)
expect(reusables.length).toBeGreaterThan(0)
await Promise.all(
reusables.map(async (reusablesPerFile) => {
let reusableFile = path.join(
__dirname,
'../../data/reusables/',
getFilenameByValue(allReusables, reusablesPerFile)
)
reusableFile = await getFilepath(reusableFile)
const reusableRefs = getDataReferences(JSON.stringify(reusablesPerFile))
reusableRefs.forEach((key) => {
const value = get(data.en, key)
if (typeof value !== 'string') errors.push({ key, value, reusableFile })
})
})
)
errors = uniqWith(errors, isEqual) // remove duplicates
expect(errors.length, JSON.stringify(errors, null, 2)).toBe(0)
})
test('every data reference found in English variable files is defined and has a value', async () => {
let errors = []
const allVariables = data.en.site.data.variables
const variables = Object.values(allVariables)
expect(variables.length).toBeGreaterThan(0)
await Promise.all(
variables.map(async (variablesPerFile) => {
let variableFile = path.join(
__dirname,
'../../data/variables/',
getFilenameByValue(allVariables, variablesPerFile)
)
variableFile = await getFilepath(variableFile)
const variableRefs = getDataReferences(JSON.stringify(variablesPerFile))
variableRefs.forEach((key) => {
const value = get(data.en, key)
if (typeof value !== 'string') errors.push({ key, value, variableFile })
})
})
)
errors = uniqWith(errors, isEqual) // remove duplicates
expect(errors.length, JSON.stringify(errors, null, 2)).toBe(0)
})
})
function getFilenameByValue(object, value) {
return Object.keys(object).find((key) => object[key] === value)
}
// if path exists, assume it's a directory; otherwise, assume a YML extension
async function getFilepath(filepath) {
try {
await fs.stat(filepath)
filepath = filepath + '/'
} catch (_) {
filepath = filepath + '.yml'
}
// we only need the relative path
return filepath.replace(path.join(__dirname, '../../'), '')
}