Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
101 changes: 101 additions & 0 deletions sdks/node/src/__tests__/SubscriptionItems.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
import { SubscriptionItems } from '../resources/SubscriptionItems';
import { HttpClient } from '../HttpClient';

describe('SubscriptionItems Resource', () => {
let client: jest.Mocked<HttpClient>;
let subscriptionItems: SubscriptionItems;

beforeEach(() => {
client = {
Get: jest.fn(),
Post: jest.fn(),
Delete: jest.fn(),
} as unknown as jest.Mocked<HttpClient>;
subscriptionItems = new SubscriptionItems(client);
});

afterEach(() => {
jest.clearAllMocks();
});

describe('create', () => {
it('should send a POST request to /subscription_items with params', async () => {
const params = {
subscription: 'sub_123',
price: 'price_123',
quantity: 2,
};

await subscriptionItems.create(params);

expect(client.Post).toHaveBeenCalledWith('/subscription_items', params);
});
});

describe('update', () => {
it('should send a POST request to /subscription_items/:id with params', async () => {
const params = {
quantity: 3,
};

await subscriptionItems.update('si_123', params);

expect(client.Post).toHaveBeenCalledWith(
'/subscription_items/si_123',
params
);
});
});

describe('retrieve', () => {
it('should send a GET request to /subscription_items/:id', async () => {
await subscriptionItems.retrieve('si_123');

expect(client.Get).toHaveBeenCalledWith('/subscription_items/si_123', {});
});

it('should pass expand params if provided', async () => {
await subscriptionItems.retrieve('si_123', { expand: ['price'] });

expect(client.Get).toHaveBeenCalledWith('/subscription_items/si_123', {
expand: ['price'],
});
});
});

describe('list', () => {
it('should send a GET request to /subscription_items with query params', async () => {
await subscriptionItems.list({
subscription: 'sub_123',
limit: 5,
starting_after: 'si_456',
});

expect(client.Get).toHaveBeenCalledWith('/subscription_items', {
subscription: 'sub_123',
limit: 5,
starting_after: 'si_456',
ending_before: undefined,
});
});
});

describe('del', () => {
it('should send a DELETE request to /subscription_items/:id', async () => {
await subscriptionItems.del('si_123');

expect(client.Delete).toHaveBeenCalledWith(
'/subscription_items/si_123',
{}
);
});

it('should send optional proration params if provided', async () => {
await subscriptionItems.del('si_123', { clear_usage: true });

expect(client.Delete).toHaveBeenCalledWith('/subscription_items/si_123', {
clear_usage: true,
});
});
});
});
111 changes: 111 additions & 0 deletions sdks/node/src/generated/Inputs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1711,6 +1711,48 @@ export type CreateSubscriptionInput = {
expand?: string[] | undefined;
};

export type CreateSubscriptionItemInput = {
subscription: string;
billing_thresholds?: '' | { usage_gte: number } | undefined;
discounts?:
| {
coupon?: string | undefined;
discount?: string | undefined;
promotion_code?: string | undefined;
}[]
| undefined;
metadata?: Record<string, string> | undefined;
payment_behavior?:
| 'allow_incomplete'
| 'default_incomplete'
| 'error_if_incomplete'
| 'pending_if_incomplete'
| undefined;
price?: string | undefined;
price_data?:
| {
currency: string;
product: string;
recurring: {
interval: 'hour' | 'day' | 'week' | 'month' | 'year';
interval_count?: number | undefined;
};
tax_behavior?: 'inclusive' | 'exclusive' | 'unspecified' | undefined;
unit_amount?: number | undefined;
unit_amount_decimal?: string | undefined;
}
| undefined;
proration_behavior?:
| 'none'
| 'create_prorations'
| 'always_invoice'
| undefined;
proration_date?: number | undefined;
quantity?: number | undefined;
tax_rates?: string[] | undefined;
expand?: string[] | undefined;
};

export type CreateTopUpInput = {
amount: number;
currency: string;
Expand Down Expand Up @@ -1741,6 +1783,22 @@ export type CreateWebhookEndpointInput = {
metadata?: Record<string, string> | undefined;
};

export type DeleteSubscriptionItemInput = {
clear_usage?: boolean | undefined;
payment_behavior?:
| 'allow_incomplete'
| 'default_incomplete'
| 'error_if_incomplete'
| 'pending_if_incomplete'
| undefined;
proration_behavior?:
| 'none'
| 'create_prorations'
| 'always_invoice'
| undefined;
proration_date?: number | undefined;
};

export type ExpireCheckoutSessionInput = Record<string, never>;

export type FinalizeInvoiceInput = {
Expand Down Expand Up @@ -2100,6 +2158,14 @@ export type ListProductsInput = {
expand?: string[] | undefined;
};

export type ListSubscriptionItemsInput = {
subscription: string;
ending_before?: string | undefined;
limit?: number | undefined;
starting_after?: string | undefined;
expand?: string[] | undefined;
};

export type ListSubscriptionsInput = {
automatic_tax?: { enabled: boolean } | undefined;
collection_method?: 'charge_automatically' | 'send_invoice' | undefined;
Expand Down Expand Up @@ -2250,6 +2316,8 @@ export type RetrieveProductInput = { expand?: string[] | undefined };

export type RetrieveSubscriptionInput = { expand?: string[] | undefined };

export type RetrieveSubscriptionItemInput = { expand?: string[] | undefined };

export type RunBillingForPlatformInput = { batch_size?: number | undefined };

export type UpdateAccountInput = {
Expand Down Expand Up @@ -3418,6 +3486,49 @@ export type UpdateSubscriptionInput = {
expand?: string[] | undefined;
};

export type UpdateSubscriptionItemInput = {
billing_thresholds?: '' | { usage_gte: number } | undefined;
discounts?:
| ''
| {
coupon?: string | undefined;
discount?: string | undefined;
promotion_code?: string | undefined;
}[]
| undefined;
metadata?: Record<string, string> | undefined;
off_session?: boolean | undefined;
payment_behavior?:
| 'allow_incomplete'
| 'default_incomplete'
| 'error_if_incomplete'
| 'pending_if_incomplete'
| undefined;
price?: string | undefined;
price_data?:
| {
currency: string;
product: string;
recurring: {
interval: 'hour' | 'day' | 'week' | 'month' | 'year';
interval_count?: number | undefined;
};
tax_behavior?: 'inclusive' | 'exclusive' | 'unspecified' | undefined;
unit_amount?: number | undefined;
unit_amount_decimal?: string | undefined;
}
| undefined;
proration_behavior?:
| 'none'
| 'create_prorations'
| 'always_invoice'
| undefined;
proration_date?: number | undefined;
quantity?: number | undefined;
tax_rates?: '' | string[] | undefined;
expand?: string[] | undefined;
};

export type UpdateTopUpInput = {
description?: string | undefined;
metadata?: Record<string, string> | undefined;
Expand Down
5 changes: 5 additions & 0 deletions sdks/node/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import { Payouts } from './resources/Payouts';
import { Prices } from './resources/Prices';
import { Products } from './resources/Products';
import { Subscriptions } from './resources/Subscriptions';
import { SubscriptionItems } from './resources/SubscriptionItems';
import { TopUps } from './resources/TopUps';
import { Transfers } from './resources/Transfers';
import { WebhookEndpoints } from './resources/WebhookEndpoints';
Expand Down Expand Up @@ -109,6 +110,9 @@ export class Zoneless {
/** Subscriptions API resource */
readonly subscriptions: Subscriptions;

/** SubscriptionItems API resource */
readonly subscriptionItems: SubscriptionItems;

/** TopUps API resource */
readonly topups: TopUps;

Expand Down Expand Up @@ -162,6 +166,7 @@ export class Zoneless {
this.prices = new Prices(this.client);
this.products = new Products(this.client);
this.subscriptions = new Subscriptions(this.client);
this.subscriptionItems = new SubscriptionItems(this.client);
this.topups = new TopUps(this.client);
this.transfers = new Transfers(this.client);
this.webhookEndpoints = new WebhookEndpoints(this.client);
Expand Down
80 changes: 80 additions & 0 deletions sdks/node/src/resources/SubscriptionItems.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
import { BaseResource } from './Base';
import {
SubscriptionItem,
SubscriptionItemDeleted,
ListResponse,
} from '@zoneless/shared-types';
import type {
CreateSubscriptionItemInput,
ListSubscriptionItemsInput,
RetrieveSubscriptionItemInput,
UpdateSubscriptionItemInput,
DeleteSubscriptionItemInput,
} from '../generated/Inputs';

/**
* @see https://zoneless.com/docs/subscriptionitems
*/
export class SubscriptionItems extends BaseResource {
/** @see https://zoneless.com/docs/subscriptionitems/create */
async create(params: CreateSubscriptionItemInput): Promise<SubscriptionItem> {
return this.client.Post<SubscriptionItem>('/subscription_items', params);
}

/** @see https://zoneless.com/docs/subscriptionitems/update */
async update(
id: string,
params: UpdateSubscriptionItemInput
): Promise<SubscriptionItem> {
return this.client.Post<SubscriptionItem>(
`/subscription_items/${id}`,
params
);
}

/** @see https://zoneless.com/docs/subscriptionitems/retrieve */
async retrieve(
id: string,
params: RetrieveSubscriptionItemInput = {}
): Promise<SubscriptionItem> {
return this.client.Get<SubscriptionItem>(
`/subscription_items/${id}`,
params
);
}

/** @see https://zoneless.com/docs/subscriptionitems/list */
async list(
params: ListSubscriptionItemsInput
): Promise<ListResponse<SubscriptionItem>> {
return this.client.Get<ListResponse<SubscriptionItem>>(
'/subscription_items',
this.BuildQuery(params)
);
}

/**
* Deletes a subscription item.
* @see https://zoneless.com/docs/subscriptionitems/delete
*/
async del(
id: string,
params: DeleteSubscriptionItemInput = {}
): Promise<SubscriptionItemDeleted> {
return this.client.Delete<SubscriptionItemDeleted>(
`/subscription_items/${id}`,
params
);
}

private BuildQuery(
params: ListSubscriptionItemsInput
): Record<string, string | number | boolean | undefined> {
return {
subscription: params.subscription,
limit: params.limit,
starting_after: params.starting_after,
ending_before: params.ending_before,
};
}
}
1 change: 1 addition & 0 deletions sdks/node/src/resources/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ export { Products } from './Products';
export { Checkout } from './Checkout';
export { CheckoutSessions } from './CheckoutSessions';
export { Subscriptions } from './Subscriptions';
export { SubscriptionItems } from './SubscriptionItems';
export { TopUps } from './TopUps';
export { Transfers } from './Transfers';
export { WebhookEndpoints } from './WebhookEndpoints';
Expand Down
Loading