Testing de Navegación
Ejemplo: Sidebar Navigation
Test: cypress/e2e/sidebar.cy.ts
describe('Sidebar Navigation', () => {
beforeEach(() => {
cy.visit('/docs');
});
it('debe expandir/colapsar categorías', () => {
// Verificar categoría colapsada
cy.get('[data-testid="category-tutorial"]')
.should('have.attr', 'aria-expanded', 'false');
// Expandir
cy.get('[data-testid="category-tutorial"]').click();
// Verificar expandida
cy.get('[data-testid="category-tutorial"]')
.should('have.attr', 'aria-expanded', 'true');
// Verificar items visibles
cy.get('[data-testid="category-tutorial"]')
.parent()
.find('ul li')
.should('have.length.at.least', 1)
.and('be.visible');
});
it('debe resaltar página actual', () => {
cy.visit('/docs/intro');
cy.get('[data-testid="sidebar-item-intro"]')
.should('have.class', 'active')
.or('have.attr', 'aria-current', 'page');
});
it('debe mantener scroll position', () => {
// Scroll hasta abajo
cy.get('[data-testid="sidebar"]').scrollTo('bottom');
// Click en link
cy.get('[data-testid="sidebar"]')
.find('a')
.last()
.click();
// Volver atrás
cy.go('back');
// Verificar que mantiene posición (aproximada)
cy.get('[data-testid="sidebar"]')
.should(($el) => {
const scrollTop = $el[0].scrollTop;
expect(scrollTop).to.be.greaterThan(100);
});
});
it('debe ser responsive', () => {
// Mobile viewport
cy.viewport('iphone-x');
// Sidebar debe estar oculto
cy.get('[data-testid="sidebar"]').should('not.be.visible');
// Abrir menu mobile
cy.get('[data-testid="mobile-menu-button"]').click();
// Sidebar debe aparecer
cy.get('[data-testid="sidebar"]').should('be.visible');
});
});
Ejemplo: Paginación
Test: cypress/e2e/pagination.cy.ts
describe('Pagination', () => {
beforeEach(() => {
cy.visit('/blog');
});
it('debe navegar entre páginas', () => {
// Verificar página 1
cy.get('[data-testid="current-page"]').should('contain', '1');
// Click en siguiente
cy.get('[data-testid="next-page"]').click();
// Verificar página 2
cy.url().should('include', 'page=2');
cy.get('[data-testid="current-page"]').should('contain', '2');
// Verificar contenido cambió
cy.get('[data-testid="blog-posts"]')
.find('[data-testid="post"]')
.should('have.length.at.least', 1);
});
it('debe deshabilitar botón en primera/última página', () => {
// Primera página: previous disabled
cy.get('[data-testid="prev-page"]').should('be.disabled');
// Navegar a última página
cy.get('[data-testid="last-page"]').click();
// Última página: next disabled
cy.get('[data-testid="next-page"]').should('be.disabled');
});
it('debe permitir salto directo a página', () => {
cy.get('[data-testid="page-3"]').click();
cy.url().should('include', 'page=3');
cy.get('[data-testid="current-page"]').should('contain', '3');
});
});