generated from solidjs-community/solid-lib-starter
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathuse-intl.test.tsx
107 lines (88 loc) · 2.67 KB
/
use-intl.test.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import { describe, it, expect } from "vitest";
import { screen, render } from "solid-testing-library";
import type { VoidComponent } from "solid-js";
import IntlProvider from "../src/provider";
import useIntl from "../src/use-intl";
const en = {
"app.greeting": "Welcome back!",
};
const es = {
"app.greeting": "¡Bienvenido de nuevo!",
};
interface FooElement {
defaultMessage?: string;
}
const Foo: VoidComponent<FooElement> = (props) => {
const intl = useIntl();
return (
<div>
{intl.formatMessage({
id: "app.greeting",
defaultMessage: props.defaultMessage ?? "",
})}
</div>
);
};
describe("useIntl()", () => {
describe("exceptions", () => {
it("should throw when context is missing", async () => {
expect(() => render(() => <Foo />)).toThrow(
"Have you forgot to wrap your application with <IntlProvider />",
);
});
it("should not throw when setup correctly", () => {
expect(() =>
render(() => (
<IntlProvider locale="en" messages={en}>
<Foo />
</IntlProvider>
)),
).not.toThrow();
});
});
describe("behaviour", () => {
it("should translate locale accordingly", () => {
render(() => (
<IntlProvider locale="en" messages={en}>
<Foo />
</IntlProvider>
));
expect(screen.getByText(en["app.greeting"])).toBeInTheDocument();
});
it("should fallback to defaultMessage when translation is missing", () => {
const defaultMessage = "It's nice to you again!";
render(() => (
<IntlProvider locale="en" messages={{}}>
<Foo defaultMessage={defaultMessage} />
</IntlProvider>
));
expect(screen.getByText(defaultMessage)).toBeInTheDocument();
});
it("should re-translate locale when language changes", () => {
render(() => (
<IntlProvider locale="en" messages={en}>
<Foo />
</IntlProvider>
));
expect(screen.getByText(en["app.greeting"])).toBeInTheDocument();
render(() => (
<IntlProvider locale="en" messages={es}>
<Foo />
</IntlProvider>
));
expect(screen.getByText(es["app.greeting"])).toBeInTheDocument();
});
it("should format messages with defaultRichTextElements specified", () => {
render(() => (
<IntlProvider
locale="en"
messages={{ "app.greeting": "My <bar>message</bar> formatted." }}
defaultRichTextElements={{ bar: (chunks) => <span data-testid="bar">{chunks}</span> }}
>
<Foo />
</IntlProvider>
));
expect(screen.getAllByTestId("bar")).toHaveLength(1);
});
});
});