1import { AuthError } from "@/Auth/AuthProvider";
2import type { CredentialsStore } from "@/Auth/Credentials";
3import type { ProfileStore } from "@/Auth/Profile";
4import * as Effect from "effect/Effect";
5import * as Schema from "effect/Schema";
6
7export const makeFakeProfileStore = (
8 overrides?: Partial<ProfileStore["Service"]>,
9): ProfileStore["Service"] => ({
10 readManifest: Effect.succeed({ version: 3, profiles: {} }),
11 getProfile: () => Effect.succeed(undefined),
12 ensureProfile: () => Effect.succeed({ id: "fake", providers: {} }),
13 createProfile: () => Effect.void,
14 renameProfile: () => Effect.void,
15 current: Effect.succeed({ name: "default", source: "configuration" }),
16 setProviderConfig: () => Effect.void,
17 deleteProviderConfig: () => Effect.succeed(false),
18 deleteProfile: () => Effect.succeed(false),
19 loadProviderConfig: <Config extends { method: string }>() =>
20 Effect.succeed({ method: "stored" } as Config),
21 ...overrides,
22});
23
24export const makeFakeCredentialsStore = (
25 stored?: unknown,
26): CredentialsStore["Service"] => ({
27 read: <A, E>(
28 _profile: string,
29 _provider: string,
30 schema: Schema.Codec<A, E>,
31 ) =>
32 stored === undefined
33 ? Effect.succeed(undefined)
34 : Schema.decodeUnknownEffect(schema)(stored).pipe(
35 Effect.mapError(
36 (cause) =>
37 new AuthError({
38 message: "Stored credentials do not match the expected shape.",
39 cause,
40 }),
41 ),
42 ),
43 write: () => Effect.void,
44 delete: () => Effect.void,
45 deleteProfile: () => Effect.void,
46});