プラグインでいくつかのグループをシードする必要があります。
以下の記事を参考に、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
これで問題は解決しましたが、以前はこれを実行する必要があったことを覚えていません。