Files
cfw-autumn/server/tests/global.ts
2025-07-17 13:58:36 +01:00

901 lines
20 KiB
TypeScript

import dotenv from "dotenv";
dotenv.config();
import {
AggregateType,
AllowanceType,
AppEnv,
BillingInterval,
CouponDurationType,
EntInterval,
Feature,
FeatureUsageType,
RewardReceivedBy,
RewardTriggerEvent,
RewardType,
} from "@autumn/shared";
import { FeatureType } from "@autumn/shared";
import {
initReward,
initEntitlement,
initFeature,
initFreeTrial,
initPrice,
initProduct,
initRewardProgram,
} from "./utils/init.js";
import { createSupabaseClient } from "@/external/supabaseUtils.js";
import { OrgService } from "@/internal/orgs/OrgService.js";
import { initDrizzle } from "@/db/initDrizzle.js";
import { FeatureService } from "@/internal/features/FeatureService.js";
export const features: Record<string, Feature & { eventName: string }> = {
boolean1: initFeature({
id: "boolean1",
type: FeatureType.Boolean,
}),
metered1: initFeature({
id: "metered1",
type: FeatureType.Metered,
aggregateType: AggregateType.Sum,
groupBy: "user_id",
eventName: "metered_1",
usageType: FeatureUsageType.Single,
}),
infinite1: initFeature({
id: "infinite1",
type: FeatureType.Metered,
usageType: FeatureUsageType.Single,
}),
metered2: initFeature({
id: "metered2",
type: FeatureType.Metered,
aggregateType: AggregateType.Count,
eventName: "metered_2",
usageType: FeatureUsageType.Single,
}),
// GPU SYSTEM
gpu1: initFeature({
id: "gpu1",
type: FeatureType.Metered,
groupBy: "user_id",
usageType: FeatureUsageType.Single,
}),
gpu2: initFeature({
id: "gpu2",
type: FeatureType.Metered,
groupBy: "user_id",
usageType: FeatureUsageType.Single,
}),
// In arrear prorated
seats: initFeature({
id: "seats",
type: FeatureType.Metered,
usageType: FeatureUsageType.Continuous,
}),
};
export const creditSystems = {
gpuCredits: initFeature({
id: "gpuCredits",
type: FeatureType.CreditSystem,
creditSchema: [
{
metered_feature_id: features.gpu1.id,
feature_amount: 1,
credit_amount: 0.01,
},
{
metered_feature_id: features.gpu2.id,
feature_amount: 1,
credit_amount: 0.0213,
},
],
usageType: FeatureUsageType.Single,
}),
};
export const products = {
free: initProduct({
id: "free",
isDefault: true,
entitlements: {
metered1: initEntitlement({
feature: features.metered1,
allowance: 5,
interval: EntInterval.Month,
}),
},
prices: [],
freeTrial: null,
}),
pro: initProduct({
id: "pro",
entitlements: {
boolean1: initEntitlement({
feature: features.boolean1,
}),
metered1: initEntitlement({
feature: features.metered1,
allowance: 10,
interval: EntInterval.Month,
}),
infinite1: initEntitlement({
feature: features.infinite1,
allowanceType: AllowanceType.Unlimited,
}),
},
prices: [
initPrice({
type: "monthly",
}),
],
freeTrial: null,
}),
oneTimeAddOnMetered1: initProduct({
id: "one-time-add-on-metered-1",
isAddOn: true,
entitlements: {
metered1: initEntitlement({
feature: features.metered1,
allowance: 0,
interval: EntInterval.Lifetime,
}),
},
prices: [
initPrice({
type: "in_advance",
billingInterval: BillingInterval.OneOff,
feature: features.metered1,
}),
],
freeTrial: null,
}),
monthlyAddOnMetered1: initProduct({
id: "monthly-add-on-metered-1",
isAddOn: true,
entitlements: {
metered1: initEntitlement({
feature: features.metered1,
allowance: 0,
interval: EntInterval.Month,
}),
},
prices: [
initPrice({
type: "in_advance",
billingInterval: BillingInterval.Month,
feature: features.metered1,
}),
],
freeTrial: null,
}),
proWithOverage: initProduct({
id: "pro-with-overage",
entitlements: {
metered1: initEntitlement({
feature: features.metered1,
allowance: 10,
interval: EntInterval.Month,
}),
},
prices: [
initPrice({
type: "monthly",
billingInterval: BillingInterval.Month,
}),
initPrice({
type: "in_arrears",
billingInterval: BillingInterval.Month,
feature: features.metered1,
}),
],
freeTrial: null,
}),
proOnlyUsage: initProduct({
id: "pro-only-usage",
entitlements: {
metered1: initEntitlement({
feature: features.metered1,
allowance: 0,
allowanceType: AllowanceType.Fixed,
interval: EntInterval.Month,
}),
},
prices: [
initPrice({
type: "in_arrears",
billingInterval: BillingInterval.Month,
feature: features.metered1,
}),
],
freeTrial: null,
}),
proWithTrial: initProduct({
id: "pro-with-trial",
entitlements: {
metered1: initEntitlement({
feature: features.metered1,
allowance: 10,
interval: EntInterval.Month,
}),
},
prices: [
initPrice({
type: "monthly",
}),
],
freeTrial: initFreeTrial({
length: 7,
uniqueFingerprint: true,
}),
}),
premium: initProduct({
id: "premium",
entitlements: {
metered1: initEntitlement({
feature: features.metered1,
allowance: 100,
interval: EntInterval.Month,
}),
},
prices: [
initPrice({
type: "monthly",
amount: 50,
}),
],
freeTrial: null,
}),
premiumWithTrial: initProduct({
id: "premium-with-trial",
entitlements: {
metered1: initEntitlement({
feature: features.metered1,
allowance: 100,
interval: EntInterval.Month,
}),
},
prices: [
initPrice({
type: "monthly",
amount: 50,
}),
],
freeTrial: initFreeTrial({
length: 7,
uniqueFingerprint: true,
}),
}),
monthlyWithOneTime: initProduct({
id: "mothlyWithOneTime",
entitlements: {
metered1: initEntitlement({
feature: features.metered1,
allowance: 0,
interval: EntInterval.Lifetime,
}),
metered2: initEntitlement({
feature: features.metered2,
allowance: 0,
interval: EntInterval.Lifetime,
}),
},
prices: [
initPrice({
type: "monthly",
}),
initPrice({
type: "in_advance",
billingInterval: BillingInterval.OneOff,
feature: features.metered1,
amount: 100,
}),
initPrice({
type: "in_advance",
billingInterval: BillingInterval.OneOff,
feature: features.metered2,
amount: 200,
}),
],
freeTrial: null,
}),
freeAddOn: initProduct({
id: "freeAddOn",
entitlements: {
metered1: initEntitlement({
feature: features.metered1,
allowance: 100,
interval: EntInterval.Lifetime,
}),
},
prices: [],
freeTrial: null,
isAddOn: true,
}),
};
export const oneTimeProducts = {
oneTimeMetered1: initProduct({
id: "oneTimeMetered1",
entitlements: {
metered1: initEntitlement({
feature: features.metered1,
allowance: 500,
interval: EntInterval.Lifetime,
}),
},
prices: [
initPrice({
type: "monthly",
billingInterval: BillingInterval.OneOff,
feature: features.metered1,
amount: 100,
}),
],
freeTrial: null,
}),
oneTimeMetered2: initProduct({
id: "oneTimeMetered2",
entitlements: {
metered2: initEntitlement({
feature: features.metered2,
allowance: 0,
interval: EntInterval.Lifetime,
}),
},
prices: [
initPrice({
type: "in_advance",
billingInterval: BillingInterval.OneOff,
feature: features.metered2,
amount: 0.01,
}),
],
freeTrial: null,
}),
};
export const advanceProducts = {
// GPU SYSTEM
gpuSystemStarter: initProduct({
id: "gpu-system-starter",
entitlements: {
gpuCredits: initEntitlement({
allowance: 500,
feature: creditSystems.gpuCredits,
}),
},
prices: [
initPrice({
type: "monthly",
amount: 20,
}),
initPrice({
type: "in_arrears",
billingInterval: BillingInterval.Month,
feature: creditSystems.gpuCredits,
amount: 0.01,
oneTier: true,
billingUnits: 5,
}),
],
freeTrial: null,
}),
gpuSystemPro: initProduct({
id: "gpu-system-pro",
entitlements: {
gpuCredits: initEntitlement({
allowance: 5000,
feature: creditSystems.gpuCredits,
}),
},
prices: [
initPrice({
type: "monthly",
amount: 100,
}),
initPrice({
type: "in_arrears",
billingInterval: BillingInterval.Month,
feature: creditSystems.gpuCredits,
amount: 0.01,
oneTier: true,
billingUnits: 1,
}),
],
freeTrial: null,
}),
// Quarterly
gpuStarterQuarter: initProduct({
id: "gpuStarterQuarter",
entitlements: {
gpuCredits: initEntitlement({
allowance: 500,
feature: creditSystems.gpuCredits,
}),
},
prices: [
initPrice({
type: "monthly",
amount: 20,
billingInterval: BillingInterval.Quarter,
}),
initPrice({
type: "in_arrears",
billingInterval: BillingInterval.Month,
feature: creditSystems.gpuCredits,
amount: 0.01,
oneTier: true,
billingUnits: 5,
}),
],
freeTrial: null,
}),
gpuProQuarter: initProduct({
id: "gpuProQuarter",
entitlements: {
gpuCredits: initEntitlement({
allowance: 5000,
feature: creditSystems.gpuCredits,
}),
},
prices: [
initPrice({
type: "in_arrears",
billingInterval: BillingInterval.Month,
feature: creditSystems.gpuCredits,
amount: 0.01,
oneTier: true,
billingUnits: 1,
}),
initPrice({
type: "fixed_cycle",
amount: 1000,
billingInterval: BillingInterval.Quarter,
}),
],
freeTrial: null,
}),
gpuStarterAnnual: initProduct({
id: "gpu-starter-annual",
entitlements: {
gpuCredits: initEntitlement({
allowance: 500,
feature: creditSystems.gpuCredits,
}),
},
prices: [
initPrice({
type: "fixed_cycle",
amount: 200,
billingInterval: BillingInterval.Year,
}),
initPrice({
type: "in_arrears",
billingInterval: BillingInterval.Month,
feature: creditSystems.gpuCredits,
amount: 0.01,
oneTier: true,
billingUnits: 1,
}),
],
freeTrial: null,
}),
gpuProAnnual: initProduct({
id: "gpuProAnnual",
entitlements: {
gpuCredits: initEntitlement({
allowance: 5000,
feature: creditSystems.gpuCredits,
}),
},
prices: [
initPrice({
type: "in_arrears",
billingInterval: BillingInterval.Month,
feature: creditSystems.gpuCredits,
amount: 0.01,
oneTier: true,
billingUnits: 1,
}),
initPrice({
type: "fixed_cycle",
amount: 1000,
billingInterval: BillingInterval.Year,
}),
],
freeTrial: null,
}),
proratedArrearSeats: initProduct({
id: "prorated-arrear-seats",
entitlements: {
seats: initEntitlement({
feature: features.seats,
allowance: 3,
interval: EntInterval.Lifetime,
}),
},
prices: [
initPrice({
type: "monthly",
amount: 20,
}),
initPrice({
type: "in_arrear_prorated",
billingInterval: BillingInterval.Month,
feature: features.seats,
amount: 10,
oneTier: true,
billingUnits: 1,
}),
],
freeTrial: null,
}),
proratedArrearSeatsWithReset: initProduct({
id: "prorated-arrear-seats-with-reset",
entitlements: {
seats: initEntitlement({
feature: features.seats,
allowance: 3,
}),
},
prices: [
initPrice({
type: "monthly",
amount: 20,
}),
initPrice({
type: "in_arrear_prorated",
billingInterval: BillingInterval.Month,
feature: features.seats,
amount: 10,
oneTier: true,
billingUnits: 1,
}),
],
freeTrial: null,
}),
};
export const attachProducts = {
// 1. pro1Starter
starterGroup1: initProduct({
id: "starterGroup1",
group: "g1",
entitlements: {
metered1: initEntitlement({
feature: features.metered1,
interval: EntInterval.Month,
allowance: 10,
}),
},
prices: [
initPrice({
type: "monthly",
amount: 10,
}),
initPrice({
type: "in_arrears",
billingInterval: BillingInterval.Month,
feature: features.metered1,
amount: 0.5,
}),
],
freeTrial: null,
}),
proGroup1: initProduct({
id: "proGroup1",
group: "g1",
entitlements: {
metered1: initEntitlement({
feature: features.metered1,
interval: EntInterval.Month,
allowance: 10,
}),
},
prices: [
initPrice({
type: "monthly",
amount: 30,
}),
initPrice({
type: "in_arrears",
billingInterval: BillingInterval.Month,
feature: features.metered1,
amount: 1.0,
}),
],
freeTrial: null,
}),
premiumGroup1: initProduct({
id: "premiumGroup1",
group: "g1",
entitlements: {
metered1: initEntitlement({
feature: features.metered1,
interval: EntInterval.Month,
allowance: 100,
}),
},
prices: [
initPrice({
type: "monthly",
amount: 50,
}),
initPrice({
type: "in_arrears",
billingInterval: BillingInterval.Month,
feature: features.metered1,
amount: 2.0,
}),
],
freeTrial: null,
}),
// 2. pro2Starter
freeGroup2: initProduct({
id: "freeGroup2",
group: "g2",
entitlements: {
metered1: initEntitlement({
feature: features.metered2,
allowance: 10,
}),
},
prices: [],
freeTrial: null,
}),
starterGroup2: initProduct({
id: "starterGroup2",
group: "g2",
entitlements: {
metered1: initEntitlement({
feature: features.metered2,
interval: EntInterval.Month,
allowance: 10,
}),
},
prices: [
initPrice({
type: "monthly",
amount: 20,
}),
initPrice({
type: "in_arrears",
billingInterval: BillingInterval.Month,
feature: features.metered2,
amount: 0.3,
}),
],
freeTrial: null,
}),
proGroup2: initProduct({
id: "proGroup2",
group: "g2",
entitlements: {
metered1: initEntitlement({
feature: features.metered2,
interval: EntInterval.Month,
allowance: 10,
}),
},
prices: [
initPrice({
type: "monthly",
amount: 40,
}),
initPrice({
type: "in_arrears",
billingInterval: BillingInterval.Month,
feature: features.metered2,
amount: 0.6,
}),
],
freeTrial: null,
}),
premiumGroup2: initProduct({
id: "premiumGroup2",
group: "g2",
entitlements: {
metered1: initEntitlement({
feature: features.metered2,
interval: EntInterval.Month,
allowance: 10,
}),
},
prices: [
initPrice({
type: "monthly",
amount: 60,
}),
initPrice({
type: "in_arrears",
billingInterval: BillingInterval.Month,
feature: features.metered2,
amount: 0.9,
}),
],
freeTrial: null,
}),
};
// Entity products
export const entityProducts = {
entityFree: initProduct({
id: "entityFree",
entitlements: {
seats: initEntitlement({
feature: features.seats,
allowance: 1,
interval: EntInterval.Lifetime,
}),
},
prices: [],
freeTrial: null,
}),
entityPro: initProduct({
id: "entityPro",
entitlements: {
seats: initEntitlement({
feature: features.seats,
allowance: 0,
interval: EntInterval.Lifetime,
carryFromPrevious: true,
}),
metered1: initEntitlement({
feature: features.metered1,
allowance: 500,
interval: EntInterval.Month,
entityFeatureId: features.seats.id,
carryFromPrevious: true,
}),
},
prices: [
// initPrice({
// type: "monthly",
// amount: 10,
// }),
initPrice({
type: "in_arrear_prorated",
billingInterval: BillingInterval.Month,
feature: features.seats,
amount: 100,
oneTier: true,
billingUnits: 1,
// Carry over usage
}),
],
freeTrial: null,
}),
};
export const rewards = {
rolloverAll: initReward({
id: "rolloverAll",
type: RewardType.InvoiceCredits,
discountValue: 1000,
durationType: CouponDurationType.Forever,
applyToAll: true,
}),
rolloverUsage: initReward({
id: "rolloverUsage",
type: RewardType.InvoiceCredits,
discountValue: 1000,
durationType: CouponDurationType.Forever,
onlyUsagePrices: true,
productIds: [products.proWithOverage.id],
}),
monthOff: initReward({
id: "monthOff",
type: RewardType.PercentageDiscount,
discountValue: 100,
applyToAll: true,
durationType: CouponDurationType.Months,
durationValue: 1,
}),
freeProduct: initReward({
id: "freeProduct",
type: RewardType.FreeProduct,
freeProductId: products.freeAddOn.id,
}),
};
export const referralPrograms = {
onCheckout: initRewardProgram({
id: "onCheckout",
internalRewardId: rewards.monthOff.id,
when: RewardTriggerEvent.Checkout,
productIds: [products.pro.id, products.proWithTrial.id],
}),
immediate: initRewardProgram({
id: "immediate",
internalRewardId: rewards.monthOff.id,
when: RewardTriggerEvent.CustomerCreation,
}),
freeProduct: initRewardProgram({
id: "freeProduct",
internalRewardId: rewards.freeProduct.id,
when: RewardTriggerEvent.Checkout,
receivedBy: RewardReceivedBy.All,
productIds: [products.pro.id, products.proWithTrial.id],
}),
};
const ORG_SLUG = process.env.TESTS_ORG!;
before(async function () {
try {
this.env = AppEnv.Sandbox;
let { db, client } = initDrizzle();
this.db = db;
this.client = client;
this.org = await OrgService.getBySlug({
db: this.db,
slug: ORG_SLUG,
});
const dbFeatures = await FeatureService.list({
db: this.db,
orgId: this.org.id,
env: this.env,
});
const cleanFeatures = (features: Record<string, Feature>) => {
for (const featureId in features) {
let feature = features[featureId as keyof typeof features];
let dbFeature = dbFeatures.find((f: any) => f.id === feature.id);
if (!dbFeature) {
// throw new Error(`Feature ${feature.id} not found`);
continue;
}
features[featureId as keyof typeof features].internal_id =
dbFeature.internal_id;
if (feature.type === FeatureType.Metered) {
// Ignore this for now
// @ts-ignore eventName is manually set
features[featureId as keyof typeof features].eventName =
dbFeature.config?.filters[0].value[0];
}
}
};
cleanFeatures(features);
cleanFeatures(creditSystems);
} catch (error) {
console.error(error);
}
});
after(async function () {
await this.client?.end();
});