You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
167 lines
4.9 KiB
JavaScript
167 lines
4.9 KiB
JavaScript
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'
|
|
import { setActivePinia, createPinia } from 'pinia'
|
|
import axios from 'axios'
|
|
import { useProcesoAdmisionStore } from '../../src/store/procesosAdmisionStore'
|
|
|
|
// Mock axios
|
|
vi.mock('axios')
|
|
|
|
describe('procesosAdmisionStore', () => {
|
|
let store
|
|
|
|
beforeEach(() => {
|
|
setActivePinia(createPinia())
|
|
store = useProcesoAdmisionStore()
|
|
vi.stubEnv('VITE_API_URL', 'http://localhost:8000/api')
|
|
})
|
|
|
|
afterEach(() => {
|
|
vi.clearAllMocks()
|
|
vi.unstubAllEnvs()
|
|
})
|
|
|
|
describe('fetchProcesosPublicados', () => {
|
|
it('should fetch and update procesosPublicados state with returned data', async () => {
|
|
const mockProcesos = [
|
|
{
|
|
id: 1,
|
|
titulo: 'Proceso Ordinario 2026',
|
|
slug: 'proceso-ordinario-2026',
|
|
publicado: true,
|
|
estado: 'publicado',
|
|
detalles: [
|
|
{ tipo: 'requisitos', titulo_detalle: 'Requisitos', descripcion: 'Lista de requisitos' }
|
|
]
|
|
},
|
|
{
|
|
id: 2,
|
|
titulo: 'Proceso Extraordinario 2026',
|
|
slug: 'proceso-extraordinario-2026',
|
|
publicado: true,
|
|
estado: 'en_proceso',
|
|
detalles: []
|
|
}
|
|
]
|
|
|
|
axios.get.mockResolvedValueOnce({ data: mockProcesos })
|
|
|
|
// Initial state should be empty
|
|
expect(store.procesosPublicados).toEqual([])
|
|
expect(store.loading).toBe(false)
|
|
|
|
// Call the action
|
|
const result = await store.fetchProcesosPublicados()
|
|
|
|
// Verify the result
|
|
expect(result).toBe(true)
|
|
expect(store.procesosPublicados).toEqual(mockProcesos)
|
|
expect(store.procesosPublicados).toHaveLength(2)
|
|
expect(store.loading).toBe(false)
|
|
expect(store.error).toBeNull()
|
|
})
|
|
|
|
it('should set loading to true while fetching', async () => {
|
|
let loadingDuringFetch = false
|
|
|
|
axios.get.mockImplementation(() => {
|
|
loadingDuringFetch = store.loading
|
|
return Promise.resolve({ data: [] })
|
|
})
|
|
|
|
await store.fetchProcesosPublicados()
|
|
|
|
expect(loadingDuringFetch).toBe(true)
|
|
})
|
|
|
|
it('should handle empty response array', async () => {
|
|
axios.get.mockResolvedValueOnce({ data: [] })
|
|
|
|
const result = await store.fetchProcesosPublicados()
|
|
|
|
expect(result).toBe(true)
|
|
expect(store.procesosPublicados).toEqual([])
|
|
expect(store.error).toBeNull()
|
|
})
|
|
|
|
it('should handle non-array response by setting empty array', async () => {
|
|
axios.get.mockResolvedValueOnce({ data: null })
|
|
|
|
const result = await store.fetchProcesosPublicados()
|
|
|
|
expect(result).toBe(true)
|
|
expect(store.procesosPublicados).toEqual([])
|
|
})
|
|
|
|
it('should set error state when fetch fails', async () => {
|
|
const errorMessage = 'Network Error'
|
|
axios.get.mockRejectedValueOnce(new Error(errorMessage))
|
|
|
|
const result = await store.fetchProcesosPublicados()
|
|
|
|
expect(result).toBe(false)
|
|
expect(store.error).toBe(errorMessage)
|
|
expect(store.loading).toBe(false)
|
|
})
|
|
|
|
it('should handle API error response with message', async () => {
|
|
axios.get.mockRejectedValueOnce({
|
|
response: {
|
|
data: { message: 'Server error occurred' },
|
|
status: 500
|
|
}
|
|
})
|
|
|
|
const result = await store.fetchProcesosPublicados()
|
|
|
|
expect(result).toBe(false)
|
|
expect(store.error).toBe('Server error occurred')
|
|
})
|
|
|
|
it('should call the correct API endpoint', async () => {
|
|
axios.get.mockResolvedValueOnce({ data: [] })
|
|
|
|
await store.fetchProcesosPublicados()
|
|
|
|
expect(axios.get).toHaveBeenCalledTimes(1)
|
|
expect(axios.get).toHaveBeenCalledWith(
|
|
expect.stringContaining('/procesos-admision/publicados')
|
|
)
|
|
})
|
|
|
|
it('should clear previous error before fetching', async () => {
|
|
// Set an error first
|
|
store.error = 'Previous error'
|
|
|
|
axios.get.mockResolvedValueOnce({ data: [] })
|
|
|
|
await store.fetchProcesosPublicados()
|
|
|
|
expect(store.error).toBeNull()
|
|
})
|
|
|
|
it('should update state with processes containing detalles', async () => {
|
|
const mockProcesos = [
|
|
{
|
|
id: 1,
|
|
titulo: 'Proceso con Detalles',
|
|
slug: 'proceso-con-detalles',
|
|
publicado: true,
|
|
detalles: [
|
|
{ tipo: 'requisitos', titulo_detalle: 'Requisitos', descripcion: 'Requisito 1' },
|
|
{ tipo: 'pagos', titulo_detalle: 'Pagos', descripcion: 'Pago info' },
|
|
{ tipo: 'vacantes', titulo_detalle: 'Vacantes', descripcion: '100 vacantes' },
|
|
{ tipo: 'cronograma', titulo_detalle: 'Cronograma', descripcion: 'Fechas importantes' }
|
|
]
|
|
}
|
|
]
|
|
|
|
axios.get.mockResolvedValueOnce({ data: mockProcesos })
|
|
|
|
await store.fetchProcesosPublicados()
|
|
|
|
expect(store.procesosPublicados[0].detalles).toHaveLength(4)
|
|
expect(store.procesosPublicados[0].detalles[0].tipo).toBe('requisitos')
|
|
})
|
|
})
|
|
})
|