FamilyNido — a self-hosted PWA for a single household: shared calendar, chores, meals, school agenda, health records and a family wall. One instance per family, deployable with `docker compose` on any home server. Stack: .NET 10 (ASP.NET Core Minimal APIs) + EF Core 10 + PostgreSQL 16 on the backend, Angular 21 (standalone, signals, zoneless) + Tailwind CSS v4 on the frontend, SignalR for realtime, optional OIDC alongside local credentials, integration via a versioned `/api/v1/**` public API. See README.md for the module overview and how to deploy.
22 lines
996 B
TypeScript
22 lines
996 B
TypeScript
import { expect, test } from '@playwright/test';
|
|
|
|
/**
|
|
* Dashboard smoke: visiting /home mounts the widget grid and the per-user
|
|
* widget catalogue endpoint responds. We don't assert any specific widget
|
|
* because the user can hide them all from /account — but the grid container
|
|
* should always be in the DOM so a regression that breaks the widget loop
|
|
* (e.g. a renamed signal) gets caught here.
|
|
*/
|
|
test('dashboard widget grid mounts', async ({ page }) => {
|
|
await page.goto('/home');
|
|
|
|
// The grid is the first <div> inside the main <section> with the
|
|
// grid-cols layout — assert it's there.
|
|
await expect(page.locator('section .grid.grid-cols-1.md\\:grid-cols-2').first()).toBeVisible();
|
|
|
|
// The user can also navigate to /account and verify the dashboard
|
|
// preferences UI shows up — that's the surface that drives this widget
|
|
// grid, so it's worth a sanity check.
|
|
await page.goto('/account');
|
|
await expect(page.getByText(/widgets del panel/i)).toBeVisible();
|
|
});
|