

























@@ -42,6 +42,27 @@ function captureStdout() {
4242};
4343}
444445+function expectFields(value: unknown, expected: Record<string, unknown>): void {
46+expect(value).toBeTypeOf("object");
47+expect(value).not.toBeNull();
48+const record = value as Record<string, unknown>;
49+for (const [key, expectedValue] of Object.entries(expected)) {
50+expect(record[key], key).toEqual(expectedValue);
51+}
52+}
53+54+function firstRecord(value: unknown): Record<string, unknown> {
55+expect(Array.isArray(value)).toBe(true);
56+const [record] = value as unknown[];
57+expect(record).toBeTypeOf("object");
58+expect(record).not.toBeNull();
59+return record as Record<string, unknown>;
60+}
61+62+function parseStdoutJson(stdout: { output: () => string }): Record<string, unknown> {
63+return JSON.parse(stdout.output()) as Record<string, unknown>;
64+}
65+4566function jsonResponse(value: unknown): Response {
4667return new Response(JSON.stringify(value), {
4768status: 200,
@@ -260,9 +281,11 @@ describe("google-meet CLI", () => {
260281}),
261282},
262283}).parseAsync(["googlemeet", "setup", "--json"], { from: "user" });
263-expect(JSON.parse(stdout.output())).toMatchObject({
284+const payload = parseStdoutJson(stdout);
285+expectFields(payload, { ok: false });
286+expectFields(firstRecord(payload.checks), {
287+id: "twilio-voice-call-plugin",
264288ok: false,
265-checks: [{ id: "twilio-voice-call-plugin", ok: false }],
266289});
267290} finally {
268291stdout.restore();
@@ -289,22 +312,21 @@ describe("google-meet CLI", () => {
289312],
290313{ from: "user" },
291314);
292-expect(JSON.parse(artifactsStdout.output())).toMatchObject({
293-conferenceRecords: [{ name: "conferenceRecords/rec-1" }],
294-artifacts: [
295-{
296-recordings: [{ name: "conferenceRecords/rec-1/recordings/r1" }],
297-transcripts: [{ name: "conferenceRecords/rec-1/transcripts/t1" }],
298-transcriptEntries: [
299-{
300-transcript: "conferenceRecords/rec-1/transcripts/t1",
301-entries: [{ text: "Hello from the transcript." }],
302-},
303-],
304-smartNotes: [{ name: "conferenceRecords/rec-1/smartNotes/sn1" }],
305-},
306-],
307-tokenSource: "cached-access-token",
315+const payload = parseStdoutJson(artifactsStdout);
316+expectFields(payload, { tokenSource: "cached-access-token" });
317+expectFields(firstRecord(payload.conferenceRecords), { name: "conferenceRecords/rec-1" });
318+const artifact = firstRecord(payload.artifacts);
319+expectFields(firstRecord(artifact.recordings), {
320+name: "conferenceRecords/rec-1/recordings/r1",
321+});
322+expectFields(firstRecord(artifact.transcripts), {
323+name: "conferenceRecords/rec-1/transcripts/t1",
324+});
325+const transcriptEntries = firstRecord(artifact.transcriptEntries);
326+expectFields(transcriptEntries, { transcript: "conferenceRecords/rec-1/transcripts/t1" });
327+expectFields(firstRecord(transcriptEntries.entries), { text: "Hello from the transcript." });
328+expectFields(firstRecord(artifact.smartNotes), {
329+name: "conferenceRecords/rec-1/smartNotes/sn1",
308330});
309331} finally {
310332artifactsStdout.restore();
@@ -367,7 +389,7 @@ describe("google-meet CLI", () => {
367389],
368390{ from: "user" },
369391);
370-expect(JSON.parse(stdout.output())).toMatchObject({
392+expectFields(parseStdoutJson(stdout), {
371393space: "spaces/space-resource-123",
372394ended: true,
373395tokenSource: "cached-access-token",
@@ -602,28 +624,26 @@ describe("google-meet CLI", () => {
602624"Transcript document body.",
603625);
604626const manifest = JSON.parse(readFileSync(path.join(tempDir, "manifest.json"), "utf8"));
605-expect(manifest).toMatchObject({
606-request: {
607- conferenceRecord: "rec-1",
608- includeDocumentBodies: true,
609- },
627+expectFields(manifest.request, {
628+conferenceRecord: "rec-1",
629+includeDocumentBodies: true,
630+});
631+expectFields(manifest, {
610632tokenSource: "cached-access-token",
611-counts: {
612-attendanceRows: 1,
613-warnings: 0,
614-},
615-files: [
616-"summary.md",
617-"attendance.csv",
618-"transcript.md",
619-"artifacts.json",
620-"attendance.json",
621-"manifest.json",
622-],
623633});
624-expect(JSON.parse(readFileSync(path.join(tempDir, "artifacts.json"), "utf8"))).toMatchObject({
625-conferenceRecords: [{ name: "conferenceRecords/rec-1" }],
626-artifacts: [{ transcripts: [{ documentText: "Transcript document body." }] }],
634+expectFields(manifest.counts, { attendanceRows: 1, warnings: 0 });
635+expect(manifest.files).toEqual([
636+"summary.md",
637+"attendance.csv",
638+"transcript.md",
639+"artifacts.json",
640+"attendance.json",
641+"manifest.json",
642+]);
643+const artifacts = JSON.parse(readFileSync(path.join(tempDir, "artifacts.json"), "utf8"));
644+expectFields(firstRecord(artifacts.conferenceRecords), { name: "conferenceRecords/rec-1" });
645+expectFields(firstRecord(firstRecord(artifacts.artifacts).transcripts), {
646+documentText: "Transcript document body.",
627647});
628648expect(readFileSync(`${tempDir}.zip`).subarray(0, 4).toString("hex")).toBe("504b0304");
629649} finally {
@@ -660,15 +680,11 @@ describe("google-meet CLI", () => {
660680expect(summary).toContain("### Warnings");
661681expect(summary).toContain("Document body warning");
662682const manifest = JSON.parse(readFileSync(path.join(tempDir, "manifest.json"), "utf8"));
663-expect(manifest).toMatchObject({
664-counts: { warnings: 1 },
665-warnings: [
666-{
667-type: "smart_note_document_body",
668-conferenceRecord: "conferenceRecords/rec-1",
669-resource: "conferenceRecords/rec-1/smartNotes/sn1",
670-},
671-],
683+expectFields(manifest.counts, { warnings: 1 });
684+expectFields(firstRecord(manifest.warnings), {
685+type: "smart_note_document_body",
686+conferenceRecord: "conferenceRecords/rec-1",
687+resource: "conferenceRecords/rec-1/smartNotes/sn1",
672688});
673689} finally {
674690stdout.restore();
@@ -700,9 +716,11 @@ describe("google-meet CLI", () => {
700716}),
701717},
702718}).parseAsync(["googlemeet", "status", "--json"], { from: "user" });
703-expect(JSON.parse(stdout.output())).toMatchObject({
704-found: true,
705-sessions: [{ id: "meet_1", transport: "twilio" }],
719+const payload = parseStdoutJson(stdout);
720+expectFields(payload, { found: true });
721+expectFields(firstRecord(payload.sessions), {
722+id: "meet_1",
723+transport: "twilio",
706724});
707725} finally {
708726stdout.restore();
@@ -743,9 +761,11 @@ describe("google-meet CLI", () => {
743761{ progress: false },
744762);
745763expect(ensureRuntime).not.toHaveBeenCalled();
746-expect(JSON.parse(stdout.output())).toMatchObject({
747-found: true,
748-sessions: [{ id: "meet_gateway", transport: "chrome-node" }],
764+const payload = parseStdoutJson(stdout);
765+expectFields(payload, { found: true });
766+expectFields(firstRecord(payload.sessions), {
767+id: "meet_gateway",
768+transport: "chrome-node",
749769});
750770} finally {
751771stdout.restore();
@@ -812,7 +832,7 @@ describe("google-meet CLI", () => {
812832});
813833expect(gatewayCall?.[3]).toEqual({ progress: false });
814834expect(ensureRuntime).not.toHaveBeenCalled();
815-expect(JSON.parse(stdout.output())).toMatchObject({
835+expectFields(parseStdoutJson(stdout), {
816836id: "meet_gateway",
817837transport: "chrome-node",
818838});
@@ -875,10 +895,9 @@ describe("google-meet CLI", () => {
875895{ progress: false },
876896);
877897expect(ensureRuntime).not.toHaveBeenCalled();
878-expect(JSON.parse(stdout.output())).toMatchObject({
879-createdSession: true,
880-session: { mode: "bidi" },
881-});
898+const payload = parseStdoutJson(stdout);
899+expectFields(payload, { createdSession: true });
900+expectFields(payload.session, { mode: "bidi" });
882901} finally {
883902stdout.restore();
884903}
@@ -924,7 +943,7 @@ describe("google-meet CLI", () => {
924943transport: "chrome-node",
925944timeoutMs: 30000,
926945});
927-expect(JSON.parse(stdout.output())).toMatchObject({
946+expectFields(parseStdoutJson(stdout), {
928947listenVerified: true,
929948transcriptLines: 1,
930949});
@@ -958,29 +977,27 @@ describe("google-meet CLI", () => {
958977{ from: "user" },
959978);
960979const payload = JSON.parse(stdout.output());
961-expect(payload).toMatchObject({
980+expectFields(payload, {
962981dryRun: true,
963-manifest: {
964-request: {
965-conferenceRecord: "rec-1",
966-includeDocumentBodies: true,
967-},
968-counts: {
969-attendanceRows: 1,
970-transcriptEntries: 1,
971-warnings: 0,
972-},
973-files: [
974-"summary.md",
975-"attendance.csv",
976-"transcript.md",
977-"artifacts.json",
978-"attendance.json",
979-"manifest.json",
980-],
981-},
982982tokenSource: "cached-access-token",
983983});
984+expectFields(payload.manifest.request, {
985+conferenceRecord: "rec-1",
986+includeDocumentBodies: true,
987+});
988+expectFields(payload.manifest.counts, {
989+attendanceRows: 1,
990+transcriptEntries: 1,
991+warnings: 0,
992+});
993+expect(payload.manifest.files).toEqual([
994+"summary.md",
995+"attendance.csv",
996+"transcript.md",
997+"artifacts.json",
998+"attendance.json",
999+"manifest.json",
1000+]);
9841001expect(existsSync(outputDir)).toBe(false);
9851002} finally {
9861003stdout.restore();
@@ -1115,15 +1132,15 @@ describe("google-meet CLI", () => {
11151132expect(output).not.toContain("new-access-token");
11161133expect(output).not.toContain("rt-secret");
11171134expect(output).not.toContain("client-secret");
1118-expect(JSON.parse(output)).toMatchObject({
1135+const payload = JSON.parse(output) as Record<string, unknown>;
1136+expectFields(payload, {
11191137ok: true,
11201138configured: true,
11211139tokenSource: "refresh-token",
1122-checks: [
1123-{ id: "oauth-config", ok: true },
1124-{ id: "oauth-token", ok: true },
1125-],
11261140});
1141+const checks = payload.checks as unknown[];
1142+expectFields(checks[0], { id: "oauth-config", ok: true });
1143+expectFields(checks[1], { id: "oauth-token", ok: true });
11271144expect(ensureRuntime).not.toHaveBeenCalled();
11281145const body = fetchMock.mock.calls[0]?.[1]?.body as URLSearchParams;
11291146expect(body.get("grant_type")).toBe("refresh_token");
@@ -1166,17 +1183,17 @@ describe("google-meet CLI", () => {
11661183}).parseAsync(["googlemeet", "doctor", "--oauth", "--create-space", "--json"], {
11671184from: "user",
11681185});
1169-expect(JSON.parse(stdout.output())).toMatchObject({
1186+const payload = parseStdoutJson(stdout);
1187+expectFields(payload, {
11701188ok: true,
11711189tokenSource: "refresh-token",
11721190createdSpace: "spaces/new-space",
11731191meetingUri: "https://meet.google.com/new-abcd-xyz",
1174-checks: [
1175-{ id: "oauth-config", ok: true },
1176-{ id: "oauth-token", ok: true },
1177-{ id: "meet-spaces-create", ok: true },
1178-],
11791192});
1193+const checks = payload.checks as unknown[];
1194+expectFields(checks[0], { id: "oauth-config", ok: true });
1195+expectFields(checks[1], { id: "oauth-token", ok: true });
1196+expectFields(checks[2], { id: "meet-spaces-create", ok: true });
11801197} finally {
11811198stdout.restore();
11821199}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。