





















@@ -10,6 +10,7 @@ import { registerGoogleMeetCli } from "./src/cli.js";
1010import { resolveGoogleMeetConfig, resolveGoogleMeetConfigWithEnv } from "./src/config.js";
1111import {
1212buildGoogleMeetPreflightReport,
13+createGoogleMeetSpace,
1314fetchGoogleMeetSpace,
1415normalizeGoogleMeetSpaceName,
1516} from "./src/meet.js";
@@ -348,6 +349,7 @@ describe("google-meet plugin", () => {
348349type: "string",
349350enum: [
350351"join",
352+"create",
351353"status",
352354"setup_status",
353355"resolve_space",
@@ -411,6 +413,37 @@ describe("google-meet plugin", () => {
411413);
412414});
413415416+it("creates Meet spaces and returns the meeting URL", async () => {
417+const fetchMock = vi.fn(async () => {
418+return new Response(
419+JSON.stringify({
420+name: "spaces/new-space",
421+meetingCode: "new-abcd-xyz",
422+meetingUri: "https://meet.google.com/new-abcd-xyz",
423+}),
424+{ status: 200, headers: { "Content-Type": "application/json" } },
425+);
426+});
427+vi.stubGlobal("fetch", fetchMock);
428+429+await expect(createGoogleMeetSpace({ accessToken: "token" })).resolves.toMatchObject({
430+meetingUri: "https://meet.google.com/new-abcd-xyz",
431+space: { name: "spaces/new-space" },
432+});
433+expect(fetchGuardMocks.fetchWithSsrFGuard).toHaveBeenCalledWith(
434+expect.objectContaining({
435+url: "https://meet.googleapis.com/v2/spaces",
436+init: expect.objectContaining({
437+method: "POST",
438+headers: expect.objectContaining({ Authorization: "Bearer token" }),
439+body: "{}",
440+}),
441+policy: { allowedHostnames: ["meet.googleapis.com"] },
442+auditContext: "google-meet.spaces.create",
443+}),
444+);
445+});
446+414447it("surfaces Developer Preview acknowledgment blockers in preflight reports", () => {
415448expect(
416449buildGoogleMeetPreflightReport({
@@ -438,6 +471,7 @@ describe("google-meet plugin", () => {
438471expect(url.searchParams.get("client_id")).toBe("client-id");
439472expect(url.searchParams.get("code_challenge")).toBe("challenge");
440473expect(url.searchParams.get("access_type")).toBe("offline");
474+expect(url.searchParams.get("scope")).toContain("meetings.space.created");
441475expect(url.searchParams.get("scope")).toContain("meetings.conference.media.readonly");
442476443477await expect(
@@ -701,6 +735,48 @@ describe("google-meet plugin", () => {
701735}
702736});
703737738+it("CLI create prints the new meeting URL", async () => {
739+const fetchMock = vi.fn(async (input: RequestInfo | URL, _init?: RequestInit) => {
740+const url = input instanceof Request ? input.url : input.toString();
741+if (url.includes("oauth2.googleapis.com")) {
742+return new Response(
743+JSON.stringify({
744+access_token: "new-access-token",
745+expires_in: 3600,
746+token_type: "Bearer",
747+}),
748+{ status: 200, headers: { "Content-Type": "application/json" } },
749+);
750+}
751+return new Response(
752+JSON.stringify({
753+name: "spaces/new-space",
754+meetingCode: "new-abcd-xyz",
755+meetingUri: "https://meet.google.com/new-abcd-xyz",
756+}),
757+{ status: 200, headers: { "Content-Type": "application/json" } },
758+);
759+});
760+vi.stubGlobal("fetch", fetchMock);
761+const program = new Command();
762+const stdout = captureStdout();
763+registerGoogleMeetCli({
764+ program,
765+config: resolveGoogleMeetConfig({
766+oauth: { clientId: "client-id", refreshToken: "refresh-token" },
767+}),
768+ensureRuntime: async () => ({}) as GoogleMeetRuntime,
769+});
770+771+try {
772+await program.parseAsync(["googlemeet", "create"], { from: "user" });
773+expect(stdout.output()).toContain("meeting uri: https://meet.google.com/new-abcd-xyz");
774+expect(stdout.output()).toContain("space: spaces/new-space");
775+} finally {
776+stdout.restore();
777+}
778+});
779+704780it("launches Chrome after the BlackHole check", async () => {
705781const originalPlatform = process.platform;
706782Object.defineProperty(process, "platform", { value: "darwin" });
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。