260 lines · 8.4 KB · TypeScript
RawDownload
import { AuthStandardClientScopes, EnvironmentId } from "@t3tools/contracts";import { describe, expect, it } from "@effect/vitest";import * as Effect from "effect/Effect";import * as Layer from "effect/Layer";import * as Option from "effect/Option"; import { remoteHttpClientLayer } from "../rpc/http.ts";import { ClientPresentation, SshEnvironmentGateway } from "../platform/capabilities.ts";import { BearerConnectionCredential, BearerConnectionProfile } from "./catalog.ts";import { BearerConnectionTarget } from "./model.ts";import {  prepareBearerConnectionUpdate,  preparePairingRegistration,  prepareSshRegistration,} from "./onboarding.ts"; const CLIENT_PRESENTATION_LAYER = Layer.succeed(  ClientPresentation,  ClientPresentation.of({    metadata: {      label: "T3 Code Test",      deviceType: "desktop",      os: "Test OS",    },    scopes: AuthStandardClientScopes,  }),); function pairingHttpLayer(  calls: Array<{ readonly url: string; readonly init: RequestInit }>,  options?: { readonly failDescriptor?: boolean },) {  const fetchFn = ((input, init = {}) => {    const url = String(input);    calls.push({ url, init });     if (url.endsWith("/.well-known/t3/environment")) {      if (options?.failDescriptor === true) {        return Promise.resolve(          Response.json({ message: "descriptor unavailable" }, { status: 503 }),        );      }      return Promise.resolve(        Response.json({          environmentId: "environment-paired",          label: "Paired environment",          platform: {            os: "linux",            arch: "x64",          },          serverVersion: "0.0.0-test",          capabilities: {            repositoryIdentity: true,          },        }),      );    }     if (url.endsWith("/oauth/token")) {      return Promise.resolve(        Response.json({          access_token: "bearer-token",          issued_token_type: "urn:ietf:params:oauth:token-type:access_token",          token_type: "Bearer",          expires_in: 3600,          scope: AuthStandardClientScopes.join(" "),        }),      );    }     return Promise.reject(new Error(`Unexpected request: ${url}`));  }) satisfies typeof fetch;   return remoteHttpClientLayer(fetchFn);} describe("connection onboarding", () => {  it.effect("prepares a persisted bearer registration from pairing details", () =>    Effect.gen(function* () {      const calls: Array<{ readonly url: string; readonly init: RequestInit }> = [];      const registration = yield* preparePairingRegistration({        host: "remote.example.test",        pairingCode: "pairing-token",      }).pipe(Effect.provide(Layer.mergeAll(CLIENT_PRESENTATION_LAYER, pairingHttpLayer(calls))));       expect(registration).toMatchObject({        _tag: "BearerConnectionRegistration",        target: {          environmentId: "environment-paired",          label: "Paired environment",          connectionId: "bearer:environment-paired",        },        profile: {          environmentId: "environment-paired",          label: "Paired environment",          connectionId: "bearer:environment-paired",          httpBaseUrl: "https://remote.example.test/",          wsBaseUrl: "wss://remote.example.test/",        },        credential: {          token: "bearer-token",        },      });      expect(calls.map((call) => call.url)).toEqual([        "https://remote.example.test/.well-known/t3/environment",        "https://remote.example.test/oauth/token",      ]);       const tokenRequest = calls.find((call) => call.url.endsWith("/oauth/token"));      const tokenBody =        tokenRequest?.init.body instanceof Uint8Array          ? new TextDecoder().decode(tokenRequest.init.body)          : String(tokenRequest?.init.body);      const tokenParams = new URLSearchParams(tokenBody);      expect(tokenParams.get("subject_token")).toBe("pairing-token");      expect(tokenParams.get("scope")).toBe(AuthStandardClientScopes.join(" "));      expect(tokenParams.get("client_label")).toBe("T3 Code Test");    }),  );   it.effect("does not consume a pairing credential when descriptor discovery fails", () =>    Effect.gen(function* () {      const calls: Array<{ readonly url: string; readonly init: RequestInit }> = [];       yield* preparePairingRegistration({        host: "remote.example.test",        pairingCode: "pairing-token",      }).pipe(        Effect.provide(          Layer.mergeAll(            CLIENT_PRESENTATION_LAYER,            pairingHttpLayer(calls, { failDescriptor: true }),          ),        ),        Effect.flip,      );       expect(calls.map((call) => call.url)).toEqual([        "https://remote.example.test/.well-known/t3/environment",      ]);    }),  );   it.effect("rejects invalid pairing details before making a request", () =>    Effect.gen(function* () {      const calls: Array<{ readonly url: string; readonly init: RequestInit }> = [];      const error = yield* preparePairingRegistration({        host: "",        pairingCode: "",      }).pipe(        Effect.provide(Layer.mergeAll(CLIENT_PRESENTATION_LAYER, pairingHttpLayer(calls))),        Effect.flip,      );       expect(error).toMatchObject({        _tag: "ConnectionBlockedError",        reason: "configuration",        message: "The pairing details are invalid.",        cause: expect.objectContaining({          message: "Enter a backend URL.",        }),      });      expect(calls).toEqual([]);    }),  );   it.effect("updates bearer metadata while preserving the credential and identity", () =>    Effect.gen(function* () {      const environmentId = EnvironmentId.make("environment-paired");      const registration = yield* prepareBearerConnectionUpdate({        input: {          environmentId,          label: "  Renamed environment  ",          httpBaseUrl: "http://100.65.180.100:3773/path",        },        entry: Option.some({          target: new BearerConnectionTarget({            environmentId,            label: "Old label",            connectionId: "bearer:environment-paired",          }),          profile: Option.some(            new BearerConnectionProfile({              connectionId: "bearer:environment-paired",              environmentId,              label: "Old label",              httpBaseUrl: "http://old.example.test/",              wsBaseUrl: "ws://old.example.test/",            }),          ),        }),        credential: Option.some(new BearerConnectionCredential({ token: "bearer-token" })),      });       expect(registration).toMatchObject({        target: {          environmentId,          label: "Renamed environment",          connectionId: "bearer:environment-paired",        },        profile: {          environmentId,          label: "Renamed environment",          httpBaseUrl: "http://100.65.180.100:3773/",          wsBaseUrl: "ws://100.65.180.100:3773/",        },        credential: { token: "bearer-token" },      });    }),  );   it.effect("prepares an SSH registration from the provisioned platform environment", () =>    Effect.gen(function* () {      const target = {        alias: "devbox",        hostname: "devbox.example.test",        username: "developer",        port: 22,      };      const registration = yield* prepareSshRegistration({        target,      }).pipe(        Effect.provideService(          SshEnvironmentGateway,          SshEnvironmentGateway.of({            provision: () =>              Effect.succeed({                environmentId: EnvironmentId.make("environment-ssh"),                label: "Remote development box",                bootstrap: {                  target,                  httpBaseUrl: "http://127.0.0.1:3201",                  wsBaseUrl: "ws://127.0.0.1:3201",                  pairingToken: "pairing-token",                },                bearerToken: "bearer-token",              }),            prepare: () => Effect.die("unused"),            disconnect: () => Effect.die("unused"),          }),        ),      );       expect(registration).toMatchObject({        _tag: "SshConnectionRegistration",        target: {          environmentId: "environment-ssh",          label: "Remote development box",          connectionId: "ssh:environment-ssh",        },        profile: {          environmentId: "environment-ssh",          label: "Remote development box",          connectionId: "ssh:environment-ssh",          target,        },      });    }),  );});