mirror of
https://git.sr.ht/~cadence/bibliogram
synced 2024-11-22 16:17:29 +00:00
Add screenshot tests for user, post, and gallery
This commit is contained in:
parent
f25b2891ac
commit
5baae5167d
@ -8,7 +8,9 @@
|
|||||||
"start": "cd src/site && node server.js",
|
"start": "cd src/site && node server.js",
|
||||||
"assistant": "cd src/site && node assistant.js",
|
"assistant": "cd src/site && node assistant.js",
|
||||||
"build-lang": "cd src/lang/utils && node build_base.js",
|
"build-lang": "cd src/lang/utils && node build_base.js",
|
||||||
"test": "tap"
|
"test": "tap",
|
||||||
|
"upload-test-files": "rsync -a src/lib/utils/saved_requests/files/ debib:meta/saved_requests; rsync -a test/screenshots/final/ debib:meta/screenshots",
|
||||||
|
"download-test-files": "bash -c 'mkdir -p test/screenshots/{diff,final,staging} && rm test/screenshots/final/* && wget -q -r -nd -np -P test/screenshots/final -R html -R tmp https://meta.bibliogram.art/screenshots/'"
|
||||||
},
|
},
|
||||||
"keywords": [],
|
"keywords": [],
|
||||||
"author": "",
|
"author": "",
|
||||||
|
@ -60,7 +60,7 @@ class SavedRequestManager {
|
|||||||
const base = pj(folder, row.path)
|
const base = pj(folder, row.path)
|
||||||
try {
|
try {
|
||||||
fs.accessSync(base)
|
fs.accessSync(base)
|
||||||
console.log("Found, using saved request for "+row.path)
|
// console.log("Found, using saved request for "+row.path)
|
||||||
return new Saved(base)
|
return new Saved(base)
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.log("Known, but not downloaded for "+row.path)
|
console.log("Known, but not downloaded for "+row.path)
|
||||||
@ -85,7 +85,7 @@ class SavedRequestManager {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
const name = generateName()
|
const name = generateName()
|
||||||
console.log("Not found, saving now as "+name)
|
console.log(`Not found, saving now:\n ${this.url}\n -> ${name}`)
|
||||||
|
|
||||||
const internalRequest = new NodeFetch(this.url)
|
const internalRequest = new NodeFetch(this.url)
|
||||||
return new DelayedBackend(
|
return new DelayedBackend(
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
const tap = require("tap")
|
const tap = require("tap")
|
||||||
const se = require("selenium-webdriver")
|
const se = require("selenium-webdriver")
|
||||||
|
const firefox = require("selenium-webdriver/firefox")
|
||||||
const fs = require("fs").promises
|
const fs = require("fs").promises
|
||||||
const Jimp = require("jimp")
|
const Jimp = require("jimp")
|
||||||
const commands = require("./screenshots/commands")
|
const commands = require("./screenshots/commands")
|
||||||
@ -24,6 +25,9 @@ const dimensions = new Map([
|
|||||||
|
|
||||||
const browserDimensions = dimensions.get(browser)
|
const browserDimensions = dimensions.get(browser)
|
||||||
|
|
||||||
|
const constants = require("../src/lib/constants")
|
||||||
|
constants.request_backend = "saved" // predictable request results
|
||||||
|
|
||||||
process.chdir("src/site")
|
process.chdir("src/site")
|
||||||
const server = require("../src/site/server")
|
const server = require("../src/site/server")
|
||||||
|
|
||||||
@ -39,8 +43,10 @@ function exec(command) {
|
|||||||
await fs.mkdir("../../test/screenshots/diff", {recursive: true})
|
await fs.mkdir("../../test/screenshots/diff", {recursive: true})
|
||||||
await fs.mkdir("../../test/screenshots/staging", {recursive: true})
|
await fs.mkdir("../../test/screenshots/staging", {recursive: true})
|
||||||
|
|
||||||
|
const options = new firefox.Options()
|
||||||
|
// options.addArguments("-headless")
|
||||||
const [driver] = await Promise.all([
|
const [driver] = await Promise.all([
|
||||||
new se.Builder().forBrowser(browser).build(),
|
new se.Builder().forBrowser(browser).setFirefoxOptions(options).build(),
|
||||||
server.waitForFirstCompile()
|
server.waitForFirstCompile()
|
||||||
])
|
])
|
||||||
|
|
||||||
@ -56,10 +62,6 @@ function exec(command) {
|
|||||||
await driver.get(origin)
|
await driver.get(origin)
|
||||||
|
|
||||||
for (const command of commands) {
|
for (const command of commands) {
|
||||||
function screenPath(dir) {
|
|
||||||
return `../../test/screenshots/${dir}/${command.filename}.png`
|
|
||||||
}
|
|
||||||
|
|
||||||
await Promise.all(Object.keys(command.cookies).map(cookieName =>
|
await Promise.all(Object.keys(command.cookies).map(cookieName =>
|
||||||
driver.manage().addCookie({
|
driver.manage().addCookie({
|
||||||
name: cookieName,
|
name: cookieName,
|
||||||
@ -67,23 +69,31 @@ function exec(command) {
|
|||||||
})
|
})
|
||||||
))
|
))
|
||||||
|
|
||||||
await Promise.all([
|
await setSize(command.size) // complete this before driver.get so that srcset doesn't get confused
|
||||||
setSize(command.size),
|
await driver.get(origin + command.url)
|
||||||
driver.get(origin + command.url)
|
|
||||||
])
|
for (let scrollNumber = 1; scrollNumber <= command.scrolls; scrollNumber++) {
|
||||||
|
const filenameWithScroll = `${command.filename}-${scrollNumber}`
|
||||||
|
function screenPath(dir) {
|
||||||
|
return `../../test/screenshots/${dir}/${filenameWithScroll}.png`
|
||||||
|
}
|
||||||
|
|
||||||
|
if (scrollNumber > 1) {
|
||||||
|
await driver.executeScript(`window.scrollByPages(1)`)
|
||||||
|
}
|
||||||
|
|
||||||
const finalExists = await fs.access(screenPath("final")).then(() => true).catch(() => false)
|
const finalExists = await fs.access(screenPath("final")).then(() => true).catch(() => false)
|
||||||
|
|
||||||
const screenshot = Buffer.from(await driver.takeScreenshot(), "base64")
|
const screenshot = Buffer.from(await driver.takeScreenshot(), "base64")
|
||||||
|
|
||||||
const message = `equal screens: ${command.filename}`
|
const message = `equal screens: ${filenameWithScroll}`
|
||||||
tap.test(message, async childTest => {
|
tap.test(message, async childTest => {
|
||||||
const image = await Jimp.read(screenshot)
|
const image = await Jimp.read(screenshot)
|
||||||
image.crop(0, 0, command.size.width, command.size.height) // crop out page scrollbar
|
image.crop(0, 0, command.size.width, command.size.height) // crop out page scrollbar
|
||||||
|
|
||||||
if (finalExists) {
|
if (finalExists) {
|
||||||
await image.writeAsync(screenPath("staging"))
|
await image.writeAsync(screenPath("staging"))
|
||||||
const message = `screen: ${command.filename}`
|
const message = `screen: ${filenameWithScroll}`
|
||||||
const result = await exec(`compare -metric AE ${screenPath("staging")} ${screenPath("final")} ${screenPath("diff")}`)
|
const result = await exec(`compare -metric AE ${screenPath("staging")} ${screenPath("final")} ${screenPath("diff")}`)
|
||||||
const diff = +result.stderr
|
const diff = +result.stderr
|
||||||
childTest.ok(diff === 0, message)
|
childTest.ok(diff === 0, message)
|
||||||
@ -93,10 +103,11 @@ function exec(command) {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
image.writeAsync(screenPath("final"))
|
image.writeAsync(screenPath("final"))
|
||||||
console.log(`note: creating new screenshot ${command.filename}`)
|
console.log(`note: creating new screenshot ${filenameWithScroll}`)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
tap.teardown(() => {
|
tap.teardown(() => {
|
||||||
driver.close()
|
driver.close()
|
||||||
|
@ -18,7 +18,7 @@ const cookies = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function generateSetup(pageName, url, sizeName, cookiesName, scrolls) {
|
function generateSetup(pageName, url, sizeName, cookiesName, scrolls = 1) {
|
||||||
return {
|
return {
|
||||||
url: url,
|
url: url,
|
||||||
filename: `${pageName}-${sizeName}-${cookiesName}`,
|
filename: `${pageName}-${sizeName}-${cookiesName}`,
|
||||||
@ -28,13 +28,18 @@ function generateSetup(pageName, url, sizeName, cookiesName, scrolls) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = [
|
function generateAllSetups(pageName, url, scrolls) {
|
||||||
generateSetup("home", "/", "laptop", "default"),
|
return Object.keys(cookies).map(cookieKey =>
|
||||||
generateSetup("settings", "/settings", "laptop", "default"),
|
Object.keys(sizes).map(sizeKey =>
|
||||||
generateSetup("home", "/", "phone", "default"),
|
generateSetup(pageName, url, sizeKey, cookieKey, scrolls)
|
||||||
generateSetup("settings", "/settings", "phone", "default"),
|
)
|
||||||
|
).flat()
|
||||||
|
}
|
||||||
|
|
||||||
generateSetup("home", "/", "laptop", "ptc"),
|
module.exports = [
|
||||||
generateSetup("settings", "/settings", "laptop", "ptc"),
|
...generateAllSetups("home", "/"),
|
||||||
generateSetup("home", "/", "phone", "ptc"),
|
...generateAllSetups("settings", "/settings"),
|
||||||
|
...generateAllSetups("anti__reality", "/u/anti__reality?page=3", 2),
|
||||||
|
...generateAllSetups("post", "/p/CCyko7oJ-ta"),
|
||||||
|
...generateAllSetups("gallery", "/p/CCbVsCMpizf", 2)
|
||||||
]
|
]
|
||||||
|
Loading…
Reference in New Issue
Block a user