import { expect} from "vitest";
import TestUtils from "@supersoniks/concorde/test-utils/TestUtils";
import { html } from "lit";
import "./states";
import { dp } from "@supersoniks/concorde/directives";
function create(template = "", addToDocument = true) {
dp<{state: string}>("state-dataprovider-test").set({state: ""});
return TestUtils.bootstrap(
`
${template}
`,
addToDocument
)[0];
}
describe("SonicStates", () => {
it("devrait afficher le template correspondant à la valeur d'état", async () => {
const elt: any = create(`
État Actif
État Inactif
`);
dp<{state: string}>("state-dataprovider-test").set({state: "active"});
await elt.updated();
expect(elt.textContent.trim()).toBe("État Actif");
});
it("devrait supporter les expressions régulières pour les valeurs", async () => {
const elt: any = create(`
Nombre
`);
dp<{state: string}>("state-dataprovider-test").set({state: "123"});
await elt.updated();
expect(elt.textContent.trim()).toBe("Nombre");
});
it("devrait supporter url-pattern pour les valeurs", async () => {
const elt: any = create(`
Utilisateur
`);
dp<{state: string}>("state-dataprovider-test").set({state: "user/123"});
await elt.updated();
expect(elt.textContent.trim()).toBe("Utilisateur");
});
it("devrait gérer le dataProviderExpression avec regexp", async () => {
const elt: any = create(`
Utilisateur
`);
dp<{state: string}>("state-dataprovider-test").set({state: "user/123"});
await elt.updated();
const divWrapper = elt.querySelector("div[dataProvider]");
expect(divWrapper.getAttribute("dataProvider")).toBe("/api/user/123");
});
it("devrait gérer le dataProviderExpression avec url-pattern", async () => {
const elt: any = create(`
Utilisateur
`);
dp<{state: string}>("state-dataprovider-test").set({state: "user/123"});
await elt.updated();
const divWrapper = elt.querySelector("div[dataProvider]");
expect(divWrapper.getAttribute("dataProvider")).toBe("/api/user/123");
});
it("devrait afficher l'état programmatique correspondant", async () => {
const elt: any = create();
elt.states = {
active: () => html`
État Actif Programmatique
`,
};
dp<{state: string}>("state-dataprovider-test").set({state: "active"});
await elt.updated();
expect(elt.textContent.trim()).toBe("État Actif Programmatique");
});
it("devrait supporter les expressions régulières dans les états programmatiques", async () => {
const elt: any = create();
elt.states = {
"(\\d+)": (status: string) => html`Nombre: ${status}
`,
};
dp<{state: string}>("state-dataprovider-test").set({state: "123"});
await elt.updated();
expect(elt.textContent.trim()).toBe("Nombre: 123");
});
it("devrait supporter url-pattern dans les états programmatiques", async () => {
const elt: any = create();
elt.states = {
"user/:id/:slug": ({ id, slug }: { id: number; slug: string }) => {
return html`Utilisateur ${id} ${slug}
`;
},
};
dp<{state: string}>("state-dataprovider-test").set({state: "user/123/mySlug"});
await elt.updated();
expect(elt.textContent.trim()).toBe("Utilisateur 123 mySlug");
});
it("devrait utiliser l'état par défaut programmatique si aucun état ne correspond", async () => {
const elt: any = create();
elt.states = {
active: () => html`État Actif
`,
fallback: () => html`État Par Défaut
`,
};
dp<{state: string}>("state-dataprovider-test").set({state: "unknown"});
await elt.updated();
expect(elt.textContent.trim()).toBe("État Par Défaut");
});
it("devrait supporter la combinaison des templates HTML et programmatiques", async () => {
const elt: any = create(`
Template HTML
`);
elt.states = {
prog: () => html`Template Programmatique
`,
};
dp<{state: string}>("state-dataprovider-test").set({state: "html"});
await elt.updated();
expect(elt.textContent.trim()).toBe("Template HTML");
dp<{state: string}>("state-dataprovider-test").set({state: "prog"});
await elt.updated();
expect(elt.textContent.trim()).toBe("Template Programmatique");
});
});