Verständnis von Spezifikationen und Vorrichtungen

Ich habe ein Plugin, das einige Gruppen initialisieren muss.

Nachfolgend, basierend auf Add new webhooks and customize webhook payload, habe ich in plugin.rb:

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

In db/fixtures/001_create_pfaffmanager_groups habe ich so etwas:

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

Wenn ich ./bin/rake db:migrate ausführe, funktioniert es wie erwartet. Wenn ich jedoch die Tests laufen lasse, erhalte ich:

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

Es scheint also, als würden die Tests diese Seeds ausführen und erneut ausführen wollen? Das ergibt keinen Sinn, denn wenn ich die Migration erneut ausführe, treten keine Fehler auf.

Sollte ich diese Tests vielleicht in spec/fixtures verschieben und das Plugin dazu bringen, diese Gruppen beim Start zu erstellen? Ist das Best Practice? Ich finde die Idee, diese Gruppen bei der Migration zu erstellen, besser als sie bei jedem Plugin-Start mit Group.find_or_create_by zu prüfen, aber das funktioniert auch.

Außerdem scheint ./bin/rake db:drop db:create db:migrate die Testdatenbank zu erstellen, führt aber keine Migrationen durch, es sei denn, ich führe RAILS_DB=test ./bin/rake db:migrate aus. Ist das zu erwarten? Ich dachte, es würde diese Migrationen durchführen.

Jetzt bin ich noch verwirrter: Selbst nach der oben genannten Migration der Testdatenbank erhalte ich:

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

Und ich sehe beim Ausführen der Migration so etwas:

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

Nun, ich habe

./bin/rake db:test:prepare

ausgeführt, und das hat es behoben. Ich erinnere mich jedoch nicht, das zuvor tun zu müssen.

2 „Gefällt mir“