import { describe, it, expect, beforeEach, vi } from 'vitest';
import { mount, flushPromises } from '@vue/test-utils';
import { createPinia, setActivePinia } from 'pinia';
import { createRouter, createMemoryHistory } from 'vue-router';
import NewsView from '../views/NewsView.vue';
async function createTestRouter() {
const router = createRouter({
history: createMemoryHistory(),
routes: [
{ path: '/', name: 'home', component: { template: '
' } },
{ path: '/news', name: 'news', component: { template: '' } },
],
});
router.push('/news');
await router.isReady();
return router;
}
describe('NewsView', () => {
let pinia: ReturnType;
let router: Awaited>;
beforeEach(async () => {
pinia = createPinia();
setActivePinia(pinia);
router = await createTestRouter();
});
function mountNews() {
return mount(NewsView, {
global: { plugins: [pinia, router] },
});
}
it('renders breadcrumb navigation', () => {
const wrapper = mountNews();
expect(wrapper.text()).toContain('Home');
expect(wrapper.text()).toContain('News');
});
it('renders News heading', () => {
const wrapper = mountNews();
expect(wrapper.text()).toContain('News');
});
it('shows loading skeleton initially', () => {
const wrapper = mountNews();
expect(wrapper.find('.animate-pulse').exists()).toBe(true);
});
it('shows empty state when no posts', async () => {
globalThis.fetch = vi.fn().mockResolvedValue({ ok: true, json: () => Promise.resolve([]) });
const wrapper = mountNews();
await flushPromises();
expect(wrapper.text()).toContain('No news posts yet');
});
it('shows error state when fetch fails', async () => {
globalThis.fetch = vi.fn().mockRejectedValue(new Error('Network error'));
const wrapper = mountNews();
await flushPromises();
expect(wrapper.text()).toContain('Failed to load news posts');
});
it('renders posts when available', async () => {
const posts = [
{ slug: 'test-post', title: 'Test Post', date: '2025-01-15', categories: ['release'], file: '/news/test-post.adoc', excerpt: 'A test excerpt.' },
];
globalThis.fetch = vi.fn().mockResolvedValue({ ok: true, json: () => Promise.resolve(posts) });
const wrapper = mountNews();
await flushPromises();
expect(wrapper.text()).toContain('Test Post');
expect(wrapper.text()).toContain('release');
expect(wrapper.text()).toContain('A test excerpt.');
});
it('formats dates correctly', async () => {
const posts = [
{ slug: 'dated', title: 'Dated', date: '2025-03-15', categories: [], file: '/news/dated.adoc', excerpt: '' },
];
globalThis.fetch = vi.fn().mockResolvedValue({ ok: true, json: () => Promise.resolve(posts) });
const wrapper = mountNews();
await flushPromises();
expect(wrapper.text()).toContain('March 15, 2025');
});
});