Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test: Add giftaid submit and update ERP tests #430

Merged
merged 2 commits into from
Jul 8, 2024
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
3 changes: 2 additions & 1 deletion playwright-staging/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
"uuid": "8.3.2"
},
"scripts": {
"test:sanity": "FORCE_COLOR=1 playwright test --grep '@sanity'"
"test:sanity": "FORCE_COLOR=1 playwright test --grep '@sanity'",
"test:regression": "FORCE_COLOR=1 playwright test --grep '@regression'"
}
}
100 changes: 100 additions & 0 deletions playwright-staging/tests/submit/erp.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
// @ts-check
const { expect } = require('@playwright/test');
const { test } = require('../../browserstack');
const { Commands } = require('../utils/commands');
const { ErpNextTester } = require('@comicrelief/test-utils/ErpNextTester');
const Chance = require('chance');
const chance = new Chance();

const erpTester = new ErpNextTester(
process.env.ERP_HOST,
process.env.ERP_API_KEY,
process.env.ERP_API_SECRET,
);

test('Verify giftaid submit ERP data @regression', async ({ page }) => {
const commands = new Commands(page);
const rndmString = await commands.randomString();

const contactInfo = {
mobile: chance.phone({ country: 'uk', mobile: true }).replace(/\s/g, ''), // Remove spaces from the phone number
firstName: `test${rndmString}`,
lastName: chance.last(),
email: `giftaid-staging-${chance.email()}`,
postcode: chance.postcode(),
address1: chance.address(),
address2: chance.street(),
address3: 'test address 3',
town: chance.city()
};

// Navigate to the giftaid page
await page.goto(process.env.BASE_URL, { timeout: 30000 });
await page.waitForLoadState('domcontentloaded');

// Click the Giftaid checkbox
await page.click('#field-label--giftaid');

// Populate all the form fields with valid inputs
await commands.populateFormFields(page, contactInfo);

// Select marketing preferences as required
await commands.selectMarketingPrefs(page);

// Submit the form and wait for the navigation to ensure the submission goes through
await Promise.all([
page.waitForNavigation(), // This ensures that the navigation happens before the check
page.click('button[type=submit]')
]);

// Check for the thank you message to confirm successful submission
await expect(page.locator('div.success-wrapper--inner h1')).toHaveText(`Thank you, ${contactInfo.firstName}!`);

// ERP Steps
const giftaidSubmit = await erpTester.findOne('Gift Aid Declaration', {
filters: [
{
field: 'first_name',
value: contactInfo.firstName
}
]
}, 60, 10000);

console.log('Fetching Giftaid submit data from ERP');
expect(giftaidSubmit.first_name).toEqual(contactInfo.firstName);
expect(giftaidSubmit.last_name).toEqual(contactInfo.lastName);
expect(giftaidSubmit.can_claim_giftaid).toEqual(1);
expect(giftaidSubmit.source).toEqual('Giftaid Submit');

// Supporter ID
const supporterUUID = giftaidSubmit.supporter_uuid;

console.log('Fetching supporter from ERP');
const supporter = await erpTester.get('Supporter', supporterUUID, 30, 10000);

console.log('Fetching supporter data from ERP');
expect(supporter.first_name).toEqual(contactInfo.firstName);
expect(supporter.last_name).toEqual(contactInfo.lastName);

// Fetch supporter's phone number
expect(supporter.phone[0].type).toEqual('Mobile');
expect(supporter.phone[0].number).toEqual(contactInfo.mobile.replace(/^[07]{1}/, '+44'));

// Get supporter's postal ID
const getPostalID = supporter.giftaid_declarations[0];
const postalID = getPostalID.postal_id;
console.log('postalID', postalID);

// Fetch supporter's postal data
console.log('Fetching postal data from ERP');
const postal = await erpTester.get('Postal', postalID, 30, 10000);
expect(postal.name).toEqual(postalID);
expect(postal.line_1).toEqual(contactInfo.address1);
expect(postal.line_2).toEqual(contactInfo.address2);
expect(postal.line_3).toEqual(contactInfo.address3);
expect(postal.post_code).toEqual(contactInfo.postcode);
expect(postal.town).toEqual(contactInfo.town);
expect(postal.country).toEqual('GB');

await page.close();
});
2 changes: 1 addition & 1 deletion playwright-staging/tests/submit/formValidation.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,6 @@ test.describe('Form validation @sanity @nightly-sanity', () => {
await page.locator('#field-input--lastname').fill('');
await commands.populateFormFields(page);
await page.locator('button[type=submit]').click();
await expect(page.locator('div > h1')).toHaveText('Thank you, test!');
await expect(page.locator('div.success-wrapper--inner h1')).toHaveText('Thank you, test!');
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ test.describe('International addresses validation @sanity @nightly-sanity', () =
// Submit the form and ensure no errors are shown for international address
await commands.selectMarketingPrefs(page); // Assuming this handles checkbox interactions
await page.click('button[type=submit]');
await expect(page.locator('div > h1')).toContainText('Thank you, test!');
await expect(page.locator('div.success-wrapper--inner h1')).toContainText('Thank you, test!');

await page.close();
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ test('Verify giftaid marketing preferences data in contact-store @sanity @nightl
await page.locator('button[type=submit]').click();

// Verify success message
await expect(page.locator('div > h1')).toHaveText(`Thank you, ${firstName}!`);
await expect(page.locator('div.success-wrapper--inner h1')).toHaveText(`Thank you, ${firstName}!`);

// Retrieve and verify marketing preferences data
const mpData = await MarketingPrefsVerify.get(email);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ const { Commands } = require('../utils/commands');
const Chance = require('chance');
const chance = new Chance();

const email = `giftaid-staging-${Date.now().toString()}@email.sls.comicrelief.com`;
const email = `giftaid-update-staging-${chance.email()}`;
const phone = chance.phone({ country: 'uk', mobile: false }).replace(/\s/g, '');

test.describe('Marketing preferences validation @sanity @nightly-sanity', () => {
Expand Down Expand Up @@ -35,7 +35,7 @@ test.describe('Marketing preferences validation @sanity @nightly-sanity', () =>

// Submit the form
await page.click('button[type=submit]');
await expect(page.locator('div > h1')).toHaveText('Thank you, test!');
await expect(page.locator('div.success-wrapper--inner h1')).toHaveText('Thank you, test!');
});

test('Validate email marketing preference field', async ({ page }) => {
Expand All @@ -53,7 +53,7 @@ test.describe('Marketing preferences validation @sanity @nightly-sanity', () =>
// Re-enter valid email and submit
await page.fill('input#field-input--email', email);
await page.click('button[type=submit]');
await expect(page.locator('div > h1')).toHaveText('Thank you, test!');
await expect(page.locator('div.success-wrapper--inner h1')).toHaveText('Thank you, test!');
});

test('Validate phone marketing preference field', async ({ page }) => {
Expand All @@ -71,6 +71,6 @@ test.describe('Marketing preferences validation @sanity @nightly-sanity', () =>
// Re-enter valid phone number and submit
await page.fill('input#field-input--phone', phone);
await page.click('button[type=submit]');
await expect(page.locator('div > h1')).toHaveText('Thank you, test!');
await expect(page.locator('div.success-wrapper--inner h1')).toHaveText('Thank you, test!');
});
});
2 changes: 1 addition & 1 deletion playwright-staging/tests/submit/postcodeLookup.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ test.describe('Postcode validation @sanity @nightly-sanity', () => {
}

await page.click('button[type=submit]');
await expect(page.locator('div > h1')).toContainText('Thank you,\n' + 'test!');
await expect(page.locator('div.success-wrapper--inner h1')).toContainText('Thank you,\n' + 'test!');

await page.close();
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ test('Valid giftaid submission @sanity @nightly-sanity', async ({ page }) => {
]);

// Check for the thank you message to confirm successful submission
await expect(page.locator('div > h1')).toHaveText('Thank you, test!');
await expect(page.locator('div.success-wrapper--inner h1')).toHaveText('Thank you, test!');

await page.close();
});
91 changes: 91 additions & 0 deletions playwright-staging/tests/update/erp.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
// @ts-check
const { expect } = require('@playwright/test');
const { test } = require('../../browserstack');
const { Commands } = require('../utils/commands');
const { ErpNextTester } = require('@comicrelief/test-utils/ErpNextTester');
const Chance = require('chance');
const chance = new Chance();

const erpTester = new ErpNextTester(
process.env.ERP_HOST,
process.env.ERP_API_KEY,
process.env.ERP_API_SECRET,
);

test('Verify giftaid update ERP data @regression', async ({ page }) => {
const commands = new Commands(page);
const rndmString = await commands.randomString();

const contactInfo = {
firstName: `testUpdate${chance.first()}`,
lastName: chance.last(),
email: `giftaid-update-staging-${chance.email()}`,
mobile: chance.phone({ country: 'uk', mobile: true }).replace(/\s/g, ''),
postcode: chance.postcode(),
address1: chance.address(),
address2: chance.street(),
address3: 'test address 3',
town: chance.city(),
};

// Navigate to the Giftaid update page
await page.goto(`${process.env.BASE_URL}update`, { timeout: 30000 });
await page.waitForLoadState('domcontentloaded');

// Populate all input fields with valid data
await commands.populateUpdateFormFields(page, contactInfo);

// Select 'Yes' for GiftAid declaration
await page.locator('#giftAidClaimChoice>div:nth-child(2)>label').click();

// Submit the form and validate the thank you message
await page.locator('button[type=submit]').click();
await expect(page.locator('div.success-wrapper--inner h1')).toContainText(`Thank you, ${contactInfo.firstName}!`);

// ERP Steps
const giftaidUpdate = await erpTester.findOne('Gift Aid Declaration', {
filters: [
{
field: 'first_name',
value: contactInfo.firstName
}
]
}, 60, 10000);

console.log('Fetching Giftaid submit data from ERP');
expect(giftaidUpdate.first_name).toEqual(contactInfo.firstName);
expect(giftaidUpdate.last_name).toEqual(contactInfo.lastName);
expect(giftaidUpdate.can_claim_giftaid).toEqual(1);
expect(giftaidUpdate.source).toEqual('Giftaid Update');

// Supporter ID
const supporterUUID = giftaidUpdate.supporter_uuid;

console.log('Fetching supporter from ERP');
const supporter = await erpTester.get('Supporter', supporterUUID, 30, 10000);

console.log('Fetching supporter data from ERP');
expect(supporter.first_name).toEqual(contactInfo.firstName);
expect(supporter.last_name).toEqual(contactInfo.lastName);
expect(supporter.giftaid_status).toEqual(1);
expect(supporter.email[0].email).toEqual(contactInfo.email);
expect(supporter.phone[0].number).toEqual(contactInfo.mobile.replace(/^[07]{1}/, '+44'));

// Get supporter's postal ID
const getPostalID = supporter.giftaid_declarations[0];
const postalID = getPostalID.postal_id;
console.log('postalID', postalID);

// Fetch supporter's postal data
console.log('Fetching postal data from ERP');
const postal = await erpTester.get('Postal', postalID, 30, 10000);
expect(postal.name).toEqual(postalID);
expect(postal.line_1).toEqual(contactInfo.address1);
expect(postal.line_2).toEqual(contactInfo.address2);
expect(postal.line_3).toEqual(contactInfo.address3);
expect(postal.post_code).toEqual(contactInfo.postcode);
expect(postal.town).toEqual(contactInfo.town);
expect(postal.country).toEqual('GB');

await page.close();
});
12 changes: 6 additions & 6 deletions playwright-staging/tests/update/formValidation.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ test.describe('Giftaid Update form validation @sanity @nightly-sanity', () => {
await page.click('#giftAidClaimChoice>div:nth-child(2)>label'); // Select yes for declaration
await page.click('button[type=submit]'); // Submit the form

await expect(page.locator('div > h1')).toHaveText('Thank you, John!');
await expect(page.locator('div.success-wrapper--inner h1')).toHaveText('Thank you, John!');
await page.close();
});

Expand Down Expand Up @@ -83,13 +83,13 @@ test.describe('Giftaid Update form validation @sanity @nightly-sanity', () => {
}

// Test for a valid email
const validEmail = '[email protected]';
const validEmail = `giftaid-update-staging-${chance.email()}`;
await page.fill('input#field-input--email', ''); // clear email field
await commands.populateUpdateFormFields(page, { email: validEmail });
await page.click('#giftAidClaimChoice>div:nth-child(3)>label'); // Select no for declaration
await page.click('button[type=submit]'); // Submit the form

await expect(page.locator('div > h1')).toHaveText('Thanks for letting us know');
await expect(page.locator('div.success-wrapper--inner h1')).toHaveText('Thanks for letting us know');
await page.close();
});

Expand Down Expand Up @@ -119,11 +119,11 @@ test.describe('Giftaid Update form validation @sanity @nightly-sanity', () => {

// Validate correct mobile number
await page.locator('#field-input--mobile').fill(''); // Ensure the field is cleared and filled with valid data
await commands.populateUpdateFormFields(page, { mobile: mobile });
await commands.populateUpdateFormFields(page, { lastName: 'test', mobile: mobile });
await page.click('#giftAidClaimChoice>div:nth-child(2)>label'); // Select yes for declaration
await page.click('button[type=submit]'); // Submit the form

await expect(page.locator('div > h1')).toHaveText('Thank you, test!');
await expect(page.locator('div.success-wrapper--inner h1')).toHaveText('Thank you, test!');
});

test('Postcode validation and form submission', async ({ page }) => {
Expand Down Expand Up @@ -170,7 +170,7 @@ test.describe('Giftaid Update form validation @sanity @nightly-sanity', () => {
await page.click('#giftAidClaimChoice>div:nth-child(2)>label'); // Select yes for declaration
await page.click('button[type=submit]'); // Submit the form

await expect(page.locator('div > h1')).toHaveText('Thank you, test!');
await expect(page.locator('div.success-wrapper--inner h1')).toHaveText('Thank you, test!');
await page.close();
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ test('Validate Giftaid declaration claim selections @sanity @nightly-sanity', as
expect(await page.locator('#giftAidClaimChoice>div:nth-child(2)>input').isChecked()).toBeFalsy();

await page.locator('button[type=submit]').click();
await expect(page.locator('div > h1')).toHaveText('Thanks for letting us know');
await expect(page.locator('div.success-wrapper--inner h1')).toHaveText('Thanks for letting us know');

await page.close();
});
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ test.describe('International addresses validation on update form @sanity @nightl
await page.locator('button[type=submit]').click();

// Thank you message on success page
await expect(page.locator('div > h1')).toContainText('Thank you, test!');
await expect(page.locator('div.success-wrapper--inner h1')).toContainText('Thank you, test!');

await page.close();
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ test('Valid giftaid update submission @sanity @nightly-sanity', async ({ page })

// Submit the form and validate the thank you message
await page.locator('button[type=submit]').click();
await expect(page.locator('div > h1')).toContainText('Thank you, test!');
await expect(page.locator('div.success-wrapper--inner h1')).toContainText('Thank you, test!');

await page.close();
});
8 changes: 8 additions & 0 deletions playwright-staging/tests/utils/commands.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,14 @@ class Commands {
constructor(page) {
this.page = page;
}

/**
* Generate a random string of 5 lowercase letters.
* @return {Promise<string>} A promise that resolves to a random string.
*/
async randomString() {
return chance.string({ length: 5, pool: 'abcdefghijklmnopqrstuvwxyz' });
}

/**
* Populate giftaid from fields
Expand Down
Loading