alepha
Version:
Easy-to-use modern TypeScript framework for building many kind of applications.
128 lines (103 loc) • 3.32 kB
text/typescript
import { $env, $inject, Alepha, AlephaError, TypeBoxError, z } from "alepha";
import { describe, expect, it } from "vitest";
describe("$env", () => {
it("should parse env variables from Alepha config", () => {
class App {
env = $env(
z.object({
PORT: z.text(),
}),
);
}
const app = Alepha.create({ env: { PORT: "3000" } }).inject(App);
expect(app.env.PORT).toBe("3000");
});
it("should apply default values when var is missing", () => {
class App {
env = $env(
z.object({
HOST: z.text({ default: "localhost" }),
}),
);
}
const app = Alepha.create().inject(App);
expect(app.env.HOST).toBe("localhost");
});
it("should interpolate env references", () => {
class App {
env = $env(
z.object({
BASE: z.text(),
URL: z.text({ default: "$BASE/api" }),
}),
);
}
const app = Alepha.create({ env: { BASE: "http://localhost" } }).inject(
App,
);
expect(app.env.URL).toBe("http://localhost/api");
});
it("should throw TypeBoxError when required var is missing", () => {
class App {
env = $env(
z.object({
REQUIRED: z.text(),
}),
);
}
expect(() => Alepha.create().inject(App)).toThrow(TypeBoxError);
});
it("should throw AlephaError for non-TObject schema", () => {
class App {
env = $env(z.text() as any);
}
expect(() => Alepha.create().inject(App)).toThrow(AlephaError);
});
it("should share parsed env across services", () => {
const schema = z.object({ KEY: z.text() });
class A {
env = $env(schema);
}
class B {
a = $inject(A);
env = $env(schema);
}
const alepha = Alepha.create({ env: { KEY: "value" } });
const b = alepha.inject(B);
expect(b.env.KEY).toBe("value");
expect(b.a.env.KEY).toBe("value");
});
describe("loadEnv", () => {
it("lifts string values from a runtime binding into alepha.env", () => {
const alepha = Alepha.create();
alepha.loadEnv({ PUBLIC_URL: "https://lore.alepha.dev" });
expect(alepha.env.PUBLIC_URL).toBe("https://lore.alepha.dev");
});
it("skips non-string bindings (D1, R2, KV objects)", () => {
const alepha = Alepha.create();
alepha.loadEnv({
PUBLIC_URL: "https://app.example.com",
DB: { prepare: () => {} },
BUCKET: { get: () => {} },
});
expect(alepha.env.PUBLIC_URL).toBe("https://app.example.com");
expect(alepha.env.DB).toBeUndefined();
expect(alepha.env.BUCKET).toBeUndefined();
});
it("does not clobber existing (explicit) env values", () => {
const alepha = Alepha.create({ env: { PUBLIC_URL: "https://explicit" } });
alepha.loadEnv({ PUBLIC_URL: "https://from-binding" });
expect(alepha.env.PUBLIC_URL).toBe("https://explicit");
});
it("is resolvable through $env after merge", () => {
class App {
env = $env(z.object({ PUBLIC_URL: z.text({ default: "" }) }));
}
const alepha = Alepha.create();
alepha.loadEnv({ PUBLIC_URL: "https://merged.example.com" });
expect(alepha.inject(App).env.PUBLIC_URL).toBe(
"https://merged.example.com",
);
});
});
});