Фабрикаторы генерируют дублирующиеся имена из-за устаревшей локальной тестовой базы данных

У меня только что провалился целый набор тестов с ошибками вроде этой:

ActiveRecord::RecordInvalid:
Validation failed: Name has already been taken

Кажется, проблема здесь:

fab!(:the_group) { Fabricate(:group) }

Ранее все это работало. Я видел подобное в другом плагине, над которым работал, и, кажется, сам придумал задать случайное имя, но эти тесты работали, насколько я помню, ещё вчера.

Что-то изменилось, или я по ошибке сделал что-то глупое?

РЕДАКТИРОВАНИЕ: С помощью Claude и бота-помощника Discourse я попытался заменить вышеуказанный fab на

Fabricator(:the_group) do
  name { sequence(:group_name) { |i| "Test Group #{i}" } }
end

но так и не до конца разобрался, как это сделать.

Затем я использовал

let(:the_group) { Fabricate(:group) }

вместо предыдущего !fab, и это сократило количество провалов с 12 до 1, но всё ещё падает с ошибкой:

1) Pfaffmanager::ServersController servers admin can get servers owned by a group
Failure/Error: let(:the_group) { Fabricate(:group) }

ActiveRecord::RecordInvalid:
Validation failed: Name has already been taken

Не думаю, что что-то вокруг этих тестов менялось с 10:30 утра по центральному времени (CDT) вчерашнего дня, когда я сделал последний коммит.

Я откатился к более раннему коммиту, и теперь он падает с ошибкой:

1) Pfaffmanager::ServersController servers includes groups that the user is in
Failure/Error: let(:the_group) { Fabricate(:group) }

ActiveRecord::RecordInvalid:
Validation failed: Name has already been taken

Я запустил его снова без каких-либо изменений, и теперь он падает на:

1) Pfaffmanager::ServersController servers can update group id if group owner
Failure/Error: let(:the_group) { Fabricate(:group) }

ActiveRecord::RecordInvalid:
Validation failed: Name has already been taken

Получается, что падает один тест, и это случайно?

Возможно, ваша локальная тестовая база данных оказалась в некорректном состоянии? Попробуйте выполнить:

RAILS_ENV=test bin/rake db:drop db:create db:migrate

О боже. Так это действительно были гремлины.

Странно, но первая команда db:create не создала базу данных для мультисайта, однако когда я запустил задачу db:create отдельно, всё сработало. Затем миграция прошла успешно, и всё просто заработало.

И, @Lilly, ты и твои :eyes — просто чудо, смеюсь до слёз.

Понял, значит, у меня тестовая база данных существовала уже давно, и случайно сгенерированные имена начали конфликтовать с предыдущими. Теперь всё ясно. Я изменил свой скрипт обновления (который делает git pull, обновляет код из all-the-plugins, проверяет версию Ruby и так далее), чтобы он сбрасывал, создавал и мигрировал тестовую базу данных.

Ха-ха. Ну, я присматривался к твоим фрагментам кода, потому что был почти уверен, что это должно было сработать, так как:

В теории тестовая база данных должна автоматически очищаться после каждого запуска тестов. Поэтому она никогда не должна оказываться в таком состоянии. Но… если процессы тестирования каким-то образом аварийно завершаются, возможно, что эта очистка (технически — восстановление точки сохранения в PostgreSQL) будет пропущена.

Так что это не должно быть нормальным явлением. Лично я бы занялся удалением/созданием/миграцией только в том случае, если начну сталкиваться со странными сбоями.

Но если вас устраивает ожидание, нет ничего плохого в регулярном пересоздании вашей тестовой базы данных :+1:

Это имеет смысл. Я обожаю ^c.

Я ненавижу ждать. Я закомментирую это и надеюсь, что не забуду. :slight_smile:

Спасибо ещё раз за то, что разобрались в этом. Я был уверен, что схожу с ума.