Some checks failed
Build and Deploy Nuxt / build (push) Failing after 1m23s
214 lines
7.2 KiB
TypeScript
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')
|
|
})
|
|
})
|