Remover o model Agreement — Plano de implementação

TLDR: apaga o código do Agreement e depois dropa a tabela agreements com uma migration irreversível.

Spec: .project/docs/specs/20260928152046_remove_agreement_model.md Branch: feat/remove-agreement

Arquitetura: remoção pura, sem comportamento novo — não há teste RED a escrever. A rede de segurança é a suíte existente (baseline: 346 runs, 0 failures) mais um grep que precisa zerar. Primeiro sai o código (a tabela ainda existe, então tudo continua verde); depois sai a tabela.

Stack: Rails 8.1, Minitest com fixtures YAML, PostgreSQL.

Restrições globais

  • Testes rodam com bin/rails t de dentro de modules/backend/ — nunca via make.
  • A migration original 20260724120700_create_agreements.rb não é tocada.
  • drop_table sem bloco — irreversível por decisão explícita.

Todos os caminhos e comandos abaixo são relativos a modules/backend/.

Task 1: Remover o código do Agreement

Files: - Delete: app/models/agreement.rb - Delete: test/models/agreement_test.rb - Delete: test/fixtures/agreements.yml - Modify: app/models/negotiation.rb - Modify: app/models/user.rb - Modify: app/models/debit.rb - Modify: test/models/debit_test.rb - Modify: db/seeds.rb

Interfaces: - Consumes: nada. - Produces: nenhuma referência a Agreement / agreement(s) fora de db/.

  • [ ] Step 1: Confirmar as referências (estado “RED”)

bash grep -rni agreement app test db/seeds.rb

Expected: hits em agreement.rb, negotiation.rb, user.rb, debit.rb, agreement_test.rb, agreements.yml, debit_test.rb, seeds.rb.

  • [ ] Step 2: Apagar arquivos

bash git rm app/models/agreement.rb test/models/agreement_test.rb test/fixtures/agreements.yml

  • [ ] Step 3: Remover associações

app/models/negotiation.rb — remover a linha:

ruby has_one :agreement, dependent: :destroy

app/models/user.rb — remover:

ruby has_many :approved_agreements, class_name: "Agreement", foreign_key: :approved_by_id, inverse_of: :approved_by, dependent: :nullify

app/models/debit.rb — remover:

ruby has_many :agreements, through: :negotiations

  • [ ] Step 4: Remover o teste de associação em test/models/debit_test.rb

Remover o teste inteiro test "reaches its agreements through the negotiations" do ... end e a linha em branco seguinte. Se o comentário # --- associations --- ficar sem nenhum teste abaixo, removê-lo também.

  • [ ] Step 5: Remover o bloco do seed em db/seeds.rb

```ruby puts “\n— Agreement —” puts “Total: #{Agreement.count}”

```

  • [ ] Step 6: Verificar

bash grep -rni agreement app test db/seeds.rb bin/rails t bundle exec rubocop

Expected: grep sem saída; suíte com 0 failures/0 errors (menos runs que a baseline de 346 — saem o teste do debit_test e os de agreement_test.rb); rubocop sem offenses.

  • [ ] Step 7: Commit

bash git add -A app test db/seeds.rb git commit -m "refactor: remove model Agreement"

Task 2: Dropar a tabela agreements

Files: - Create: db/migrate/<timestamp>_drop_agreements.rb - Modify: db/schema.rb (regenerado)

Interfaces: - Consumes: Task 1 (nenhum código referencia a tabela). - Produces: schema.rb sem agreements.

  • [ ] Step 1: Gerar a migration

bash bin/rails g migration DropAgreements

Conteúdo:

ruby class DropAgreements < ActiveRecord::Migration[8.1] def change drop_table :agreements end end

  • [ ] Step 2: Rodar a migration

bash bin/rails db:migrate

Expected: drop_table(:agreements) sem erro; schema.rb perde create_table "agreements" e os dois add_foreign_key "agreements", ..., e a versão sobe para o timestamp da nova migration.

  • [ ] Step 3: Verificar

bash grep -n agreements db/schema.rb grep -rni agreement app test db/seeds.rb bin/rails t bin/rails db:seed

Expected: os dois grep sem saída; suíte com 0 failures/0 errors; seed sem erro.

  • [ ] Step 4: Commit

bash git add db/migrate db/schema.rb git commit -m "refactor: drop tabela agreements"