Files
owl/tests/compiler/translation.test.ts
T

174 lines
5.2 KiB
TypeScript
Raw Normal View History

2021-12-20 16:19:07 +01:00
import { Component, mount, xml } from "../../src";
2021-12-20 11:19:59 +01:00
import { makeTestFixture, snapshotEverything } from "../helpers";
2021-10-13 16:49:34 +02:00
let fixture: HTMLElement;
2021-12-20 11:19:59 +01:00
snapshotEverything();
2021-10-13 16:49:34 +02:00
beforeEach(() => {
fixture = makeTestFixture();
});
describe("translation support", () => {
test("can translate node content", async () => {
class SomeComponent extends Component {
static template = xml`<div>word</div>`;
}
2021-12-20 11:19:59 +01:00
await mount(SomeComponent, fixture, {
2021-10-13 16:49:34 +02:00
translateFn: (expr: string) => (expr === "word" ? "mot" : expr),
});
2021-12-20 11:19:59 +01:00
expect(fixture.innerHTML).toBe("<div>mot</div>");
2021-10-13 16:49:34 +02:00
});
test("does not translate node content if disabled", async () => {
class SomeComponent extends Component {
static template = xml`
<div>
<span>word</span>
<span t-translation="off">word</span>
</div>
`;
}
2021-12-20 11:19:59 +01:00
await mount(SomeComponent, fixture, {
2021-10-13 16:49:34 +02:00
translateFn: (expr: string) => (expr === "word" ? "mot" : expr),
});
2021-12-20 11:19:59 +01:00
expect(fixture.innerHTML).toBe("<div><span>mot</span><span>word</span></div>");
2021-10-13 16:49:34 +02:00
});
test("some attributes are translated", async () => {
class SomeComponent extends Component {
static template = xml`
<div>
<p label="word">word</p>
<p title="word">word</p>
<p placeholder="word">word</p>
<p alt="word">word</p>
<p something="word">word</p>
</div>
`;
}
2021-12-20 11:19:59 +01:00
await mount(SomeComponent, fixture, {
2021-10-13 16:49:34 +02:00
translateFn: (expr: string) => (expr === "word" ? "mot" : expr),
});
2021-12-20 11:19:59 +01:00
expect(fixture.innerHTML).toBe(
2021-10-13 16:49:34 +02:00
'<div><p label="mot">mot</p><p title="mot">mot</p><p placeholder="mot">mot</p><p alt="mot">mot</p><p something="word">mot</p></div>'
);
});
test("can set and remove translatable attributes", async () => {
2021-10-13 16:49:34 +02:00
class SomeComponent extends Component {
static template = xml`
<div tomato="word" potato="word" title="word" label="word">text</div>
2021-10-13 16:49:34 +02:00
`;
}
2021-12-20 11:19:59 +01:00
await mount(SomeComponent, fixture, {
2021-10-13 16:49:34 +02:00
translateFn: (expr: string) => (expr === "word" ? "mot" : expr),
translatableAttributes: ["potato", "-label"],
2021-10-13 16:49:34 +02:00
});
expect(fixture.innerHTML).toBe(
'<div tomato="word" potato="mot" title="mot" label="word">text</div>'
);
2021-10-13 16:49:34 +02:00
});
test("translation is done on the trimmed text, with extra spaces readded after", async () => {
class SomeComponent extends Component {
static template = xml`
<div> word </div>
`;
}
const translateFn = jest.fn((expr: string) => (expr === "word" ? "mot" : expr));
2021-12-20 11:19:59 +01:00
await mount(SomeComponent, fixture, { translateFn });
expect(fixture.innerHTML).toBe("<div> mot </div>");
2021-10-13 16:49:34 +02:00
expect(translateFn).toHaveBeenCalledWith("word");
});
test("translation works, even if initial string has inner consecutive white space", async () => {
class SomeComponent extends Component {
static template = xml`<div>some word</div>`;
}
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("<div>un mot</div>");
});
test("body of t-sets are translated", async () => {
class SomeComponent extends Component {
static template = xml`
<t t-set="label">untranslated</t>
<t t-esc="label"/>`;
}
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`
<t t-translation="off">
<t t-set="label">untranslated</t>
<t t-esc="label"/>
</t>`;
}
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`
<t t-set="label"><div>untranslated</div></t>
<t t-out="label"/>`;
}
const translateFn = () => "translated";
await mount(SomeComponent, fixture, { translateFn });
expect(fixture.innerHTML).toBe("<div>translated</div>");
});
test("body of t-sets with text and html content are translated", async () => {
class SomeComponent extends Component {
static template = xml`
<t t-set="label">
some text
<div>untranslated</div>
</t>
<t t-out="label"/>`;
}
const translateFn = () => "translated";
await mount(SomeComponent, fixture, { translateFn });
expect(fixture.innerHTML).toBe(" translated <div>translated</div>");
});
test("t-set and falsy t-value: t-body are translated", async () => {
class SomeComponent extends Component {
static template = xml`
<t t-set="label" t-value="false">untranslated</t>
<t t-esc="label"/>`;
}
const translateFn = () => "translated";
await mount(SomeComponent, fixture, { translateFn });
expect(fixture.innerHTML).toBe("translated");
});
2021-10-13 16:49:34 +02:00
});