scratch-www/test/integration/join.test.js
Christopher Willis-Ford bbb8618b87 test: fix join flow test flakiness
- wait for navigation to complete so we don't accidentally grab an
  element on the page we're navigating away from, leading to a stale
  reference
- wait for focus to move into a selected input field so we don't
  accidentally grab the `validation-message` attached to the old input
  box (the "username" box is selected by default on the join flow page)
2023-10-27 08:31:50 -07:00

96 lines
4.3 KiB
JavaScript

// these tests do not sign in as a user
const SeleniumHelper = require('./selenium-helpers.js');
const {
buildDriver,
clickXpath,
findByXpath,
navigate,
waitUntilDocumentReady
} = new SeleniumHelper();
const rootUrl = process.env.ROOT_URL || 'https://scratch.ly';
const takenUsername = process.env.SMOKE_USERNAME;
jest.setTimeout(60000);
let driver;
describe('www-integration join flow', () => {
beforeAll(async () => {
driver = await buildDriver('www-integration join flow');
});
afterAll(() => driver.quit());
beforeEach(async () => {
await navigate(rootUrl); // navigate to home page
await clickXpath('//a[@class="registrationLink"]'); // navigate to join page
await waitUntilDocumentReady();
});
test('click Join opens join modal', async () => {
const joinModal = await findByXpath('//div[@class = "join-flow-outer-content"]');
const modalVisible = await joinModal.isDisplayed();
expect(modalVisible).toBe(true);
});
test('username validation message appears', async () => {
const clickedInput = await clickXpath('//input[contains(@name, "username")]');
await driver.wait(() => driver.executeScript('return document.activeElement == arguments[0]', clickedInput));
const message = await findByXpath('//div[contains(@class, "validation-message")]');
const messageText = await message.getText();
expect(messageText).toEqual('Don\'t use your real name');
});
test('password validation message appears', async () => {
const clickedInput = await clickXpath('//input[contains(@name, "password")]');
await driver.wait(() => driver.executeScript('return document.activeElement == arguments[0]', clickedInput));
const message = await findByXpath('//div[contains(@class, "validation-message")]');
const messageText = await message.getText();
expect(messageText).toContain('Write it down so you remember.');
});
test('password confirmation validation message appears', async () => {
const clickedInput = await clickXpath('//input[contains(@name, "passwordConfirm")]');
await driver.wait(() => driver.executeScript('return document.activeElement == arguments[0]', clickedInput));
const message = await findByXpath('//div[contains(@class, "validation-message")]');
const messageText = await message.getText();
expect(messageText).toEqual('Type password again');
});
test('username validation: too short', async () => {
const textInput = await findByXpath('//input[contains(@name, "username")]');
await textInput.click();
await driver.wait(() => driver.executeScript('return document.activeElement == arguments[0]', textInput));
await textInput.sendKeys('ab');
await clickXpath('//div[@class = "join-flow-outer-content"]');
const message = await findByXpath('//div[contains(@class, "validation-error")]');
const messageText = await message.getText();
expect(messageText).toContain('Must be 3 letters or longer');
});
test('username validation: username taken', async () => {
const textInput = await findByXpath('//input[contains(@name, "username")]');
await textInput.click();
await driver.wait(() => driver.executeScript('return document.activeElement == arguments[0]', textInput));
await textInput.sendKeys(takenUsername);
await clickXpath('//div[@class = "join-flow-outer-content"]');
const message = await findByXpath('//div[contains(@class, "validation-error")]');
const messageText = await message.getText();
expect(messageText).toContain('Username taken.');
});
test('username validation: bad word', async () => {
const textInput = await findByXpath('//input[contains(@name, "username")]');
await textInput.click();
await driver.wait(() => driver.executeScript('return document.activeElement == arguments[0]', textInput));
// Should be caught by the filter
await textInput.sendKeys('xxxxxxxxx');
await clickXpath('//div[@class = "join-flow-outer-content"]');
const message = await findByXpath('//div[contains(@class, "validation-error")]');
const messageText = await message.getText();
expect(messageText).toContain('Username not allowed');
});
});