@dargmuesli/nuxt-vio-testing 13.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/e2e/specs/pages/root/error-404.spec.ts +63 -0
  2. package/e2e/specs/pages/root/error-404.spec.ts-snapshots/visual-regression-consistent-appearance-system-chromium-linux.png +0 -0
  3. package/e2e/specs/pages/root/error-404.spec.ts-snapshots/visual-regression-consistent-appearance-system-firefox-linux.png +0 -0
  4. package/e2e/specs/pages/root/error-404.spec.ts-snapshots/visual-regression-consistent-appearance-system-webkit-linux.png +0 -0
  5. package/e2e/specs/pages/root/index.spec.ts +114 -0
  6. package/e2e/specs/pages/root/index.spec.ts-snapshots/schema-org-graph-dev-chromium-linux.json +30 -0
  7. package/e2e/specs/pages/root/index.spec.ts-snapshots/schema-org-graph-dev-firefox-linux.json +30 -0
  8. package/e2e/specs/pages/root/index.spec.ts-snapshots/schema-org-graph-dev-webkit-linux.json +30 -0
  9. package/e2e/specs/pages/root/index.spec.ts-snapshots/schema-org-graph-node-chromium-linux.json +1 -0
  10. package/e2e/specs/pages/root/index.spec.ts-snapshots/schema-org-graph-node-firefox-linux.json +1 -0
  11. package/e2e/specs/pages/root/index.spec.ts-snapshots/schema-org-graph-node-webkit-linux.json +1 -0
  12. package/e2e/specs/pages/root/index.spec.ts-snapshots/schema-org-graph-static-chromium-linux.json +1 -0
  13. package/e2e/specs/pages/root/index.spec.ts-snapshots/schema-org-graph-static-firefox-linux.json +1 -0
  14. package/e2e/specs/pages/root/index.spec.ts-snapshots/schema-org-graph-static-webkit-linux.json +1 -0
  15. package/e2e/specs/pages/root/index.spec.ts-snapshots/visual-regression-consistent-appearance-dark-chromium-linux.png +0 -0
  16. package/e2e/specs/pages/root/index.spec.ts-snapshots/visual-regression-consistent-appearance-dark-firefox-linux.png +0 -0
  17. package/e2e/specs/pages/root/index.spec.ts-snapshots/visual-regression-consistent-appearance-dark-webkit-linux.png +0 -0
  18. package/e2e/specs/pages/root/index.spec.ts-snapshots/visual-regression-consistent-appearance-light-chromium-linux.png +0 -0
  19. package/e2e/specs/pages/root/index.spec.ts-snapshots/visual-regression-consistent-appearance-light-firefox-linux.png +0 -0
  20. package/e2e/specs/pages/root/index.spec.ts-snapshots/visual-regression-consistent-appearance-light-webkit-linux.png +0 -0
  21. package/e2e/specs/pages/root/index.spec.ts-snapshots/visual-regression-consistent-appearance-system-chromium-linux.png +0 -0
  22. package/e2e/specs/pages/root/index.spec.ts-snapshots/visual-regression-consistent-appearance-system-firefox-linux.png +0 -0
  23. package/e2e/specs/pages/root/index.spec.ts-snapshots/visual-regression-consistent-appearance-system-webkit-linux.png +0 -0
  24. package/e2e/specs/pages/root/index.spec.ts-snapshots/visual-regression-consistent-appearance-with-cookie-banner-chromium-linux.png +0 -0
  25. package/e2e/specs/pages/root/index.spec.ts-snapshots/visual-regression-consistent-appearance-with-cookie-banner-firefox-linux.png +0 -0
  26. package/e2e/specs/pages/root/index.spec.ts-snapshots/visual-regression-consistent-appearance-with-cookie-banner-webkit-linux.png +0 -0
  27. package/e2e/specs/pages/root/index.spec.ts-snapshots/visual-regression-generates-the-open-graph-image-1-chromium-linux.png +0 -0
  28. package/e2e/specs/pages/root/index.spec.ts-snapshots/visual-regression-generates-the-open-graph-image-1-firefox-linux.png +0 -0
  29. package/e2e/specs/pages/root/index.spec.ts-snapshots/visual-regression-generates-the-open-graph-image-1-webkit-linux.png +0 -0
  30. package/e2e/specs/pages/root/index.spec.ts-snapshots/visual-regression-generates-the-open-graph-image-2-chromium-linux.png +0 -0
  31. package/e2e/specs/pages/root/index.spec.ts-snapshots/visual-regression-generates-the-open-graph-image-2-firefox-linux.png +0 -0
  32. package/e2e/specs/pages/root/index.spec.ts-snapshots/visual-regression-generates-the-open-graph-image-2-webkit-linux.png +0 -0
  33. package/e2e/specs/pages/root/legal-notice.spec.ts +50 -0
  34. package/e2e/specs/pages/root/legal-notice.spec.ts-snapshots/schema-org-graph-dev-chromium-linux.json +31 -0
  35. package/e2e/specs/pages/root/legal-notice.spec.ts-snapshots/schema-org-graph-dev-firefox-linux.json +31 -0
  36. package/e2e/specs/pages/root/legal-notice.spec.ts-snapshots/schema-org-graph-dev-webkit-linux.json +31 -0
  37. package/e2e/specs/pages/root/legal-notice.spec.ts-snapshots/schema-org-graph-node-chromium-linux.json +1 -0
  38. package/e2e/specs/pages/root/legal-notice.spec.ts-snapshots/schema-org-graph-node-firefox-linux.json +1 -0
  39. package/e2e/specs/pages/root/legal-notice.spec.ts-snapshots/schema-org-graph-node-webkit-linux.json +1 -0
  40. package/e2e/specs/pages/root/legal-notice.spec.ts-snapshots/schema-org-graph-static-chromium-linux.json +1 -0
  41. package/e2e/specs/pages/root/legal-notice.spec.ts-snapshots/schema-org-graph-static-firefox-linux.json +1 -0
  42. package/e2e/specs/pages/root/legal-notice.spec.ts-snapshots/schema-org-graph-static-webkit-linux.json +1 -0
  43. package/e2e/specs/pages/root/legal-notice.spec.ts-snapshots/visual-regression-consistent-appearance-1-chromium-linux.png +0 -0
  44. package/e2e/specs/pages/root/legal-notice.spec.ts-snapshots/visual-regression-consistent-appearance-1-firefox-linux.png +0 -0
  45. package/e2e/specs/pages/root/legal-notice.spec.ts-snapshots/visual-regression-consistent-appearance-1-webkit-linux.png +0 -0
  46. package/e2e/specs/pages/root/legal-notice.spec.ts-snapshots/visual-regression-generates-the-open-graph-image-1-chromium-linux.png +0 -0
  47. package/e2e/specs/pages/root/legal-notice.spec.ts-snapshots/visual-regression-generates-the-open-graph-image-1-firefox-linux.png +0 -0
  48. package/e2e/specs/pages/root/legal-notice.spec.ts-snapshots/visual-regression-generates-the-open-graph-image-1-webkit-linux.png +0 -0
  49. package/e2e/specs/pages/root/legal-notice.spec.ts-snapshots/visual-regression-generates-the-open-graph-image-2-chromium-linux.png +0 -0
  50. package/e2e/specs/pages/root/legal-notice.spec.ts-snapshots/visual-regression-generates-the-open-graph-image-2-firefox-linux.png +0 -0
  51. package/e2e/specs/pages/root/legal-notice.spec.ts-snapshots/visual-regression-generates-the-open-graph-image-2-webkit-linux.png +0 -0
  52. package/e2e/specs/pages/root/privacy-policy.spec.ts +40 -0
  53. package/e2e/specs/pages/root/privacy-policy.spec.ts-snapshots/visual-regression-consistent-appearance-1-chromium-linux.png +0 -0
  54. package/e2e/specs/pages/root/privacy-policy.spec.ts-snapshots/visual-regression-consistent-appearance-1-firefox-linux.png +0 -0
  55. package/e2e/specs/pages/root/privacy-policy.spec.ts-snapshots/visual-regression-consistent-appearance-1-webkit-linux.png +0 -0
  56. package/e2e/specs/pages/root/privacy-policy.spec.ts-snapshots/visual-regression-generates-the-open-graph-image-1-chromium-linux.png +0 -0
  57. package/e2e/specs/pages/root/privacy-policy.spec.ts-snapshots/visual-regression-generates-the-open-graph-image-1-firefox-linux.png +0 -0
  58. package/e2e/specs/pages/root/privacy-policy.spec.ts-snapshots/visual-regression-generates-the-open-graph-image-1-webkit-linux.png +0 -0
  59. package/e2e/specs/pages/root/privacy-policy.spec.ts-snapshots/visual-regression-generates-the-open-graph-image-2-chromium-linux.png +0 -0
  60. package/e2e/specs/pages/root/privacy-policy.spec.ts-snapshots/visual-regression-generates-the-open-graph-image-2-firefox-linux.png +0 -0
  61. package/e2e/specs/pages/root/privacy-policy.spec.ts-snapshots/visual-regression-generates-the-open-graph-image-2-webkit-linux.png +0 -0
  62. package/e2e/specs/server/headers.spec.ts +53 -0
  63. package/e2e/specs/server/headers.spec.ts-snapshots/csp-production-chromium-linux.txt +1 -0
  64. package/e2e/specs/server/headers.spec.ts-snapshots/csp-production-firefox-linux.txt +1 -0
  65. package/e2e/specs/server/headers.spec.ts-snapshots/csp-production-webkit-linux.txt +1 -0
  66. package/e2e/specs/server/robots.spec.ts +29 -0
  67. package/e2e/specs/server/robots.spec.ts-snapshots/robots-txt-content-development-chromium-linux.txt +4 -0
  68. package/e2e/specs/server/robots.spec.ts-snapshots/robots-txt-content-development-firefox-linux.txt +4 -0
  69. package/e2e/specs/server/robots.spec.ts-snapshots/robots-txt-content-development-webkit-linux.txt +4 -0
  70. package/e2e/specs/server/robots.spec.ts-snapshots/robots-txt-content-production-chromium-linux.txt +4 -0
  71. package/e2e/specs/server/robots.spec.ts-snapshots/robots-txt-content-production-firefox-linux.txt +4 -0
  72. package/e2e/specs/server/robots.spec.ts-snapshots/robots-txt-content-production-webkit-linux.txt +4 -0
  73. package/e2e/specs/server/sitemap.spec.ts +42 -0
  74. package/e2e/specs/server/sitemap.spec.ts-snapshots/sitemap-content-de-chromium-linux.txt +21 -0
  75. package/e2e/specs/server/sitemap.spec.ts-snapshots/sitemap-content-de-firefox-linux.txt +21 -0
  76. package/e2e/specs/server/sitemap.spec.ts-snapshots/sitemap-content-de-webkit-linux.txt +21 -0
  77. package/e2e/specs/server/sitemap.spec.ts-snapshots/sitemap-content-en-chromium-linux.txt +21 -0
  78. package/e2e/specs/server/sitemap.spec.ts-snapshots/sitemap-content-en-firefox-linux.txt +21 -0
  79. package/e2e/specs/server/sitemap.spec.ts-snapshots/sitemap-content-en-webkit-linux.txt +21 -0
  80. package/e2e/utils/constants.ts +37 -0
  81. package/e2e/utils/tests.ts +574 -0
  82. package/package.json +58 -0
  83. package/playwright.config.ts +100 -0
@@ -0,0 +1,53 @@
1
+ import { test, expect } from '@playwright/test'
2
+
3
+ test.describe('headers middleware', () => {
4
+ test('sets the correct security headers', async ({ request }) => {
5
+ if (process.env.VIO_SERVER === 'static') return // TODO: use single snapshot and all servers
6
+
7
+ const headers = (await request.get('/')).headers()
8
+
9
+ expect(headers.connection).toStrictEqual('close')
10
+ expect(headers['access-control-allow-origin']).toStrictEqual('*')
11
+ expect(
12
+ headers['content-security-policy'].replace(/nonce-[^']+/g, 'nonce'),
13
+ ).toMatchSnapshot(
14
+ `csp-${
15
+ process.env.NODE_ENV === 'production' ? 'production' : 'development'
16
+ }.txt`,
17
+ )
18
+ expect(headers['content-type']).toStrictEqual('text/html;charset=utf-8')
19
+ expect(headers['cross-origin-embedder-policy']).toStrictEqual(
20
+ process.env.NODE_ENV === 'production' ? 'require-corp' : 'unsafe-none',
21
+ ) // https://stackoverflow.com/questions/71904052/getting-notsameoriginafterdefaultedtosameoriginbycoep-error-with-helmet
22
+ expect(headers['cross-origin-opener-policy']).toStrictEqual('same-origin')
23
+ expect(headers['cross-origin-resource-policy']).toStrictEqual('same-origin')
24
+ expect('expect-ct' in headers).toBeFalsy() // deprecated (https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Expect-CT)
25
+ expect(headers.nel).toStrictEqual(
26
+ '\'{"report_to":"csp-endpoint","max_age":31536000,"include_subdomains":true}\'',
27
+ )
28
+ expect(headers['origin-agent-cluster']).toStrictEqual('?1')
29
+ expect(headers['permissions-policy']).toStrictEqual(
30
+ 'camera=(), display-capture=(), fullscreen=(), geolocation=(), microphone=()',
31
+ )
32
+ expect(headers['referrer-policy']).toStrictEqual('no-referrer')
33
+ expect(headers['report-to']).toStrictEqual(
34
+ '{"group":"csp-endpoint","max_age":10886400,"endpoints":[{"url":"https://o4507259039973376.ingest.sentry.io/api/4507260561653840/security/?sentry_key=1e53178c1dba9b39147de4a21853a3e3"}],"include_subdomains":true}}',
35
+ )
36
+
37
+ if (process.env.NODE_ENV === 'production') {
38
+ expect(headers['strict-transport-security']).toStrictEqual(
39
+ 'max-age=31536000; includeSubDomains; preload;',
40
+ )
41
+ } else {
42
+ expect('strict-transport-security' in headers).toBeFalsy()
43
+ }
44
+
45
+ expect(headers['x-content-type-options']).toStrictEqual('nosniff')
46
+ expect(headers['x-dns-prefetch-control']).toStrictEqual('off')
47
+ expect(headers['x-download-options']).toStrictEqual('noopen')
48
+ expect(headers['x-frame-options']).toStrictEqual('SAMEORIGIN')
49
+ expect(headers['x-permitted-cross-domain-policies']).toStrictEqual('none')
50
+ expect('x-powered-by' in headers).toBeFalsy()
51
+ expect(headers['x-xss-protection']).toStrictEqual('1; mode=block')
52
+ })
53
+ })
@@ -0,0 +1 @@
1
+ base-uri 'none'; form-action 'none'; frame-ancestors 'none'; img-src https://*.google-analytics.com https://*.googletagmanager.com 'self' data:; style-src 'nonce' 'self'; connect-src https://cloudflareinsights.com https://*.analytics.google.com https://*.google-analytics.com https://*.googletagmanager.com 'self'; default-src 'none'; report-to csp-endpoint; report-uri https://o4507259039973376.ingest.sentry.io/api/4507260561653840/security/?sentry_key=1e53178c1dba9b39147de4a21853a3e3; script-src-elem https://static.cloudflareinsights.com https://*.googletagmanager.com 'nonce' http://localhost:3001/_nuxt/; manifest-src http://localhost:3001/site.webmanifest;
@@ -0,0 +1 @@
1
+ base-uri 'none'; form-action 'none'; frame-ancestors 'none'; img-src https://*.google-analytics.com https://*.googletagmanager.com 'self' data:; style-src 'nonce' 'self'; connect-src https://cloudflareinsights.com https://*.analytics.google.com https://*.google-analytics.com https://*.googletagmanager.com 'self'; default-src 'none'; report-to csp-endpoint; report-uri https://o4507259039973376.ingest.sentry.io/api/4507260561653840/security/?sentry_key=1e53178c1dba9b39147de4a21853a3e3; script-src-elem https://static.cloudflareinsights.com https://*.googletagmanager.com 'nonce' http://localhost:3001/_nuxt/; manifest-src http://localhost:3001/site.webmanifest;
@@ -0,0 +1 @@
1
+ base-uri 'none'; form-action 'none'; frame-ancestors 'none'; img-src https://*.google-analytics.com https://*.googletagmanager.com 'self' data:; style-src 'nonce' 'self'; connect-src https://cloudflareinsights.com https://*.analytics.google.com https://*.google-analytics.com https://*.googletagmanager.com 'self'; default-src 'none'; report-to csp-endpoint; report-uri https://o4507259039973376.ingest.sentry.io/api/4507260561653840/security/?sentry_key=1e53178c1dba9b39147de4a21853a3e3; script-src-elem https://static.cloudflareinsights.com https://*.googletagmanager.com 'nonce' http://localhost:3001/_nuxt/; manifest-src http://localhost:3001/site.webmanifest;
@@ -0,0 +1,29 @@
1
+ import { test, expect } from '@playwright/test'
2
+ import { escapeRegExp } from 'lodash-es'
3
+
4
+ import { SITE_URL } from '#src/utils/constants'
5
+
6
+ const path = '/robots.txt'
7
+
8
+ test.describe('page load', () => {
9
+ test('loads the page successfully', async ({ request }) => {
10
+ const resp = await request.get(path)
11
+ expect(resp.status()).toBe(200)
12
+ })
13
+ })
14
+
15
+ test.describe('robots.txt', () => {
16
+ test('content', async ({ request }) => {
17
+ const resp = await request.get(path)
18
+ expect(
19
+ (await resp.text()).replace(
20
+ new RegExp(escapeRegExp(SITE_URL), 'g'),
21
+ 'https://example.com',
22
+ ),
23
+ ).toMatchSnapshot(
24
+ `robots-txt-content-${
25
+ process.env.NODE_ENV === 'production' ? 'production' : 'development'
26
+ }.txt`,
27
+ )
28
+ })
29
+ })
@@ -0,0 +1,4 @@
1
+ User-agent: *
2
+ Disallow: /
3
+
4
+ # DEVELOPMENT HINTS: Indexing is blocked because of the environment. You can mock a production environment with ?indexable query.
@@ -0,0 +1,4 @@
1
+ User-agent: *
2
+ Disallow: /
3
+
4
+ # DEVELOPMENT HINTS: Indexing is blocked because of the environment. You can mock a production environment with ?indexable query.
@@ -0,0 +1,4 @@
1
+ User-agent: *
2
+ Disallow: /
3
+
4
+ # DEVELOPMENT HINTS: Indexing is blocked because of the environment. You can mock a production environment with ?indexable query.
@@ -0,0 +1,4 @@
1
+ User-agent: *
2
+ Disallow:
3
+
4
+ Sitemap: https://example.com/sitemap_index.xml
@@ -0,0 +1,4 @@
1
+ User-agent: *
2
+ Disallow:
3
+
4
+ Sitemap: https://example.com/sitemap_index.xml
@@ -0,0 +1,4 @@
1
+ User-agent: *
2
+ Disallow:
3
+
4
+ Sitemap: https://example.com/sitemap_index.xml
@@ -0,0 +1,42 @@
1
+ import { test, expect } from '@playwright/test'
2
+ import { escapeRegExp } from 'lodash-es'
3
+
4
+ import { SITE_URL } from '#src/utils/constants'
5
+
6
+ const path = '/sitemap_index.xml'
7
+
8
+ test.describe('page load', () => {
9
+ test('loads the page successfully', async ({ request }) => {
10
+ const resp = await request.get(path)
11
+ expect(resp.status()).toBe(200)
12
+ })
13
+ })
14
+
15
+ test.describe('sitemap', () => {
16
+ const languages = ['en', 'de']
17
+
18
+ test('index', async ({ request }) => {
19
+ const resp = await request.get(path)
20
+ const text = await resp.text()
21
+
22
+ for (const language of languages) {
23
+ expect(text).toContain(`${SITE_URL}/${language}-sitemap.xml`)
24
+ }
25
+ })
26
+
27
+ test('content', async ({ request }) => {
28
+ for (const language of languages) {
29
+ const resp = await request.get(`/${language}-sitemap.xml`)
30
+ const text = await resp.text()
31
+
32
+ expect(
33
+ text
34
+ .replace(/\n.+<\/lastmod>/g, '')
35
+ .replace(
36
+ new RegExp(escapeRegExp(SITE_URL), 'g'),
37
+ 'https://example.com',
38
+ ),
39
+ ).toMatchSnapshot(`sitemap-content-${language}.txt`)
40
+ }
41
+ })
42
+ })
@@ -0,0 +1,21 @@
1
+ <?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="/__sitemap__/style.xsl"?>
2
+ <urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd http://www.google.com/schemas/sitemap-image/1.1 http://www.google.com/schemas/sitemap-image/1.1/sitemap-image.xsd" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
3
+ <url>
4
+ <loc>https://example.com/de</loc>
5
+ <xhtml:link rel="alternate" hreflang="en" href="https://example.com/" />
6
+ <xhtml:link rel="alternate" hreflang="de" href="https://example.com/de" />
7
+ <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/" />
8
+ </url>
9
+ <url>
10
+ <loc>https://example.com/de/legal-notice</loc>
11
+ <xhtml:link rel="alternate" hreflang="en" href="https://example.com/legal-notice" />
12
+ <xhtml:link rel="alternate" hreflang="de" href="https://example.com/de/legal-notice" />
13
+ <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/legal-notice" />
14
+ </url>
15
+ <url>
16
+ <loc>https://example.com/de/privacy-policy</loc>
17
+ <xhtml:link rel="alternate" hreflang="en" href="https://example.com/privacy-policy" />
18
+ <xhtml:link rel="alternate" hreflang="de" href="https://example.com/de/privacy-policy" />
19
+ <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/privacy-policy" />
20
+ </url>
21
+ </urlset>
@@ -0,0 +1,21 @@
1
+ <?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="/__sitemap__/style.xsl"?>
2
+ <urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd http://www.google.com/schemas/sitemap-image/1.1 http://www.google.com/schemas/sitemap-image/1.1/sitemap-image.xsd" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
3
+ <url>
4
+ <loc>https://example.com/de</loc>
5
+ <xhtml:link rel="alternate" hreflang="en" href="https://example.com/" />
6
+ <xhtml:link rel="alternate" hreflang="de" href="https://example.com/de" />
7
+ <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/" />
8
+ </url>
9
+ <url>
10
+ <loc>https://example.com/de/legal-notice</loc>
11
+ <xhtml:link rel="alternate" hreflang="en" href="https://example.com/legal-notice" />
12
+ <xhtml:link rel="alternate" hreflang="de" href="https://example.com/de/legal-notice" />
13
+ <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/legal-notice" />
14
+ </url>
15
+ <url>
16
+ <loc>https://example.com/de/privacy-policy</loc>
17
+ <xhtml:link rel="alternate" hreflang="en" href="https://example.com/privacy-policy" />
18
+ <xhtml:link rel="alternate" hreflang="de" href="https://example.com/de/privacy-policy" />
19
+ <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/privacy-policy" />
20
+ </url>
21
+ </urlset>
@@ -0,0 +1,21 @@
1
+ <?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="/__sitemap__/style.xsl"?>
2
+ <urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd http://www.google.com/schemas/sitemap-image/1.1 http://www.google.com/schemas/sitemap-image/1.1/sitemap-image.xsd" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
3
+ <url>
4
+ <loc>https://example.com/de</loc>
5
+ <xhtml:link rel="alternate" hreflang="en" href="https://example.com/" />
6
+ <xhtml:link rel="alternate" hreflang="de" href="https://example.com/de" />
7
+ <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/" />
8
+ </url>
9
+ <url>
10
+ <loc>https://example.com/de/legal-notice</loc>
11
+ <xhtml:link rel="alternate" hreflang="en" href="https://example.com/legal-notice" />
12
+ <xhtml:link rel="alternate" hreflang="de" href="https://example.com/de/legal-notice" />
13
+ <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/legal-notice" />
14
+ </url>
15
+ <url>
16
+ <loc>https://example.com/de/privacy-policy</loc>
17
+ <xhtml:link rel="alternate" hreflang="en" href="https://example.com/privacy-policy" />
18
+ <xhtml:link rel="alternate" hreflang="de" href="https://example.com/de/privacy-policy" />
19
+ <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/privacy-policy" />
20
+ </url>
21
+ </urlset>
@@ -0,0 +1,21 @@
1
+ <?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="/__sitemap__/style.xsl"?>
2
+ <urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd http://www.google.com/schemas/sitemap-image/1.1 http://www.google.com/schemas/sitemap-image/1.1/sitemap-image.xsd" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
3
+ <url>
4
+ <loc>https://example.com/</loc>
5
+ <xhtml:link rel="alternate" hreflang="en" href="https://example.com/" />
6
+ <xhtml:link rel="alternate" hreflang="de" href="https://example.com/de" />
7
+ <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/" />
8
+ </url>
9
+ <url>
10
+ <loc>https://example.com/legal-notice</loc>
11
+ <xhtml:link rel="alternate" hreflang="en" href="https://example.com/legal-notice" />
12
+ <xhtml:link rel="alternate" hreflang="de" href="https://example.com/de/legal-notice" />
13
+ <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/legal-notice" />
14
+ </url>
15
+ <url>
16
+ <loc>https://example.com/privacy-policy</loc>
17
+ <xhtml:link rel="alternate" hreflang="en" href="https://example.com/privacy-policy" />
18
+ <xhtml:link rel="alternate" hreflang="de" href="https://example.com/de/privacy-policy" />
19
+ <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/privacy-policy" />
20
+ </url>
21
+ </urlset>
@@ -0,0 +1,21 @@
1
+ <?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="/__sitemap__/style.xsl"?>
2
+ <urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd http://www.google.com/schemas/sitemap-image/1.1 http://www.google.com/schemas/sitemap-image/1.1/sitemap-image.xsd" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
3
+ <url>
4
+ <loc>https://example.com/</loc>
5
+ <xhtml:link rel="alternate" hreflang="en" href="https://example.com/" />
6
+ <xhtml:link rel="alternate" hreflang="de" href="https://example.com/de" />
7
+ <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/" />
8
+ </url>
9
+ <url>
10
+ <loc>https://example.com/legal-notice</loc>
11
+ <xhtml:link rel="alternate" hreflang="en" href="https://example.com/legal-notice" />
12
+ <xhtml:link rel="alternate" hreflang="de" href="https://example.com/de/legal-notice" />
13
+ <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/legal-notice" />
14
+ </url>
15
+ <url>
16
+ <loc>https://example.com/privacy-policy</loc>
17
+ <xhtml:link rel="alternate" hreflang="en" href="https://example.com/privacy-policy" />
18
+ <xhtml:link rel="alternate" hreflang="de" href="https://example.com/de/privacy-policy" />
19
+ <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/privacy-policy" />
20
+ </url>
21
+ </urlset>
@@ -0,0 +1,21 @@
1
+ <?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="/__sitemap__/style.xsl"?>
2
+ <urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd http://www.google.com/schemas/sitemap-image/1.1 http://www.google.com/schemas/sitemap-image/1.1/sitemap-image.xsd" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
3
+ <url>
4
+ <loc>https://example.com/</loc>
5
+ <xhtml:link rel="alternate" hreflang="en" href="https://example.com/" />
6
+ <xhtml:link rel="alternate" hreflang="de" href="https://example.com/de" />
7
+ <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/" />
8
+ </url>
9
+ <url>
10
+ <loc>https://example.com/legal-notice</loc>
11
+ <xhtml:link rel="alternate" hreflang="en" href="https://example.com/legal-notice" />
12
+ <xhtml:link rel="alternate" hreflang="de" href="https://example.com/de/legal-notice" />
13
+ <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/legal-notice" />
14
+ </url>
15
+ <url>
16
+ <loc>https://example.com/privacy-policy</loc>
17
+ <xhtml:link rel="alternate" hreflang="en" href="https://example.com/privacy-policy" />
18
+ <xhtml:link rel="alternate" hreflang="de" href="https://example.com/de/privacy-policy" />
19
+ <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/privacy-policy" />
20
+ </url>
21
+ </urlset>
@@ -0,0 +1,37 @@
1
+ import { expect } from '@playwright/test'
2
+ import type { Page } from 'playwright-core'
3
+
4
+ export const COOKIE_CONTROL_DEFAULT = 'ctga'
5
+ export const PAGE_READY = async ({
6
+ page,
7
+ options,
8
+ }: {
9
+ page: Page
10
+ options?: {
11
+ cookieControl?: boolean
12
+ devTools?: boolean
13
+ isLoading?: boolean
14
+ }
15
+ }) => {
16
+ if (!options || options.cookieControl !== false) {
17
+ await expect(
18
+ page.getByRole('button', { name: 'Cookie control' }),
19
+ ).toBeVisible()
20
+ }
21
+
22
+ // if (
23
+ // process.env.NODE_ENV === 'development' &&
24
+ // (!options || options.devTools !== false)
25
+ // ) {
26
+ // await expect(
27
+ // page.getByRole('button', { name: 'Toggle Nuxt DevTools' }),
28
+ // ).toBeVisible()
29
+ // }
30
+
31
+ if (!options || options.isLoading !== false) {
32
+ await expect(page.getByTestId('is-loading')).toHaveAttribute(
33
+ 'data-is-loading',
34
+ 'false',
35
+ )
36
+ }
37
+ }