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: "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, }, }); }), ); });