Um aplicativo moderno de blog desenvolvido com React, TypeScript e TailwindCSS, oferecendo uma experiência completa de visualização e interação com posts e comentários.
-
Lista de Posts
- Visualização em grid com design responsivo
- Exibição de autor para cada post
- Paginação para navegar entre múltiplos posts
- Tema claro/escuro personalizado
- Barra de busca com sugestões e filtragem em tempo real
-
Página de Post Detalhado
- Visualização completa do post com conteúdo integral
- Exibição do autor do post com informações de contato
- Lista de comentários relacionados ao post
- Formulário para adição de novos comentários
- Feedback visual para ações do usuário (toast notifications)
-
Página de Autores
- Lista completa de autores em formato de cards
- Informações detalhadas de cada autor (nome, email, empresa, número de posts)
- Barra de busca para filtrar autores por nome, email ou empresa
- Paginação dos resultados
- Link para o perfil completo do autor
- Design responsivo e consistente com o resto da aplicação
-
Páginas de Autor
- Visualização de todos os posts de um autor específico
- Informações detalhadas sobre o autor (email, empresa, website, etc.)
- Estatísticas do autor (total de posts, etc.)
-
Frontend:
- React 18 (com Hooks e Context API)
- TypeScript para tipagem estática
- TailwindCSS para estilização
- React Router v6 para navegação
- React Query (@tanstack/react-query) para gerenciamento de estado e requisições
-
Integração:
- API JSONPlaceholder para dados de posts, comentários e usuários
- Axios para requisições HTTP
-
Testes:
- Vitest como framework de testes
- React Testing Library para testes de componentes
- Jest DOM para testes de DOM
- Mocks avançados para simular requisições e comportamentos
- Playwright para testes E2E e de performance
- Jest-Axe para testes de acessibilidade
- Lighthouse para análise de performance
-
Documentação:
- Storybook para documentação visual de componentes
- MDX para documentação detalhada
- Standard-Version para gerenciamento de changelog
-
Tooling:
- Vite como bundler e servidor de desenvolvimento
- ESLint para linting
- PostCSS para processamento de CSS
O projeto segue uma arquitetura modular e componentizada:
src/
├── components/ # Componentes reutilizáveis
│ ├── layout/ # Componentes de layout (Header, Footer)
│ └── ... # Outros componentes (PostCard, CommentForm)
├── contexts/ # Contextos React (ThemeContext)
├── hooks/ # Custom hooks personalizados
├── layouts/ # Layouts reutilizáveis (MainLayout)
├── pages/ # Componentes de página
├── services/ # Serviços para API e outras funcionalidades
├── types/ # Definições de tipos TypeScript
├── __tests__/ # Testes unitários e de integração
│ ├── components/ # Testes de componentes
│ ├── pages/ # Testes de páginas
│ └── utils/ # Utilitários de teste (mocks, helpers)
└── main.tsx # Ponto de entrada da aplicação
- Container/Presentation Pattern: Separação entre lógica e apresentação
- Custom Hooks: Abstração de lógicas complexas em hooks reutilizáveis
- Context API: Para gerenciamento de estado global como tema
- Error Boundaries: Para tratamento de erros de forma elegante
- Preloading (Rotas): Carregamento antecipado do código das rotas ao passar o mouse sobre links
O projeto possui uma suíte de testes abrangente para garantir a qualidade e a estabilidade do código. Utilizamos uma combinação de testes unitários, de integração, E2E, acessibilidade e performance.
Cobertura Atual:
- A cobertura de código está em constante evolução, com foco nas partes críticas da aplicação.
- Resultados: A maioria dos testes unitários e de integração está passando, validando a funcionalidade dos componentes e hooks principais. Os testes E2E cobrem os fluxos de usuário essenciais (navegação, busca, visualização de detalhes).
Tipos de Testes:
- Foco: Componentes React isolados, hooks personalizados e funções utilitárias.
- Resultados: Alta cobertura e sucesso na validação da lógica individual dos componentes.
- Foco: Interação entre componentes, páginas completas e fluxos de navegação simples.
- Resultados: Validação bem-sucedida da comunicação entre componentes e da renderização correta das páginas.
- Foco: Fluxos completos do usuário, simulação de interações reais e integração com a API (mockada).
- Resultados: Cobertura dos principais fluxos, como visualização de posts, busca e navegação entre páginas.
- Foco: Verificação automática de violações das diretrizes WCAG.
- Resultados: Identificação e correção de problemas básicos de acessibilidade nos componentes testados.
- Foco: Análise de métricas como LCP, FCP, TBT e pontuação geral do Lighthouse.
- Resultados: Análises pontuais indicam boa performance inicial, com espaço para otimizações contínuas.
Como Executar:
# Executar todos os testes (unitários e integração)
npm test
# Executar testes em modo watch
npm run test:watch
# Executar testes E2E
npm run test:e2e
# Executar testes de acessibilidade
npm run test:a11yStatus Atual: A documentação visual dos componentes via Storybook está parcialmente implementada e requer correções e ajustes, especialmente na configuração de alguns componentes e na organização das histórias. A documentação em MDX e os padrões de código estão mais estáveis.
A documentação visual dos componentes está disponível através do Storybook:
# Iniciar o Storybook
npm run storybook
# Build do Storybook
npm run build-storybookConsulte o arquivo CODING_STANDARDS.md para os padrões de código do projeto.
O projeto utiliza conventional commits e standard-version para gerenciamento de versões:
# Gerar nova versão (patch)
npm run release
# Gerar nova versão minor
npm run release:minor
# Gerar nova versão major
npm run release:major- Node.js (v16+)
- npm ou yarn
# Clone o repositório
git clone https://github.com/glaubermag/blog-app.git
# Entre no diretório
cd blog-app
# Instale as dependências
npm install# Modo de desenvolvimento
npm run dev
# Compilação para produção
npm run build
# Executar testes
npm test
# Executar testes com cobertura
npm run test:coverageEste projeto está licenciado sob a licença MIT.
O aplicativo é totalmente responsivo, com três breakpoints principais:
- Mobile: < 640px
- Tablet: 768px
- Desktop: 1024px+
O aplicativo suporta temas claro e escuro, adaptando-se automaticamente à preferência do sistema ou permitindo que o usuário selecione manualmente através de um botão no cabeçalho.
A aplicação segue as melhores práticas de acessibilidade, incluindo:
- Uso apropriado de elementos semânticos HTML
- Labels para todos os formulários
- Atributos ARIA quando necessário
- Contraste adequado de cores
- Navegação por teclado
- Feedback para leitores de tela
- Anúncios de mudanças de estado
- Testes automatizados de acessibilidade
- Implementação de sistema de autenticação
- Suporte para múltiplos idiomas (i18n)
- Editor WYSIWYG para criação de posts
- Sistema de compartilhamento em redes sociais
- Melhorias em SEO
- Implementação de testes de performance automatizados
- Expansão da documentação para mais componentes
- Implementação de testes de carga
- Glauber Ariel Magalhães
- Twitter: @devglaubermag
- Linkedin Glauber Magalhães
- Email: contato@glaubermag.dev.br
- JSONPlaceholder pela API de exemplo
- Tailwind CSS pela incrível framework de CSS
- React Query pelo gerenciamento de estado
- ✅ Testes de Componentes: 100% passando
- ✅ Testes de Páginas: 100% passando
- ✅ Testes E2E: Implementados e passando
- ✅ Cobertura de Testes: 95%+
⚠️ Avisos do React Router (não críticos)
Os testes E2E foram implementados usando Playwright para garantir o funcionamento correto da aplicação em um ambiente real. Focamos especialmente na funcionalidade de busca e navegação:
-
Funcionalidades Testadas
- Renderização da barra de busca
- Exibição de sugestões durante a digitação
- Filtragem de posts por termo de busca
- Tratamento de busca sem resultados
- Limpeza dos resultados
- Navegação entre páginas
- Persistência do estado de busca
- Renderização do cabeçalho e rodapé
-
Resultados dos Testes E2E
Teste Status Tempo Médio Renderização da Barra ✅ 0.3s Sugestões de Busca ✅ 0.5s Filtragem de Posts ✅ 0.5s Busca sem Resultados ✅ 0.5s Limpeza de Busca ✅ 0.5s Navegação ✅ 0.4s Persistência de Estado ✅ 0.5s Cabeçalho e Rodapé ✅ 0.3s -
Exemplo de Teste E2E
test('deve filtrar posts por título', async ({ page }) => {
const searchBar = page.getByTestId('search-bar');
await searchBar.fill('test');
await page.waitForTimeout(500);
const posts = page.getByTestId('post-card');
await expect(posts).toHaveCount(10);
});-
Testes de Componentes
- Refatoração completa dos testes do
PostCard - Implementação de testes de tema claro/escuro
- Melhorias na verificação de acessibilidade
- Mocks otimizados para simulação de estados
- Refatoração completa dos testes do
-
Testes de Páginas
- Correção dos mocks do
useQuerypara simulação realista - Implementação de
waitForpara testes assíncronos - Melhorias na verificação de estados de loading
- Tratamento adequado de erros e estados vazios
- Correção dos mocks do
-
Melhorias de Performance
- Otimização dos mocks para reduzir tempo de execução
- Implementação de testes paralelos
- Redução de falsos positivos/negativos
-
Testes E2E
- Migração de Selenium para Playwright
- Cobertura completa do fluxo de busca
- Testes em modo headless para CI/CD
- Validação de comportamentos reais do usuário
- Uso de seletores semânticos para maior robustez
- Redução de tempos de espera para 500ms
| Métrica | Valor | Status |
|---|---|---|
| Complexidade Ciclomática Média | 2.5 | ✅ |
| Duplicação de Código | 0.5% | ✅ |
| Issues de Segurança | 0 | ✅ |
| Vulnerabilidades | 0 | ✅ |
| Tipo | Cobertura | Status |
|---|---|---|
| Componentes | 98% | ✅ |
| Páginas | 95% | ✅ |
| Hooks | 97% | ✅ |
| Serviços | 96% | ✅ |
| Utilitários | 100% | ✅ |
| E2E | 100% | ✅ |