Skip to content
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
280 changes: 140 additions & 140 deletions tests/e2e/tests/roadmap.basic.spec.ts
Original file line number Diff line number Diff line change
@@ -1,188 +1,188 @@
import { expect, test } from '@e2e/fixtures';

test.describe('Roadmap — auth-required page', () => {
test.describe('Roadmap', () => {
test.describe.configure({ mode: 'serial' });

test.beforeEach(async ({ laravel }) => {
await laravel.callFunction('Modules\\Roadmap\\Tests\\Support\\RoadmapTestHelper::clean');
});

test('guest is redirected to login page', async ({ page }) => {
await page.goto('/roadmap');
test.describe('Roadmap — auth-required page', () => {
test.beforeEach(async ({ laravel }) => {
await laravel.callFunction('Modules\\Roadmap\\Tests\\Support\\RoadmapTestHelper::clean');
});

await expect(page).toHaveURL(/login/);
});
test('guest is redirected to login page', async ({ page }) => {
await page.goto('/roadmap');

test('approved item is visible on the roadmap', async ({ page, laravel, credentials, loginAs }) => {
await laravel.factory('Modules\\Roadmap\\Models\\RoadmapItem', {
title: 'Dark mode support',
status: 'approved',
type: 'feature',
await expect(page).toHaveURL(/login/);
});

await loginAs(credentials.user);
await page.goto('/roadmap');
await page.waitForLoadState('networkidle');
test('approved item is visible on the roadmap', async ({ page, laravel, credentials, loginAs }) => {
await laravel.factory('Modules\\Roadmap\\Models\\RoadmapItem', {
title: 'Dark mode support',
status: 'approved',
type: 'feature',
});

await expect(page.getByText('Dark mode support')).toBeVisible();
});
await loginAs(credentials.user);
await page.goto('/roadmap');
await page.waitForLoadState('networkidle');

test('pending approval item is not visible on the roadmap', async ({ page, laravel, credentials, loginAs }) => {
await laravel.factory('Modules\\Roadmap\\Models\\RoadmapItem', {
title: 'Hidden suggestion',
status: 'pending_approval',
type: 'feature',
await expect(page.getByText('Dark mode support')).toBeVisible();
});

await loginAs(credentials.user);
await page.goto('/roadmap');
test('pending approval item is not visible on the roadmap', async ({ page, laravel, credentials, loginAs }) => {
await laravel.factory('Modules\\Roadmap\\Models\\RoadmapItem', {
title: 'Hidden suggestion',
status: 'pending_approval',
type: 'feature',
});

await expect(page.getByText('Hidden suggestion')).not.toBeVisible();
});
await loginAs(credentials.user);
await page.goto('/roadmap');

test('rejected item is not visible on the roadmap', async ({ page, laravel, credentials, loginAs }) => {
await laravel.factory('Modules\\Roadmap\\Models\\RoadmapItem', {
title: 'Rejected idea',
status: 'rejected',
type: 'feature',
await expect(page.getByText('Hidden suggestion')).not.toBeVisible();
});

await loginAs(credentials.user);
await page.goto('/roadmap');
test('rejected item is not visible on the roadmap', async ({ page, laravel, credentials, loginAs }) => {
await laravel.factory('Modules\\Roadmap\\Models\\RoadmapItem', {
title: 'Rejected idea',
status: 'rejected',
type: 'feature',
});

await expect(page.getByText('Rejected idea')).not.toBeVisible();
});
await loginAs(credentials.user);
await page.goto('/roadmap');

test('in_progress item is visible on the roadmap', async ({ page, laravel, credentials, loginAs }) => {
await laravel.factory('Modules\\Roadmap\\Models\\RoadmapItem', {
title: 'Work in progress',
status: 'in_progress',
type: 'feature',
await expect(page.getByText('Rejected idea')).not.toBeVisible();
});

await loginAs(credentials.user);
await page.goto('/roadmap');
test('in_progress item is visible on the roadmap', async ({ page, laravel, credentials, loginAs }) => {
await laravel.factory('Modules\\Roadmap\\Models\\RoadmapItem', {
title: 'Work in progress',
status: 'in_progress',
type: 'feature',
});

await expect(page.getByText('Work in progress')).toBeVisible();
});
await loginAs(credentials.user);
await page.goto('/roadmap');

test('completed item is visible on the roadmap', async ({ page, laravel, credentials, loginAs }) => {
await laravel.factory('Modules\\Roadmap\\Models\\RoadmapItem', {
title: 'Done feature',
status: 'completed',
type: 'feature',
await expect(page.getByText('Work in progress')).toBeVisible();
});

await loginAs(credentials.user);
await page.goto('/roadmap');

await expect(page.getByText('Done feature')).toBeVisible();
});
test('completed item is visible on the roadmap', async ({ page, laravel, credentials, loginAs }) => {
await laravel.factory('Modules\\Roadmap\\Models\\RoadmapItem', {
title: 'Done feature',
status: 'completed',
type: 'feature',
});

test('authenticated user sees suggest a feature button', async ({ page, credentials, loginAs }) => {
await loginAs(credentials.user);
await page.goto('/roadmap');
await page.waitForLoadState('networkidle');
await loginAs(credentials.user);
await page.goto('/roadmap');

await expect(page.getByTestId('suggest-btn')).toBeVisible();
});
});
await expect(page.getByText('Done feature')).toBeVisible();
});

test.describe('Roadmap — voting (no page reload)', () => {
test.describe.configure({ mode: 'serial' });
test('authenticated user sees suggest a feature button', async ({ page, credentials, loginAs }) => {
await loginAs(credentials.user);
await page.goto('/roadmap');
await page.waitForLoadState('networkidle');

test.beforeEach(async ({ laravel }) => {
await laravel.callFunction('Modules\\Roadmap\\Tests\\Support\\RoadmapTestHelper::clean');
await expect(page.getByTestId('suggest-btn')).toBeVisible();
});
});

test('vote count increments instantly without full page reload', async ({
page,
laravel,
credentials,
loginAs,
}) => {
const item = await laravel.factory('Modules\\Roadmap\\Models\\RoadmapItem', {
title: 'Votable feature',
status: 'approved',
type: 'feature',
test.describe('Roadmap — voting (no page reload)', () => {
test.beforeEach(async ({ laravel }) => {
await laravel.callFunction('Modules\\Roadmap\\Tests\\Support\\RoadmapTestHelper::clean');
});

await loginAs(credentials.user);
await page.goto('/roadmap');
await page.waitForLoadState('networkidle');
test('vote count increments instantly without full page reload', async ({
page,
laravel,
credentials,
loginAs,
}) => {
const item = await laravel.factory('Modules\\Roadmap\\Models\\RoadmapItem', {
title: 'Votable feature',
status: 'approved',
type: 'feature',
});

const voteScore = page.getByTestId(`vote-score-${item.id}`);
await expect(voteScore).toHaveText('0');
await loginAs(credentials.user);
await page.goto('/roadmap');
await page.waitForLoadState('networkidle');

// Plant a marker on the window — survives Inertia SPA navigations (pushState)
// but is wiped out by a real full page reload
await page.evaluate(() => { (window as any).__noReload = true; });
const voteScore = page.getByTestId(`vote-score-${item.id}`);
await expect(voteScore).toHaveText('0');

await page.getByTestId(`upvote-btn-${item.id}`).click();
// Plant a marker on the window — survives Inertia SPA navigations (pushState)
// but is wiped out by a real full page reload
await page.evaluate(() => { (window as any).__noReload = true; });

// Score updates to 1
await expect(voteScore).toHaveText('1');
await page.getByTestId(`upvote-btn-${item.id}`).click();

// Marker must still be present — a real reload would have cleared it
expect(await page.evaluate(() => (window as any).__noReload)).toBe(true);
});
// Score updates to 1
await expect(voteScore).toHaveText('1');

test('upvote button shows active state after voting', async ({
page,
laravel,
credentials,
loginAs,
}) => {
const item = await laravel.factory('Modules\\Roadmap\\Models\\RoadmapItem', {
title: 'Active vote feature',
status: 'approved',
type: 'feature',
// Marker must still be present — a real reload would have cleared it
expect(await page.evaluate(() => (window as any).__noReload)).toBe(true);
});

await loginAs(credentials.user);
await page.goto('/roadmap');
await page.waitForLoadState('networkidle');
test('upvote button shows active state after voting', async ({
page,
laravel,
credentials,
loginAs,
}) => {
const item = await laravel.factory('Modules\\Roadmap\\Models\\RoadmapItem', {
title: 'Active vote feature',
status: 'approved',
type: 'feature',
});

const voteBox = page.getByTestId(`vote-box-${item.id}`);
await expect(voteBox).toHaveAttribute('data-user-vote', 'none');
await loginAs(credentials.user);
await page.goto('/roadmap');
await page.waitForLoadState('networkidle');

await page.getByTestId(`upvote-btn-${item.id}`).click();
const voteBox = page.getByTestId(`vote-box-${item.id}`);
await expect(voteBox).toHaveAttribute('data-user-vote', 'none');

await expect(voteBox).toHaveAttribute('data-user-vote', 'up');
});
await page.getByTestId(`upvote-btn-${item.id}`).click();

test('vote score decrements instantly when toggling upvote off', async ({
page,
laravel,
credentials,
loginAs,
}) => {
const item = await laravel.factory('Modules\\Roadmap\\Models\\RoadmapItem', {
title: 'Toggle vote feature',
status: 'approved',
type: 'feature',
await expect(voteBox).toHaveAttribute('data-user-vote', 'up');
});

await loginAs(credentials.user);
await page.goto('/roadmap');
await page.waitForLoadState('networkidle');

const upvoteBtn = page.getByTestId(`upvote-btn-${item.id}`);
const voteScore = page.getByTestId(`vote-score-${item.id}`);

// Upvote
await upvoteBtn.click();
await expect(voteScore).toHaveText('1');
await page.waitForLoadState('networkidle');

// Plant a marker — survives Inertia SPA navigations but not a full reload
await page.evaluate(() => { (window as any).__noReload = true; });

// Toggle off
await upvoteBtn.click();
await expect(voteScore).toHaveText('0');
await expect(page.getByTestId(`vote-box-${item.id}`)).toHaveAttribute('data-user-vote', 'none');

expect(await page.evaluate(() => (window as any).__noReload)).toBe(true);
test('vote score decrements instantly when toggling upvote off', async ({
page,
laravel,
credentials,
loginAs,
}) => {
const item = await laravel.factory('Modules\\Roadmap\\Models\\RoadmapItem', {
title: 'Toggle vote feature',
status: 'approved',
type: 'feature',
});

await loginAs(credentials.user);
await page.goto('/roadmap');
await page.waitForLoadState('networkidle');

const upvoteBtn = page.getByTestId(`upvote-btn-${item.id}`);
const voteScore = page.getByTestId(`vote-score-${item.id}`);

// Upvote
await upvoteBtn.click();
await expect(voteScore).toHaveText('1');
await page.waitForLoadState('networkidle');

// Plant a marker — survives Inertia SPA navigations but not a full reload
await page.evaluate(() => { (window as any).__noReload = true; });

// Toggle off
await upvoteBtn.click();
await expect(voteScore).toHaveText('0');
await expect(page.getByTestId(`vote-box-${item.id}`)).toHaveAttribute('data-user-vote', 'none');

expect(await page.evaluate(() => (window as any).__noReload)).toBe(true);
});
});
});
4 changes: 0 additions & 4 deletions tests/e2e/tests/roadmap.suggest.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,6 @@ import { expect, test } from '@e2e/fixtures';
test.describe('Roadmap — suggest a feature (dialog)', () => {
test.describe.configure({ mode: 'serial' });

test.beforeEach(async ({ laravel }) => {
await laravel.callFunction('Modules\\Roadmap\\Tests\\Support\\RoadmapTestHelper::clean');
});

test('authenticated user sees the suggest button', async ({ page, credentials, loginAs }) => {
await loginAs(credentials.user);
await page.goto('/roadmap');
Expand Down
Loading