import { describe, expect, it } from "@effect/vitest";import { AuthTemplateSlug } from "@executor-js/sdk/shared"; import { applyAuthTemplate, findAuthTemplate, renderAuthTemplate, requiredVariables,} from "./template";import { variable, type Authentication } from "./types"; // removed: the v1 `httpCredentialsFromConfiguredCredentialBindings` test// (react/http-credentials.test.ts) — it exercised the v1 secret/scope/binding// model (ScopeId + SecretId + ConfiguredCredentialBinding + per-header slots),// all deleted in v2. In v2 a connection IS the credential and its value renders// through the integration's auth template, which the cases below cover. const apiKeyHeader: Authentication = { slug: AuthTemplateSlug.make("apiKey-header"), type: "apiKey", headers: { Authorization: ["Bearer ", variable("token")] },}; const apiKeyQuery: Authentication = { slug: AuthTemplateSlug.make("apiKey-query"), type: "apiKey", queryParams: { api_key: [variable("token")] },}; const oauth: Authentication = { slug: AuthTemplateSlug.make("oauth"), type: "oauth", authorizationUrl: "https://auth.example.com/authorize", tokenUrl: "https://auth.example.com/token", scopes: ["read"],}; // Two distinct credential inputs on one method (e.g. Datadog) — each header// renders from its own variable.const datadog: Authentication = { slug: AuthTemplateSlug.make("datadog"), type: "apiKey", headers: { "DD-API-KEY": [variable("dd_api_key")], "DD-APPLICATION-KEY": [variable("dd_application_key")], },}; describe("renderAuthTemplate", () => { it("renders an apiKey header template, substituting the credential variable", () => { const rendered = renderAuthTemplate(apiKeyHeader, { token: "sk-123" }); expect(rendered.headers).toEqual({ Authorization: "Bearer sk-123" }); expect(rendered.queryParams).toEqual({}); }); it("renders an apiKey query template", () => { const rendered = renderAuthTemplate(apiKeyQuery, { token: "qtoken" }); expect(rendered.queryParams).toEqual({ api_key: "qtoken" }); expect(rendered.headers).toEqual({}); }); it("renders two distinct inputs into their own headers, no cross-bleed", () => { const rendered = renderAuthTemplate(datadog, { dd_api_key: "a", dd_application_key: "b" }); expect(rendered.headers).toEqual({ "DD-API-KEY": "a", "DD-APPLICATION-KEY": "b" }); }); it("renders an oauth access token exactly like a bearer apiKey (D11)", () => { const rendered = renderAuthTemplate(oauth, { token: "access-tok" }); expect(rendered.headers).toEqual({ Authorization: "Bearer access-tok" }); }); it("renders nothing for oauth when the token input is unresolved", () => { expect(renderAuthTemplate(oauth, {})).toEqual({ headers: {}, queryParams: {} }); }); it("renders nothing when the template is absent", () => { expect(renderAuthTemplate(undefined, { token: "v" })).toEqual({ headers: {}, queryParams: {}, }); });}); describe("requiredVariables", () => { it("lists the single token for oauth", () => { expect(requiredVariables(oauth)).toEqual(["token"]); }); it("lists every distinct variable across an apiKey method's placements", () => { expect([...requiredVariables(datadog)].sort()).toEqual(["dd_api_key", "dd_application_key"]); });}); describe("findAuthTemplate / applyAuthTemplate", () => { const templates: readonly Authentication[] = [apiKeyHeader, apiKeyQuery, oauth]; it("finds a template by its slug", () => { expect(findAuthTemplate(templates, AuthTemplateSlug.make("oauth"))).toBe(oauth); expect(findAuthTemplate(templates, AuthTemplateSlug.make("missing"))).toBeUndefined(); }); it("selects the connection's template by slug and renders it", () => { const rendered = applyAuthTemplate(templates, AuthTemplateSlug.make("apiKey-query"), { token: "abc", }); expect(rendered.queryParams).toEqual({ api_key: "abc" }); }); it("renders nothing when the connection's template slug doesn't match", () => { const rendered = applyAuthTemplate(templates, AuthTemplateSlug.make("nope"), { token: "abc" }); expect(rendered).toEqual({ headers: {}, queryParams: {} }); });});
import { describe, expect, it } from "@effect/vitest";
import { AuthTemplateSlug } from "@executor-js/sdk/shared";
import {
applyAuthTemplate,
findAuthTemplate,
renderAuthTemplate,
requiredVariables,
} from "./template";
import { variable, type Authentication } from "./types";
// removed: the v1 `httpCredentialsFromConfiguredCredentialBindings` test
// (react/http-credentials.test.ts) — it exercised the v1 secret/scope/binding
// model (ScopeId + SecretId + ConfiguredCredentialBinding + per-header slots),
// all deleted in v2. In v2 a connection IS the credential and its value renders
// through the integration's auth template, which the cases below cover.
const apiKeyHeader: Authentication = {
slug: AuthTemplateSlug.make("apiKey-header"),
type: "apiKey",
headers: { Authorization: ["Bearer ", variable("token")] },
};
const apiKeyQuery: Authentication = {
slug: AuthTemplateSlug.make("apiKey-query"),
type: "apiKey",
queryParams: { api_key: [variable("token")] },
};
const oauth: Authentication = {
slug: AuthTemplateSlug.make("oauth"),
type: "oauth",
authorizationUrl: "https://auth.example.com/authorize",
tokenUrl: "https://auth.example.com/token",
scopes: ["read"],
};
// Two distinct credential inputs on one method (e.g. Datadog) — each header
// renders from its own variable.
const datadog: Authentication = {
slug: AuthTemplateSlug.make("datadog"),
type: "apiKey",
headers: {
"DD-API-KEY": [variable("dd_api_key")],
"DD-APPLICATION-KEY": [variable("dd_application_key")],
},
};
describe("renderAuthTemplate", () => {
it("renders an apiKey header template, substituting the credential variable", () => {
const rendered = renderAuthTemplate(apiKeyHeader, { token: "sk-123" });
expect(rendered.headers).toEqual({ Authorization: "Bearer sk-123" });
expect(rendered.queryParams).toEqual({});
});
it("renders an apiKey query template", () => {
const rendered = renderAuthTemplate(apiKeyQuery, { token: "qtoken" });
expect(rendered.queryParams).toEqual({ api_key: "qtoken" });
expect(rendered.headers).toEqual({});
});
it("renders two distinct inputs into their own headers, no cross-bleed", () => {
const rendered = renderAuthTemplate(datadog, { dd_api_key: "a", dd_application_key: "b" });
expect(rendered.headers).toEqual({ "DD-API-KEY": "a", "DD-APPLICATION-KEY": "b" });
});
it("renders an oauth access token exactly like a bearer apiKey (D11)", () => {
const rendered = renderAuthTemplate(oauth, { token: "access-tok" });
expect(rendered.headers).toEqual({ Authorization: "Bearer access-tok" });
});
it("renders nothing for oauth when the token input is unresolved", () => {
expect(renderAuthTemplate(oauth, {})).toEqual({ headers: {}, queryParams: {} });
});
it("renders nothing when the template is absent", () => {
expect(renderAuthTemplate(undefined, { token: "v" })).toEqual({
headers: {},
queryParams: {},
});
});
});
describe("requiredVariables", () => {
it("lists the single token for oauth", () => {
expect(requiredVariables(oauth)).toEqual(["token"]);
});
it("lists every distinct variable across an apiKey method's placements", () => {
expect([...requiredVariables(datadog)].sort()).toEqual(["dd_api_key", "dd_application_key"]);
});
});
describe("findAuthTemplate / applyAuthTemplate", () => {
const templates: readonly Authentication[] = [apiKeyHeader, apiKeyQuery, oauth];
it("finds a template by its slug", () => {
expect(findAuthTemplate(templates, AuthTemplateSlug.make("oauth"))).toBe(oauth);
expect(findAuthTemplate(templates, AuthTemplateSlug.make("missing"))).toBeUndefined();
});
it("selects the connection's template by slug and renders it", () => {
const rendered = applyAuthTemplate(templates, AuthTemplateSlug.make("apiKey-query"), {
token: "abc",
});
expect(rendered.queryParams).toEqual({ api_key: "abc" });
});
it("renders nothing when the connection's template slug doesn't match", () => {
const rendered = applyAuthTemplate(templates, AuthTemplateSlug.make("nope"), { token: "abc" });
expect(rendered).toEqual({ headers: {}, queryParams: {} });
});
});