Files
aranroig.com/frontend/test/e2e.test.ts
BinarySandia04 d4976fab69
Some checks failed
Build and Deploy Nuxt / build (push) Failing after 1m23s
Particles
2026-06-10 20:18:47 +02:00

214 lines
7.2 KiB
TypeScript

import { describe, it, expect, vi, beforeAll } from 'vitest'
// --- Mock queryCollection globally ---
beforeAll(() => {
const mockFixedContent = [
{ path: '/fixed/en/root', locale: 'en', collection: 'fixed' },
{ path: '/fixed/es/root', locale: 'es', collection: 'fixed' },
{ path: '/fixed/ca/root', locale: 'ca', collection: 'fixed' },
{ path: '/fixed/en/contact', locale: 'en', collection: 'fixed' },
]
const mockBlogItems = [
{ path: '/blog/en/test', slug: 'test', title: 'First Post', date: '2026-03-18', description: 'Testing testing' },
{ path: '/blog/en/upgrade', slug: 'upgrade', title: 'Upgrade Post', date: '2026-04-01', description: 'System upgraded' },
{ path: '/blog/en/translator', slug: 'translator', title: 'Translator Post', date: '2026-05-15', description: 'Auto translation' },
]
const mockArtItems = [
{ path: '/art/en/nozt', slug: 'nozt', title: 'Nozt Art', date: '2026-04-14', thumb: '/art/nozt.jpg' },
{ path: '/art/en/silang-3d', slug: 'silang-3d', title: 'Silang 3D', date: '2026-05-20', thumb: '/art/silang.jpg' },
]
const mockProjectItems = [
{ path: '/projects/en/dragonroll', slug: 'dragonroll', title: 'Dragonroll', description: 'RPG helper', date: '2026-01-01', tech: ['Nuxt', 'Vue'] },
]
global.queryCollection = function queryCollection(collectionName: string) {
const items = {
fixed: mockFixedContent,
blog: mockBlogItems,
art: mockArtItems,
projects: mockProjectItems,
}[collectionName] || []
return {
path: (pathStr: string) => ({
first: () => Promise.resolve(items.find((i: any) => i.path === pathStr) || null),
all: () => Promise.resolve([items.find((i: any) => i.path === pathStr) || null].filter(Boolean)),
}),
where: (field: string, op: string, value: any) => {
let filtered = [...items]
if (op === 'LIKE') {
const pattern = value.replace(/\*/g, '').replace(/%/g, '')
filtered = items.filter((i: any) => i[field] && typeof i[field] === 'string' && i[field].startsWith(pattern))
}
return {
order: () => ({
all: () => Promise.resolve(filtered.sort((a: any, b: any) => {
if (a.date && b.date) return new Date(b.date).getTime() - new Date(a.date).getTime()
return 0
})),
}),
all: () => Promise.resolve(filtered),
}
},
}
}
global.useState = vi.fn(() => ({ value: [] as any[] }))
})
// --- Page components ---
import { renderSuspended } from '@nuxt/test-utils/runtime'
import IndexPage from '../app/pages/index.vue'
import BlogListPage from '../app/pages/blog/index.vue'
import ArtListPage from '../app/pages/art/index.vue'
import ContactPage from '../app/pages/contact/index.vue'
function getHtml(wrapper: any) {
return typeof wrapper.html === 'function' ? wrapper.html() : ''
}
// ======================
// Home page tests
// ======================
describe('Home page (index)', () => {
it('renders table header with site navigation', async () => {
const wrapper = await renderSuspended(IndexPage, { shallow: false })
const html = getHtml(wrapper)
expect(html).toContain('ARANROIG')
})
it('renders hidden H1 title for accessibility', async () => {
const wrapper = await renderSuspended(IndexPage, { shallow: false })
const html = getHtml(wrapper)
expect(html).toContain('Aran Roig')
})
it('renders fixed layout wrapper', async () => {
const wrapper = await renderSuspended(IndexPage, { shallow: false })
const html = getHtml(wrapper)
expect(html).toContain('fixed-layout')
})
it('renders intro section', async () => {
const wrapper = await renderSuspended(IndexPage, { shallow: false })
const html = getHtml(wrapper)
expect(html).toContain('intro-section')
})
it('renders projects section with project cards', async () => {
const wrapper = await renderSuspended(IndexPage, { shallow: false })
const html = getHtml(wrapper)
// Verify Container component renders properly
expect(html).toContain('Container')
})
it('renders blog section', async () => {
const wrapper = await renderSuspended(IndexPage, { shallow: false })
const html = getHtml(wrapper)
expect(html).toContain('Blog Entries')
})
it('renders art gallery section', async () => {
const wrapper = await renderSuspended(IndexPage, { shallow: false })
const html = getHtml(wrapper)
expect(html).toContain('Art Gallery')
})
it('renders contact section', async () => {
const wrapper = await renderSuspended(IndexPage, { shallow: false })
const html = getHtml(wrapper)
expect(html).toContain('Contact')
})
it('renders footer component', async () => {
const wrapper = await renderSuspended(IndexPage, { shallow: false })
const html = getHtml(wrapper)
expect(html).toContain('tui-statusbar')
})
it('has scroll target anchors', async () => {
const wrapper = await renderSuspended(IndexPage, { shallow: false })
const html = getHtml(wrapper)
expect(html).toContain('scroll-blog')
expect(html).toContain('scroll-art')
expect(html).toContain('scroll-contact')
})
it('renders footer copyright text', async () => {
const wrapper = await renderSuspended(IndexPage, { shallow: false })
const html = getHtml(wrapper)
expect(html).toContain('2026 Aran Roig')
})
})
// ======================
// Blog listing tests
// ======================
describe('Blog listing page', () => {
it('renders blog heading', async () => {
const wrapper = await renderSuspended(BlogListPage, { shallow: false })
const html = getHtml(wrapper)
expect(html).toContain('Blog Entries')
})
it('renders tui-list structure', async () => {
const wrapper = await renderSuspended(BlogListPage, { shallow: false })
const html = getHtml(wrapper)
expect(html).toContain('tui-list')
})
it('renders layout', async () => {
const wrapper = await renderSuspended(BlogListPage, { shallow: false })
const html = getHtml(wrapper)
expect(html).toContain('fixed-layout')
})
})
// ======================
// Art listing tests
// ======================
describe('Art listing page', () => {
it('renders art gallery heading', async () => {
const wrapper = await renderSuspended(ArtListPage, { shallow: false })
const html = getHtml(wrapper)
expect(html).toContain('Art Gallery')
})
it('renders grid layout', async () => {
const wrapper = await renderSuspended(ArtListPage, { shallow: false })
const html = getHtml(wrapper)
expect(html).toContain('grid')
})
it('renders layout', async () => {
const wrapper = await renderSuspended(ArtListPage, { shallow: false })
const html = getHtml(wrapper)
expect(html).toContain('fixed-layout')
})
})
// ======================
// Contact page tests
// ======================
describe('Contact page', () => {
it('renders contact heading', async () => {
const wrapper = await renderSuspended(ContactPage, { shallow: false })
const html = getHtml(wrapper)
expect(html).toContain('Contact')
})
it('renders layout', async () => {
const wrapper = await renderSuspended(ContactPage, { shallow: false })
const html = getHtml(wrapper)
expect(html).toContain('fixed-layout')
expect(html).toContain('tui-statusbar')
})
})