import { assert, describe, it } from "@effect/vitest";import { Effect, Exit } from "effect"; import { CloudAuthApiTestContext, CloudAuthApiTestContextLayer, makeCloudAuthApiTestState,} from "./cloud-auth-api.test-context";import { makeWorkOSTestMembership, makeWorkOSTestState } from "./workos.test-layer";import { makeAutumnTestState } from "../services/autumn.test-layer"; describe("create organization API", () => { it.effect("lets a paid user create another organization through the HTTP API client", () => { const state = makeCloudAuthApiTestState({ workos: makeWorkOSTestState({ memberships: [ makeWorkOSTestMembership("org_free_1", "active"), makeWorkOSTestMembership("org_free_2", "active"), makeWorkOSTestMembership("org_paid", "active"), ], }), autumn: makeAutumnTestState({ subscriptionsByOrgId: { org_paid: [{ planId: "team", status: "active" }], }, }), }); return Effect.gen(function* () { const { client } = yield* CloudAuthApiTestContext; const result = yield* client.cloudAuth.createOrganization({ payload: { name: "Paid Extra Org" }, }); assert.deepEqual(result, { id: "org_created", name: "Paid Extra Org" }); assert.deepEqual(state.workos.createdOrganizations, [ { id: "org_created", name: "Paid Extra Org" }, ]); assert.deepEqual(state.workos.createdMemberships, [ { organizationId: "org_created", userId: "user_1", roleSlug: "admin" }, ]); assert.deepEqual(state.userStore.upsertedOrganizations, [ { id: "org_created", name: "Paid Extra Org" }, ]); }).pipe(Effect.provide(CloudAuthApiTestContextLayer(state))); }); it.effect( "rejects a free-only user at the free organization limit through the HTTP API client", () => { const state = makeCloudAuthApiTestState({ workos: makeWorkOSTestState({ memberships: [ makeWorkOSTestMembership("org_free_1", "active"), makeWorkOSTestMembership("org_free_2", "active"), makeWorkOSTestMembership("org_free_3", "active"), ], }), }); return Effect.gen(function* () { const { client } = yield* CloudAuthApiTestContext; const exit = yield* Effect.exit( client.cloudAuth.createOrganization({ payload: { name: "Blocked Org" }, }), ); assert.isTrue(Exit.isFailure(exit)); assert.deepEqual(state.workos.createdOrganizations, []); assert.deepEqual(state.workos.createdMemberships, []); assert.deepEqual(state.userStore.upsertedOrganizations, []); }).pipe(Effect.provide(CloudAuthApiTestContextLayer(state))); }, ); it.effect("does not count pending memberships toward the free organization limit", () => { const state = makeCloudAuthApiTestState({ workos: makeWorkOSTestState({ memberships: [ makeWorkOSTestMembership("org_free_1", "active"), makeWorkOSTestMembership("org_free_2", "active"), makeWorkOSTestMembership("org_invited", "pending"), ], }), }); return Effect.gen(function* () { const { client } = yield* CloudAuthApiTestContext; const result = yield* client.cloudAuth.createOrganization({ payload: { name: "Below Active Limit" }, }); assert.deepEqual(result, { id: "org_created", name: "Below Active Limit" }); assert.deepEqual(state.workos.createdOrganizations, [ { id: "org_created", name: "Below Active Limit" }, ]); }).pipe(Effect.provide(CloudAuthApiTestContextLayer(state))); });});
import { assert, describe, it } from "@effect/vitest";
import { Effect, Exit } from "effect";
import {
CloudAuthApiTestContext,
CloudAuthApiTestContextLayer,
makeCloudAuthApiTestState,
} from "./cloud-auth-api.test-context";
import { makeWorkOSTestMembership, makeWorkOSTestState } from "./workos.test-layer";
import { makeAutumnTestState } from "../services/autumn.test-layer";
describe("create organization API", () => {
it.effect("lets a paid user create another organization through the HTTP API client", () => {
const state = makeCloudAuthApiTestState({
workos: makeWorkOSTestState({
memberships: [
makeWorkOSTestMembership("org_free_1", "active"),
makeWorkOSTestMembership("org_free_2", "active"),
makeWorkOSTestMembership("org_paid", "active"),
],
}),
autumn: makeAutumnTestState({
subscriptionsByOrgId: {
org_paid: [{ planId: "team", status: "active" }],
},
}),
});
return Effect.gen(function* () {
const { client } = yield* CloudAuthApiTestContext;
const result = yield* client.cloudAuth.createOrganization({
payload: { name: "Paid Extra Org" },
});
assert.deepEqual(result, { id: "org_created", name: "Paid Extra Org" });
assert.deepEqual(state.workos.createdOrganizations, [
{ id: "org_created", name: "Paid Extra Org" },
]);
assert.deepEqual(state.workos.createdMemberships, [
{ organizationId: "org_created", userId: "user_1", roleSlug: "admin" },
]);
assert.deepEqual(state.userStore.upsertedOrganizations, [
{ id: "org_created", name: "Paid Extra Org" },
]);
}).pipe(Effect.provide(CloudAuthApiTestContextLayer(state)));
});
it.effect(
"rejects a free-only user at the free organization limit through the HTTP API client",
() => {
const state = makeCloudAuthApiTestState({
workos: makeWorkOSTestState({
memberships: [
makeWorkOSTestMembership("org_free_1", "active"),
makeWorkOSTestMembership("org_free_2", "active"),
makeWorkOSTestMembership("org_free_3", "active"),
],
}),
});
return Effect.gen(function* () {
const { client } = yield* CloudAuthApiTestContext;
const exit = yield* Effect.exit(
client.cloudAuth.createOrganization({
payload: { name: "Blocked Org" },
}),
);
assert.isTrue(Exit.isFailure(exit));
assert.deepEqual(state.workos.createdOrganizations, []);
assert.deepEqual(state.workos.createdMemberships, []);
assert.deepEqual(state.userStore.upsertedOrganizations, []);
}).pipe(Effect.provide(CloudAuthApiTestContextLayer(state)));
},
);
it.effect("does not count pending memberships toward the free organization limit", () => {
const state = makeCloudAuthApiTestState({
workos: makeWorkOSTestState({
memberships: [
makeWorkOSTestMembership("org_free_1", "active"),
makeWorkOSTestMembership("org_free_2", "active"),
makeWorkOSTestMembership("org_invited", "pending"),
],
}),
});
return Effect.gen(function* () {
const { client } = yield* CloudAuthApiTestContext;
const result = yield* client.cloudAuth.createOrganization({
payload: { name: "Below Active Limit" },
});
assert.deepEqual(result, { id: "org_created", name: "Below Active Limit" });
assert.deepEqual(state.workos.createdOrganizations, [
{ id: "org_created", name: "Below Active Limit" },
]);
}).pipe(Effect.provide(CloudAuthApiTestContextLayer(state)));
});
});