仕様とフィクスチャの理解

プラグインでいくつかのグループをシードする必要があります。

以下の記事を参考に、plugin.rb に以下を追加しています。

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

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

./bin/rake db:migrate を実行すると期待通りに動作しますが、specs を実行すると以下のエラーが発生します。

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

specs がこれらのシードデータを繰り返し実行しようとしているのでしょうか?それは理にかなっていません。なぜなら、マイグレーションを再実行してもエラーは発生しないからです。

もしかして、それらの specs を spec/fixtures へ移動させ、プラグインの起動時にグループを作成するようにするべきでしょうか?それがベストプラクティスなのでしょうか?プラグインの起動時に Group.find_or_create_by でassertするよりも、マイグレーション時にグループを作成する方がよいように思えますが、現在は機能しています。

また、./bin/rake db:drop db:create db:migrate はテストデータベースを作成するようですが、RAILS_DB=test ./bin/rake db:migrate を実行しない限りマイグレーションが実行されないようです。これは想定された動作でしょうか?それとも自動的に実行される我以为していました。

さらに混乱しているのですが、上記の通りテスト DB のマイグレーションを実行した後でも、以下のエラーが発生します。

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

マイグレーション実行時に以下のような出力も見られました。

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

その後、以下を実行しました。

./bin/rake db:test:prepare

これで問題は解決しましたが、以前はこれを実行する必要があったことを覚えていません。

「いいね!」 2