Skip to content

Commit 5e74ea0

Browse files
committed
test: add and skip reactive tests
1 parent 43a7e2d commit 5e74ea0

File tree

2 files changed

+164
-0
lines changed

2 files changed

+164
-0
lines changed
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
<script lang="ts">
2+
import Time from "svelte-time";
3+
4+
let timestamp = $state("2020-02-01");
5+
let format = $state("MMM DD, YYYY");
6+
let relative = $state(false);
7+
let live = $state<boolean | number>(false);
8+
9+
function updateTimestamp() {
10+
timestamp = "2021-03-15";
11+
}
12+
13+
function updateFormat() {
14+
format = "YYYY-MM-DD";
15+
}
16+
17+
function toggleRelative() {
18+
relative = !relative;
19+
}
20+
21+
function toggleLive() {
22+
live = !live;
23+
}
24+
</script>
25+
26+
<Time data-test="reactive-timestamp" {timestamp} />
27+
<button data-test="btn-timestamp" onclick={updateTimestamp}
28+
>Update timestamp</button
29+
>
30+
31+
<Time data-test="reactive-format" timestamp="2020-02-01" {format} />
32+
<button data-test="btn-format" onclick={updateFormat}>Update format</button>
33+
34+
<Time
35+
data-test="reactive-relative"
36+
timestamp="2021-02-02"
37+
format="MMM DD, YYYY"
38+
{relative}
39+
/>
40+
<button data-test="btn-relative" onclick={toggleRelative}
41+
>Toggle relative</button
42+
>
43+
44+
<Time
45+
data-test="reactive-live"
46+
timestamp={new Date().toISOString()}
47+
{relative}
48+
{live}
49+
/>
50+
<button data-test="btn-live" onclick={toggleLive}>Toggle live</button>

tests/SvelteTimeReactive.test.ts

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
import dayjs from "dayjs";
2+
import { flushSync, mount, tick, unmount } from "svelte";
3+
import SvelteTimeReactive from "./SvelteTimeReactive.test.svelte";
4+
5+
describe.skip("svelte-time-reactive", () => {
6+
let instance: null | ReturnType<typeof mount> = null;
7+
const FIXED_DATE = new Date("2024-01-01T00:00:00.000Z");
8+
9+
beforeEach(() => {
10+
vi.useFakeTimers();
11+
vi.setSystemTime(FIXED_DATE);
12+
});
13+
14+
afterEach(() => {
15+
vi.restoreAllMocks();
16+
if (instance) {
17+
unmount(instance);
18+
}
19+
instance = null;
20+
document.body.innerHTML = "";
21+
});
22+
23+
const getElement = (selector: string) => {
24+
const element = document.querySelector(selector);
25+
assert(element instanceof HTMLElement);
26+
return element;
27+
};
28+
29+
test("timestamp prop changes should update display", async () => {
30+
const target = document.body;
31+
instance = mount(SvelteTimeReactive, { target });
32+
flushSync();
33+
34+
const element = getElement('[data-test="reactive-timestamp"]');
35+
expect(element.innerHTML).toEqual("Feb 01, 2020");
36+
expect(element.getAttribute("datetime")).toEqual("2020-02-01");
37+
38+
const button = getElement('[data-test="btn-timestamp"]');
39+
button.click();
40+
flushSync();
41+
42+
expect(element.getAttribute("datetime")).toEqual("2021-03-15");
43+
expect(element.innerHTML).toEqual("Mar 15, 2021");
44+
});
45+
46+
test("format prop changes should update display", async () => {
47+
const target = document.body;
48+
instance = mount(SvelteTimeReactive, { target });
49+
flushSync();
50+
51+
const element = getElement('[data-test="reactive-format"]');
52+
expect(element.innerHTML).toEqual("Feb 01, 2020");
53+
54+
const button = getElement('[data-test="btn-format"]');
55+
button.click();
56+
flushSync();
57+
58+
expect(element.innerHTML).toEqual("2020-02-01");
59+
});
60+
61+
test("relative prop changes should toggle display mode", async () => {
62+
const target = document.body;
63+
instance = mount(SvelteTimeReactive, { target });
64+
flushSync();
65+
66+
const element = getElement('[data-test="reactive-relative"]');
67+
expect(element.innerHTML).toEqual("Feb 02, 2021");
68+
expect(element.title).toBeFalsy();
69+
70+
const button = getElement('[data-test="btn-relative"]');
71+
button.click();
72+
flushSync();
73+
74+
expect(/ago/.test(element.innerHTML)).toEqual(true);
75+
expect(element.title).toEqual("Feb 02, 2021");
76+
77+
button.click();
78+
flushSync();
79+
80+
expect(element.innerHTML).toEqual("Feb 02, 2021");
81+
expect(element.title).toBeFalsy();
82+
});
83+
84+
test("live prop changes should start/stop updates", async () => {
85+
const target = document.body;
86+
instance = mount(SvelteTimeReactive, { target });
87+
flushSync();
88+
89+
const element = getElement('[data-test="reactive-live"]');
90+
const DEFAULT_TIME = dayjs(FIXED_DATE).format("MMM DD, YYYY");
91+
92+
expect(element.innerHTML).toEqual(DEFAULT_TIME);
93+
94+
const relativeBtn = getElement('[data-test="btn-relative"]');
95+
relativeBtn.click();
96+
flushSync();
97+
98+
const initialText = element.innerHTML;
99+
expect(initialText).toEqual("a few seconds ago");
100+
101+
const liveBtn = getElement('[data-test="btn-live"]');
102+
liveBtn.click();
103+
flushSync();
104+
expect(element.innerHTML).toEqual("a few seconds ago");
105+
106+
vi.runOnlyPendingTimers();
107+
await tick();
108+
expect(element.innerHTML).toEqual("a minute ago");
109+
110+
vi.runOnlyPendingTimers();
111+
await tick();
112+
expect(element.innerHTML).toEqual("2 minutes ago");
113+
});
114+
});

0 commit comments

Comments
 (0)