Skip to content

test: add WordPress fixtures and route coverage - #6

Open
Guajir0-code wants to merge 1 commit into
sourcevortex:mainfrom
Guajir0-code:test/wordpress-fixtures
Open

test: add WordPress fixtures and route coverage#6
Guajir0-code wants to merge 1 commit into
sourcevortex:mainfrom
Guajir0-code:test/wordpress-fixtures

Conversation

@Guajir0-code

Copy link
Copy Markdown

Problema

O projeto não tem cobertura de testes, e não é por falta de vontade: não havia como escrever um teste que tocasse o banco.

Evidência

O único teste de feature do repositório falha:

FAIL  Tests\Feature\ExampleTest
⨯ returns a successful response

QueryException: Database file at path [testing] does not exist.

Corrigido o banco de teste, ele passa a falhar de novo, agora por outro motivo:

SQLSTATE[HY000]: General error: 1 no such table: wp_posts

A causa é estrutural: este projeto aponta o Eloquent para um WordPress existente, então nenhuma migration cria wp_posts, wp_users, wp_terms e as demais. Sem elas, qualquer teste que chegue ao banco morre na primeira query, e o workflow tests está vermelho.

Solução

tests/Support/WordPressSchema.php

Cria as sete tabelas que a aplicação lê:

wp_posts, wp_postmeta, wp_users, wp_usermeta, wp_terms, wp_term_taxonomy, wp_term_relationships.

Os tipos seguem o WordPress de perto o bastante para que as consultas de App\Models e App\Services se comportem como em produção. Colunas que a aplicação nunca lê ficaram de fora, de propósito, para o arquivo continuar legível.

Vale registrar um efeito colateral útil: como o app não tem migrations para essas tabelas, este arquivo passa a ser o único lugar do repositório onde o schema esperado está descrito.

tests/Support/Wp.php

Construtores curtos para as linhas: Wp::user(), Wp::post(), Wp::term(), Wp::categorise(), Wp::thumbnail(), Wp::postMeta(), Wp::userMeta().

Não usei factories do Eloquent porque os models Wp* não declaram $fillable e vários têm chave primária fora da convenção (ID, term_id, meta_id). Inserts diretos ficam mais perto do que o banco de produção realmente contém e evitam configurar o Eloquent para um caso que só existe no teste.

tests/Pest.php

->beforeEach(function () {
    Tests\Support\WordPressSchema::create();
    $this->withoutVite();
    cache()->flush();
})

withoutVite() desacopla a suíte de npm run build: sem ele, renderizar a view raiz exige um manifest compilado, e os testes falham numa máquina limpa.

O cache()->flush() importa porque os services cacheiam agressivamente — sem isso um teste vaza resultado para o seguinte.

tests/Feature/RoutesTest.php

Cobertura das sete rotas de routes/web.php, mais os comportamentos que ninguém verificava:

Teste O que garante
home, post, categoria, tag, autor, arquivo, política rota responde e monta o componente Inertia certo
exclusão de destaques posts em destaques aparecem no carrossel e não na listagem
busca ?s= filtra e devolve o termo
slug inexistente 404
rascunho e agendado o global scope de fato esconde os dois

Os dois últimos são o tipo de coisa que quebra em silêncio: se WpPostScope parar de filtrar post_status, rascunhos vazam para a home e nada avisa.

Como validar

php artisan test
Tests: 12 passed (133 assertions)

Esta é a primeira vez que a suíte fica verde no repositório.

Impacto

  • Aplicação: nenhuma mudança em app/. Este PR só adiciona tests/ e ajusta phpunit.xml.
  • CI: o workflow tests passa a passar. Nenhuma alteração foi necessária no tests.yml — com phpunit.xml corrigido e withoutVite(), o workflow existente já funciona.
  • Rollback: reverter o commit.

phpunit.xml

-<env name="DB_DATABASE" value="testing"/>
+<env name="DB_CONNECTION" value="sqlite"/>
+<env name="DB_DATABASE" value=":memory:"/>

DB_DATABASE=testing sem DB_CONNECTION fazia o sqlite procurar um arquivo chamado testing. É a mesma alteração presente nos outros PRs desta série; se algum for mesclado antes, esta parte vira no-op.

ExampleTest removido

RoutesTest cobre GET / de forma real, com dados e asserções sobre os props. Manter o stub que só verifica 200 seria redundante.

Fora de escopo

  • Testes de unidade dos services. A cobertura aqui é de feature, pelas rotas. Vale expandir, mas a infraestrutura é o que destrava isso.
  • Componentes Vue. Não há runner de testes de front configurado no projeto; adicionar um é decisão à parte.
  • O schema é um subconjunto. Cobre o que a aplicação lê hoje. Se um recurso novo passar a ler outra coluna ou tabela, WordPressSchema precisa acompanhar.

The app points Eloquent at an existing WordPress database, so no migration
creates wp_posts, wp_users, wp_terms and friends. Any test that touched the
database therefore could not run, and the single feature test in the repo
(GET / asserting 200) failed on a missing database.

Add a schema builder for the wp_* tables the app reads, small row builders,
and smoke coverage for all seven routes in routes/web.php, including the
highlighted-post exclusion, search, and the published/scheduled filtering the
global scope is responsible for.

withoutVite() keeps the suite independent of `npm run build`.
ExampleTest is dropped: RoutesTest covers GET / properly.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant