summaryrefslogtreecommitdiff
path: root/packages/integrations/prefetch/test
diff options
context:
space:
mode:
Diffstat (limited to 'packages/integrations/prefetch/test')
-rw-r--r--packages/integrations/prefetch/test/basic-prefetch.test.js64
-rw-r--r--packages/integrations/prefetch/test/custom-selectors.test.js72
-rw-r--r--packages/integrations/prefetch/test/fixtures/basic-prefetch/astro.config.mjs7
-rw-r--r--packages/integrations/prefetch/test/fixtures/basic-prefetch/package.json9
-rw-r--r--packages/integrations/prefetch/test/fixtures/basic-prefetch/src/pages/about.astro11
-rw-r--r--packages/integrations/prefetch/test/fixtures/basic-prefetch/src/pages/admin.astro11
-rw-r--r--packages/integrations/prefetch/test/fixtures/basic-prefetch/src/pages/contact.astro11
-rw-r--r--packages/integrations/prefetch/test/fixtures/basic-prefetch/src/pages/index.astro26
-rw-r--r--packages/integrations/prefetch/test/test-utils.js31
9 files changed, 242 insertions, 0 deletions
diff --git a/packages/integrations/prefetch/test/basic-prefetch.test.js b/packages/integrations/prefetch/test/basic-prefetch.test.js
new file mode 100644
index 000000000..897c00590
--- /dev/null
+++ b/packages/integrations/prefetch/test/basic-prefetch.test.js
@@ -0,0 +1,64 @@
+import { expect } from '@playwright/test';
+import { testFactory } from './test-utils.js';
+
+const test = testFactory({ root: './fixtures/basic-prefetch/' });
+
+test.describe('Basic prefetch', () => {
+ test.describe('dev', () => {
+ let devServer;
+
+ test.beforeEach(async ({ astro }) => {
+ devServer = await astro.startDevServer();
+ });
+
+ test.afterEach(async () => {
+ await devServer.stop();
+ });
+
+ test.describe('prefetches rel="prefetch" links', () => {
+ test('skips /admin', async ({ page, astro }) => {
+ const requests = new Set();
+
+ page.on('request', async (request) => requests.add(request.url()));
+
+ await page.goto(astro.resolveUrl('/'));
+
+ await page.waitForLoadState('networkidle');
+
+ await expect(requests.has(astro.resolveUrl('/about')), '/about was prefetched').toBeTruthy();
+ await expect(requests.has(astro.resolveUrl('/contact')), '/contact was prefetched').toBeTruthy();
+ await expect(requests.has(astro.resolveUrl('/admin')), '/admin was skipped').toBeFalsy();
+ });
+ });
+ });
+
+ test.describe('build', () => {
+ let previewServer;
+
+ test.beforeAll(async ({ astro }) => {
+ await astro.build();
+ previewServer = await astro.preview();
+ });
+
+ // important: close preview server (free up port and connection)
+ test.afterAll(async () => {
+ await previewServer.stop();
+ });
+
+ test.describe('prefetches rel="prefetch" links', () => {
+ test('skips /admin', async ({ page, astro }) => {
+ const requests = new Set();
+
+ page.on('request', async (request) => requests.add(request.url()));
+
+ await page.goto(astro.resolveUrl('/'));
+
+ await page.waitForLoadState('networkidle');
+
+ await expect(requests.has(astro.resolveUrl('/about')), '/about was prefetched').toBeTruthy();
+ await expect(requests.has(astro.resolveUrl('/contact')), '/contact was prefetched').toBeTruthy();
+ await expect(requests.has(astro.resolveUrl('/admin')), '/admin was skipped').toBeFalsy();
+ });
+ });
+ });
+});
diff --git a/packages/integrations/prefetch/test/custom-selectors.test.js b/packages/integrations/prefetch/test/custom-selectors.test.js
new file mode 100644
index 000000000..2ed5b9753
--- /dev/null
+++ b/packages/integrations/prefetch/test/custom-selectors.test.js
@@ -0,0 +1,72 @@
+import { expect } from '@playwright/test';
+import { testFactory } from './test-utils.js';
+import prefetch from '../dist/index.js';
+
+const test = testFactory({
+ root: './fixtures/basic-prefetch/',
+ integrations: [
+ prefetch({
+ selector: 'a[href="/contact"]'
+ }),
+ ]
+});
+
+test.describe('Custom prefetch selectors', () => {
+ test.describe('dev', () => {
+ let devServer;
+
+ test.beforeEach(async ({ astro }) => {
+ devServer = await astro.startDevServer();
+ });
+
+ test.afterEach(async () => {
+ await devServer.stop();
+ });
+
+ test.describe('prefetches links by custom selector', () => {
+ test('only prefetches /contact', async ({ page, astro }) => {
+ const requests = new Set();
+
+ page.on('request', async (request) => requests.add(request.url()));
+
+ await page.goto(astro.resolveUrl('/'));
+
+ await page.waitForLoadState('networkidle');
+
+ await expect(requests.has(astro.resolveUrl('/about')), '/about was skipped').toBeFalsy();
+ await expect(requests.has(astro.resolveUrl('/contact')), '/contact was prefetched').toBeTruthy();
+ await expect(requests.has(astro.resolveUrl('/admin')), '/admin was skipped').toBeFalsy();
+ });
+ });
+ });
+
+ test.describe('build', () => {
+ let previewServer;
+
+ test.beforeAll(async ({ astro }) => {
+ await astro.build();
+ previewServer = await astro.preview();
+ });
+
+ // important: close preview server (free up port and connection)
+ test.afterAll(async () => {
+ await previewServer.stop();
+ });
+
+ test.describe('prefetches links by custom selector', () => {
+ test('only prefetches /contact', async ({ page, astro }) => {
+ const requests = new Set();
+
+ page.on('request', async (request) => requests.add(request.url()));
+
+ await page.goto(astro.resolveUrl('/'));
+
+ await page.waitForLoadState('networkidle');
+
+ await expect(requests.has(astro.resolveUrl('/about')), '/about was skipped').toBeFalsy();
+ await expect(requests.has(astro.resolveUrl('/contact')), '/contact was prefetched').toBeTruthy();
+ await expect(requests.has(astro.resolveUrl('/admin')), '/admin was skipped').toBeFalsy();
+ });
+ });
+ });
+});
diff --git a/packages/integrations/prefetch/test/fixtures/basic-prefetch/astro.config.mjs b/packages/integrations/prefetch/test/fixtures/basic-prefetch/astro.config.mjs
new file mode 100644
index 000000000..092813b22
--- /dev/null
+++ b/packages/integrations/prefetch/test/fixtures/basic-prefetch/astro.config.mjs
@@ -0,0 +1,7 @@
+import { defineConfig } from 'astro/config';
+import prefetch from '@astrojs/prefetch';
+
+// https://astro.build/config
+export default defineConfig({
+ integrations: [prefetch()],
+});
diff --git a/packages/integrations/prefetch/test/fixtures/basic-prefetch/package.json b/packages/integrations/prefetch/test/fixtures/basic-prefetch/package.json
new file mode 100644
index 000000000..cf10d7471
--- /dev/null
+++ b/packages/integrations/prefetch/test/fixtures/basic-prefetch/package.json
@@ -0,0 +1,9 @@
+{
+ "name": "@test/astro-prefetch",
+ "version": "0.0.0",
+ "private": true,
+ "dependencies": {
+ "@astrojs/prefetch": "workspace:*",
+ "astro": "workspace:*"
+ }
+}
diff --git a/packages/integrations/prefetch/test/fixtures/basic-prefetch/src/pages/about.astro b/packages/integrations/prefetch/test/fixtures/basic-prefetch/src/pages/about.astro
new file mode 100644
index 000000000..dc2aeb8fe
--- /dev/null
+++ b/packages/integrations/prefetch/test/fixtures/basic-prefetch/src/pages/about.astro
@@ -0,0 +1,11 @@
+---
+---
+
+<html>
+<head>
+<title>About Us</title>
+</head>
+<body>
+ <h1>About Us</h1>
+</body>
+</html>
diff --git a/packages/integrations/prefetch/test/fixtures/basic-prefetch/src/pages/admin.astro b/packages/integrations/prefetch/test/fixtures/basic-prefetch/src/pages/admin.astro
new file mode 100644
index 000000000..7e44fc97d
--- /dev/null
+++ b/packages/integrations/prefetch/test/fixtures/basic-prefetch/src/pages/admin.astro
@@ -0,0 +1,11 @@
+---
+---
+
+<html>
+<head>
+<title>Admin</title>
+</head>
+<body>
+ <h1>Admin</h1>
+</body>
+</html>
diff --git a/packages/integrations/prefetch/test/fixtures/basic-prefetch/src/pages/contact.astro b/packages/integrations/prefetch/test/fixtures/basic-prefetch/src/pages/contact.astro
new file mode 100644
index 000000000..b565db912
--- /dev/null
+++ b/packages/integrations/prefetch/test/fixtures/basic-prefetch/src/pages/contact.astro
@@ -0,0 +1,11 @@
+---
+---
+
+<html>
+<head>
+<title>Contact Us</title>
+</head>
+<body>
+ <h1>Contact Us</h1>
+</body>
+</html>
diff --git a/packages/integrations/prefetch/test/fixtures/basic-prefetch/src/pages/index.astro b/packages/integrations/prefetch/test/fixtures/basic-prefetch/src/pages/index.astro
new file mode 100644
index 000000000..d2c674ebc
--- /dev/null
+++ b/packages/integrations/prefetch/test/fixtures/basic-prefetch/src/pages/index.astro
@@ -0,0 +1,26 @@
+---
+---
+
+<html>
+<head>
+<title>Home</title>
+</head>
+<body>
+ <h1>Home</h1>
+
+ <nav>
+ <ul>
+ <li>
+ <a href="/about" rel="prefetch">About</a>
+ </li>
+ <li>
+ <a href="/admin">Admin</a>
+ </li>
+ </ul>
+ </nav>
+
+ <footer>
+ <a href="/contact" rel="prefetch">Contact</a>
+ </footer>
+</body>
+</html>
diff --git a/packages/integrations/prefetch/test/test-utils.js b/packages/integrations/prefetch/test/test-utils.js
new file mode 100644
index 000000000..198ecaafa
--- /dev/null
+++ b/packages/integrations/prefetch/test/test-utils.js
@@ -0,0 +1,31 @@
+import { test as testBase } from '@playwright/test';
+import { loadFixture as baseLoadFixture } from '../../../astro/test/test-utils.js';
+
+export function loadFixture(inlineConfig) {
+ if (!inlineConfig || !inlineConfig.root)
+ throw new Error("Must provide { root: './fixtures/...' }");
+
+ // resolve the relative root (i.e. "./fixtures/tailwindcss") to a full filepath
+ // without this, the main `loadFixture` helper will resolve relative to `packages/astro/test`
+ return baseLoadFixture({
+ ...inlineConfig,
+ root: new URL(inlineConfig.root, import.meta.url).toString(),
+ });
+}
+
+export function testFactory(inlineConfig) {
+ let fixture;
+
+ const test = testBase.extend({
+ astro: async ({}, use) => {
+ fixture = await loadFixture(inlineConfig);
+ await use(fixture);
+ },
+ });
+
+ test.afterEach(() => {
+ fixture.resetAllFiles();
+ });
+
+ return test;
+}