From 79100ef40efa5d55b18d19b87ac29a454a5f0eaa Mon Sep 17 00:00:00 2001 From: monomono Date: Sat, 15 Aug 2026 18:07:06 -0500 Subject: [PATCH] =?UTF-8?q?#49=20test:=20cubrir=20p=C3=A1ginas=20admin=20d?= =?UTF-8?q?e=20provenance=20y=20NavBar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/unit/components/NavBar.spec.js | 80 +++++++++++++++++++++ tests/unit/pages/admin/admin-pages.spec.js | 83 ++++++++++++++++++++++ 2 files changed, 163 insertions(+) create mode 100644 tests/unit/components/NavBar.spec.js create mode 100644 tests/unit/pages/admin/admin-pages.spec.js diff --git a/tests/unit/components/NavBar.spec.js b/tests/unit/components/NavBar.spec.js new file mode 100644 index 0000000..a31230c --- /dev/null +++ b/tests/unit/components/NavBar.spec.js @@ -0,0 +1,80 @@ +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') + }) +}) diff --git a/tests/unit/pages/admin/admin-pages.spec.js b/tests/unit/pages/admin/admin-pages.spec.js new file mode 100644 index 0000000..3541dd3 --- /dev/null +++ b/tests/unit/pages/admin/admin-pages.spec.js @@ -0,0 +1,83 @@ +import { describe, expect, it, vi } from 'vitest' +import { flushPromises, mount } from '@vue/test-utils' +import { createPinia, setActivePinia } from 'pinia' +import { useAuthStore } from '@/stores/auth' +import OrganizationsManagement from '@/components/provenance/admin/OrganizationsManagement.vue' +import SuppliersManagement from '@/components/provenance/admin/SuppliersManagement.vue' +import GeographyManagement from '@/components/provenance/admin/GeographyManagement.vue' +import OrganizationsPage from '@/pages/admin/organizations.vue' +import SuppliersPage from '@/pages/admin/suppliers.vue' +import GeographyPage from '@/pages/admin/geography.vue' +import vuetify from '@/plugins/vuetify' + +function mockApi () { + return { + getOrganizations: vi.fn().mockResolvedValue([]), + getSuppliers: vi.fn().mockResolvedValue([]), + getMunicipalities: vi.fn().mockResolvedValue([]), + getCountries: vi.fn().mockResolvedValue([]), + getDepartments: vi.fn().mockResolvedValue([]), + } +} + +function mountAdmin (page, api, role) { + const pinia = createPinia() + setActivePinia(pinia) + const authStore = useAuthStore() + authStore.setUser({ role, username: 'admin' }) + const wrapper = mount(page, { + global: { plugins: [pinia, vuetify], provide: { api } }, + }) + return { wrapper } +} + +async function flushAll (wrapper) { + await flushPromises() + await wrapper.vm.$nextTick() +} + +describe('página admin/organizations', () => { + it('renderiza OrganizationsManagement cuando el usuario es administrador', async () => { + const { wrapper } = mountAdmin(OrganizationsPage, mockApi(), 'administrator') + await flushAll(wrapper) + + expect(wrapper.findComponent(OrganizationsManagement).exists()).toBe(true) + }) + + it('no renderiza el componente cuando el usuario no es administrador', async () => { + const { wrapper } = mountAdmin(OrganizationsPage, mockApi(), 'publico') + + expect(wrapper.findComponent(OrganizationsManagement).exists()).toBe(false) + expect(wrapper.text()).toBe('') + }) +}) + +describe('página admin/suppliers', () => { + it('renderiza SuppliersManagement cuando el usuario es administrador', async () => { + const { wrapper } = mountAdmin(SuppliersPage, mockApi(), 'administrator') + await flushAll(wrapper) + + expect(wrapper.findComponent(SuppliersManagement).exists()).toBe(true) + }) + + it('no renderiza el componente cuando el usuario no es administrador', async () => { + const { wrapper } = mountAdmin(SuppliersPage, mockApi(), 'publico') + + expect(wrapper.findComponent(SuppliersManagement).exists()).toBe(false) + }) +}) + +describe('página admin/geography', () => { + it('renderiza GeographyManagement cuando el usuario es administrador', async () => { + const { wrapper } = mountAdmin(GeographyPage, mockApi(), 'administrator') + await flushAll(wrapper) + + expect(wrapper.findComponent(GeographyManagement).exists()).toBe(true) + }) + + it('no renderiza el componente cuando el usuario no es administrador', async () => { + const { wrapper } = mountAdmin(GeographyPage, mockApi(), 'publico') + + expect(wrapper.findComponent(GeographyManagement).exists()).toBe(false) + }) +})