mirror of
https://github.com/VibedByKaKi/t3-code-android-nightly.git
synced 2026-10-14 14:27:45 +02:00
248 lines
7.9 KiB
TypeScript
248 lines
7.9 KiB
TypeScript
import * as Cloudflare from "@/Cloudflare";
|
|
import { CloudflareEnvironment } from "@/Cloudflare/CloudflareEnvironment";
|
|
import * as Provider from "@/Provider";
|
|
import * as Test from "@/Test/Alchemy";
|
|
import * as accounts from "@distilled.cloud/cloudflare/accounts";
|
|
import { describe, expect } from "alchemy-test";
|
|
import * as Data from "effect/Data";
|
|
import * as Effect from "effect/Effect";
|
|
import * as Redacted from "effect/Redacted";
|
|
import { MinimumLogLevel } from "effect/References";
|
|
import * as Schedule from "effect/Schedule";
|
|
const { test } = Test.make({ providers: Cloudflare.providers() });
|
|
|
|
const logLevel = Effect.provideService(
|
|
MinimumLogLevel,
|
|
process.env.DEBUG ? "Debug" : "Info",
|
|
);
|
|
|
|
describe.skip(
|
|
"AccountApiToken",
|
|
{ tags: ["provider:cloudflare", "provider:cloudflare:apitoken", "live"] },
|
|
() => {
|
|
test.provider(
|
|
"create and delete account token with default props",
|
|
(stack) =>
|
|
Effect.gen(function* () {
|
|
const { accountId } = yield* yield* CloudflareEnvironment;
|
|
|
|
yield* stack.destroy();
|
|
|
|
const token = yield* stack.deploy(
|
|
Effect.gen(function* () {
|
|
return yield* Cloudflare.ApiToken.AccountApiToken(
|
|
"DefaultToken",
|
|
{
|
|
policies: [
|
|
{
|
|
effect: "allow",
|
|
permissionGroups: ["Workers Scripts Read"],
|
|
resources: {
|
|
[`com.cloudflare.api.account.${accountId}`]: "*",
|
|
},
|
|
},
|
|
],
|
|
},
|
|
);
|
|
}),
|
|
);
|
|
|
|
expect(token.tokenId).toBeDefined();
|
|
expect(token.name).toBeDefined();
|
|
expect(token.status).toEqual("active");
|
|
expect(Redacted.value(token.value)).toMatch(/.+/);
|
|
|
|
const actualToken = yield* accounts.getToken({
|
|
accountId,
|
|
tokenId: token.tokenId,
|
|
});
|
|
expect(actualToken.id).toEqual(token.tokenId);
|
|
expect(actualToken.name).toEqual(token.name);
|
|
|
|
yield* stack.destroy();
|
|
|
|
yield* waitForTokenToBeDeleted(token.tokenId, accountId);
|
|
}).pipe(logLevel),
|
|
{ tags: ["provider:cloudflare:account"] },
|
|
);
|
|
|
|
test.provider(
|
|
"create, update, delete account token",
|
|
(stack) =>
|
|
Effect.gen(function* () {
|
|
const { accountId } = yield* yield* CloudflareEnvironment;
|
|
|
|
yield* stack.destroy();
|
|
|
|
const token = yield* stack.deploy(
|
|
Effect.gen(function* () {
|
|
return yield* Cloudflare.ApiToken.AccountApiToken("UpdateToken", {
|
|
name: "alchemy-test-acct-update-initial",
|
|
policies: [
|
|
{
|
|
effect: "allow",
|
|
permissionGroups: ["Workers Scripts Read"],
|
|
resources: {
|
|
[`com.cloudflare.api.account.${accountId}`]: "*",
|
|
},
|
|
},
|
|
],
|
|
});
|
|
}),
|
|
);
|
|
|
|
expect(token.name).toEqual("alchemy-test-acct-update-initial");
|
|
const initialValue = Redacted.value(token.value);
|
|
|
|
const updated = yield* stack.deploy(
|
|
Effect.gen(function* () {
|
|
return yield* Cloudflare.ApiToken.AccountApiToken("UpdateToken", {
|
|
name: "alchemy-test-acct-update-renamed",
|
|
policies: [
|
|
{
|
|
effect: "allow",
|
|
permissionGroups: [
|
|
"Workers Scripts Read",
|
|
"Workers KV Storage Read",
|
|
],
|
|
resources: {
|
|
[`com.cloudflare.api.account.${accountId}`]: "*",
|
|
},
|
|
},
|
|
],
|
|
});
|
|
}),
|
|
);
|
|
|
|
expect(updated.tokenId).toEqual(token.tokenId);
|
|
expect(updated.name).toEqual("alchemy-test-acct-update-renamed");
|
|
expect(Redacted.value(updated.value)).toEqual(initialValue);
|
|
|
|
const actual = yield* accounts.getToken({
|
|
accountId,
|
|
tokenId: updated.tokenId,
|
|
});
|
|
expect(actual.name).toEqual("alchemy-test-acct-update-renamed");
|
|
expect(actual.policies?.[0]?.permissionGroups.length).toEqual(2);
|
|
|
|
yield* stack.destroy();
|
|
|
|
yield* waitForTokenToBeDeleted(token.tokenId, accountId);
|
|
}).pipe(logLevel),
|
|
{ tags: ["provider:cloudflare:account"] },
|
|
);
|
|
|
|
test.provider("noop when account token props unchanged", (stack) =>
|
|
Effect.gen(function* () {
|
|
const { accountId } = yield* yield* CloudflareEnvironment;
|
|
|
|
yield* stack.destroy();
|
|
|
|
const props = {
|
|
name: "alchemy-test-acct-noop",
|
|
policies: [
|
|
{
|
|
effect: "allow" as const,
|
|
permissionGroups: ["Workers Scripts Read" as const],
|
|
resources: {
|
|
[`com.cloudflare.api.account.${accountId}`]: "*",
|
|
},
|
|
},
|
|
],
|
|
};
|
|
|
|
const first = yield* stack.deploy(
|
|
Effect.gen(function* () {
|
|
return yield* Cloudflare.ApiToken.AccountApiToken(
|
|
"NoopToken",
|
|
props,
|
|
);
|
|
}),
|
|
);
|
|
|
|
const second = yield* stack.deploy(
|
|
Effect.gen(function* () {
|
|
return yield* Cloudflare.ApiToken.AccountApiToken(
|
|
"NoopToken",
|
|
props,
|
|
);
|
|
}),
|
|
);
|
|
|
|
expect(second.tokenId).toEqual(first.tokenId);
|
|
expect(Redacted.value(second.value)).toEqual(
|
|
Redacted.value(first.value),
|
|
);
|
|
|
|
yield* stack.destroy();
|
|
}).pipe(logLevel),
|
|
);
|
|
|
|
const waitForTokenToBeDeleted = Effect.fn(function* (
|
|
tokenId: string,
|
|
accountId: string,
|
|
) {
|
|
yield* accounts.getToken({ accountId, tokenId }).pipe(
|
|
Effect.flatMap(() => Effect.fail(new TokenStillExists())),
|
|
Effect.retry({
|
|
while: (e): e is TokenStillExists => e instanceof TokenStillExists,
|
|
schedule: Schedule.max([
|
|
Schedule.exponential(200),
|
|
Schedule.recurs(8),
|
|
]),
|
|
}),
|
|
Effect.catchTag("TokenStillExists", () =>
|
|
Effect.die(
|
|
`Cloudflare API token ${tokenId} was not deleted after retries`,
|
|
),
|
|
),
|
|
Effect.catchTag("TokenNotFound", () => Effect.void),
|
|
Effect.catchTag("InvalidRoute", () => Effect.void),
|
|
);
|
|
});
|
|
},
|
|
);
|
|
class TokenStillExists extends Data.TaggedError("TokenStillExists") {}
|
|
|
|
describe(
|
|
"AccountApiToken list",
|
|
{ tags: ["provider:cloudflare", "provider:cloudflare:apitoken", "live"] },
|
|
() => {
|
|
test.provider("list enumerates the deployed account token", (stack) =>
|
|
Effect.gen(function* () {
|
|
const { accountId } = yield* yield* CloudflareEnvironment;
|
|
|
|
yield* stack.destroy();
|
|
|
|
const token = yield* stack.deploy(
|
|
Effect.gen(function* () {
|
|
return yield* Cloudflare.ApiToken.AccountApiToken("ListToken", {
|
|
name: "alchemy-test-acct-list",
|
|
policies: [
|
|
{
|
|
effect: "allow",
|
|
permissionGroups: ["Workers Scripts Read"],
|
|
resources: {
|
|
[`com.cloudflare.api.account.${accountId}`]: "*",
|
|
},
|
|
},
|
|
],
|
|
});
|
|
}),
|
|
);
|
|
|
|
const provider = yield* Provider.findProvider(
|
|
Cloudflare.ApiToken.AccountApiToken,
|
|
);
|
|
const all = yield* provider.list();
|
|
|
|
expect(all.some((t) => t.tokenId === token.tokenId)).toBe(true);
|
|
const found = all.find((t) => t.tokenId === token.tokenId)!;
|
|
expect(found.name).toEqual(token.name);
|
|
expect(found.accountId).toEqual(accountId);
|
|
|
|
yield* stack.destroy();
|
|
}).pipe(logLevel),
|
|
);
|
|
},
|
|
);
|