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.
397 lines
12 KiB
JavaScript
397 lines
12 KiB
JavaScript
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'
|
|
import { mount, shallowMount } from '@vue/test-utils'
|
|
import { ref, computed, nextTick } from 'vue'
|
|
import { setActivePinia, createPinia } from 'pinia'
|
|
|
|
// Since WebPage.vue has many dependencies, we'll test the showModal logic in isolation
|
|
// by extracting the logic into a testable unit
|
|
|
|
describe('WebPage showModal function', () => {
|
|
// Simulate the showModal function logic from WebPage.vue
|
|
const tipoLabels = {
|
|
requisitos: 'Requisitos',
|
|
pagos: 'Pagos',
|
|
vacantes: 'Vacantes',
|
|
cronograma: 'Cronograma'
|
|
}
|
|
|
|
const createShowModal = (procesosPublicados) => {
|
|
const detalleModal = ref({
|
|
titulo: '',
|
|
descripcion: '',
|
|
imagen_url: null,
|
|
imagen_url_2: null,
|
|
listas: []
|
|
})
|
|
const detalleModalVisible = ref(false)
|
|
|
|
const showModal = ({ procesoId, tipo }) => {
|
|
const proceso = procesosPublicados.value.find(p => p.id === procesoId)
|
|
if (!proceso) return
|
|
|
|
const detalle = proceso.detalles?.find(d => d.tipo === tipo)
|
|
|
|
if (detalle) {
|
|
detalleModal.value = {
|
|
titulo: detalle.titulo_detalle || tipoLabels[tipo] || tipo,
|
|
descripcion: detalle.descripcion || '',
|
|
imagen_url: detalle.imagen_url || null,
|
|
imagen_url_2: detalle.imagen_url_2 || null,
|
|
listas: detalle.listas || []
|
|
}
|
|
} else {
|
|
detalleModal.value = {
|
|
titulo: `${tipoLabels[tipo] || tipo} - ${proceso.titulo}`,
|
|
descripcion: '',
|
|
imagen_url: null,
|
|
imagen_url_2: null,
|
|
listas: []
|
|
}
|
|
}
|
|
|
|
detalleModalVisible.value = true
|
|
}
|
|
|
|
return { showModal, detalleModal, detalleModalVisible }
|
|
}
|
|
|
|
describe('when proceso has matching detalle', () => {
|
|
it('displays detalle information when detalle exists for the tipo', () => {
|
|
const procesosPublicados = ref([
|
|
{
|
|
id: 1,
|
|
titulo: 'Admisión 2026',
|
|
detalles: [
|
|
{
|
|
tipo: 'requisitos',
|
|
titulo_detalle: 'Requisitos de Admisión',
|
|
descripcion: 'Lista de requisitos necesarios para postular',
|
|
imagen_url: 'https://example.com/requisitos.jpg',
|
|
imagen_url_2: 'https://example.com/requisitos2.jpg',
|
|
listas: ['DNI vigente', 'Certificado de estudios', 'Foto carnet']
|
|
}
|
|
]
|
|
}
|
|
])
|
|
|
|
const { showModal, detalleModal, detalleModalVisible } = createShowModal(procesosPublicados)
|
|
|
|
showModal({ procesoId: 1, tipo: 'requisitos' })
|
|
|
|
expect(detalleModalVisible.value).toBe(true)
|
|
expect(detalleModal.value.titulo).toBe('Requisitos de Admisión')
|
|
expect(detalleModal.value.descripcion).toBe('Lista de requisitos necesarios para postular')
|
|
expect(detalleModal.value.imagen_url).toBe('https://example.com/requisitos.jpg')
|
|
expect(detalleModal.value.imagen_url_2).toBe('https://example.com/requisitos2.jpg')
|
|
expect(detalleModal.value.listas).toEqual(['DNI vigente', 'Certificado de estudios', 'Foto carnet'])
|
|
})
|
|
|
|
it('uses tipo label as title when titulo_detalle is not provided', () => {
|
|
const procesosPublicados = ref([
|
|
{
|
|
id: 1,
|
|
titulo: 'Admisión 2026',
|
|
detalles: [
|
|
{
|
|
tipo: 'pagos',
|
|
descripcion: 'Información de pagos'
|
|
}
|
|
]
|
|
}
|
|
])
|
|
|
|
const { showModal, detalleModal } = createShowModal(procesosPublicados)
|
|
|
|
showModal({ procesoId: 1, tipo: 'pagos' })
|
|
|
|
expect(detalleModal.value.titulo).toBe('Pagos')
|
|
expect(detalleModal.value.descripcion).toBe('Información de pagos')
|
|
})
|
|
|
|
it('handles detalle with vacantes tipo correctly', () => {
|
|
const procesosPublicados = ref([
|
|
{
|
|
id: 1,
|
|
titulo: 'Proceso Ordinario',
|
|
detalles: [
|
|
{
|
|
tipo: 'vacantes',
|
|
titulo_detalle: 'Vacantes Disponibles',
|
|
descripcion: '100 vacantes para todas las carreras',
|
|
listas: ['Medicina: 20', 'Ingeniería: 30', 'Derecho: 50']
|
|
}
|
|
]
|
|
}
|
|
])
|
|
|
|
const { showModal, detalleModal } = createShowModal(procesosPublicados)
|
|
|
|
showModal({ procesoId: 1, tipo: 'vacantes' })
|
|
|
|
expect(detalleModal.value.titulo).toBe('Vacantes Disponibles')
|
|
expect(detalleModal.value.listas).toHaveLength(3)
|
|
})
|
|
|
|
it('handles detalle with cronograma tipo correctly', () => {
|
|
const procesosPublicados = ref([
|
|
{
|
|
id: 1,
|
|
titulo: 'Admisión Extraordinaria',
|
|
detalles: [
|
|
{
|
|
tipo: 'cronograma',
|
|
titulo_detalle: 'Cronograma de Actividades',
|
|
descripcion: 'Fechas importantes del proceso',
|
|
imagen_url: 'https://example.com/cronograma.png'
|
|
}
|
|
]
|
|
}
|
|
])
|
|
|
|
const { showModal, detalleModal } = createShowModal(procesosPublicados)
|
|
|
|
showModal({ procesoId: 1, tipo: 'cronograma' })
|
|
|
|
expect(detalleModal.value.titulo).toBe('Cronograma de Actividades')
|
|
expect(detalleModal.value.imagen_url).toBe('https://example.com/cronograma.png')
|
|
})
|
|
})
|
|
|
|
describe('when proceso does not have matching detalle', () => {
|
|
it('creates default modal data with proceso title when no detalle found', () => {
|
|
const procesosPublicados = ref([
|
|
{
|
|
id: 1,
|
|
titulo: 'Admisión 2026',
|
|
detalles: [] // No detalles
|
|
}
|
|
])
|
|
|
|
const { showModal, detalleModal, detalleModalVisible } = createShowModal(procesosPublicados)
|
|
|
|
showModal({ procesoId: 1, tipo: 'requisitos' })
|
|
|
|
expect(detalleModalVisible.value).toBe(true)
|
|
expect(detalleModal.value.titulo).toBe('Requisitos - Admisión 2026')
|
|
expect(detalleModal.value.descripcion).toBe('')
|
|
expect(detalleModal.value.imagen_url).toBeNull()
|
|
expect(detalleModal.value.imagen_url_2).toBeNull()
|
|
expect(detalleModal.value.listas).toEqual([])
|
|
})
|
|
|
|
it('creates default modal for pagos when no detalle', () => {
|
|
const procesosPublicados = ref([
|
|
{
|
|
id: 2,
|
|
titulo: 'Proceso Especial',
|
|
detalles: [
|
|
{ tipo: 'requisitos', titulo_detalle: 'Requisitos' } // Only requisitos, no pagos
|
|
]
|
|
}
|
|
])
|
|
|
|
const { showModal, detalleModal } = createShowModal(procesosPublicados)
|
|
|
|
showModal({ procesoId: 2, tipo: 'pagos' })
|
|
|
|
expect(detalleModal.value.titulo).toBe('Pagos - Proceso Especial')
|
|
})
|
|
|
|
it('handles proceso with undefined detalles array', () => {
|
|
const procesosPublicados = ref([
|
|
{
|
|
id: 1,
|
|
titulo: 'Proceso Sin Detalles'
|
|
// No detalles property at all
|
|
}
|
|
])
|
|
|
|
const { showModal, detalleModal, detalleModalVisible } = createShowModal(procesosPublicados)
|
|
|
|
showModal({ procesoId: 1, tipo: 'vacantes' })
|
|
|
|
expect(detalleModalVisible.value).toBe(true)
|
|
expect(detalleModal.value.titulo).toBe('Vacantes - Proceso Sin Detalles')
|
|
})
|
|
})
|
|
|
|
describe('when proceso is not found', () => {
|
|
it('does not open modal when procesoId does not match any proceso', () => {
|
|
const procesosPublicados = ref([
|
|
{
|
|
id: 1,
|
|
titulo: 'Admisión 2026',
|
|
detalles: []
|
|
}
|
|
])
|
|
|
|
const { showModal, detalleModal, detalleModalVisible } = createShowModal(procesosPublicados)
|
|
|
|
showModal({ procesoId: 999, tipo: 'requisitos' }) // Non-existent ID
|
|
|
|
expect(detalleModalVisible.value).toBe(false)
|
|
})
|
|
|
|
it('does not modify modal data when proceso not found', () => {
|
|
const procesosPublicados = ref([
|
|
{ id: 1, titulo: 'Admisión 2026', detalles: [] }
|
|
])
|
|
|
|
const { showModal, detalleModal } = createShowModal(procesosPublicados)
|
|
|
|
// Set initial state
|
|
const initialState = { ...detalleModal.value }
|
|
|
|
showModal({ procesoId: 999, tipo: 'requisitos' })
|
|
|
|
expect(detalleModal.value).toEqual(initialState)
|
|
})
|
|
})
|
|
|
|
describe('modal data handling edge cases', () => {
|
|
it('handles empty strings in detalle properties', () => {
|
|
const procesosPublicados = ref([
|
|
{
|
|
id: 1,
|
|
titulo: 'Test Proceso',
|
|
detalles: [
|
|
{
|
|
tipo: 'requisitos',
|
|
titulo_detalle: '',
|
|
descripcion: '',
|
|
imagen_url: '',
|
|
listas: []
|
|
}
|
|
]
|
|
}
|
|
])
|
|
|
|
const { showModal, detalleModal } = createShowModal(procesosPublicados)
|
|
|
|
showModal({ procesoId: 1, tipo: 'requisitos' })
|
|
|
|
// Empty titulo_detalle should fall back to tipo label
|
|
expect(detalleModal.value.titulo).toBe('Requisitos')
|
|
expect(detalleModal.value.descripcion).toBe('')
|
|
})
|
|
|
|
it('handles null values in detalle properties', () => {
|
|
const procesosPublicados = ref([
|
|
{
|
|
id: 1,
|
|
titulo: 'Test Proceso',
|
|
detalles: [
|
|
{
|
|
tipo: 'pagos',
|
|
titulo_detalle: 'Pagos',
|
|
descripcion: null,
|
|
imagen_url: null,
|
|
imagen_url_2: null,
|
|
listas: null
|
|
}
|
|
]
|
|
}
|
|
])
|
|
|
|
const { showModal, detalleModal } = createShowModal(procesosPublicados)
|
|
|
|
showModal({ procesoId: 1, tipo: 'pagos' })
|
|
|
|
expect(detalleModal.value.descripcion).toBe('')
|
|
expect(detalleModal.value.imagen_url).toBeNull()
|
|
expect(detalleModal.value.listas).toEqual([])
|
|
})
|
|
|
|
it('correctly maps all tipo labels', () => {
|
|
const testCases = [
|
|
{ tipo: 'requisitos', expectedLabel: 'Requisitos' },
|
|
{ tipo: 'pagos', expectedLabel: 'Pagos' },
|
|
{ tipo: 'vacantes', expectedLabel: 'Vacantes' },
|
|
{ tipo: 'cronograma', expectedLabel: 'Cronograma' }
|
|
]
|
|
|
|
testCases.forEach(({ tipo, expectedLabel }) => {
|
|
const procesosPublicados = ref([
|
|
{ id: 1, titulo: 'Test', detalles: [] }
|
|
])
|
|
|
|
const { showModal, detalleModal } = createShowModal(procesosPublicados)
|
|
|
|
showModal({ procesoId: 1, tipo })
|
|
|
|
expect(detalleModal.value.titulo).toBe(`${expectedLabel} - Test`)
|
|
})
|
|
})
|
|
|
|
it('handles unknown tipo by using tipo as label', () => {
|
|
const procesosPublicados = ref([
|
|
{ id: 1, titulo: 'Test', detalles: [] }
|
|
])
|
|
|
|
const { showModal, detalleModal } = createShowModal(procesosPublicados)
|
|
|
|
showModal({ procesoId: 1, tipo: 'unknown_tipo' })
|
|
|
|
expect(detalleModal.value.titulo).toBe('unknown_tipo - Test')
|
|
})
|
|
})
|
|
|
|
describe('multiple procesos scenarios', () => {
|
|
it('correctly finds the right proceso among multiple', () => {
|
|
const procesosPublicados = ref([
|
|
{
|
|
id: 1,
|
|
titulo: 'Proceso Uno',
|
|
detalles: [{ tipo: 'requisitos', titulo_detalle: 'Requisitos Uno' }]
|
|
},
|
|
{
|
|
id: 2,
|
|
titulo: 'Proceso Dos',
|
|
detalles: [{ tipo: 'requisitos', titulo_detalle: 'Requisitos Dos' }]
|
|
},
|
|
{
|
|
id: 3,
|
|
titulo: 'Proceso Tres',
|
|
detalles: [{ tipo: 'requisitos', titulo_detalle: 'Requisitos Tres' }]
|
|
}
|
|
])
|
|
|
|
const { showModal, detalleModal } = createShowModal(procesosPublicados)
|
|
|
|
showModal({ procesoId: 2, tipo: 'requisitos' })
|
|
|
|
expect(detalleModal.value.titulo).toBe('Requisitos Dos')
|
|
})
|
|
|
|
it('handles showing different tipos for different procesos', () => {
|
|
const procesosPublicados = ref([
|
|
{
|
|
id: 1,
|
|
titulo: 'Proceso A',
|
|
detalles: [
|
|
{ tipo: 'requisitos', titulo_detalle: 'Requisitos A' },
|
|
{ tipo: 'pagos', titulo_detalle: 'Pagos A' }
|
|
]
|
|
},
|
|
{
|
|
id: 2,
|
|
titulo: 'Proceso B',
|
|
detalles: [
|
|
{ tipo: 'vacantes', titulo_detalle: 'Vacantes B' }
|
|
]
|
|
}
|
|
])
|
|
|
|
const { showModal, detalleModal } = createShowModal(procesosPublicados)
|
|
|
|
// Show pagos for proceso 1
|
|
showModal({ procesoId: 1, tipo: 'pagos' })
|
|
expect(detalleModal.value.titulo).toBe('Pagos A')
|
|
|
|
// Then show vacantes for proceso 2
|
|
showModal({ procesoId: 2, tipo: 'vacantes' })
|
|
expect(detalleModal.value.titulo).toBe('Vacantes B')
|
|
})
|
|
})
|
|
})
|