import { beforeEach, describe, expect, it, vi } from 'vitest' import { flushPromises, mount } from '@vue/test-utils' import { createPinia, setActivePinia } from 'pinia' import NavBar from '@/components/NavBar.vue' import vuetify from '@/plugins/vuetify' import AuthService from '@/services/auth' vi.mock('@/services/auth', () => ({ default: { isAuthenticated: vi.fn(), logout: vi.fn(), }, })) function mountNavBar (api) { const pinia = createPinia() setActivePinia(pinia) const wrapper = mount(NavBar, { global: { plugins: [pinia, vuetify], provide: { api }, mocks: { $router: { push: vi.fn() } }, stubs: { VAppBar: { template: '
' }, VNavigationDrawer: { template: '
' }, }, }, }) return { wrapper } } describe('NavBar', () => { beforeEach(() => { vi.clearAllMocks() localStorage.clear() }) it('sin sesión muestra el botón de login y no el menú de administración', async () => { AuthService.isAuthenticated.mockReturnValue(false) const { wrapper } = mountNavBar({ getCurrentUser: vi.fn() }) await flushPromises() expect(wrapper.text()).toContain('Login') expect(wrapper.text()).not.toContain('Administracion') }) it('el administrador ve los ítems de administración de provenance', async () => { AuthService.isAuthenticated.mockReturnValue(true) const api = { getCurrentUser: vi.fn().mockResolvedValue({ username: 'admin', role: 'administrator' }), } const { wrapper } = mountNavBar(api) await flushPromises() expect(api.getCurrentUser).toHaveBeenCalled() expect(wrapper.text()).toContain('Administracion') const adminItem = wrapper.findAll('.v-list-item') .find(item => item.text().includes('Administracion')) await adminItem.trigger('click') expect(wrapper.text()).toContain('Organizaciones') expect(wrapper.text()).toContain('Proveedores') expect(wrapper.text()).toContain('Geografía') }) it('el usuario público no ve el menú de administración y no ve "Comprar"', async () => { AuthService.isAuthenticated.mockReturnValue(true) const api = { getCurrentUser: vi.fn().mockResolvedValue({ username: 'cliente', role: 'publico' }), } const { wrapper } = mountNavBar(api) await flushPromises() expect(wrapper.text()).not.toContain('Administracion') expect(wrapper.text()).not.toContain('Comprar') expect(wrapper.text()).toContain('Ver Catálogo') }) })