import { render, screen } from '@testing-library/react'; import { describe, it, expect } from 'vitest'; import { PuntosInflexion } from '../PuntosInflexion'; import { puntosInflexion } from '@/lib/content'; describe('', () => { it('still has a heading after losing its header block', () => { render(); // The eyebrow and the deck's title used to sit in a light strip above the // pinned stage; with them gone the lead carries the heading level. A // section this long with no heading at all is a hole in the outline — // for a screen reader the six exchanges would hang off nothing. const encabezado = screen.getByRole('heading', { name: /te reconoces/i }); expect(encabezado.tagName).toBe('H2'); }); it('labels both halves of every exchange with its inflection point', () => { render(); // Twice per point, once on each frame. The pinned sequence shows one thing // at a time, so when creeer's answer is on screen the question that // prompted it is gone — the repeated label is the only thing left tying the // two together. Dropping it from the answer would leave six statements // floating with nothing to answer. for (const name of ['Crecer', 'Consolidarse', 'Recuperar rentabilidad', 'Simplificar', 'Expandirse', 'Replantear el portafolio']) { expect(screen.getAllByText(new RegExp(name))).toHaveLength(2); } expect(screen.getAllByRole('listitem')).toHaveLength(6); }); it('answers every situation instead of only naming it', () => { render(); // The whole point of the section, and the one thing that would silently // regress back into the old mute grid: six situations, six answers, each // spoken by creeer. expect(screen.getAllByLabelText('creeer')).toHaveLength(6); for (const { respuesta } of puntosInflexion.items) { expect(screen.getByText(respuesta)).toBeInTheDocument(); } }); it('states each situation in the second person, as the dueña reads them', () => { // Her own phrasing in the 31/jul call: "estás atrapado en tu compañía", // "creciste muy rápido pero quieres expandirte". The deck's infinitives // ("Dar el siguiente salto") would put the reader outside their own story. // // Only real second-person markers count here. The first draft of this // pattern also accepted `dejó|volvió|abiertos|mismo`, which let four // impersonal lines through — "El esfuerzo dejó de traducirse en resultado" // never addresses anyone. That was the test being bent to fit the copy. for (const { situacion } of puntosInflexion.items) { expect(situacion).toMatch(/\b(tu|tus|te|ti|tienes|vas|sabes|quieres|puedes|demostraste|construiste|creciste)\b/i); } }); it('keeps the situations about the business, not about how it feels', () => { // `dolores` is four sections down and owns the feelings, in the client's // own first-person words. If a situation starts saying "siento" or "estoy // agotado", the two sections collapse into each other. for (const { situacion } of puntosInflexion.items) { expect(situacion).not.toMatch(/\b(siento|me siento|estoy|agotad|frustrad|harto)\b/i); } }); it('does NOT introduce scarcity', () => { const { container } = render(); expect(container.textContent).not.toMatch(/cupos|cohorte|generación fundadora/i); }); });