docs(auto-melhoria): memorias atualizadas 2026-05-20 — suite 80/80

- MEMORY.md: revisada com 6 novas lições (inclui vitest.jsdom.mocks)
- SESSION-STATE.md: sync com project SESSION-STATE.md
- memory/2026-05-20.md: sessao criada (22:56 → 00:18)
- .learnings/LEARNINGS.md: LRN-006, LRN-007 adicionados
- .learnings/PATTERN_COUNTER.md: react.testing-library + vitest.jsdom.mocks = 3
- AGENTS.md: Test & Mocking Best Practices promovido de PATTERN_COUNTER
This commit is contained in:
pulse-agent
2026-05-20 00:20:20 -03:00
parent d1b3667755
commit c07690b4d4
5 changed files with 138 additions and 86 deletions
+33
View File
@@ -325,6 +325,39 @@ Quando o usuário pedir para analisar sistemas Linux, logs, processos ou rede:
---
## ✅ Test & Mocking Best Practices (promovido 2026-05-20)
Estes padrões atingiram Count ≥ 3 no PATTERN_COUNTER — promovidos para regra permanente.
### Vitest + jsdom — Mocks globais (vitest.jsdom.mocks)
> `localStorage`, `clipboard`, `matchMedia` NÃO funcionam no jsdom sem setup.
```ts
// ❌ Erro comum: dependência em impl nativa do jsdom
localStorage.setItem('x', '1') // Erro no jsdom puro
// ✅ Sempre mockar em beforeAll / beforeEach globais
beforeAll(() => {
vi.stubGlobal('localStorage', {
getItem: vi.fn(),
setItem: vi.fn(),
removeItem: vi.fn(),
clear: vi.fn(),
});
Object.assign(navigator, { clipboard: { writeText: vi.fn() } });
window.matchMedia = vi.fn().mockReturnValue({ matches: false, addListener: vi.fn(), removeListener: vi.fn() });
});
```
### React Testing Library (react.testing-library)
> Use `screen` e queries semânticas — evita queries por implementação.
-`screen.getByRole('button', { name: /submit/i })`
-`getByTestId('submit-btn')` (quebra com mudanças de markup)
-`userEvent.setup()` preferencial a `fireEvent`
- ✅ Wrapper com `<BrowserRouter>` + `<UserProvider>` em todos os testes de componentes que usam contextos
---
## 🗺️ Estratégia de Stack — Agente Full-Stack
```