У меня есть плагин, которому нужно создать несколько групп.
Следуя инструкции по адресу 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
и это помогло, но я не помню, чтобы раньше приходилось это делать.