Skip to content

Builds · E2E tests

0 modules · 0 exports · 1 repository · 8 e2e tests · 2 routes

  • NN-ZAP
  • SSendou
  • Arrange data setup
  • Act what the user does
  • Assert what is expected

Builds

adds a build

Renders/u/:identifier/u/:identifier/builds/u/:identifier/builds/new

NN-ZAP
Build form page
Act
  1. Go to new NZAP TEST ID
    await buildForm.gotoNew(NZAP_TEST_ID);
  2. Select weapons Weapons “Tenta Brella”, “Splat Brella”
    await buildForm.form.selectWeapons("weapons", [
    	"Tenta Brella",
    	"Splat Brella",
    ]);
  3. Select gear HEAD “White Headband”
    await buildForm.selectGear("HEAD", "White Headband");
  4. Select gear CLOTHES “Basic Tee”
    await buildForm.selectGear("CLOTHES", "Basic Tee");
  5. Select gear SHOES “Blue Lo-Tops”
    await buildForm.selectGear("SHOES", "Blue Lo-Tops");
  6. Add ability ISM 12
    await buildForm.addAbility("ISM", 12);
  7. Fill Title with “Test Build”
    await buildForm.form.fill("title", "Test Build");
  8. Fill Description with “Test Description”
    await buildForm.form.fill("description", "Test Description");
  9. Check items Modes “TC”
    await buildForm.form.checkItems("modes", ["TC"]);
  10. Submit
    await buildForm.form.submit();
User builds page
Assert
  1. change sorting button is visible
    await expect(userBuilds.locators.changeSortingButton).toBeVisible();
Act
  1. Build card 0 → firstBuildCard
    const firstBuildCard = userBuilds.buildCard(0);
Build card
Assert
  1. weapon image “Tenta Brella” is visible
    await expect(firstBuildCard.weaponImage("Tenta Brella")).toBeVisible();
  2. weapon image “Splat Brella” is visible
    await expect(firstBuildCard.weaponImage("Splat Brella")).toBeVisible();
  3. mode image “Tower Control” is visible
    await expect(firstBuildCard.modeImage("Tower Control")).toBeVisible();
  4. mode image “Splat Zones” is not visible
    await expect(firstBuildCard.modeImage("Splat Zones")).not.toBeVisible();
  5. title contains “Test Build”
    await expect(firstBuildCard.title).toContainText("Test Build");
Source
test("adds a build", async ({ page }) => {
	await impersonate(page, NZAP_TEST_ID);

	const buildForm = new BuildFormPage(page);
	await buildForm.gotoNew(NZAP_TEST_ID);

	await buildForm.form.selectWeapons("weapons", [
		"Tenta Brella",
		"Splat Brella",
	]);

	await buildForm.selectGear("HEAD", "White Headband");
	await buildForm.selectGear("CLOTHES", "Basic Tee");
	await buildForm.selectGear("SHOES", "Blue Lo-Tops");

	await buildForm.addAbility("ISM", 12);

	await buildForm.form.fill("title", "Test Build");
	await buildForm.form.fill("description", "Test Description");
	await buildForm.form.checkItems("modes", ["TC"]);

	await buildForm.form.submit();

	const userBuilds = new UserBuildsPage(page);
	await expect(userBuilds.locators.changeSortingButton).toBeVisible();

	const firstBuildCard = userBuilds.buildCard(0);

	await expect(firstBuildCard.weaponImage("Tenta Brella")).toBeVisible();
	await expect(firstBuildCard.weaponImage("Splat Brella")).toBeVisible();

	await expect(firstBuildCard.modeImage("Tower Control")).toBeVisible();
	await expect(firstBuildCard.modeImage("Splat Zones")).not.toBeVisible();

	await expect(firstBuildCard.title).toContainText("Test Build");
})

makes build private

Renders/u/:identifier/u/:identifier/builds/u/:identifier/builds/new

Setup
Arrange
  1. backdating one build makes the updatedAt sort deterministic

    Create 2 × build owner Sendou → [olderBuild]
    const [olderBuild] = await factories.BuildFactory.createMany(2, {
    	ownerId: ADMIN_ID,
    });
  2. Backdate “Build” olderBuild.id updated at subDays(new Date(), 1)
    await factories.backdate("Build", olderBuild.id, {
    	updatedAt: subDays(new Date(), 1),
    });
SSendou
User builds page
Act
  1. Open the user builds page Sendou
    await userBuilds.goto(ADMIN_ID);
  2. Build id 0 → buildIdBefore
    const buildIdBefore = await userBuilds.buildId(0);
  3. Edit build 0 → buildForm
    const buildForm = await userBuilds.editBuild(0);
Build form page
Act
  1. Check Private
    await buildForm.form.check("isPrivate");
  2. Submit
    await buildForm.form.submit();
User builds page
Assert
  1. build cards count is 2
    await expect(userBuilds.locators.buildCards).toHaveCount(2);
  2. private indicator is visible
    await expect(userBuilds.buildCard(0).privateIndicator).toBeVisible();
Act
  1. Build id 0 → buildIdAfter
    const buildIdAfter = await userBuilds.buildId(0);
Assert
  1. buildIdAfter is buildIdBefore
    expect(buildIdAfter).toBe(buildIdBefore);
NN-ZAP
User builds page
Act
  1. Open the user builds page Sendou
    await userBuilds.goto(ADMIN_ID);
Assert
  1. build cards count is 1
    await expect(userBuilds.locators.buildCards).toHaveCount(1);
  2. private indicator count is 0
    await expect(userBuilds.buildCard(0).privateIndicator).toHaveCount(0);
Source
test("makes build private", async ({ page, factories }) => {
	// backdating one build makes the updatedAt sort deterministic
	const [olderBuild] = await factories.BuildFactory.createMany(2, {
		ownerId: ADMIN_ID,
	});
	await factories.backdate("Build", olderBuild.id, {
		updatedAt: subDays(new Date(), 1),
	});

	await impersonate(page);

	const userBuilds = new UserBuildsPage(page);
	await userBuilds.goto(ADMIN_ID);

	const buildIdBefore = await userBuilds.buildId(0);

	const buildForm = await userBuilds.editBuild(0);
	await buildForm.form.check("isPrivate");
	await buildForm.form.submit();

	await expect(userBuilds.locators.buildCards).toHaveCount(2);
	await expect(userBuilds.buildCard(0).privateIndicator).toBeVisible();

	const buildIdAfter = await userBuilds.buildId(0);
	expect(buildIdAfter).toBe(buildIdBefore);

	await impersonate(page, NZAP_TEST_ID);
	await userBuilds.goto(ADMIN_ID);
	await expect(userBuilds.locators.buildCards).toHaveCount(1);
	await expect(userBuilds.buildCard(0).privateIndicator).toHaveCount(0);
})

filters builds

Renders/builds/builds/:slug

Setup
Arrange
  1. Create 3 × build owner Sendou weapon spl ids 40 modes “TC” abilities ABILITIES_WITH_ISM
    await factories.BuildFactory.createMany(3, {
    	ownerId: ADMIN_ID,
    	weaponSplIds: [40],
    	modes: ["TC"],
    	abilities: ABILITIES_WITH_ISM,
    });
  2. Create 2 × build owner Sendou weapon spl ids 40 modes “SZ” abilities ABILITIES_WITHOUT_ISM
    await factories.BuildFactory.createMany(2, {
    	ownerId: ADMIN_ID,
    	weaponSplIds: [40],
    	modes: ["SZ"],
    	abilities: ABILITIES_WITHOUT_ISM,
    });
NN-ZAP
Builds page
Act
  1. Open weapon 40
    await new BuildsPage(page).openWeapon(40);
Weapon builds page
Act
  1. Expand build stacks
    await weaponBuilds.expandBuildStacks();
  2. Click ability toggle “Ink Saver (Main)”
    await weaponBuilds.abilityToggle("Ink Saver (Main)").click();
Assert
  1. build cards count is 3
    await expect(weaponBuilds.locators.buildCards).toHaveCount(3);
Act
  1. Select “HAS_NOT” in ability filter type select
    await weaponBuilds.locators.abilityFilterTypeSelect.selectOption("HAS_NOT");
Assert
  1. build cards count is 2
    await expect(weaponBuilds.locators.buildCards).toHaveCount(2);
Act
  1. Select “AT_LEAST” in ability filter type select
    await weaponBuilds.locators.abilityFilterTypeSelect.selectOption(
    	"AT_LEAST",
    );
Assert
  1. build cards count is 3
    await expect(weaponBuilds.locators.buildCards).toHaveCount(3);
Act
  1. Select “AT_MOST” in ability filter type select
    await weaponBuilds.locators.abilityFilterTypeSelect.selectOption("AT_MOST");
Assert
  1. build cards count is 2
    await expect(weaponBuilds.locators.buildCards).toHaveCount(2);
Act
  1. Select “19” in ability filter ap select
    await weaponBuilds.locators.abilityFilterApSelect.selectOption("19");
Assert
  1. build cards count is 5
    await expect(weaponBuilds.locators.buildCards).toHaveCount(5);
Act
  1. Click ability toggle “Ink Saver (Main)”
    await weaponBuilds.abilityToggle("Ink Saver (Main)").click();
Assert
  1. build cards count is 5
    await expect(weaponBuilds.locators.buildCards).toHaveCount(5);
Act
  1. Click filter option “Tower Control”
    await weaponBuilds.filterOption("Tower Control").click();
Assert
  1. mode badge “TC” count is 3
    await expect(weaponBuilds.modeBadge("TC")).toHaveCount(3);
Act
  1. Click filter option “Any mode”
    await weaponBuilds.filterOption("Any mode").click();
Assert
  1. build cards count is 5
    await expect(weaponBuilds.locators.buildCards).toHaveCount(5);
Act
  1. Click filter option new RegExp(`^Patch ${RECENT_PATCHES[0].patch}`)
    await weaponBuilds
    	.filterOption(new RegExp(`^Patch ${RECENT_PATCHES[0].patch}`))
    	.click();
Assert
  1. no change in count since all builds in test data are new

    build cards count is 5
    await expect(weaponBuilds.locators.buildCards).toHaveCount(5);
Source
test("filters builds", async ({ page, factories }) => {
	await factories.BuildFactory.createMany(3, {
		ownerId: ADMIN_ID,
		weaponSplIds: [40],
		modes: ["TC"],
		abilities: ABILITIES_WITH_ISM,
	});
	await factories.BuildFactory.createMany(2, {
		ownerId: ADMIN_ID,
		weaponSplIds: [40],
		modes: ["SZ"],
		abilities: ABILITIES_WITHOUT_ISM,
	});

	await impersonate(page, NZAP_TEST_ID);

	const weaponBuilds = new WeaponBuildsPage(page);
	await new BuildsPage(page).openWeapon(40);
	await weaponBuilds.expandBuildStacks();

	await weaponBuilds.abilityToggle("Ink Saver (Main)").click();
	await expect(weaponBuilds.locators.buildCards).toHaveCount(3);

	await weaponBuilds.locators.abilityFilterTypeSelect.selectOption("HAS_NOT");
	await expect(weaponBuilds.locators.buildCards).toHaveCount(2);

	await weaponBuilds.locators.abilityFilterTypeSelect.selectOption(
		"AT_LEAST",
	);
	await expect(weaponBuilds.locators.buildCards).toHaveCount(3);

	await weaponBuilds.locators.abilityFilterTypeSelect.selectOption("AT_MOST");
	await expect(weaponBuilds.locators.buildCards).toHaveCount(2);
	await weaponBuilds.locators.abilityFilterApSelect.selectOption("19");
	await expect(weaponBuilds.locators.buildCards).toHaveCount(5);

	await weaponBuilds.abilityToggle("Ink Saver (Main)").click();
	await expect(weaponBuilds.locators.buildCards).toHaveCount(5);

	await weaponBuilds.filterOption("Tower Control").click();
	await expect(weaponBuilds.modeBadge("TC")).toHaveCount(3);
	await weaponBuilds.filterOption("Any mode").click();
	await expect(weaponBuilds.locators.buildCards).toHaveCount(5);

	await weaponBuilds
		.filterOption(new RegExp(`^Patch ${RECENT_PATCHES[0].patch}`))
		.click();
	// no change in count since all builds in test data are new
	await expect(weaponBuilds.locators.buildCards).toHaveCount(5);
})

filters a user's builds

Setup
Arrange
  1. Create 3 × build owner Sendou weapon spl ids 40 abilities ABILITIES_WITH_ISM
    await factories.BuildFactory.createMany(3, {
    	ownerId: ADMIN_ID,
    	weaponSplIds: [40],
    	abilities: ABILITIES_WITH_ISM,
    });
  2. Create 2 × build owner Sendou weapon spl ids 0 abilities ABILITIES_WITHOUT_ISM
    await factories.BuildFactory.createMany(2, {
    	ownerId: ADMIN_ID,
    	weaponSplIds: [0],
    	abilities: ABILITIES_WITHOUT_ISM,
    });
NN-ZAP
User builds page
Act
  1. Open the user builds page Sendou
    await userBuilds.goto(ADMIN_ID);
Assert
  1. build cards count is 5
    await expect(userBuilds.locators.buildCards).toHaveCount(5);
Act
  1. Click filter option /^Sploosh-o-matic/
    await userBuilds.filterOption(/^Sploosh-o-matic/).click();
Assert
  1. build cards count is 2
    await expect(userBuilds.locators.buildCards).toHaveCount(2);
Act
  1. Click filter option /^Any weapon/
    await userBuilds.filterOption(/^Any weapon/).click();
  2. Click ability toggle “Ink Saver (Main)”
    await userBuilds.abilityToggle("Ink Saver (Main)").click();
Assert
  1. build cards count is 3
    await expect(userBuilds.locators.buildCards).toHaveCount(3);
Source
test("filters a user's builds", async ({ page, factories }) => {
	await factories.BuildFactory.createMany(3, {
		ownerId: ADMIN_ID,
		weaponSplIds: [40],
		abilities: ABILITIES_WITH_ISM,
	});
	await factories.BuildFactory.createMany(2, {
		ownerId: ADMIN_ID,
		weaponSplIds: [0],
		abilities: ABILITIES_WITHOUT_ISM,
	});

	await impersonate(page, NZAP_TEST_ID);

	const userBuilds = new UserBuildsPage(page);
	await userBuilds.goto(ADMIN_ID);
	await expect(userBuilds.locators.buildCards).toHaveCount(5);

	await userBuilds.filterOption(/^Sploosh-o-matic/).click();
	await expect(userBuilds.locators.buildCards).toHaveCount(2);

	await userBuilds.filterOption(/^Any weapon/).click();
	await userBuilds.abilityToggle("Ink Saver (Main)").click();
	await expect(userBuilds.locators.buildCards).toHaveCount(3);
})

paginates a user's builds

Setup
Arrange
  1. Create BUILDS_PAGE_SIZE + 1 × build owner Sendou
    await factories.BuildFactory.createMany(BUILDS_PAGE_SIZE + 1, {
    	ownerId: ADMIN_ID,
    });
LOLogged out
User builds page
Act
  1. Open the user builds page Sendou
    await userBuilds.goto(ADMIN_ID);
Assert
  1. build cards count is BUILDS_PAGE_SIZE
    await expect(userBuilds.locators.buildCards).toHaveCount(BUILDS_PAGE_SIZE);
Act
  1. Click next page button
    await userBuilds.locators.nextPageButton.click();
Assert
  1. build cards count is 1
    await expect(userBuilds.locators.buildCards).toHaveCount(1);
Source
test("paginates a user's builds", async ({ page, factories }) => {
	await factories.BuildFactory.createMany(BUILDS_PAGE_SIZE + 1, {
		ownerId: ADMIN_ID,
	});

	const userBuilds = new UserBuildsPage(page);
	await userBuilds.goto(ADMIN_ID);
	await expect(userBuilds.locators.buildCards).toHaveCount(BUILDS_PAGE_SIZE);

	await userBuilds.locators.nextPageButton.click();
	await expect(userBuilds.locators.buildCards).toHaveCount(1);
})

stacks an author's builds and expands the stack

Setup
Arrange
  1. Create 3 × build owner Sendou weapon spl ids 40
    await factories.BuildFactory.createMany(3, {
    	ownerId: ADMIN_ID,
    	weaponSplIds: [40],
    });
  2. Create build owner N-ZAP weapon spl ids 40
    await factories.BuildFactory.create({
    	ownerId: NZAP_TEST_ID,
    	weaponSplIds: [40],
    });
LOLogged out
Builds page
Act
  1. Open weapon 40
    await new BuildsPage(page).openWeapon(40);
Weapon builds page
Assert
  1. build cards count is 2
    await expect(weaponBuilds.locators.buildCards).toHaveCount(2);
  2. expand stack buttons have accessible name “2 more builds”
    await expect(weaponBuilds.locators.expandStackButtons).toHaveAccessibleName(
    	"2 more builds",
    );
Act
  1. Click expand stack buttons
    await weaponBuilds.locators.expandStackButtons.click();
Assert
  1. build cards count is 4
    await expect(weaponBuilds.locators.buildCards).toHaveCount(4);
Act
  1. Click collapse stack buttons
    await weaponBuilds.locators.collapseStackButtons.click();
Assert
  1. build cards count is 2
    await expect(weaponBuilds.locators.buildCards).toHaveCount(2);
Source
test("stacks an author's builds and expands the stack", async ({
	page,
	factories,
}) => {
	await factories.BuildFactory.createMany(3, {
		ownerId: ADMIN_ID,
		weaponSplIds: [40],
	});
	await factories.BuildFactory.create({
		ownerId: NZAP_TEST_ID,
		weaponSplIds: [40],
	});

	const weaponBuilds = new WeaponBuildsPage(page);
	await new BuildsPage(page).openWeapon(40);

	await expect(weaponBuilds.locators.buildCards).toHaveCount(2);
	await expect(weaponBuilds.locators.expandStackButtons).toHaveAccessibleName(
		"2 more builds",
	);

	await weaponBuilds.locators.expandStackButtons.click();
	await expect(weaponBuilds.locators.buildCards).toHaveCount(4);

	await weaponBuilds.locators.collapseStackButtons.click();
	await expect(weaponBuilds.locators.buildCards).toHaveCount(2);
})

Renders/builds/builds/:slug/builds/:slug/popular/builds/:slug/stats

Setup
Arrange
  1. Create 3 × build owner Sendou weapon spl ids 40 abilities STATS_ABILITIES
    await factories.BuildFactory.createMany(3, {
    	ownerId: ADMIN_ID,
    	weaponSplIds: [40],
    	abilities: STATS_ABILITIES,
    });
  2. Create build owner N-ZAP weapon spl ids 40 abilities STATS_ABILITIES
    await factories.BuildFactory.create({
    	ownerId: NZAP_TEST_ID,
    	weaponSplIds: [40],
    	abilities: STATS_ABILITIES,
    });
  3. a build for another weapon so site-wide stats differ from the weapon's

    Create build owner N-ZAP weapon spl ids 10 abilities OTHER_WEAPON_ABILITIES
    await factories.BuildFactory.create({
    	ownerId: NZAP_TEST_ID,
    	weaponSplIds: [10],
    	abilities: OTHER_WEAPON_ABILITIES,
    });
LOLogged out
Builds page
Act
  1. Open weapon 40
    await new BuildsPage(page).openWeapon(40);
Weapon builds page
Act
  1. Expand build stacks
    await weaponBuilds.expandBuildStacks();
Assert
  1. build cards count is 4
    await expect(weaponBuilds.locators.buildCards).toHaveCount(4);
Act
  1. Click ability stats tab
    await weaponBuilds.locators.abilityStatsTab.click();
Build stats page
Assert
  1. builds count 4 is visible
    await expect(buildStats.buildsCount(4)).toBeVisible();
  2. SSU and RSU weapon averages

    ap average 19 count is 2
    await expect(buildStats.apAverage(19)).toHaveCount(2);
  3. ISM weapon average

    ap average 9 count is 1
    await expect(buildStats.apAverage(9)).toHaveCount(1);
  4. CB is in every Splattershot build but in 4 of the 5 builds site-wide

    main only ability percentages ability name “Comeback” weapon percentage 100 all percentage 80 is visible
    await expect(
    	buildStats.mainOnlyAbilityPercentages({
    		abilityName: "Comeback",
    		weaponPercentage: 100,
    		allPercentage: 80,
    	}),
    ).toBeVisible();
Popular builds page
Act
  1. Open the popular builds page “splattershot”
    await popularBuilds.goto("splattershot");
Assert
  1. admin's identical builds count once, N-ZAP's brings it to 2 players

    placement 1 is visible
    await expect(popularBuilds.placement(1)).toBeVisible();
  2. players count 2 is visible
    await expect(popularBuilds.playersCount(2)).toBeVisible();
  3. build ability rank 1 ability “CB” count is 1
    await expect(
    	popularBuilds.buildAbility({ rank: 1, ability: "CB" }),
    ).toHaveCount(1);
  4. 19 AP = one main and three subs

    build ability rank 1 ability “SSU” count is 4
    await expect(
    	popularBuilds.buildAbility({ rank: 1, ability: "SSU" }),
    ).toHaveCount(4);
  5. build ability rank 1 ability “RSU” count is 4
    await expect(
    	popularBuilds.buildAbility({ rank: 1, ability: "RSU" }),
    ).toHaveCount(4);
  6. build ability rank 1 ability “ISM” count is 3
    await expect(
    	popularBuilds.buildAbility({ rank: 1, ability: "ISM" }),
    ).toHaveCount(3);
  7. placement 2 is not visible
    await isNotVisible(popularBuilds.placement(2));
Source
test("aggregates builds into ability stats and popular builds", async ({
	page,
	factories,
}) => {
	await factories.BuildFactory.createMany(3, {
		ownerId: ADMIN_ID,
		weaponSplIds: [40],
		abilities: STATS_ABILITIES,
	});
	await factories.BuildFactory.create({
		ownerId: NZAP_TEST_ID,
		weaponSplIds: [40],
		abilities: STATS_ABILITIES,
	});
	// a build for another weapon so site-wide stats differ from the weapon's
	await factories.BuildFactory.create({
		ownerId: NZAP_TEST_ID,
		weaponSplIds: [10],
		abilities: OTHER_WEAPON_ABILITIES,
	});

	const weaponBuilds = new WeaponBuildsPage(page);
	await new BuildsPage(page).openWeapon(40);
	await weaponBuilds.expandBuildStacks();
	await expect(weaponBuilds.locators.buildCards).toHaveCount(4);

	await weaponBuilds.locators.abilityStatsTab.click();

	const buildStats = new BuildStatsPage(page);
	await expect(buildStats.buildsCount(4)).toBeVisible();
	// SSU and RSU weapon averages
	await expect(buildStats.apAverage(19)).toHaveCount(2);
	// ISM weapon average
	await expect(buildStats.apAverage(9)).toHaveCount(1);
	// CB is in every Splattershot build but in 4 of the 5 builds site-wide
	await expect(
		buildStats.mainOnlyAbilityPercentages({
			abilityName: "Comeback",
			weaponPercentage: 100,
			allPercentage: 80,
		}),
	).toBeVisible();

	const popularBuilds = new PopularBuildsPage(page);
	await popularBuilds.goto("splattershot");

	// admin's identical builds count once, N-ZAP's brings it to 2 players
	await expect(popularBuilds.placement(1)).toBeVisible();
	await expect(popularBuilds.playersCount(2)).toBeVisible();
	await expect(
		popularBuilds.buildAbility({ rank: 1, ability: "CB" }),
	).toHaveCount(1);
	// 19 AP = one main and three subs
	await expect(
		popularBuilds.buildAbility({ rank: 1, ability: "SSU" }),
	).toHaveCount(4);
	await expect(
		popularBuilds.buildAbility({ rank: 1, ability: "RSU" }),
	).toHaveCount(4);
	await expect(
		popularBuilds.buildAbility({ rank: 1, ability: "ISM" }),
	).toHaveCount(3);
	await isNotVisible(popularBuilds.placement(2));
})

edits build title, changes sorting and deletes a build

Renders/u/:identifier/u/:identifier/builds/u/:identifier/builds/new

Setup
Arrange
  1. Create build owner Sendou title “Alpha Build” → olderBuild
    const olderBuild = await factories.BuildFactory.create({
    	ownerId: ADMIN_ID,
    	title: "Alpha Build",
    });
  2. Create build owner Sendou title “Mid Build”
    await factories.BuildFactory.create({
    	ownerId: ADMIN_ID,
    	title: "Mid Build",
    });
  3. Backdate “Build” olderBuild.id updated at subDays(new Date(), 1)
    await factories.backdate("Build", olderBuild.id, {
    	updatedAt: subDays(new Date(), 1),
    });
SSendou
User builds page
Act
  1. Open the user builds page Sendou
    await userBuilds.goto(ADMIN_ID);
Assert
  1. title contains “Mid Build”
    await expect(userBuilds.buildCard(0).title).toContainText("Mid Build");
Act
  1. Edit build 0 → buildForm
    const buildForm = await userBuilds.editBuild(0);
Build form page
Act
  1. Fill Title with “Zulu Build”
    await buildForm.form.fill("title", "Zulu Build");
  2. Submit
    await buildForm.form.submit();
User builds page
Assert
  1. title contains “Zulu Build”
    await expect(userBuilds.buildCard(0).title).toContainText("Zulu Build");
  2. title contains “Alpha Build”
    await expect(userBuilds.buildCard(1).title).toContainText("Alpha Build");
Act
  1. Change sorting to “ALPHABETICAL_TITLE”
    await userBuilds.changeSortingTo("ALPHABETICAL_TITLE");
Assert
  1. title contains “Alpha Build”
    await expect(userBuilds.buildCard(0).title).toContainText("Alpha Build");
  2. title contains “Zulu Build”
    await expect(userBuilds.buildCard(1).title).toContainText("Zulu Build");
Act
  1. Delete build 0
    await userBuilds.deleteBuild(0);
Assert
  1. build cards count is 1
    await expect(userBuilds.locators.buildCards).toHaveCount(1);
  2. title contains “Zulu Build”
    await expect(userBuilds.buildCard(0).title).toContainText("Zulu Build");
Source
test("edits build title, changes sorting and deletes a build", async ({
	page,
	factories,
}) => {
	const olderBuild = await factories.BuildFactory.create({
		ownerId: ADMIN_ID,
		title: "Alpha Build",
	});
	await factories.BuildFactory.create({
		ownerId: ADMIN_ID,
		title: "Mid Build",
	});
	await factories.backdate("Build", olderBuild.id, {
		updatedAt: subDays(new Date(), 1),
	});

	await impersonate(page);

	const userBuilds = new UserBuildsPage(page);
	await userBuilds.goto(ADMIN_ID);

	await expect(userBuilds.buildCard(0).title).toContainText("Mid Build");

	const buildForm = await userBuilds.editBuild(0);
	await buildForm.form.fill("title", "Zulu Build");
	await buildForm.form.submit();

	await expect(userBuilds.buildCard(0).title).toContainText("Zulu Build");
	await expect(userBuilds.buildCard(1).title).toContainText("Alpha Build");

	await userBuilds.changeSortingTo("ALPHABETICAL_TITLE");

	await expect(userBuilds.buildCard(0).title).toContainText("Alpha Build");
	await expect(userBuilds.buildCard(1).title).toContainText("Zulu Build");

	await userBuilds.deleteBuild(0);

	await expect(userBuilds.locators.buildCards).toHaveCount(1);
	await expect(userBuilds.buildCard(0).title).toContainText("Zulu Build");
})