1import { AlchemyContext } from "@/AlchemyContext.ts";
2import { AuthProviders } from "@/Auth/AuthProvider.ts";
3import * as CliKit from "@/Cli/CliKit/index.ts";
4import * as Planetscale from "@/Planetscale";
5import { Credentials } from "@/Planetscale/Credentials.ts";
6import { Stack } from "@/Stack.ts";
7import { Stage } from "@/Stage.ts";
8import * as NodeServices from "@effect/platform-node/NodeServices";
9import { expect, it } from "alchemy-test";
10import * as ConfigProvider from "effect/ConfigProvider";
11import * as Effect from "effect/Effect";
12import * as Layer from "effect/Layer";
13import * as Result from "effect/Result";
14import * as FetchHttpClient from "effect/http/FetchHttpClient";
15import { v4 as uuidv4 } from "uuid";
16
17it.live(
18 "resolving Planetscale credentials rejects an unknown explicit profile",
19 () =>
20 Effect.gen(function* () {
21 const result = yield* Effect.result(
22 Effect.sandbox(
23 Effect.gen(function* () {
24 return yield* yield* Credentials;
25 }).pipe(Effect.provide(Planetscale.providers())),
26 ),
27 );
28 expect(Result.isFailure(result)).toBe(true);
29 if (Result.isFailure(result)) {
30 expect(String(result.failure)).toContain("does not exist");
31 expect(String(result.failure)).toContain("alchemy profile create");
32 }
33 }).pipe(
34 Effect.provide(
35 Layer.mergeAll(
36 Layer.succeed(AuthProviders, {}),
37 Layer.succeed(Stage, "test"),
38 Layer.succeed(Stack, {
39 name: "test",
40 stage: "test",
41 resources: {},
42 bindings: {},
43 actions: {},
44 }),
45 Layer.succeed(AlchemyContext, {
46 dev: false,
47 adopt: false,
48 dotAlchemy: ".alchemy",
49 }),
50 Layer.succeed(
51 ConfigProvider.ConfigProvider,
52 ConfigProvider.fromUnknown({
53 ALCHEMY_PROFILE: `non-existent-${uuidv4()}`,
54 }),
55 ),
56 ).pipe(
57 Layer.provideMerge(
58 Layer.mergeAll(NodeServices.layer, FetchHttpClient.layer),
59 ),
60 ),
61 ),
62 Effect.scoped,
63 Effect.provide(CliKit.layer({ input: false })),
64 ),
65 { tags: ["unit", "provider:planetscale", "local"] },
66);