Возможно ли переопределить объект Site своим фикстуром во время фронтенд-тестов плагина?

Сейчас я работаю над этим PR: FIX: presenting formatted location on User Card by merefield · Pull Request #73 · merefield/discourse-locations · GitHub

Пытаюсь покрыть изменение новым тестом на фронтенде.

Но тест не запускается, потому что не определён требуемый атрибут данных.

Проблема, с которой я столкнулся, заключается в том, как успешно переопределить данные в объекте Site с помощью фикстуры, расположенной здесь:

которая содержит дополнительный атрибут, который объект Site хранит при наличии плагина Locations.

… и обеспечить, чтобы эти данные сохранялись на протяжении всего теста!

Новый тест находится здесь:

Похоже, я успешно загружаю Site с помощью фикстуры.

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

  test("user card location - shows correct format", async function (assert) {
    const siteAttrs = {
      ...siteFixtures["site.json"].site,
    };
    PreloadStore.store("site", cloneJSON(siteAttrs));
    Site.resetCurrent();
    debugger;
    PreloadStore.get("site")

image

однако при клике на карточку пользователя данные оказываются не такими, как ожидалось, и, что критично, отсутствует атрибут country_codes, из-за чего тест останавливается вот здесь:

Почему мои переопределённые данные Site теряются?

Хорошо, это раздражает.

Похоже, что значение объекта Site устанавливается здесь:

И его нельзя переопределить?

Я проверил это, изменив фикстуру в core (здесь: discourse/app/assets/javascripts/discourse/tests/fixtures/site-fixtures.js at 93a4012ecb3af7306de0c51283d6dd2b2e90818c · discourse/discourse · GitHub), и он подхватил мои изменения.

Но я не хочу этого, я хочу переопределить это в тесте моего плагина с помощью фикстуры, хранящейся в моем плагине.

Повторюсь: я могу это сделать в рамках кода теста, но как только запускается код плагина, область видимости, похоже, подхватывает объект site, связанный с фикстурой, загруженной вспомогательной функцией теста core …

:thinking:

Наконец-то я это решил. Оказалось, что можно использовать needs так же, как и для других объектов:

Подсказка здесь:

Итоговый код:

  needs.site(cloneJSON(siteFixtures["country_codes.json"]));