import { Component, mount, xml } from "../../src"; import { makeTestFixture, snapshotEverything } from "../helpers"; let fixture: HTMLElement; snapshotEverything(); beforeEach(() => { fixture = makeTestFixture(); }); describe("translation support", () => { test("can translate node content", async () => { class SomeComponent extends Component { static template = xml`
word
`; } await mount(SomeComponent, fixture, { translateFn: (expr: string) => (expr === "word" ? "mot" : expr), }); expect(fixture.innerHTML).toBe("
mot
"); }); test("does not translate node content if disabled", async () => { class SomeComponent extends Component { static template = xml`
word word
`; } await mount(SomeComponent, fixture, { translateFn: (expr: string) => (expr === "word" ? "mot" : expr), }); expect(fixture.innerHTML).toBe("
motword
"); }); test("some attributes are translated", async () => { class SomeComponent extends Component { static template = xml`

word

word

word

word

word

`; } await mount(SomeComponent, fixture, { translateFn: (expr: string) => (expr === "word" ? "mot" : expr), }); expect(fixture.innerHTML).toBe( '

mot

mot

mot

mot

mot

' ); }); test("can set and remove translatable attributes", async () => { class SomeComponent extends Component { static template = xml`
text
`; } await mount(SomeComponent, fixture, { translateFn: (expr: string) => (expr === "word" ? "mot" : expr), translatableAttributes: ["potato", "-label"], }); expect(fixture.innerHTML).toBe( '
text
' ); }); test("translation is done on the trimmed text, with extra spaces readded after", async () => { class SomeComponent extends Component { static template = xml`
word
`; } const translateFn = jest.fn((expr: string) => (expr === "word" ? "mot" : expr)); await mount(SomeComponent, fixture, { translateFn }); expect(fixture.innerHTML).toBe("
mot
"); expect(translateFn).toHaveBeenCalledWith("word", ""); }); test("translation works, even if initial string has inner consecutive white space", async () => { class SomeComponent extends Component { static template = xml`
some word
`; } const translateFn = jest.fn((expr: string) => (expr === "some word" ? "un mot" : expr)); await mount(SomeComponent, fixture, { translateFn }); expect(translateFn).toHaveBeenCalledWith("some word", ""); expect(fixture.innerHTML).toBe("
un mot
"); }); test("body of t-sets are translated", async () => { class SomeComponent extends Component { static template = xml` untranslated `; } const translateFn = () => "translated"; await mount(SomeComponent, fixture, { translateFn }); expect(fixture.innerHTML).toBe("translated"); }); test("body of t-sets inside translation=off are not translated", async () => { class SomeComponent extends Component { static template = xml` untranslated `; } const translateFn = () => "translated"; await mount(SomeComponent, fixture, { translateFn }); expect(fixture.innerHTML).toBe("untranslated"); }); test("body of t-sets inside translation=off are not translated 2", async () => { class SomeComponent extends Component { static template = xml` untranslated `; } const translateFn = () => "translated"; await mount(SomeComponent, fixture, { translateFn }); expect(fixture.innerHTML).toBe("untranslated"); }); test("body of t-sets with html content are translated", async () => { class SomeComponent extends Component { static template = xml`
untranslated
`; } const translateFn = () => "translated"; await mount(SomeComponent, fixture, { translateFn }); expect(fixture.innerHTML).toBe("
translated
"); }); test("body of t-sets with text and html content are translated", async () => { class SomeComponent extends Component { static template = xml` some text
untranslated
`; } const translateFn = () => "translated"; await mount(SomeComponent, fixture, { translateFn }); expect(fixture.innerHTML).toBe(" translated
translated
"); }); test("t-set and falsy t-value: t-body are translated", async () => { class SomeComponent extends Component { static template = xml` untranslated `; } const translateFn = () => "translated"; await mount(SomeComponent, fixture, { translateFn }); expect(fixture.innerHTML).toBe("translated"); }); test("t-translation with several children", async () => { class SomeComponent extends Component { static template = xml`
`; } await mount(SomeComponent, fixture); expect(fixture.outerHTML).toBe("
"); }); }); describe("translation context", () => { test("translation of text in context", async () => { class SomeComponent extends Component { static template = xml`
word
word
`; } const translateFn = jest.fn((expr: string, translationCtx: string) => translationCtx === "fr" ? (expr === "word" ? "mot" : expr) : expr ); await mount(SomeComponent, fixture, { translateFn }); expect(fixture.innerHTML).toBe("
word
mot
"); expect(translateFn).toHaveBeenCalledWith("word", ""); expect(translateFn).toHaveBeenCalledWith("word", "fr"); }); test("translation of attributes in context", async () => { class SomeComponent extends Component { static template = xml`
`; } const translateFn = jest.fn((expr: string, translationCtx: string) => translationCtx === "fr" ? (expr === "title" ? "titre" : expr) : expr ); await mount(SomeComponent, fixture, { translateFn }); expect(fixture.innerHTML).toBe(`
`); expect(translateFn).toHaveBeenCalledWith("title", "fr"); expect(translateFn).toHaveBeenCalledWith("game", "en"); }); test("body of t-sets are translated in context", async () => { class SomeComponent extends Component { static template = xml` untranslated `; } const translateFn = jest.fn((expr: string, translationCtx: string) => translationCtx === "fr" ? "traduit" : expr ); await mount(SomeComponent, fixture, { translateFn }); expect(fixture.innerHTML).toBe("traduit"); expect(translateFn).toHaveBeenCalledWith("untranslated", "fr"); }); test("props with modifier .translate are translated in context", async () => { class ChildComponent extends Component { static props = ["text"]; static template = xml``; } class SomeComponent extends Component { static components = { ChildComponent }; static template = xml` `; } const translateFn = jest.fn((expr: string, translationCtx: string) => translationCtx === "fr" ? "jeu" : expr ); await mount(SomeComponent, fixture, { translateFn }); expect(fixture.innerHTML).toBe("jeu"); expect(translateFn).toHaveBeenCalledWith("game", "fr"); }); test("slot attrs and text contents are translated in context", async () => { class ChildComponent extends Component { static template = xml`
`; } class SomeComponent extends Component { static components = { ChildComponent }; static template = xml` game `; } const translateFn = jest.fn((expr: string, translationCtx: string) => translationCtx === "fr" ? "jeu" : translationCtx === "pt" ? "título" : expr ); await mount(SomeComponent, fixture, { translateFn }); expect(fixture.innerHTML).toBe("
jeu
"); expect(translateFn).toHaveBeenCalledWith("game", "fr"); expect(translateFn).toHaveBeenCalledWith("title", "pt"); }); test("default slot params and content translated in context", async () => { class SomeComponent extends Component { static template = xml`
foo
`; } const translateFn = jest.fn((expr: string, translationCtx: string) => translationCtx === "pt" ? "título" : expr ); await mount(SomeComponent, fixture, { translateFn }); expect(fixture.innerHTML).toBe("
foo
"); expect(translateFn).toHaveBeenCalledWith("foo", "fr"); expect(translateFn).toHaveBeenCalledWith("param", "fr"); expect(translateFn).toHaveBeenCalledWith("title", "pt"); }); test("t-translation-context with several children", async () => { class SomeComponent extends Component { static template = xml`
`; } await mount(SomeComponent, fixture); expect(fixture.outerHTML).toBe("
"); }); });