Понимание спецификаций и фитингов

У меня есть плагин, которому нужно создать несколько групп.

Следуя инструкции по адресу Add new webhooks and customize webhook payload , в файле 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, всё работает как ожидалось, но при запуске тестов я получаю ошибку:

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

Получается, что тесты пытаются запустить эти семена повторно? Это странно, ведь если я повторно запущу миграцию, ошибок не возникает.

Возможно, мне стоит переместить эти тесты в spec/fixtures и заставить плагин создавать группы при запуске? Это считается лучшей практикой? Мне больше нравится идея создания групп при миграции, чем использование Group.find_or_create_by при каждом запуске плагина, хотя текущий вариант работает.

Кроме того, команда ./bin/rake db:drop db:create db:migrate вроде бы создаёт тестовую базу данных, но не выполняет миграции, если я не укажу RAILS_DB=test ./bin/rake db:migrate. Это ожидаемое поведение? Я думал, что миграции выполнятся автоматически.

Теперь я ещё больше запутался: даже после выполнения миграции тестовой БД выше я получаю ошибку:

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 лайка