
























@@ -82,7 +82,29 @@ function requireAttachmentIdFromUrl(url: unknown): string {
8282}
83838484async function expectPathMissing(targetPath: string): Promise<void> {
85-await expect(fs.access(targetPath)).rejects.toMatchObject({ code: "ENOENT" });
85+try {
86+await fs.access(targetPath);
87+} catch (error) {
88+expect((error as NodeJS.ErrnoException).code).toBe("ENOENT");
89+return;
90+}
91+throw new Error(`expected ${targetPath} to be missing`);
92+}
93+94+type ManagedImageBlock = {
95+type?: string;
96+alt?: string;
97+mimeType?: string;
98+url?: string;
99+openUrl?: string;
100+};
101+102+function requireBlock(blocks: unknown[], index = 0): ManagedImageBlock {
103+const block = blocks[index];
104+if (!block) {
105+throw new Error(`expected block ${index}`);
106+}
107+return block as ManagedImageBlock;
86108}
8710988110async function createFixture(
@@ -409,13 +431,12 @@ describe("createManagedOutgoingImageBlocks", () => {
409431});
410432411433expect(blocks).toHaveLength(1);
412-expect(blocks[0]).toMatchObject({
413-type: "image",
414-alt: "Generated image 1",
415-mimeType: "image/png",
416-});
417-expect(blocks[0]?.url).toBe(blocks[0]?.openUrl);
418-expect(String(blocks[0]?.url)).toMatch(/\/full$/);
434+const block = requireBlock(blocks);
435+expect(block.type).toBe("image");
436+expect(block.alt).toBe("Generated image 1");
437+expect(block.mimeType).toBe("image/png");
438+expect(block.url).toBe(block.openUrl);
439+expect(String(block.url)).toMatch(/\/full$/);
419440420441const recordsDir = path.join(stateDir, "media", "outgoing", "records");
421442const [recordName] = await fs.readdir(recordsDir);
@@ -461,15 +482,14 @@ describe("createManagedOutgoingImageBlocks", () => {
461482});
462483463484expect(blocks).toHaveLength(1);
464-expect(blocks[0]).toMatchObject({
465-type: "image",
466-url: expect.stringContaining("/api/chat/media/outgoing/agent%3Amain%3Amain/"),
467-openUrl: expect.stringContaining("/full"),
468-});
469-expect(blocks[0]?.url).toBe(blocks[0]?.openUrl);
470-expect(JSON.stringify(blocks[0])).not.toContain(sourcePath);
471-472-const attachmentId = requireAttachmentIdFromUrl(blocks[0]?.url);
485+const block = requireBlock(blocks);
486+expect(block.type).toBe("image");
487+expect(block.url).toContain("/api/chat/media/outgoing/agent%3Amain%3Amain/");
488+expect(block.openUrl).toContain("/full");
489+expect(block.url).toBe(block.openUrl);
490+expect(JSON.stringify(block)).not.toContain(sourcePath);
491+492+const attachmentId = requireAttachmentIdFromUrl(block.url);
473493const record = JSON.parse(
474494await fs.readFile(
475495path.join(stateDir, "media", "outgoing", "records", `${attachmentId}.json`),
@@ -518,17 +538,16 @@ describe("createManagedOutgoingImageBlocks", () => {
518538});
519539520540expect(blocks).toHaveLength(1);
521-expect(blocks[0]?.alt).toBe("remote-cat.png");
522-expect(blocks[0]).toMatchObject({
523-type: "image",
524-url: expect.stringContaining("/api/chat/media/outgoing/agent%3Amain%3Amain/"),
525-openUrl: expect.stringContaining("/full"),
526-});
527-expect(blocks[0]?.url).toBe(blocks[0]?.openUrl);
528-expect(JSON.stringify(blocks[0])).not.toContain("127.0.0.1");
529-expect(JSON.stringify(blocks[0])).not.toContain("sig=secret");
530-531-const attachmentId = requireAttachmentIdFromUrl(blocks[0]?.url);
541+const block = requireBlock(blocks);
542+expect(block.alt).toBe("remote-cat.png");
543+expect(block.type).toBe("image");
544+expect(block.url).toContain("/api/chat/media/outgoing/agent%3Amain%3Amain/");
545+expect(block.openUrl).toContain("/full");
546+expect(block.url).toBe(block.openUrl);
547+expect(JSON.stringify(block)).not.toContain("127.0.0.1");
548+expect(JSON.stringify(block)).not.toContain("sig=secret");
549+550+const attachmentId = requireAttachmentIdFromUrl(block.url);
532551const record = JSON.parse(
533552await fs.readFile(
534553path.join(stateDir, "media", "outgoing", "records", `${attachmentId}.json`),
@@ -632,7 +651,7 @@ describe("createManagedOutgoingImageBlocks", () => {
632651633652expect(blocks).toHaveLength(2);
634653expect(blocks[0]?.type).toBe("image");
635-expect(blocks[1]).toMatchObject({ type: "text" });
654+expect(requireBlock(blocks, 1).type).toBe("text");
636655});
637656638657it("skips broken attachments when continueOnPrepareError is enabled", async () => {
@@ -647,7 +666,7 @@ describe("createManagedOutgoingImageBlocks", () => {
647666});
648667649668expect(blocks).toHaveLength(1);
650-expect(blocks[0]).toMatchObject({ type: "image" });
669+expect(requireBlock(blocks).type).toBe("image");
651670expect(onPrepareError).toHaveBeenCalledTimes(1);
652671expect(onPrepareError.mock.calls[0]?.[0]).toBeInstanceOf(Error);
653672expect(onPrepareError.mock.calls[0]?.[0]?.message).toMatch(
@@ -685,7 +704,7 @@ describe("createManagedOutgoingImageBlocks", () => {
685704});
686705687706expect(blocks).toHaveLength(1);
688-expect(blocks[0]).toMatchObject({ type: "image" });
707+expect(requireBlock(blocks).type).toBe("image");
689708} finally {
690709setMediaStoreNetworkDepsForTest();
691710await new Promise<void>((resolve, reject) =>
@@ -732,7 +751,7 @@ describe("createManagedOutgoingImageBlocks", () => {
732751});
733752734753expect(blocks).toHaveLength(1);
735-expect(blocks[0]).toMatchObject({ type: "image" });
754+expect(requireBlock(blocks).type).toBe("image");
736755});
737756738757it("rejects relative local image paths that resolve outside allowed roots", async () => {
@@ -772,7 +791,7 @@ describe("createManagedOutgoingImageBlocks", () => {
772791try {
773792originals = await fs.readdir(originalsDir);
774793} catch (error) {
775-expect(error).toMatchObject({ code: "ENOENT" });
794+expect((error as NodeJS.ErrnoException).code).toBe("ENOENT");
776795}
777796expect(originals ?? []).toStrictEqual([]);
778797});
@@ -794,7 +813,7 @@ describe("createManagedOutgoingImageBlocks", () => {
794813try {
795814originals = await fs.readdir(originalsDir);
796815} catch (error) {
797-expect(error).toMatchObject({ code: "ENOENT" });
816+expect((error as NodeJS.ErrnoException).code).toBe("ENOENT");
798817}
799818expect(originals ?? []).toStrictEqual([]);
800819});
@@ -909,11 +928,9 @@ describe("cleanupManagedOutgoingImageRecords", () => {
909928910929const result = await cleanupManagedOutgoingImageRecords({ stateDir });
911930912-expect(result).toMatchObject({
913-deletedRecordCount: 1,
914-deletedFileCount: 1,
915-retainedCount: 0,
916-});
931+expect(result.deletedRecordCount).toBe(1);
932+expect(result.deletedFileCount).toBe(1);
933+expect(result.retainedCount).toBe(0);
917934await expectPathMissing(fixture.originalPath);
918935});
919936@@ -938,11 +955,9 @@ describe("cleanupManagedOutgoingImageRecords", () => {
938955939956const result = await cleanupManagedOutgoingImageRecords({ stateDir });
940957941-expect(result).toMatchObject({
942-deletedRecordCount: 0,
943-deletedFileCount: 0,
944-retainedCount: 1,
945-});
958+expect(result.deletedRecordCount).toBe(0);
959+expect(result.deletedFileCount).toBe(0);
960+expect(result.retainedCount).toBe(1);
946961await expect(fs.access(fixture.originalPath)).resolves.toBeUndefined();
947962});
948963@@ -979,11 +994,9 @@ describe("cleanupManagedOutgoingImageRecords", () => {
979994980995const result = await cleanupManagedOutgoingImageRecords({ stateDir });
981996982-expect(result).toMatchObject({
983-deletedRecordCount: 0,
984-deletedFileCount: 0,
985-retainedCount: 2,
986-});
997+expect(result.deletedRecordCount).toBe(0);
998+expect(result.deletedFileCount).toBe(0);
999+expect(result.retainedCount).toBe(2);
9871000expect(readSessionMessagesMock).toHaveBeenCalledTimes(1);
9881001});
9891002@@ -1012,10 +1025,8 @@ describe("cleanupManagedOutgoingImageRecords", () => {
10121025forceDeleteSessionRecords: true,
10131026});
101410271015-expect(result).toMatchObject({
1016-deletedRecordCount: 1,
1017-retainedCount: 1,
1018-});
1028+expect(result.deletedRecordCount).toBe(1);
1029+expect(result.retainedCount).toBe(1);
10191030await expect(fs.access(retainedFixture.originalPath)).resolves.toBeUndefined();
10201031});
10211032});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。