Fix playwright config mismatch
CI Pipeline / test (20) (pull_request) Successful in 7m8s
CI Pipeline / test (18) (pull_request) Successful in 7m24s
CI Pipeline / e2e (webkit) (pull_request) Has been cancelled
CI Pipeline / visual-regression (pull_request) Has been cancelled
CI Pipeline / performance (pull_request) Has been cancelled
CI Pipeline / storybook (pull_request) Has been cancelled
CI Pipeline / lint (pull_request) Has been cancelled
CI Pipeline / build (pull_request) Has been cancelled
CI Pipeline / e2e (firefox) (pull_request) Has been cancelled
CI Pipeline / e2e (chromium) (pull_request) Has been cancelled
CI Pipeline / test (20) (pull_request) Successful in 7m8s
CI Pipeline / test (18) (pull_request) Successful in 7m24s
CI Pipeline / e2e (webkit) (pull_request) Has been cancelled
CI Pipeline / visual-regression (pull_request) Has been cancelled
CI Pipeline / performance (pull_request) Has been cancelled
CI Pipeline / storybook (pull_request) Has been cancelled
CI Pipeline / lint (pull_request) Has been cancelled
CI Pipeline / build (pull_request) Has been cancelled
CI Pipeline / e2e (firefox) (pull_request) Has been cancelled
CI Pipeline / e2e (chromium) (pull_request) Has been cancelled
This commit is contained in:
@@ -37,7 +37,7 @@ for (const bp of breakpoints) {
|
||||
).toBeVisible();
|
||||
// Look for the "Learn" link specifically in the footer (not in other components)
|
||||
await expect(
|
||||
page.getByRole("contentinfo").getByRole("link", { name: /learn/i })
|
||||
page.getByRole("contentinfo").getByRole("link", { name: /learn/i }),
|
||||
).toBeVisible();
|
||||
await expect(page.getByRole("link", { name: /about/i })).toBeVisible();
|
||||
});
|
||||
@@ -140,7 +140,9 @@ test.describe("Footer visual regression", () => {
|
||||
await page.waitForTimeout(500);
|
||||
|
||||
// Test hover on navigation items
|
||||
const useCasesLink = page.getByRole("contentinfo").getByRole("link", { name: /use cases/i });
|
||||
const useCasesLink = page
|
||||
.getByRole("contentinfo")
|
||||
.getByRole("link", { name: /use cases/i });
|
||||
await useCasesLink.hover();
|
||||
await page.waitForTimeout(200);
|
||||
await expect(page.getByRole("contentinfo")).toHaveScreenshot(
|
||||
@@ -176,7 +178,9 @@ test.describe("Footer visual regression", () => {
|
||||
await page.waitForTimeout(500);
|
||||
|
||||
// Test focus on navigation items
|
||||
const useCasesLink = page.getByRole("contentinfo").getByRole("link", { name: /use cases/i });
|
||||
const useCasesLink = page
|
||||
.getByRole("contentinfo")
|
||||
.getByRole("link", { name: /use cases/i });
|
||||
await useCasesLink.focus();
|
||||
await page.waitForTimeout(200);
|
||||
await expect(page.getByRole("contentinfo")).toHaveScreenshot(
|
||||
@@ -235,10 +239,18 @@ test.describe("Footer responsive behavior", () => {
|
||||
page.getByRole("contentinfo").getByRole("link", { name: /use cases/i }),
|
||||
page.getByRole("contentinfo").getByRole("link", { name: /learn/i }),
|
||||
page.getByRole("contentinfo").getByRole("link", { name: /about/i }),
|
||||
page.getByRole("contentinfo").getByRole("link", { name: /privacy policy/i }),
|
||||
page.getByRole("contentinfo").getByRole("link", { name: /terms of service/i }),
|
||||
page.getByRole("contentinfo").getByRole("link", { name: /follow us on bluesky/i }),
|
||||
page.getByRole("contentinfo").getByRole("link", { name: /follow us on gitlab/i }),
|
||||
page
|
||||
.getByRole("contentinfo")
|
||||
.getByRole("link", { name: /privacy policy/i }),
|
||||
page
|
||||
.getByRole("contentinfo")
|
||||
.getByRole("link", { name: /terms of service/i }),
|
||||
page
|
||||
.getByRole("contentinfo")
|
||||
.getByRole("link", { name: /follow us on bluesky/i }),
|
||||
page
|
||||
.getByRole("contentinfo")
|
||||
.getByRole("link", { name: /follow us on gitlab/i }),
|
||||
];
|
||||
|
||||
for (const element of interactiveElements) {
|
||||
|
||||
@@ -35,8 +35,12 @@ for (const bp of breakpoints) {
|
||||
await expect(
|
||||
page.getByRole("menuitem", { name: /use cases/i }),
|
||||
).toBeVisible();
|
||||
await expect(page.getByRole("menuitem", { name: /learn/i })).toBeVisible();
|
||||
await expect(page.getByRole("menuitem", { name: /about/i })).toBeVisible();
|
||||
await expect(
|
||||
page.getByRole("menuitem", { name: /learn/i }),
|
||||
).toBeVisible();
|
||||
await expect(
|
||||
page.getByRole("menuitem", { name: /about/i }),
|
||||
).toBeVisible();
|
||||
});
|
||||
|
||||
test(`authentication elements visibility at ${bp.name}`, async ({
|
||||
@@ -59,12 +63,14 @@ for (const bp of breakpoints) {
|
||||
// TODO: Fix logo visibility test - currently all logos are hidden at xs breakpoint
|
||||
// Logo should be visible at all breakpoints
|
||||
// Look for any visible logo text in the header navigation
|
||||
const logos = page.getByRole("navigation", { name: /main navigation/i }).getByText("CommunityRule");
|
||||
const logos = page
|
||||
.getByRole("navigation", { name: /main navigation/i })
|
||||
.getByText("CommunityRule");
|
||||
const logoCount = await logos.count();
|
||||
|
||||
|
||||
// At least one logo should be visible
|
||||
expect(logoCount).toBeGreaterThan(0);
|
||||
|
||||
|
||||
// Check that at least one logo is visible (not all are hidden)
|
||||
let hasVisibleLogo = false;
|
||||
for (let i = 0; i < logoCount; i++) {
|
||||
|
||||
+40
-40
@@ -12,19 +12,19 @@ test.describe("Homepage", () => {
|
||||
|
||||
// Check main sections are present
|
||||
await expect(
|
||||
page.locator("h1, h2").filter({ hasText: "Collaborate" })
|
||||
page.locator("h1, h2").filter({ hasText: "Collaborate" }),
|
||||
).toBeVisible();
|
||||
await expect(
|
||||
page.locator("h2").filter({ hasText: "How CommunityRule works" })
|
||||
page.locator("h2").filter({ hasText: "How CommunityRule works" }),
|
||||
).toBeVisible();
|
||||
await expect(
|
||||
page.locator("h1").filter({ hasText: "We've got your back" })
|
||||
page.locator("h1").filter({ hasText: "We've got your back" }),
|
||||
).toBeVisible();
|
||||
|
||||
// Check key components are rendered
|
||||
await expect(page.locator('img[alt="Hero illustration"]')).toBeVisible();
|
||||
await expect(
|
||||
page.locator("text=Trusted by leading cooperators")
|
||||
page.locator("text=Trusted by leading cooperators"),
|
||||
).toBeVisible();
|
||||
await expect(page.locator("text=Jo Freeman")).toBeVisible();
|
||||
});
|
||||
@@ -34,12 +34,12 @@ test.describe("Homepage", () => {
|
||||
await expect(page.locator("text=Collaborate")).toBeVisible();
|
||||
await expect(page.locator("text=with clarity")).toBeVisible();
|
||||
await expect(
|
||||
page.locator("text=Help your community make important decisions")
|
||||
page.locator("text=Help your community make important decisions"),
|
||||
).toBeVisible();
|
||||
|
||||
// Check CTA button
|
||||
const learnButtons = page.locator(
|
||||
'button:has-text("Learn how CommunityRule works")'
|
||||
'button:has-text("Learn how CommunityRule works")',
|
||||
);
|
||||
const buttonCount = await learnButtons.count();
|
||||
let visibleButton = null;
|
||||
@@ -54,7 +54,7 @@ test.describe("Homepage", () => {
|
||||
|
||||
if (!visibleButton) {
|
||||
throw new Error(
|
||||
'No visible "Learn how CommunityRule works" button found'
|
||||
'No visible "Learn how CommunityRule works" button found',
|
||||
);
|
||||
}
|
||||
|
||||
@@ -64,14 +64,14 @@ test.describe("Homepage", () => {
|
||||
await visibleButton.click();
|
||||
// Should scroll to the numbered cards section
|
||||
await expect(
|
||||
page.locator('h2:has-text("How CommunityRule works")')
|
||||
page.locator('h2:has-text("How CommunityRule works")'),
|
||||
).toBeVisible();
|
||||
});
|
||||
|
||||
test("logo wall section displays correctly", async ({ page }) => {
|
||||
// Check section label
|
||||
await expect(
|
||||
page.locator("text=Trusted by leading cooperators")
|
||||
page.locator("text=Trusted by leading cooperators"),
|
||||
).toBeVisible();
|
||||
|
||||
// Check logos are present
|
||||
@@ -95,23 +95,23 @@ test.describe("Homepage", () => {
|
||||
test("numbered cards section functionality", async ({ page }) => {
|
||||
// Check section header
|
||||
await expect(
|
||||
page.locator('h2:has-text("How CommunityRule works")')
|
||||
page.locator('h2:has-text("How CommunityRule works")'),
|
||||
).toBeVisible();
|
||||
await expect(
|
||||
page.locator("text=Here's a quick overview of the process")
|
||||
page.locator("text=Here's a quick overview of the process"),
|
||||
).toBeVisible();
|
||||
|
||||
// Check all three cards are present
|
||||
await expect(
|
||||
page.locator("text=Document how your community makes decisions")
|
||||
page.locator("text=Document how your community makes decisions"),
|
||||
).toBeVisible();
|
||||
await expect(
|
||||
page.locator("text=Build an operating manual for a successful community")
|
||||
page.locator("text=Build an operating manual for a successful community"),
|
||||
).toBeVisible();
|
||||
await expect(
|
||||
page.locator(
|
||||
"text=Get a link to your manual for your group to review and evolve"
|
||||
)
|
||||
"text=Get a link to your manual for your group to review and evolve",
|
||||
),
|
||||
).toBeVisible();
|
||||
|
||||
// Check numbered indicators - target the specific numbered cards section
|
||||
@@ -119,18 +119,18 @@ test.describe("Homepage", () => {
|
||||
.locator("section")
|
||||
.filter({ has: page.locator('h2:has-text("How CommunityRule works")') });
|
||||
await expect(
|
||||
numberedCardsSection.locator("span").filter({ hasText: "1" }).first()
|
||||
numberedCardsSection.locator("span").filter({ hasText: "1" }).first(),
|
||||
).toBeVisible();
|
||||
await expect(
|
||||
numberedCardsSection.locator("span").filter({ hasText: "2" }).first()
|
||||
numberedCardsSection.locator("span").filter({ hasText: "2" }).first(),
|
||||
).toBeVisible();
|
||||
await expect(
|
||||
numberedCardsSection.locator("span").filter({ hasText: "3" }).first()
|
||||
numberedCardsSection.locator("span").filter({ hasText: "3" }).first(),
|
||||
).toBeVisible();
|
||||
|
||||
// Check CTA buttons
|
||||
const createButtons = page.locator(
|
||||
'button:has-text("Create CommunityRule")'
|
||||
'button:has-text("Create CommunityRule")',
|
||||
);
|
||||
const createButtonCount = await createButtons.count();
|
||||
let visibleCreateButton = null;
|
||||
@@ -148,7 +148,7 @@ test.describe("Homepage", () => {
|
||||
}
|
||||
|
||||
await expect(
|
||||
page.locator('button:has-text("See how it works")')
|
||||
page.locator('button:has-text("See how it works")'),
|
||||
).toBeVisible();
|
||||
});
|
||||
|
||||
@@ -161,16 +161,16 @@ test.describe("Homepage", () => {
|
||||
|
||||
// Check rule descriptions
|
||||
await expect(
|
||||
page.locator("text=Units called Circles have the ability to decide")
|
||||
page.locator("text=Units called Circles have the ability to decide"),
|
||||
).toBeVisible();
|
||||
await expect(
|
||||
page.locator("text=Decisions that affect the group collectively")
|
||||
page.locator("text=Decisions that affect the group collectively"),
|
||||
).toBeVisible();
|
||||
await expect(
|
||||
page.locator("text=An elected board determines policies")
|
||||
page.locator("text=An elected board determines policies"),
|
||||
).toBeVisible();
|
||||
await expect(
|
||||
page.locator("text=All participants can propose and vote")
|
||||
page.locator("text=All participants can propose and vote"),
|
||||
).toBeVisible();
|
||||
|
||||
// Test card interactions
|
||||
@@ -180,19 +180,19 @@ test.describe("Homepage", () => {
|
||||
|
||||
// Check "See all templates" button
|
||||
await expect(
|
||||
page.locator('button:has-text("See all templates")')
|
||||
page.locator('button:has-text("See all templates")'),
|
||||
).toBeVisible();
|
||||
});
|
||||
|
||||
test("feature grid section functionality", async ({ page }) => {
|
||||
// Check section header
|
||||
await expect(
|
||||
page.locator('h1:has-text("We\'ve got your back")')
|
||||
page.locator('h1:has-text("We\'ve got your back")'),
|
||||
).toBeVisible();
|
||||
await expect(
|
||||
page.locator(
|
||||
"text=Use our toolkit to improve, document, and evolve your organization"
|
||||
)
|
||||
"text=Use our toolkit to improve, document, and evolve your organization",
|
||||
),
|
||||
).toBeVisible();
|
||||
|
||||
// Check all four feature cards - use more specific selectors to avoid conflicts
|
||||
@@ -214,23 +214,23 @@ test.describe("Homepage", () => {
|
||||
test("quote block section displays correctly", async ({ page }) => {
|
||||
// Check quote content
|
||||
await expect(
|
||||
page.locator("text=The rules of decision-making must be open")
|
||||
page.locator("text=The rules of decision-making must be open"),
|
||||
).toBeVisible();
|
||||
|
||||
// Check author and source
|
||||
await expect(page.locator("text=Jo Freeman")).toBeVisible();
|
||||
await expect(
|
||||
page.locator("text=The Tyranny of Structurelessness")
|
||||
page.locator("text=The Tyranny of Structurelessness"),
|
||||
).toBeVisible();
|
||||
|
||||
// Check avatar
|
||||
await expect(
|
||||
page.locator('img[alt="Portrait of Jo Freeman"]')
|
||||
page.locator('img[alt="Portrait of Jo Freeman"]'),
|
||||
).toBeVisible();
|
||||
|
||||
// Check decorative elements
|
||||
await expect(
|
||||
page.locator('[class*="pointer-events-none absolute z-0"]').first()
|
||||
page.locator('[class*="pointer-events-none absolute z-0"]').first(),
|
||||
).toBeVisible();
|
||||
});
|
||||
|
||||
@@ -238,7 +238,7 @@ test.describe("Homepage", () => {
|
||||
// Check section content
|
||||
await expect(page.locator("text=Still have questions?")).toBeVisible();
|
||||
await expect(
|
||||
page.locator("text=Get answers from an experienced organizer")
|
||||
page.locator("text=Get answers from an experienced organizer"),
|
||||
).toBeVisible();
|
||||
|
||||
// Check CTA button (it's actually a link)
|
||||
@@ -295,19 +295,19 @@ test.describe("Homepage", () => {
|
||||
// Test mobile viewport
|
||||
await page.setViewportSize({ width: 375, height: 667 });
|
||||
await expect(
|
||||
page.locator("h1, h2").filter({ hasText: "Collaborate" })
|
||||
page.locator("h1, h2").filter({ hasText: "Collaborate" }),
|
||||
).toBeVisible();
|
||||
|
||||
// Test tablet viewport
|
||||
await page.setViewportSize({ width: 768, height: 1024 });
|
||||
await expect(
|
||||
page.locator("h1, h2").filter({ hasText: "Collaborate" })
|
||||
page.locator("h1, h2").filter({ hasText: "Collaborate" }),
|
||||
).toBeVisible();
|
||||
|
||||
// Test desktop viewport
|
||||
await page.setViewportSize({ width: 1440, height: 900 });
|
||||
await expect(
|
||||
page.locator("h1, h2").filter({ hasText: "Collaborate" })
|
||||
page.locator("h1, h2").filter({ hasText: "Collaborate" }),
|
||||
).toBeVisible();
|
||||
});
|
||||
|
||||
@@ -371,7 +371,7 @@ test.describe("Homepage", () => {
|
||||
test("scroll behavior and smooth scrolling", async ({ page }) => {
|
||||
// Test smooth scrolling to sections
|
||||
const learnButtons = page.locator(
|
||||
'button:has-text("Learn how CommunityRule works")'
|
||||
'button:has-text("Learn how CommunityRule works")',
|
||||
);
|
||||
const buttonCount = await learnButtons.count();
|
||||
let visibleButton = null;
|
||||
@@ -386,7 +386,7 @@ test.describe("Homepage", () => {
|
||||
|
||||
if (!visibleButton) {
|
||||
throw new Error(
|
||||
'No visible "Learn how CommunityRule works" button found'
|
||||
'No visible "Learn how CommunityRule works" button found',
|
||||
);
|
||||
}
|
||||
|
||||
@@ -397,7 +397,7 @@ test.describe("Homepage", () => {
|
||||
|
||||
// Check we're at the numbered cards section
|
||||
await expect(
|
||||
page.locator('h2:has-text("How CommunityRule works")')
|
||||
page.locator('h2:has-text("How CommunityRule works")'),
|
||||
).toBeVisible();
|
||||
});
|
||||
|
||||
@@ -414,7 +414,7 @@ test.describe("Homepage", () => {
|
||||
const brokenImages = await page.evaluate(() => {
|
||||
const imgs = document.querySelectorAll("img");
|
||||
return Array.from(imgs).filter(
|
||||
(img) => !img.complete || img.naturalWidth === 0
|
||||
(img) => !img.complete || img.naturalWidth === 0,
|
||||
);
|
||||
});
|
||||
|
||||
|
||||
@@ -65,7 +65,7 @@ test.describe("Performance Monitoring", () => {
|
||||
// Assert individual metrics
|
||||
expect(result.metrics.ttfb).toBeLessThan(PERFORMANCE_BUDGETS.ttfb);
|
||||
expect(result.metrics.domContentLoaded).toBeLessThan(
|
||||
PERFORMANCE_BUDGETS.dom_content_loaded
|
||||
PERFORMANCE_BUDGETS.dom_content_loaded,
|
||||
);
|
||||
expect(result.metrics.load).toBeLessThan(PERFORMANCE_BUDGETS.full_load);
|
||||
|
||||
@@ -121,10 +121,10 @@ test.describe("Performance Monitoring", () => {
|
||||
|
||||
// Assert Core Web Vitals are within acceptable ranges
|
||||
expect(coreWebVitals.lcp).toBeLessThan(
|
||||
PERFORMANCE_BUDGETS.largest_contentful_paint
|
||||
PERFORMANCE_BUDGETS.largest_contentful_paint,
|
||||
);
|
||||
expect(coreWebVitals.fid).toBeLessThan(
|
||||
PERFORMANCE_BUDGETS.first_input_delay
|
||||
PERFORMANCE_BUDGETS.first_input_delay,
|
||||
);
|
||||
expect(coreWebVitals.cls).toBeLessThan(0.1); // CLS should be less than 0.1
|
||||
});
|
||||
@@ -133,27 +133,24 @@ test.describe("Performance Monitoring", () => {
|
||||
await page.goto("/");
|
||||
|
||||
// Measure header render time
|
||||
const headerRenderTime = await performanceMonitor.measureComponentRender(
|
||||
"header"
|
||||
);
|
||||
const headerRenderTime =
|
||||
await performanceMonitor.measureComponentRender("header");
|
||||
expect(headerRenderTime).toBeLessThan(
|
||||
PERFORMANCE_BUDGETS.component_render_time
|
||||
PERFORMANCE_BUDGETS.component_render_time,
|
||||
);
|
||||
|
||||
// Measure footer render time
|
||||
const footerRenderTime = await performanceMonitor.measureComponentRender(
|
||||
"footer"
|
||||
);
|
||||
const footerRenderTime =
|
||||
await performanceMonitor.measureComponentRender("footer");
|
||||
expect(footerRenderTime).toBeLessThan(
|
||||
PERFORMANCE_BUDGETS.component_render_time
|
||||
PERFORMANCE_BUDGETS.component_render_time,
|
||||
);
|
||||
|
||||
// Measure main content render time
|
||||
const mainRenderTime = await performanceMonitor.measureComponentRender(
|
||||
"main"
|
||||
);
|
||||
const mainRenderTime =
|
||||
await performanceMonitor.measureComponentRender("main");
|
||||
expect(mainRenderTime).toBeLessThan(
|
||||
PERFORMANCE_BUDGETS.component_render_time
|
||||
PERFORMANCE_BUDGETS.component_render_time,
|
||||
);
|
||||
});
|
||||
|
||||
@@ -168,7 +165,7 @@ test.describe("Performance Monitoring", () => {
|
||||
'button:has-text("Learn how CommunityRule works")',
|
||||
async () => {
|
||||
const learnButtons = page.locator(
|
||||
'button:has-text("Learn how CommunityRule works")'
|
||||
'button:has-text("Learn how CommunityRule works")',
|
||||
);
|
||||
const buttonCount = await learnButtons.count();
|
||||
let visibleButton = null;
|
||||
@@ -183,12 +180,12 @@ test.describe("Performance Monitoring", () => {
|
||||
|
||||
if (!visibleButton) {
|
||||
throw new Error(
|
||||
'No visible "Learn how CommunityRule works" button found'
|
||||
'No visible "Learn how CommunityRule works" button found',
|
||||
);
|
||||
}
|
||||
|
||||
await visibleButton.click();
|
||||
}
|
||||
},
|
||||
);
|
||||
expect(buttonClickTime).toBeLessThan(PERFORMANCE_BUDGETS.interaction_time);
|
||||
|
||||
@@ -213,7 +210,7 @@ test.describe("Performance Monitoring", () => {
|
||||
}
|
||||
|
||||
await visibleLink.click();
|
||||
}
|
||||
},
|
||||
);
|
||||
expect(linkClickTime).toBeLessThan(PERFORMANCE_BUDGETS.interaction_time);
|
||||
});
|
||||
@@ -250,7 +247,7 @@ test.describe("Performance Monitoring", () => {
|
||||
const summary = performanceMonitor.getSummary();
|
||||
if (summary.network_request_duration) {
|
||||
expect(summary.network_request_duration.average).toBeLessThan(
|
||||
PERFORMANCE_BUDGETS.network_request_duration
|
||||
PERFORMANCE_BUDGETS.network_request_duration,
|
||||
);
|
||||
}
|
||||
});
|
||||
@@ -293,7 +290,7 @@ test.describe("Performance Monitoring", () => {
|
||||
|
||||
// Even under load, page should load within reasonable time
|
||||
expect(result.loadTime).toBeLessThan(
|
||||
PERFORMANCE_BUDGETS.page_load_time * 1.5
|
||||
PERFORMANCE_BUDGETS.page_load_time * 1.5,
|
||||
);
|
||||
});
|
||||
|
||||
@@ -343,7 +340,7 @@ test.describe("Performance Monitoring", () => {
|
||||
|
||||
console.log(
|
||||
"Exported Performance Data:",
|
||||
JSON.stringify(exportedData, null, 2)
|
||||
JSON.stringify(exportedData, null, 2),
|
||||
);
|
||||
});
|
||||
|
||||
@@ -402,7 +399,7 @@ test.describe("Performance Regression Testing", () => {
|
||||
const variance =
|
||||
results.reduce(
|
||||
(acc, val) => acc + Math.pow(val - averageLoadTime, 2),
|
||||
0
|
||||
0,
|
||||
) / results.length;
|
||||
|
||||
// Performance should be consistent (low variance)
|
||||
|
||||
@@ -11,7 +11,7 @@ test.describe("User Journeys", () => {
|
||||
|
||||
// 2. User reads hero section
|
||||
await expect(
|
||||
page.locator("text=Help your community make important decisions")
|
||||
page.locator("text=Help your community make important decisions"),
|
||||
).toBeVisible();
|
||||
|
||||
// 3. User clicks CTA to learn more
|
||||
@@ -24,20 +24,20 @@ test.describe("User Journeys", () => {
|
||||
|
||||
// 4. User scrolls to numbered cards section
|
||||
await expect(
|
||||
page.locator('h2:has-text("How CommunityRule works")')
|
||||
page.locator('h2:has-text("How CommunityRule works")'),
|
||||
).toBeVisible();
|
||||
|
||||
// 5. User reads the process steps
|
||||
await expect(
|
||||
page.locator("text=Document how your community makes decisions")
|
||||
page.locator("text=Document how your community makes decisions"),
|
||||
).toBeVisible();
|
||||
await expect(
|
||||
page.locator("text=Build an operating manual for a successful community")
|
||||
page.locator("text=Build an operating manual for a successful community"),
|
||||
).toBeVisible();
|
||||
await expect(
|
||||
page.locator(
|
||||
"text=Get a link to your manual for your group to review and evolve"
|
||||
)
|
||||
"text=Get a link to your manual for your group to review and evolve",
|
||||
),
|
||||
).toBeVisible();
|
||||
|
||||
// 6. User explores rule templates
|
||||
@@ -78,7 +78,7 @@ test.describe("User Journeys", () => {
|
||||
|
||||
// 10. User creates CommunityRule
|
||||
const createButton = page.locator(
|
||||
'button:has-text("Create CommunityRule")'
|
||||
'button:has-text("Create CommunityRule")',
|
||||
);
|
||||
if (
|
||||
(await createButton.count()) > 0 &&
|
||||
@@ -139,7 +139,7 @@ test.describe("User Journeys", () => {
|
||||
|
||||
// Read the section
|
||||
await expect(
|
||||
page.locator("text=Get answers from an experienced organizer")
|
||||
page.locator("text=Get answers from an experienced organizer"),
|
||||
).toBeVisible();
|
||||
|
||||
// Click contact button - check if it exists and is visible first
|
||||
@@ -158,7 +158,7 @@ test.describe("User Journeys", () => {
|
||||
test("user journey: create CommunityRule", async ({ page }) => {
|
||||
// Simplified approach - just check if the button exists and is visible
|
||||
const createButton = page.locator(
|
||||
'button:has-text("Create CommunityRule")'
|
||||
'button:has-text("Create CommunityRule")',
|
||||
);
|
||||
|
||||
if (
|
||||
@@ -183,7 +183,7 @@ test.describe("User Journeys", () => {
|
||||
// User starts by reading the hero section
|
||||
await expect(page.locator("text=Collaborate")).toBeVisible();
|
||||
await expect(
|
||||
page.locator("text=Help your community make important decisions")
|
||||
page.locator("text=Help your community make important decisions"),
|
||||
).toBeVisible();
|
||||
|
||||
// User scrolls down to learn about how CommunityRule works
|
||||
@@ -191,20 +191,20 @@ test.describe("User Journeys", () => {
|
||||
.locator('h2:has-text("How CommunityRule works")')
|
||||
.scrollIntoViewIfNeeded();
|
||||
await expect(
|
||||
page.locator('h2:has-text("How CommunityRule works")')
|
||||
page.locator('h2:has-text("How CommunityRule works")'),
|
||||
).toBeVisible();
|
||||
|
||||
// User reads the process steps
|
||||
await expect(
|
||||
page.locator("text=Document how your community makes decisions")
|
||||
page.locator("text=Document how your community makes decisions"),
|
||||
).toBeVisible();
|
||||
await expect(
|
||||
page.locator("text=Build an operating manual for a successful community")
|
||||
page.locator("text=Build an operating manual for a successful community"),
|
||||
).toBeVisible();
|
||||
await expect(
|
||||
page.locator(
|
||||
"text=Get a link to your manual for your group to review and evolve"
|
||||
)
|
||||
"text=Get a link to your manual for your group to review and evolve",
|
||||
),
|
||||
).toBeVisible();
|
||||
|
||||
// User explores rule templates
|
||||
@@ -215,7 +215,7 @@ test.describe("User Journeys", () => {
|
||||
|
||||
// User has successfully learned about how CommunityRule works
|
||||
await expect(
|
||||
page.locator("text=We've got your back, every step of the way")
|
||||
page.locator("text=We've got your back, every step of the way"),
|
||||
).toBeVisible();
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user