forked from internxt/drive-desktop
-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathvalidate-root-folder-change.test.ts
More file actions
131 lines (105 loc) · 4.52 KB
/
Copy pathvalidate-root-folder-change.test.ts
File metadata and controls
131 lines (105 loc) · 4.52 KB
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
127
128
129
130
131
import fs from 'node:fs/promises';
import {
isPermissionError,
OTHER_CLOUD_PROVIDER_KEYWORDS,
REMOVABLE_PATH_PREFIXES,
validateRootFolderChange,
} from './validate-root-folder-change';
vi.mock('node:fs/promises', () => ({
default: {
access: vi.fn(),
mkdir: vi.fn(),
},
}));
describe('validate-root-folder-change', () => {
const fsAccessMock = vi.mocked(fs.access);
const fsMkdirMock = vi.mocked(fs.mkdir);
beforeEach(() => {
fsAccessMock.mockResolvedValue(undefined);
fsMkdirMock.mockResolvedValue(undefined);
});
it('should expose removable path prefixes', () => {
expect(REMOVABLE_PATH_PREFIXES).toMatchObject(['/media/', '/run/media/', '/mnt/']);
});
it('should expose known cloud provider keywords', () => {
expect(OTHER_CLOUD_PROVIDER_KEYWORDS).toContain('dropbox');
expect(OTHER_CLOUD_PROVIDER_KEYWORDS).toContain('google drive');
expect(OTHER_CLOUD_PROVIDER_KEYWORDS).toContain('onedrive');
});
it.each(['/media/user/usb', '/run/media/user/ssd', '/mnt/external'])(
'should return REMOVABLE_DEVICE for removable path %s',
async (pathname) => {
const result = await validateRootFolderChange({
pathname,
virtualDriveFolderName: 'Internxt Drive',
});
expect(result).toStrictEqual({ status: 'error', code: 'REMOVABLE_DEVICE' });
expect(fsAccessMock).not.toHaveBeenCalled();
expect(fsMkdirMock).not.toHaveBeenCalled();
},
);
it('should return OTHER_CLOUD_PROVIDER when pathname contains cloud provider keyword', async () => {
const result = await validateRootFolderChange({
pathname: '/home/user/Dropbox/Work',
virtualDriveFolderName: 'Internxt Drive',
});
expect(result).toStrictEqual({ status: 'error', code: 'OTHER_CLOUD_PROVIDER' });
expect(fsAccessMock).not.toHaveBeenCalled();
expect(fsMkdirMock).not.toHaveBeenCalled();
});
it('should match cloud provider keyword case-insensitively', async () => {
const result = await validateRootFolderChange({
pathname: '/home/user/Google Drive/My Folder',
virtualDriveFolderName: 'Internxt Drive',
});
expect(result).toStrictEqual({ status: 'error', code: 'OTHER_CLOUD_PROVIDER' });
});
it.each(['EACCES', 'EPERM'])('should return INSUFFICIENT_PERMISSION when access fails with %s', async (code) => {
fsAccessMock.mockRejectedValueOnce(Object.assign(new Error('permission denied'), { code }));
const result = await validateRootFolderChange({
pathname: '/home/user/folder',
virtualDriveFolderName: 'Internxt Drive',
});
expect(result).toStrictEqual({ status: 'error', code: 'INSUFFICIENT_PERMISSION' });
});
it('should return INSUFFICIENT_PERMISSION when mount folder creation fails with permission error', async () => {
fsMkdirMock.mockRejectedValueOnce(Object.assign(new Error('permission denied'), { code: 'EACCES' }));
const result = await validateRootFolderChange({
pathname: '/home/user/folder',
virtualDriveFolderName: 'Internxt Drive',
});
expect(result).toStrictEqual({ status: 'error', code: 'INSUFFICIENT_PERMISSION' });
});
it('should throw when fs fails with unknown error', async () => {
const unknownError = Object.assign(new Error('disk failure'), { code: 'EIO' });
fsAccessMock.mockRejectedValueOnce(unknownError);
await expect(
validateRootFolderChange({
pathname: '/home/user/folder',
virtualDriveFolderName: 'Internxt Drive',
}),
).rejects.toThrow('disk failure');
});
it('should return null when pathname is valid and accessible', async () => {
const result = await validateRootFolderChange({
pathname: '/home/user/folder',
virtualDriveFolderName: 'Internxt Drive',
});
expect(result).toBe(null);
expect(fsAccessMock).toHaveBeenCalledTimes(2);
expect(fsMkdirMock).toHaveBeenCalledWith('/home/user/folder/Internxt Drive', { recursive: true });
});
it.each(['EACCES', 'EPERM'])('isPermissionError should return true for %s', (code) => {
const result = isPermissionError(Object.assign(new Error('permission denied'), { code }));
expect(result).toBe(true);
});
it('isPermissionError should return false for unknown code', () => {
const result = isPermissionError(Object.assign(new Error('other'), { code: 'ENOENT' }));
expect(result).toBe(false);
});
it('isPermissionError should return false for non-objects', () => {
expect(isPermissionError(null)).toBe(false);
expect(isPermissionError(undefined)).toBe(false);
expect(isPermissionError('error')).toBe(false);
});
});