summaryrefslogtreecommitdiff
path: root/apps/web/src/services/storage/migrations/__tests__/v5-to-v6.test.ts
blob: 8fd267fd91e52e621b0e843b988e0459313825c8 (plain) (blame)
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
import { describe, expect, test } from "bun:test";
import { transformProjectV5ToV6 } from "../transformers/v5-to-v6";
import { v5Project } from "./fixtures";
import { asRecordArray } from "./helpers";

describe("V5 to V6 Migration", () => {
	test("converts number bookmarks to Bookmark objects", async () => {
		const result = transformProjectV5ToV6({
			project: v5Project as Parameters<
				typeof transformProjectV5ToV6
			>[0]["project"],
		});

		expect(result.skipped).toBe(false);
		expect(result.project.version).toBe(6);

		const scenes = asRecordArray(result.project.scenes);
		expect(scenes[0].bookmarks).toEqual([
			{ time: 2.0 },
			{ time: 5.5 },
			{ time: 12.0 },
		]);
		expect(scenes[1].bookmarks).toEqual([]);
	});

	test("skips projects that are already v6", () => {
		const firstScene = (v5Project as { scenes: Array<Record<string, unknown>> })
			.scenes[0];
		const result = transformProjectV5ToV6({
			project: {
				...v5Project,
				version: 6,
				scenes: [
					{
						...firstScene,
						bookmarks: [{ time: 2 }, { time: 5 }],
					},
				],
			} as Parameters<typeof transformProjectV5ToV6>[0]["project"],
		});

		expect(result.skipped).toBe(true);
		expect(result.reason).toBe("already v6");
	});

	test("skips projects with no id", () => {
		const result = transformProjectV5ToV6({
			project: {
				version: 5,
				scenes: [],
			} as Parameters<typeof transformProjectV5ToV6>[0]["project"],
		});

		expect(result.skipped).toBe(true);
		expect(result.reason).toBe("no project id");
	});

	test("preserves existing Bookmark objects with note, color, duration", () => {
		const projectWithRichBookmarks = {
			...v5Project,
			version: 5,
			scenes: [
				{
					...(v5Project as { scenes: Array<Record<string, unknown>> })
						.scenes[0],
					bookmarks: [
						{ time: 1, note: "Intro", color: "#ef4444" },
						{ time: 5.5, duration: 2 },
					],
				},
			],
		};

		const result = transformProjectV5ToV6({
			project: projectWithRichBookmarks as Parameters<
				typeof transformProjectV5ToV6
			>[0]["project"],
		});

		expect(result.skipped).toBe(false);
		const mainScene = asRecordArray(result.project.scenes)[0];
		expect(mainScene.bookmarks).toEqual([
			{ time: 1, note: "Intro", color: "#ef4444" },
			{ time: 5.5, duration: 2 },
		]);
	});
});