summaryrefslogtreecommitdiff
path: root/apps/web/src/services/storage/migrations/__tests__/v4-to-v5.test.ts
blob: 16e9e7ca9376c46217fd7dd0891169bd7deacbb4 (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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import { describe, expect, test } from "bun:test";
import { transformProjectV4ToV5 } from "../transformers/v4-to-v5";
import { v3Project } from "./fixtures";
import { asRecordArray } from "./helpers";

describe("V4 to V5 Migration", () => {
	test("migrates sticker iconName to stickerId and removes legacy color", () => {
		const projectWithLegacySticker = {
			...v3Project,
			version: 4,
			scenes: [
				{
					...v3Project.scenes[0],
					tracks: [
						{
							id: "track-sticker",
							type: "sticker",
							name: "Sticker Track",
							hidden: false,
							elements: [
								{
									id: "sticker-1",
									type: "sticker",
									name: "Home",
									iconName: "mdi:home",
									color: "#ff0000",
									duration: 5,
									startTime: 0,
									trimStart: 0,
									trimEnd: 0,
									transform: {
										scale: 1,
										position: { x: 0, y: 0 },
										rotate: 0,
									},
									opacity: 1,
								},
							],
						},
					],
				},
			],
		};

		const result = transformProjectV4ToV5({
			project: projectWithLegacySticker,
		});

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

		const migratedScene = asRecordArray(result.project.scenes)[0];
		const migratedTrack = asRecordArray(migratedScene.tracks)[0];
		const migratedElement = asRecordArray(migratedTrack.elements)[0];

		expect(migratedElement.stickerId).toBe("icons:mdi:home");
		expect("iconName" in migratedElement).toBe(false);
		expect("color" in migratedElement).toBe(false);
	});

	test("keeps provider-prefixed stickerId values unchanged", () => {
		const projectWithStickerId = {
			...v3Project,
			version: 4,
			scenes: [
				{
					...v3Project.scenes[0],
					tracks: [
						{
							id: "track-sticker",
							type: "sticker",
							name: "Sticker Track",
							hidden: false,
							elements: [
								{
									id: "sticker-1",
									type: "sticker",
									name: "Flag",
									stickerId: "flags:AD",
									duration: 5,
									startTime: 0,
									trimStart: 0,
									trimEnd: 0,
									transform: {
										scale: 1,
										position: { x: 0, y: 0 },
										rotate: 0,
									},
									opacity: 1,
								},
							],
						},
					],
				},
			],
		};

		const result = transformProjectV4ToV5({ project: projectWithStickerId });
		const migratedScene = asRecordArray(result.project.scenes)[0];
		const migratedTrack = asRecordArray(migratedScene.tracks)[0];
		const migratedElement = asRecordArray(migratedTrack.elements)[0];

		expect(migratedElement.stickerId).toBe("flags:AD");
	});

	test("skips projects that are already v5", () => {
		const result = transformProjectV4ToV5({
			project: { ...v3Project, version: 5 },
		});

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

	test("skips projects with no id", () => {
		const result = transformProjectV4ToV5({
			project: {
				version: 4,
				scenes: [],
			},
		});

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