105 lines
3.2 KiB
JavaScript
105 lines
3.2 KiB
JavaScript
const test = require("node:test");
|
|
const assert = require("node:assert/strict");
|
|
const fs = require("node:fs");
|
|
const vm = require("node:vm");
|
|
function library(wx) {
|
|
const module = { exports: {} };
|
|
vm.runInNewContext(fs.readFileSync("pets-fe/utils/pet-card.js", "utf8"), {
|
|
wx,
|
|
module,
|
|
});
|
|
return module.exports;
|
|
}
|
|
|
|
test("保存卡片被拒绝授权后,确认去设置并授权则重试同一图片", async () => {
|
|
const saves = [];
|
|
const api = library({
|
|
saveImageToPhotosAlbum(options) {
|
|
saves.push(options.filePath);
|
|
if (saves.length === 1) options.fail({ errMsg: "auth deny" });
|
|
else options.success();
|
|
},
|
|
getSetting: (options) =>
|
|
options.success({ authSetting: { "scope.writePhotosAlbum": false } }),
|
|
showModal: async () => ({ confirm: true }),
|
|
openSetting: (options) =>
|
|
options.success({ authSetting: { "scope.writePhotosAlbum": true } }),
|
|
});
|
|
assert.equal(await api.saveToAlbum("/tmp/card.png"), true);
|
|
assert.deepEqual(saves, ["/tmp/card.png", "/tmp/card.png"]);
|
|
});
|
|
test("拒绝开启相册权限不报告保存成功,也不重复保存", async () => {
|
|
let saves = 0;
|
|
const api = library({
|
|
saveImageToPhotosAlbum: (options) => {
|
|
saves++;
|
|
options.fail({ errMsg: "auth deny" });
|
|
},
|
|
getSetting: (options) =>
|
|
options.success({ authSetting: { "scope.writePhotosAlbum": false } }),
|
|
showModal: async () => ({ confirm: false }),
|
|
});
|
|
assert.equal(await api.saveToAlbum("/tmp/card.png"), false);
|
|
assert.equal(saves, 1);
|
|
});
|
|
test("导出等待照片读取后生成 PNG,远程照片失败不会导出错误头像", async () => {
|
|
let exported = 0,
|
|
imageOptions;
|
|
const ctx = new Proxy(
|
|
{},
|
|
{
|
|
get(target, key) {
|
|
if (key === "measureText")
|
|
return (text) => ({ width: text.length * 10 });
|
|
if (key === "createLinearGradient")
|
|
return () => ({ addColorStop() {} });
|
|
return () => {};
|
|
},
|
|
set() {
|
|
return true;
|
|
},
|
|
},
|
|
);
|
|
const canvas = {
|
|
getContext: () => ctx,
|
|
createImage() {
|
|
const img = { width: 200, height: 300 };
|
|
Object.defineProperty(img, "src", {
|
|
set() {
|
|
queueMicrotask(() => img.onload());
|
|
},
|
|
});
|
|
return img;
|
|
},
|
|
};
|
|
const api = library({
|
|
getImageInfo: (options) => {
|
|
imageOptions = options;
|
|
},
|
|
canvasToTempFilePath: (options) => {
|
|
exported++;
|
|
assert.equal(options.fileType, "png");
|
|
options.success({ tempFilePath: "/tmp/card.png" });
|
|
},
|
|
});
|
|
const waiting = api.renderCard(canvas, {
|
|
id: "1234",
|
|
name: "毛孩",
|
|
avatar_url: "https://s3.test/pet.png",
|
|
});
|
|
await new Promise((resolve) => setImmediate(resolve));
|
|
assert.equal(exported, 0);
|
|
imageOptions.success({ path: "/tmp/photo.png" });
|
|
assert.equal(await waiting, "/tmp/card.png");
|
|
assert.equal(canvas.width, 1200);
|
|
assert.equal(canvas.height, 760);
|
|
const failed = api.renderCard(canvas, {
|
|
name: "毛孩",
|
|
avatar_url: "https://s3.test/missing.png",
|
|
});
|
|
await new Promise((resolve) => setImmediate(resolve));
|
|
imageOptions.fail();
|
|
await assert.rejects(failed, /照片下载失败/);
|
|
assert.equal(exported, 1);
|
|
});
|