mirror of
https://github.com/scratchfoundation/scratch-www.git
synced 2024-12-04 21:01:32 -05:00
188 lines
7.5 KiB
JavaScript
188 lines
7.5 KiB
JavaScript
// These tests sign in with user #2 and user #3
|
|
|
|
import SeleniumHelper from './selenium-helpers.js';
|
|
|
|
const {
|
|
buildDriver,
|
|
clickText,
|
|
clickXpath,
|
|
findByXpath,
|
|
isSignedIn,
|
|
navigate,
|
|
signIn
|
|
} = new SeleniumHelper();
|
|
|
|
const rootUrl = process.env.ROOT_URL || 'https://scratch.ly';
|
|
const studioId = process.env.TEST_STUDIO_ID || 10004360;
|
|
const studioUrl = `${rootUrl}/studios/${studioId}`;
|
|
const myStuffURL = `${rootUrl}/mystuff`;
|
|
const rateLimitCheck = process.env.RATE_LIMIT_CHECK || rootUrl;
|
|
|
|
// since the usernames end in 2 and 3 we're using username2 and username3
|
|
// username 1 is used in other tests. Hopefully this is not confusing.
|
|
const username2 = `${process.env.SMOKE_USERNAME}2`;
|
|
const username3 = `${process.env.SMOKE_USERNAME}3`;
|
|
const password = process.env.SMOKE_PASSWORD;
|
|
|
|
let promoteStudioURL;
|
|
let curatorTab;
|
|
|
|
jest.setTimeout(70000);
|
|
|
|
let driver;
|
|
|
|
describe('studio page while signed out', () => {
|
|
beforeAll(async () => {
|
|
// expect(projectUrl).toBe(defined);
|
|
driver = await buildDriver('www-integration studio-page signed out');
|
|
});
|
|
|
|
beforeEach(async () => {
|
|
await navigate(studioUrl);
|
|
const studioNav = await findByXpath('//div[@class="studio-tabs"]');
|
|
await studioNav.isDisplayed();
|
|
});
|
|
|
|
afterAll(() => driver.quit());
|
|
|
|
test('land on projects tab', async () => {
|
|
await navigate(studioUrl);
|
|
const projectGrid = await findByXpath('//div[@class="studio-projects-grid"]');
|
|
const projectGridDisplayed = await projectGrid.isDisplayed();
|
|
expect(projectGridDisplayed).toBe(true);
|
|
});
|
|
|
|
test('studio title', async () => {
|
|
const studioTitle = await findByXpath('//div[@class="studio-title"]');
|
|
const titleText = await studioTitle.getText();
|
|
expect(titleText).toEqual('studio for automated testing');
|
|
});
|
|
|
|
test('studio description', async () => {
|
|
const xpath = '//div[contains(@class, "studio-description")]';
|
|
const studioDescription = await findByXpath(xpath);
|
|
const descriptionText = await studioDescription.getText();
|
|
expect(descriptionText).toEqual('a description');
|
|
});
|
|
});
|
|
|
|
describe('studio management', () => {
|
|
// These tests all start on the curators tab of a studio and signed out
|
|
|
|
beforeAll(async () => {
|
|
driver = await buildDriver('www-integration studio management');
|
|
await navigate(rootUrl);
|
|
|
|
// create a studio for tests
|
|
await signIn(username2, password);
|
|
await findByXpath('//span[contains(@class, "profile-name")]');
|
|
await navigate(rateLimitCheck);
|
|
await navigate(myStuffURL);
|
|
await clickXpath('//form[@id="new_studio"]/button[@type="submit"]');
|
|
await findByXpath('//div[@class="studio-tabs"]');
|
|
promoteStudioURL = await driver.getCurrentUrl();
|
|
curatorTab = `${promoteStudioURL}curators`;
|
|
});
|
|
|
|
beforeEach(async () => {
|
|
if (await isSignedIn()) {
|
|
await clickXpath('//a[contains(@class, "user-info")]');
|
|
await clickText('Sign out');
|
|
}
|
|
});
|
|
|
|
afterAll(() => driver.quit());
|
|
|
|
test('invite a curator', async () => {
|
|
// sign in as user2
|
|
await signIn(username2, password);
|
|
await navigate(curatorTab);
|
|
|
|
// invite user3 to curate
|
|
const inviteBox = await findByXpath('//div[@class="studio-adder-row"]/input');
|
|
await inviteBox.sendKeys(username3);
|
|
await clickXpath('//div[@class="studio-adder-row"]/button');
|
|
const inviteAlert = await findByXpath('//div[@class="alert-msg"]'); // the confirm alert
|
|
const alertText = await inviteAlert.getText();
|
|
const successText = `Curator invite sent to "${username3}"`;
|
|
expect(alertText).toMatch(successText);
|
|
});
|
|
|
|
test('accept curator invite', async () => {
|
|
// Sign in user3
|
|
await signIn(username3, password);
|
|
await navigate(curatorTab);
|
|
|
|
// accept the curator invite
|
|
await clickXpath('//button[@class="studio-invitation-button button"]');
|
|
const acceptSuccess = await findByXpath('//div[contains(@class,"studio-info-box-success")]');
|
|
const acceptSuccessVisible = await acceptSuccess.isDisplayed();
|
|
expect(acceptSuccessVisible).toBe(true);
|
|
});
|
|
|
|
test('promote to manager', async () => {
|
|
// sign in as user2
|
|
await signIn(username2, password);
|
|
await findByXpath('//span[contains(@class, "profile-name")]');
|
|
// for some reason the user isn't showing up without waiting and reloading the page
|
|
await driver.sleep(2000);
|
|
await navigate(curatorTab);
|
|
|
|
// promote user3
|
|
const user3href = `/users/${username3}`;
|
|
// click kebab menu on the user tile
|
|
const kebabMenuXpath = `//a[@href = "${user3href}"]/following-sibling::div[@class="overflow-menu-container"]`;
|
|
await clickXpath(`${kebabMenuXpath}/button[@class="overflow-menu-trigger"]`);
|
|
// click promote
|
|
// await clickXpath('//button[@class="promote-menu-button"]'); //<-- I think this will do it
|
|
await clickXpath(`${kebabMenuXpath}/ul/li/button/span[contains(text(), "Promote")]/..`);
|
|
await findByXpath('//div[@class="promote-content"]');
|
|
// await clickXpath(//button[contains(@class="promote-button")]) <-- add this selector to the button
|
|
await clickXpath('//div[@class="promote-button-row"]/button/span[contains(text(),"Promote")]/..');
|
|
const promoteSuccess = await findByXpath('//div[contains(@class, "alert-success")]');
|
|
const promoteSuccessVisible = await promoteSuccess.isDisplayed();
|
|
expect(promoteSuccessVisible).toBe(true);
|
|
});
|
|
|
|
test('transfer studio host', async () => {
|
|
// sign in as user2
|
|
await signIn(username2, password);
|
|
await findByXpath('//span[contains(@class, "profile-name")]');
|
|
// for some reason the user isn't showing up without reloading the page
|
|
await navigate(curatorTab);
|
|
|
|
// open kebab menu
|
|
const user2href = `/users/${username2}`;
|
|
// click kebab menu on the user tile
|
|
const kebabMenuXpath = `//a[@href = "${user2href}"]/following-sibling::div[@class="overflow-menu-container"]`;
|
|
await clickXpath(`${kebabMenuXpath}/button[@class="overflow-menu-trigger"]`);
|
|
|
|
// click transfer in dropdown
|
|
await clickXpath('//button[@class="studio-member-tile-menu-wide"]');
|
|
await findByXpath('//div[contains(@class, "transfer-info-title")]');
|
|
|
|
// click next button
|
|
await clickXpath('//button[contains(@class, "next-button")]');
|
|
await findByXpath('//div[@class="transfer-selection-heading"]');
|
|
|
|
// click user tile
|
|
await clickXpath(`//div[contains(text(), "${username3}")]`);
|
|
await findByXpath('//div[contains(@class, "transfer-host-name-selected")]');
|
|
|
|
// click next button
|
|
await clickXpath('//button[contains(@class, "next-button")]');
|
|
await findByXpath('//div[@class="transfer-outcome"]');
|
|
|
|
// enter password
|
|
const passwordInput = await findByXpath('//input[@class="transfer-password-input"]');
|
|
await passwordInput.sendKeys(password);
|
|
await findByXpath(`//input[@value="${password}"]`);
|
|
|
|
// click confirm
|
|
// await clickXpath('//button[contains(@class, "confirm-transfer-button")]')
|
|
await clickXpath('//span[contains(text(), "Confirm")]/..');
|
|
// findByXpath checks for both presence and visibility
|
|
const transferSuccess = await findByXpath('//div[contains(@class, "alert-success")]');
|
|
expect(transferSuccess).toBeTruthy();
|
|
});
|
|
});
|