merefield
(Robert)
Dezembro 16, 2022, 6:32pm
1
Estou trabalhando neste PR: FIX: presenting formatted location on User Card by merefield · Pull Request #73 · merefield/discourse-locations · GitHub
Estou tentando cobrir a alteração com um novo teste de Front End.
Mas o teste falha ao executar porque um atributo de dados necessário não está definido.
O problema que estou enfrentando é como substituir com sucesso os dados em Site por um fixture mantido aqui:
main ← production_fixes
opened 03:54PM - 14 Dec 22 UTC
* FIX: all places where geolocation is formatted (+ add covering & first FE test… )
* FIX: failure to build
* IMPROVE: add CI workflow
* FIX: specs (out of date with latest Rails)
que contém um atributo adicional que Site possui quando o Plugin Locations está presente.
… e fazê-lo persistir para o resto do teste!
O novo teste está aqui.
main ← production_fixes
opened 03:54PM - 14 Dec 22 UTC
* FIX: all places where geolocation is formatted (+ add covering & first FE test… )
* FIX: failure to build
* IMPROVE: add CI workflow
* FIX: specs (out of date with latest Rails)
Eu carrego Site com sucesso com o fixture, aparentemente.
Eu paro neste ponto de depuração durante a execução do qunit no navegador e posso dizer que ele está carregado corretamente:
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")
mas quando o User Card é clicado, os dados não são o que você esperaria e, criticamente, o atributo country_codes está faltando, então o teste para aqui:
if (user && user.geo_location) {
contents.push(iconNode('map-marker-alt'));
let format = this.siteSettings.location_user_profile_format.split('|');
let opts = {};
let userLocation;
if (format.length && format[0]) {
opts['geoAttrs'] = format;
userLocation = geoLocationFormat(user.geo_location, self.site.country_codes, opts);
} else {
userLocation = user.geo_location.address;
};
contents.push(h('div.location-label', userLocation));
if (this.siteSettings.location_user_profile_map) {
let mapContents = [];
let btnParams = {
Por que meus dados de Site substituídos estão sendo perdidos?
1 curtida
merefield
(Robert)
Dezembro 20, 2022, 9:49pm
2
OK, isso é frustrante.
Parece que o valor do objeto Site é definido aqui:
const clock = fakeTime(timeString, timezone, false);
try {
callback();
} finally {
clock.restore();
}
}
let _pretenderCallbacks = {};
export function resetSite(extras = {}) {
const siteAttrs = {
...siteFixtures["site.json"].site,
...extras,
};
PreloadStore.store("site", cloneJSON(siteAttrs));
Site.resetCurrent();
}
export function applyPretender(name, server, helper) {
E não pode ser substituído?
Verifiquei isso modificando o fixture no core (aqui: discourse/app/assets/javascripts/discourse/tests/fixtures/site-fixtures.js at 93a4012ecb3af7306de0c51283d6dd2b2e90818c · discourse/discourse · GitHub ) e ele capta minha modificação.
Mas eu não quero isso, quero substituí-lo no meu teste de plugin com um fixture armazenado no meu plugin.
Para reiterar, sou capaz de fazer isso para o escopo do código de teste, mas uma vez que o código do plugin esteja em execução, o escopo parece captar o objeto site que se relaciona ao fixture carregado pelo helper de teste do core…
merefield
(Robert)
Dezembro 28, 2022, 9:57pm
3
Finalmente resolvi isso. Descobri que você pode usar needs assim como para outros objetos:
Pista aqui:
};
const needs = {
user(changes) {
loggedIn = true;
userChanges = changes;
},
pretender(fn) {
addPretenderCallback(name, fn);
},
site(changes) {
siteChanges = changes;
},
settings(changes) {
settingChanges = changes;
},
mobileView() {
mobileView = true;
},
};
Código final:
needs.site(cloneJSON(siteFixtures["country_codes.json"]));
3 curtidas
system
(system)
Fechado
Janeiro 27, 2023, 9:58pm
4
This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.