lint
This commit is contained in:
parent
e05821d6d7
commit
84079450f9
|
@ -99,15 +99,11 @@ export default class LicenseAPI extends BaseAPI {
|
||||||
}, opts)
|
}, opts)
|
||||||
}
|
}
|
||||||
|
|
||||||
async updatePlan(
|
async updatePlan(priceId: string, opts: APIRequestOpts = { status: 200 }) {
|
||||||
priceId: string,
|
|
||||||
opts: APIRequestOpts = { status: 200 }
|
|
||||||
) {
|
|
||||||
return this.doRequest(() => {
|
return this.doRequest(() => {
|
||||||
return this.client.put(`/api/license/plan`,
|
return this.client.put(`/api/license/plan`, {
|
||||||
{
|
body: { priceId },
|
||||||
body: { priceId },
|
})
|
||||||
})
|
|
||||||
}, opts)
|
}, opts)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -39,14 +39,15 @@ export default class StripeAPI extends BaseAPI {
|
||||||
}
|
}
|
||||||
|
|
||||||
async linkStripeCustomer(
|
async linkStripeCustomer(
|
||||||
accountId: string,
|
accountId: string,
|
||||||
stripeCustomerId: string,
|
stripeCustomerId: string,
|
||||||
opts: APIRequestOpts = { status: 200 }) {
|
opts: APIRequestOpts = { status: 200 }
|
||||||
|
) {
|
||||||
return this.doRequest(() => {
|
return this.doRequest(() => {
|
||||||
return this.client.post(`/api/stripe/link`, {
|
return this.client.post(`/api/stripe/link`, {
|
||||||
body: {
|
body: {
|
||||||
accountId,
|
accountId,
|
||||||
stripeCustomerId
|
stripeCustomerId,
|
||||||
},
|
},
|
||||||
internal: true,
|
internal: true,
|
||||||
})
|
})
|
||||||
|
|
|
@ -1,113 +1,114 @@
|
||||||
import TestConfiguration from "../../config/TestConfiguration"
|
import TestConfiguration from "../../config/TestConfiguration"
|
||||||
import * as fixtures from "../../fixtures"
|
import * as fixtures from "../../fixtures"
|
||||||
import {Hosting, PlanType} from "@budibase/types"
|
import { Hosting, PlanType } from "@budibase/types"
|
||||||
|
|
||||||
describe("license management", () => {
|
describe("license management", () => {
|
||||||
const config = new TestConfiguration()
|
const config = new TestConfiguration()
|
||||||
|
|
||||||
beforeAll(async () => {
|
beforeAll(async () => {
|
||||||
await config.beforeAll()
|
await config.beforeAll()
|
||||||
|
})
|
||||||
|
|
||||||
|
afterAll(async () => {
|
||||||
|
await config.afterAll()
|
||||||
|
})
|
||||||
|
|
||||||
|
it("retrieves plans, creates checkout session, and updates license", async () => {
|
||||||
|
// Create cloud account
|
||||||
|
const createAccountRequest = fixtures.accounts.generateAccount({
|
||||||
|
hosting: Hosting.CLOUD,
|
||||||
|
})
|
||||||
|
const [createAccountRes, account] =
|
||||||
|
await config.accountsApi.accounts.create(createAccountRequest, {
|
||||||
|
autoVerify: true,
|
||||||
|
})
|
||||||
|
|
||||||
|
// Self response has free license
|
||||||
|
await config.doInNewState(async () => {
|
||||||
|
await config.loginAsAccount(createAccountRequest)
|
||||||
|
const [selfRes, selfBody] = await config.api.accounts.self()
|
||||||
|
expect(selfBody.license.plan.type).toBe(PlanType.FREE)
|
||||||
})
|
})
|
||||||
|
|
||||||
afterAll(async () => {
|
// Retrieve plans
|
||||||
await config.afterAll()
|
const [plansRes, planBody] = await config.api.licenses.getPlans()
|
||||||
|
|
||||||
|
// Select priceId from premium plan
|
||||||
|
let premiumPriceId = null
|
||||||
|
let businessPriceId = ""
|
||||||
|
for (const plan of planBody) {
|
||||||
|
if (plan.type === PlanType.PREMIUM) {
|
||||||
|
premiumPriceId = plan.prices[0].priceId
|
||||||
|
}
|
||||||
|
if (plan.type === PlanType.BUSINESS) {
|
||||||
|
businessPriceId = plan.prices[0].priceId
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create checkout session for price
|
||||||
|
const checkoutSessionRes = await config.api.stripe.createCheckoutSession(
|
||||||
|
premiumPriceId
|
||||||
|
)
|
||||||
|
const checkoutSessionUrl = checkoutSessionRes[1].url
|
||||||
|
expect(checkoutSessionUrl).toContain("checkout.stripe.com")
|
||||||
|
|
||||||
|
// Create stripe customer
|
||||||
|
const stripe = require("stripe")(process.env.STRIPE_SECRET_KEY)
|
||||||
|
const customer = await stripe.customers.create({
|
||||||
|
email: createAccountRequest.email,
|
||||||
})
|
})
|
||||||
|
|
||||||
it("retrieves plans, creates checkout session, and updates license", async () => {
|
// Create payment method
|
||||||
// Create cloud account
|
const paymentMethod = await stripe.paymentMethods.create({
|
||||||
const createAccountRequest = fixtures.accounts.generateAccount({
|
type: "card",
|
||||||
hosting: Hosting.CLOUD,
|
card: {
|
||||||
})
|
token: "tok_visa", // Test Visa Card
|
||||||
const [createAccountRes, account] =
|
},
|
||||||
await config.accountsApi.accounts.create(createAccountRequest, {
|
|
||||||
autoVerify: true,
|
|
||||||
})
|
|
||||||
|
|
||||||
// Self response has free license
|
|
||||||
await config.doInNewState(async () => {
|
|
||||||
await config.loginAsAccount(createAccountRequest)
|
|
||||||
const [selfRes, selfBody] = await config.api.accounts.self()
|
|
||||||
expect(selfBody.license.plan.type).toBe(PlanType.FREE)
|
|
||||||
})
|
|
||||||
|
|
||||||
// Retrieve plans
|
|
||||||
const [plansRes, planBody] = await config.api.licenses.getPlans()
|
|
||||||
|
|
||||||
// Select priceId from premium plan
|
|
||||||
let premiumPriceId = null
|
|
||||||
let businessPriceId = ''
|
|
||||||
for (const plan of planBody) {
|
|
||||||
if (plan.type === PlanType.PREMIUM) {
|
|
||||||
premiumPriceId = plan.prices[0].priceId
|
|
||||||
}
|
|
||||||
if (plan.type === PlanType.BUSINESS) {
|
|
||||||
businessPriceId = plan.prices[0].priceId
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create checkout session for price
|
|
||||||
const checkoutSessionRes = await config.api.stripe.createCheckoutSession(
|
|
||||||
premiumPriceId
|
|
||||||
)
|
|
||||||
const checkoutSessionUrl = checkoutSessionRes[1].url
|
|
||||||
expect(checkoutSessionUrl).toContain("checkout.stripe.com")
|
|
||||||
|
|
||||||
// Create stripe customer
|
|
||||||
const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY)
|
|
||||||
const customer = await stripe.customers.create({
|
|
||||||
email: createAccountRequest.email
|
|
||||||
})
|
|
||||||
|
|
||||||
// Create payment method
|
|
||||||
const paymentMethod = await stripe.paymentMethods.create({
|
|
||||||
type: 'card',
|
|
||||||
card: {
|
|
||||||
token: 'tok_visa' // Test Visa Card
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
// Attach payment method to customer
|
|
||||||
await stripe.paymentMethods.attach(paymentMethod.id, {
|
|
||||||
customer: customer.id,
|
|
||||||
})
|
|
||||||
|
|
||||||
// Update customer
|
|
||||||
await stripe.customers.update(customer.id, {
|
|
||||||
invoice_settings: {
|
|
||||||
default_payment_method: paymentMethod.id,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
// Create subscription for premium plan
|
|
||||||
const subscription = await stripe.subscriptions.create({
|
|
||||||
customer: customer.id,
|
|
||||||
items: [
|
|
||||||
{
|
|
||||||
price: premiumPriceId,
|
|
||||||
quantity: 1,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
default_payment_method: paymentMethod.id,
|
|
||||||
collection_method: 'charge_automatically',
|
|
||||||
})
|
|
||||||
|
|
||||||
await config.doInNewState(async () => {
|
|
||||||
// License updated from Free to Premium
|
|
||||||
await config.loginAsAccount(createAccountRequest)
|
|
||||||
await config.api.stripe.linkStripeCustomer(account.accountId, customer.id)
|
|
||||||
const [_, selfBodyPremium] = await config.api.accounts.self()
|
|
||||||
expect(selfBodyPremium.license.plan.type).toBe(PlanType.PREMIUM)
|
|
||||||
|
|
||||||
// Create portal session - Check URL
|
|
||||||
const [portalRes, portalSessionBody] = await config.api.stripe.createPortalSession(customer.id)
|
|
||||||
expect(portalSessionBody.url).toContain("billing.stripe.com")
|
|
||||||
|
|
||||||
// Update subscription from premium to business license
|
|
||||||
await config.api.licenses.updatePlan(businessPriceId)
|
|
||||||
|
|
||||||
// License updated to Business
|
|
||||||
const [selfRes, selfBodyBusiness] = await config.api.accounts.self()
|
|
||||||
expect(selfBodyBusiness.license.plan.type).toBe(PlanType.BUSINESS)
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// Attach payment method to customer
|
||||||
|
await stripe.paymentMethods.attach(paymentMethod.id, {
|
||||||
|
customer: customer.id,
|
||||||
|
})
|
||||||
|
|
||||||
|
// Update customer
|
||||||
|
await stripe.customers.update(customer.id, {
|
||||||
|
invoice_settings: {
|
||||||
|
default_payment_method: paymentMethod.id,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
// Create subscription for premium plan
|
||||||
|
const subscription = await stripe.subscriptions.create({
|
||||||
|
customer: customer.id,
|
||||||
|
items: [
|
||||||
|
{
|
||||||
|
price: premiumPriceId,
|
||||||
|
quantity: 1,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
default_payment_method: paymentMethod.id,
|
||||||
|
collection_method: "charge_automatically",
|
||||||
|
})
|
||||||
|
|
||||||
|
await config.doInNewState(async () => {
|
||||||
|
// License updated from Free to Premium
|
||||||
|
await config.loginAsAccount(createAccountRequest)
|
||||||
|
await config.api.stripe.linkStripeCustomer(account.accountId, customer.id)
|
||||||
|
const [_, selfBodyPremium] = await config.api.accounts.self()
|
||||||
|
expect(selfBodyPremium.license.plan.type).toBe(PlanType.PREMIUM)
|
||||||
|
|
||||||
|
// Create portal session - Check URL
|
||||||
|
const [portalRes, portalSessionBody] =
|
||||||
|
await config.api.stripe.createPortalSession(customer.id)
|
||||||
|
expect(portalSessionBody.url).toContain("billing.stripe.com")
|
||||||
|
|
||||||
|
// Update subscription from premium to business license
|
||||||
|
await config.api.licenses.updatePlan(businessPriceId)
|
||||||
|
|
||||||
|
// License updated to Business
|
||||||
|
const [selfRes, selfBodyBusiness] = await config.api.accounts.self()
|
||||||
|
expect(selfBodyBusiness.license.plan.type).toBe(PlanType.BUSINESS)
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in New Issue