Unverified Commit ca59c0df authored by Hong Minhee's avatar Hong Minhee
Browse files

Add tests for firstKnock option and KvSpecDeterminer



Add comprehensive test coverage for the firstKnock option functionality:
- Test FederationBuilder handling of firstKnock option with default,
  custom, and explicit values
- Test KvSpecDeterminer class behavior for default specs, custom defaults,
  KV storage/retrieval, and spec overriding
- Ensure proper type safety with KvKey constraints

All tests verify the double-knocking mechanism components work correctly.

Co-Authored-By: default avatarClaude <noreply@anthropic.com>
parent 37f6d55a
Loading
Loading
Loading
Loading
+29 −0
Original line number Diff line number Diff line
@@ -138,6 +138,35 @@ test("FederationBuilder", async (t) => {
    assertEquals(impl.origin?.webOrigin, "https://example.com");
  });

  await t.step("should handle firstKnock option", async () => {
    const builder = createFederationBuilder<void>();
    const kv = new MemoryKvStore();

    // Test with default firstKnock (should be "rfc9421")
    const federationDefault = await builder.build({ kv });
    assertExists(federationDefault);
    const implDefault = federationDefault as FederationImpl<void>;
    assertEquals(implDefault.firstKnock, undefined); // Uses default when not specified

    // Test with custom firstKnock value
    const federationCustom = await builder.build({
      kv,
      firstKnock: "draft-cavage-http-signatures-12",
    });
    assertExists(federationCustom);
    const implCustom = federationCustom as FederationImpl<void>;
    assertEquals(implCustom.firstKnock, "draft-cavage-http-signatures-12");

    // Test with rfc9421 explicitly set
    const federationRfc = await builder.build({
      kv,
      firstKnock: "rfc9421",
    });
    assertExists(federationRfc);
    const implRfc = federationRfc as FederationImpl<void>;
    assertEquals(implRfc.firstKnock, "rfc9421");
  });

  await t.step(
    "should register multiple object dispatchers and verify them",
    async () => {
+66 −0
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@ import {
  createFederation,
  FederationImpl,
  InboxContextImpl,
  KvSpecDeterminer,
} from "./middleware.ts";
import type { MessageQueue } from "./mq.ts";
import type { InboxMessage, Message, OutboxMessage } from "./queue.ts";
@@ -2385,3 +2386,68 @@ test("InboxContextImpl.forwardActivity()", async (t) => {

  fetchMock.hardReset();
});

test("KvSpecDeterminer", async (t) => {
  await t.step("should use default spec when not found in KV", async () => {
    const kv = new MemoryKvStore();
    const prefix = ["test", "spec"] as const;

    // Test with default rfc9421
    const determiner = new KvSpecDeterminer(kv, prefix);
    const spec = await determiner.determineSpec("example.com");
    assertEquals(spec, "rfc9421");
  });

  await t.step("should use custom default spec", async () => {
    const kv = new MemoryKvStore();
    const prefix = ["test", "spec"] as const;

    // Test with custom default spec
    const determiner = new KvSpecDeterminer(
      kv,
      prefix,
      "draft-cavage-http-signatures-12",
    );
    const spec = await determiner.determineSpec("example.com");
    assertEquals(spec, "draft-cavage-http-signatures-12");
  });

  await t.step("should remember and retrieve spec from KV", async () => {
    const kv = new MemoryKvStore();
    const prefix = ["test", "spec"] as const;
    const determiner = new KvSpecDeterminer(kv, prefix);

    // Remember a spec for a specific origin
    await determiner.rememberSpec(
      "example.com",
      "draft-cavage-http-signatures-12",
    );

    // Should retrieve the remembered spec
    const spec = await determiner.determineSpec("example.com");
    assertEquals(spec, "draft-cavage-http-signatures-12");

    // Different origin should still use default
    const defaultSpec = await determiner.determineSpec("other.com");
    assertEquals(defaultSpec, "rfc9421");
  });

  await t.step("should override remembered spec", async () => {
    const kv = new MemoryKvStore();
    const prefix = ["test", "spec"] as const;
    const determiner = new KvSpecDeterminer(kv, prefix);

    // Remember initial spec
    await determiner.rememberSpec(
      "example.com",
      "draft-cavage-http-signatures-12",
    );
    let spec = await determiner.determineSpec("example.com");
    assertEquals(spec, "draft-cavage-http-signatures-12");

    // Override with new spec
    await determiner.rememberSpec("example.com", "rfc9421");
    spec = await determiner.determineSpec("example.com");
    assertEquals(spec, "rfc9421");
  });
});