Ctrl K
ComunidadGuías…

server/models/oauth/OAuthAuthorizationCode.test.ts

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
import crypto from "node:crypto";
import { Scope } from "@shared/types";
import { OAuthAuthorizationCode } from "@server/models";
import { buildOAuthClient, buildUser } from "@server/test/factories";
import { hash } from "@server/utils/crypto";

const buildCode = async () => {
  const user = await buildUser();
  const client = await buildOAuthClient({ teamId: user.teamId });
  const code = crypto.randomBytes(32).toString("hex");

  await OAuthAuthorizationCode.create({
    authorizationCodeHash: hash(code),
    scope: [Scope.Read],
    redirectUri: client.redirectUris[0],
    oauthClientId: client.id,
    userId: user.id,
    expiresAt: new Date(Date.now() + 10000),
    grantId: crypto.randomUUID(),
  });

  return code;
};

describe("OAuthAuthorizationCode", () => {
  describe("scope", () => {
    it("should reject malformed scopes", async () => {
      const user = await buildUser();
      const client = await buildOAuthClient({ teamId: user.teamId });

      await expect(
        OAuthAuthorizationCode.create({
          authorizationCodeHash: hash(crypto.randomBytes(32).toString("hex")),
          scope: ["documents:read,documents:write"],
          redirectUri: client.redirectUris[0],
          oauthClientId: client.id,
          userId: user.id,
          expiresAt: new Date(Date.now() + 10000),
          grantId: crypto.randomUUID(),
        })
      ).rejects.toThrow("Scope must be a valid API scope");
    });
  });

  describe("consume", () => {
    it("should consume the code once", async () => {
      const code = await buildCode();

      expect(await OAuthAuthorizationCode.consume(code)).toBe(true);
      expect(await OAuthAuthorizationCode.consume(code)).toBe(false);
      expect(await OAuthAuthorizationCode.findByCode(code)).toBeNull();
    });

    it("should succeed for a single caller when consumed concurrently", async () => {
      const code = await buildCode();

      const consumed = await Promise.all([
        OAuthAuthorizationCode.consume(code),
        OAuthAuthorizationCode.consume(code),
        OAuthAuthorizationCode.consume(code),
      ]);

      expect(consumed.filter(Boolean).length).toBe(1);
    });

    it("should not consume an unknown code", async () => {
      expect(await OAuthAuthorizationCode.consume("unknown")).toBe(false);
    });
  });
});