Compreendendo especificações e instalações

Tenho um plugin que precisa popular alguns grupos.

Seguindo Add new webhooks and customize webhook payload, no plugin.rb eu tenho:

  SeedFu.fixture_paths << Rails.root.join("plugins", "discourse-pfaffmanager", "db", "fixtures").to_s

Tenho algo assim em db/fixtures/001_create_pfaffmanager_groups:

Group.seed do |g|
  g.name = SiteSetting.pfaffmanager_ec2_pro_server_group
  g.visibility_level = Group.visibility_levels[:owners]
end

Se eu executo ./bin/rake db:migrate, ele faz o que eu espero, mas quando executo os testes (specs), recebo:

#   ERROR:  duplicate key value violates unique constraint "index_groups_on_name"

Parece que os testes querem executar e reexecutar esses seeds? Isso não faz sentido, pois se eu reexecutar a migração, eles não causam erros.

Talvez eu devesse mover esses testes para spec/fixtures e fazer o plugin criar esses grupos na inicialização? Isso seria a melhor prática? Acredito que prefiro a ideia de criar esses grupos na migração em vez de verificá-los com Group.find_or_create_by a cada inicialização do plugin, mas isso está funcionando.

Além disso, ./bin/rake db:drop db:create db:migrate parece criar o banco de dados de teste, mas não está executando as migrações a menos que eu faça RAILS_DB=test ./bin/rake db:migrate. Isso é esperado? Eu achava que ele executaria essas migrações.

Agora estou ainda mais confuso. Mesmo após a migração acima do banco de dados de teste, recebo:

ActiveRecord::StatementInvalid:
  PG::UndefinedTable: ERROR:  relation "groups" does not exist
  LINE 8:  WHERE a.attrelid = '"groups"'::regclass

E vejo coisas assim ao executar a migração:

-- execute("UPDATE groups\nSET flair_icon = 'fab-youtube'\nWHERE flair_icon = 'youtube-play' OR flair_icon = 'fa-youtube-play'\n")

Bem, eu fiz:

./bin/rake db:test:prepare

e isso corrigiu o problema, mas não me lembro de ter que fazer isso antes.

2 curtidas