mirror of
https://github.com/woocommerce/woocommerce-paypal-payments.git
synced 2025-09-01 07:02:48 +08:00
311 lines
11 KiB
JavaScript
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');
|
|
});
|
|
}) ;
|