Comprendre les spécifications et les installations

J’ai un plugin qui doit initialiser certains groupes.

En suivant Add new webhooks and customize webhook payload, j’ai dans plugin.rb :

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

J’ai des choses comme ceci dans 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

Si j’exécute ./bin/rake db:migrate, cela fait ce que j’attends, mais quand j’exécute les tests, j’obtiens :

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

Il semble donc que les tests veuillent exécuter et réexécuter ces seeds ? Cela n’a pas de sens, car si je relance la migration, cela ne provoque pas d’erreurs.

Devrais-je déplacer ces tests dans spec/fixtures et faire en sorte que le plugin crée ces groupes au démarrage ? Est-ce la meilleure pratique ? Je pense que j’apprécie l’idée de créer ces groupes lors de la migration plutôt que de les vérifier avec Group.find_or_create_by à chaque démarrage du plugin, mais cela fonctionne.

De plus, ./bin/rake db:drop db:create db:migrate semble créer la base de données de test, mais n’exécute pas les migrations à moins que je ne fasse RAILS_DB=test ./bin/rake db:migrate. Est-ce normal ? Je pensais que cela exécuterait ces migrations.

Maintenant, je suis encore plus confus : même après la migration ci-dessus de la base de données de test, j’obtiens :

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

Et je vois des choses comme ceci dans les logs lors de l’exécution de la migration :

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

Eh bien, j’ai fait :

./bin/rake db:test:prepare

et cela a résolu le problème, mais je ne me souviens pas avoir eu à le faire auparavant.

2 « J'aime »