woocommerce-paypal-payments/tests/playwright/subscriptions-api.spec.js
2023-05-29 17:14:27 +03:00

311 lines
11 KiB
JavaScript

const {test, expect} = require('@playwright/test');
const {loginAsAdmin, loginAsCustomer} = require('./utils/user');
const {openPaypalPopup, loginIntoPaypal, completePaypalPayment} = require("./utils/paypal-popup");
const {fillCheckoutForm, expectOrderReceivedPage} = require("./utils/checkout");
const {
AUTHORIZATION,
SUBSCRIPTION_URL,
CHECKOUT_URL,
CART_URL,
} = process.env;
async function purchaseSubscriptionFromCart(page) {
await loginAsCustomer(page);
await page.goto(SUBSCRIPTION_URL);
await page.click("text=Sign up now");
await page.goto(CART_URL);
const popup = await openPaypalPopup(page);
await loginIntoPaypal(popup);
await popup.getByText('Continue', { exact: true }).click();
await popup.locator('#confirmButtonTop').click();
await fillCheckoutForm(page);
await Promise.all([
page.waitForNavigation(),
page.locator('text=Sign up now').click(),
]);
await expectOrderReceivedPage(page);
}
test.describe.serial('Subscriptions Merchant', () => {
const productTitle = (Math.random() + 1).toString(36).substring(7);
const planName = (Math.random() + 1).toString(36).substring(7);
let product_id = '';
let plan_id = '';
test('Create new subscription product', async ({page, request}) => {
await loginAsAdmin(page);
await page.goto('/wp-admin/post-new.php?post_type=product');
await page.fill('#title', productTitle);
await page.selectOption('select#product-type', 'subscription');
await page.fill('#_subscription_price', '10');
await page.locator('#ppcp_enable_subscription_product').check();
await page.fill('#ppcp_subscription_plan_name', planName);
await Promise.all([
page.waitForNavigation(),
page.locator('#publish').click(),
]);
const message = await page.locator('.notice-success');
await expect(message).toContainText('Product published.');
const products = await request.get('https://api.sandbox.paypal.com/v1/catalogs/products?page_size=100&page=1&total_required=true', {
headers: {
'Authorization': AUTHORIZATION,
'Content-Type': 'application/json'
}
});
expect(products.ok()).toBeTruthy();
const productList = await products.json();
const product = productList.products.find((p) => {
return p.name === productTitle;
});
await expect(product.id).toBeTruthy;
product_id = product.id;
const plans = await request.get(`https://api.sandbox.paypal.com/v1/billing/plans?product_id=${product_id}&page_size=10&page=1&total_required=true`, {
headers: {
'Authorization': AUTHORIZATION,
'Content-Type': 'application/json'
}
});
expect(plans.ok()).toBeTruthy();
const planList = await plans.json();
const plan = planList.plans.find((p) => {
return p.product_id === product.id;
});
await expect(plan.id).toBeTruthy;
plan_id = plan.id;
});
test('Update subscription product', async ({page, request}) => {
await loginAsAdmin(page);
await page.goto('/wp-admin/edit.php?post_type=product');
await page.getByRole('link', { name: productTitle, exact: true }).click();
await page.fill('#title', `Updated ${productTitle}`);
await page.fill('#_subscription_price', '20');
await Promise.all([
page.waitForNavigation(),
page.locator('#publish').click(),
]);
const message = await page.locator('.notice-success');
await expect(message).toContainText('Product updated.');
const products = await request.get('https://api.sandbox.paypal.com/v1/catalogs/products?page_size=100&page=1&total_required=true', {
headers: {
'Authorization': AUTHORIZATION,
'Content-Type': 'application/json'
}
});
expect(products.ok()).toBeTruthy();
const productList = await products.json();
const product = productList.products.find((p) => {
return p.name === `Updated ${productTitle}`;
});
await expect(product.id).toBeTruthy;
const plan = await request.get(`https://api.sandbox.paypal.com/v1/billing/plans/${plan_id}`, {
headers: {
'Authorization': AUTHORIZATION,
'Content-Type': 'application/json'
}
});
expect(plan.ok()).toBeTruthy();
const plan_content = await plan.json();
await expect(plan_content.billing_cycles[0].pricing_scheme.fixed_price.value).toBe('20.0')
});
});
test('Create new free trial subscription product', async ({page, request}) => {
const productTitle = (Math.random() + 1).toString(36).substring(7);
const planName = (Math.random() + 1).toString(36).substring(7);
await loginAsAdmin(page);
await page.goto('/wp-admin/post-new.php?post_type=product');
await page.fill('#title', productTitle);
await page.selectOption('select#product-type', 'subscription');
await page.fill('#_subscription_price', '42');
await page.fill('#_subscription_trial_length', '15');
await page.locator('#ppcp_enable_subscription_product').check();
await page.fill('#ppcp_subscription_plan_name', planName);
await Promise.all([
page.waitForNavigation(),
page.locator('#publish').click(),
]);
const message = await page.locator('.notice-success');
await expect(message).toContainText('Product published.');
const products = await request.get('https://api.sandbox.paypal.com/v1/catalogs/products?page_size=100&page=1&total_required=true', {
headers: {
'Authorization': AUTHORIZATION,
'Content-Type': 'application/json'
}
});
expect(products.ok()).toBeTruthy();
const productList = await products.json();
const product = productList.products.find((p) => {
return p.name === productTitle;
});
await expect(product.id).toBeTruthy;
const plans = await request.get(`https://api.sandbox.paypal.com/v1/billing/plans?product_id=${product.id}&page_size=10&page=1&total_required=true`, {
headers: {
'Authorization': AUTHORIZATION,
'Content-Type': 'application/json'
}
});
expect(plans.ok()).toBeTruthy();
const planList = await plans.json();
const plan = planList.plans.find((p) => {
return p.product_id === product.id;
});
await expect(plan.id).toBeTruthy;
const planDetail = await request.get(`https://api.sandbox.paypal.com/v1/billing/plans/${plan.id}`, {
headers: {
'Authorization': AUTHORIZATION,
'Content-Type': 'application/json'
}
});
expect(planDetail.ok()).toBeTruthy();
const planDetailContent = await planDetail.json();
await expect(planDetailContent.billing_cycles[0].tenure_type).toBe('TRIAL');
await expect(planDetailContent.billing_cycles[0].pricing_scheme.fixed_price.value).toBe('0.0');
await expect(planDetailContent.billing_cycles[1].tenure_type).toBe('REGULAR');
await expect(planDetailContent.billing_cycles[1].pricing_scheme.fixed_price.value).toBe('42.0');
});
test.describe('Subscriber purchase a Subscription', () => {
test('Purchase Subscription from Checkout Page', async ({page}) => {
await loginAsCustomer(page);
await page.goto(SUBSCRIPTION_URL);
await page.click("text=Sign up now");
await page.goto(CHECKOUT_URL);
await fillCheckoutForm(page);
const popup = await openPaypalPopup(page);
await loginIntoPaypal(popup);
await popup.getByText('Continue', { exact: true }).click();
await Promise.all([
page.waitForNavigation(),
await popup.locator('text=Agree & Subscribe').click(),
]);
await expectOrderReceivedPage(page);
});
test('Purchase Subscription from Single Product Page', async ({page}) => {
await loginAsCustomer(page);
await page.goto(SUBSCRIPTION_URL);
const popup = await openPaypalPopup(page);
await loginIntoPaypal(popup);
await popup.getByText('Continue', { exact: true }).click();
await popup.locator('#confirmButtonTop').click();
await fillCheckoutForm(page);
await Promise.all([
page.waitForNavigation(),
page.locator('text=Sign up now').click(),
]);
await expectOrderReceivedPage(page);
});
test('Purchase Subscription from Cart Page', async ({page}) => {
await purchaseSubscriptionFromCart(page);
});
});
test.describe('Subscriber my account actions', () => {
test('Subscriber Suspend Subscription', async ({page, request}) => {
await purchaseSubscriptionFromCart(page);
await page.goto('/my-account/subscriptions');
await page.locator('text=View').first().click();
const subscriptionId = await page.locator('#ppcp-subscription-id').textContent();
let subscription = await request.get(`https://api.sandbox.paypal.com/v1/billing/subscriptions/${subscriptionId}`, {
headers: {
'Authorization': AUTHORIZATION,
'Content-Type': 'application/json'
}
});
expect(subscription.ok()).toBeTruthy();
let details = await subscription.json();
await expect(details.status).toBe('ACTIVE');
await page.locator('text=Suspend').click();
const title = page.locator('.woocommerce-message');
await expect(title).toHaveText('Your subscription has been cancelled.');
subscription = await request.get(`https://api.sandbox.paypal.com/v1/billing/subscriptions/${subscriptionId}`, {
headers: {
'Authorization': AUTHORIZATION,
'Content-Type': 'application/json'
}
});
expect(subscription.ok()).toBeTruthy();
details = await subscription.json();
await expect(details.status).toBe('SUSPENDED');
});
test('Subscriber Cancel Subscription', async ({page, request}) => {
await purchaseSubscriptionFromCart(page);
await page.goto('/my-account/subscriptions');
await page.locator('text=View').first().click();
const subscriptionId = await page.locator('#ppcp-subscription-id').textContent();
let subscription = await request.get(`https://api.sandbox.paypal.com/v1/billing/subscriptions/${subscriptionId}`, {
headers: {
'Authorization': AUTHORIZATION,
'Content-Type': 'application/json'
}
});
expect(subscription.ok()).toBeTruthy();
let details = await subscription.json();
await expect(details.status).toBe('ACTIVE');
await page.locator('text=Cancel').click();
const title = page.locator('.woocommerce-message');
await expect(title).toHaveText('Your subscription has been cancelled.');
subscription = await request.get(`https://api.sandbox.paypal.com/v1/billing/subscriptions/${subscriptionId}`, {
headers: {
'Authorization': AUTHORIZATION,
'Content-Type': 'application/json'
}
});
expect(subscription.ok()).toBeTruthy();
details = await subscription.json();
await expect(details.status).toBe('CANCELLED');
});
}) ;