Skip to content

Commit 0128897

Browse files
committed
chore(testing): centralize posthog and storage-service mocks
1 parent 925e7a2 commit 0128897

12 files changed

Lines changed: 188 additions & 133 deletions

File tree

apps/sim/app/api/files/delete/route.test.ts

Lines changed: 21 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,25 @@
11
/**
22
* @vitest-environment node
33
*/
4-
import { authMockFns, hybridAuthMockFns } from '@sim/testing'
4+
import {
5+
authMockFns,
6+
hybridAuthMockFns,
7+
storageServiceMock,
8+
storageServiceMockFns,
9+
} from '@sim/testing'
510
import { beforeEach, describe, expect, it, vi } from 'vitest'
611

712
const mocks = vi.hoisted(() => {
813
const mockVerifyFileAccess = vi.fn()
914
const mockVerifyWorkspaceFileAccess = vi.fn()
10-
const mockDeleteFile = vi.fn()
11-
const mockHasCloudStorage = vi.fn()
1215
const mockGetStorageProvider = vi.fn()
1316
const mockIsUsingCloudStorage = vi.fn()
14-
const mockUploadFile = vi.fn()
15-
const mockDownloadFile = vi.fn()
1617

1718
return {
1819
mockVerifyFileAccess,
1920
mockVerifyWorkspaceFileAccess,
20-
mockDeleteFile,
21-
mockHasCloudStorage,
2221
mockGetStorageProvider,
2322
mockIsUsingCloudStorage,
24-
mockUploadFile,
25-
mockDownloadFile,
2623
}
2724
})
2825

@@ -68,23 +65,18 @@ vi.mock('@/lib/uploads', () => ({
6865
getStorageProvider: mocks.mockGetStorageProvider,
6966
isUsingCloudStorage: mocks.mockIsUsingCloudStorage,
7067
StorageService: {
71-
uploadFile: mocks.mockUploadFile,
72-
downloadFile: mocks.mockDownloadFile,
73-
deleteFile: mocks.mockDeleteFile,
74-
hasCloudStorage: mocks.mockHasCloudStorage,
68+
uploadFile: storageServiceMockFns.mockUploadFile,
69+
downloadFile: storageServiceMockFns.mockDownloadFile,
70+
deleteFile: storageServiceMockFns.mockDeleteFile,
71+
hasCloudStorage: storageServiceMockFns.mockHasCloudStorage,
7572
},
76-
uploadFile: mocks.mockUploadFile,
77-
downloadFile: mocks.mockDownloadFile,
78-
deleteFile: mocks.mockDeleteFile,
79-
hasCloudStorage: mocks.mockHasCloudStorage,
73+
uploadFile: storageServiceMockFns.mockUploadFile,
74+
downloadFile: storageServiceMockFns.mockDownloadFile,
75+
deleteFile: storageServiceMockFns.mockDeleteFile,
76+
hasCloudStorage: storageServiceMockFns.mockHasCloudStorage,
8077
}))
8178

82-
vi.mock('@/lib/uploads/core/storage-service', () => ({
83-
uploadFile: mocks.mockUploadFile,
84-
downloadFile: mocks.mockDownloadFile,
85-
deleteFile: mocks.mockDeleteFile,
86-
hasCloudStorage: mocks.mockHasCloudStorage,
87-
}))
79+
vi.mock('@/lib/uploads/core/storage-service', () => storageServiceMock)
8880

8981
vi.mock('@/lib/uploads/server/metadata', () => ({
9082
deleteFileMetadata: vi.fn().mockResolvedValue(undefined),
@@ -117,14 +109,14 @@ describe('File Delete API Route', () => {
117109
})
118110
mocks.mockVerifyFileAccess.mockResolvedValue(true)
119111
mocks.mockVerifyWorkspaceFileAccess.mockResolvedValue(true)
120-
mocks.mockDeleteFile.mockResolvedValue(undefined)
121-
mocks.mockHasCloudStorage.mockReturnValue(true)
112+
storageServiceMockFns.mockDeleteFile.mockResolvedValue(undefined)
113+
storageServiceMockFns.mockHasCloudStorage.mockReturnValue(true)
122114
mocks.mockGetStorageProvider.mockReturnValue('s3')
123115
mocks.mockIsUsingCloudStorage.mockReturnValue(true)
124116
})
125117

126118
it('should handle local file deletion successfully', async () => {
127-
mocks.mockHasCloudStorage.mockReturnValue(false)
119+
storageServiceMockFns.mockHasCloudStorage.mockReturnValue(false)
128120
mocks.mockGetStorageProvider.mockReturnValue('local')
129121
mocks.mockIsUsingCloudStorage.mockReturnValue(false)
130122

@@ -142,7 +134,7 @@ describe('File Delete API Route', () => {
142134
})
143135

144136
it('should handle file not found gracefully', async () => {
145-
mocks.mockHasCloudStorage.mockReturnValue(false)
137+
storageServiceMockFns.mockHasCloudStorage.mockReturnValue(false)
146138
mocks.mockGetStorageProvider.mockReturnValue('local')
147139
mocks.mockIsUsingCloudStorage.mockReturnValue(false)
148140

@@ -170,7 +162,7 @@ describe('File Delete API Route', () => {
170162
expect(data).toHaveProperty('success', true)
171163
expect(data).toHaveProperty('message', 'File deleted successfully')
172164

173-
expect(mocks.mockDeleteFile).toHaveBeenCalledWith({
165+
expect(storageServiceMockFns.mockDeleteFile).toHaveBeenCalledWith({
174166
key: 'workspace/test-workspace-id/1234567890-test-file.txt',
175167
context: 'workspace',
176168
})
@@ -190,7 +182,7 @@ describe('File Delete API Route', () => {
190182
expect(data).toHaveProperty('success', true)
191183
expect(data).toHaveProperty('message', 'File deleted successfully')
192184

193-
expect(mocks.mockDeleteFile).toHaveBeenCalledWith({
185+
expect(storageServiceMockFns.mockDeleteFile).toHaveBeenCalledWith({
194186
key: 'workspace/test-workspace-id/1234567890-test-document.pdf',
195187
context: 'workspace',
196188
})

apps/sim/app/api/files/parse/route.test.ts

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import {
1010
inputValidationMock,
1111
permissionsMock,
1212
permissionsMockFns,
13+
storageServiceMock,
14+
storageServiceMockFns,
1315
} from '@sim/testing'
1416
import { NextRequest } from 'next/server'
1517
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
@@ -22,8 +24,6 @@ const {
2224
mockIsSupportedFileType,
2325
mockParseFile,
2426
mockParseBuffer,
25-
mockDownloadFile,
26-
mockHasCloudStorage,
2727
mockFsAccess,
2828
mockFsStat,
2929
mockFsReadFile,
@@ -47,8 +47,6 @@ const {
4747
content: 'parsed buffer content',
4848
metadata: { pageCount: 1 },
4949
}),
50-
mockDownloadFile: vi.fn(),
51-
mockHasCloudStorage: vi.fn().mockReturnValue(true),
5250
mockFsAccess: vi.fn().mockResolvedValue(undefined),
5351
mockFsStat: vi.fn().mockImplementation(() => ({ isFile: () => true })),
5452
mockFsReadFile: vi.fn().mockResolvedValue(Buffer.from('test file content')),
@@ -79,10 +77,7 @@ vi.mock('@/lib/file-parsers', () => ({
7977
parseBuffer: mockParseBuffer,
8078
}))
8179

82-
vi.mock('@/lib/uploads/core/storage-service', () => ({
83-
downloadFile: mockDownloadFile,
84-
hasCloudStorage: mockHasCloudStorage,
85-
}))
80+
vi.mock('@/lib/uploads/core/storage-service', () => storageServiceMock)
8681

8782
vi.mock('path', () => ({
8883
default: actualPath,
@@ -176,6 +171,7 @@ describe('File Parse API Route', () => {
176171
})
177172

178173
permissionsMockFns.mockGetUserEntityPermissions.mockResolvedValue({ canView: true })
174+
storageServiceMockFns.mockHasCloudStorage.mockReturnValue(true)
179175
mockIsSupportedFileType.mockReturnValue(true)
180176
mockParseFile.mockResolvedValue({
181177
content: 'parsed content',
@@ -325,8 +321,8 @@ describe('File Parse API Route', () => {
325321
authenticated: true,
326322
})
327323

328-
mockDownloadFile.mockRejectedValue(new Error('Access denied'))
329-
mockHasCloudStorage.mockReturnValue(true)
324+
storageServiceMockFns.mockDownloadFile.mockRejectedValue(new Error('Access denied'))
325+
storageServiceMockFns.mockHasCloudStorage.mockReturnValue(true)
330326

331327
const req = new NextRequest('http://localhost:3000/api/files/parse', {
332328
method: 'POST',

apps/sim/app/api/files/presigned/route.test.ts

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* @vitest-environment node
55
*/
66

7-
import { authMockFns } from '@sim/testing'
7+
import { authMockFns, storageServiceMock, storageServiceMockFns } from '@sim/testing'
88
import { NextRequest } from 'next/server'
99
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
1010

@@ -16,9 +16,6 @@ const {
1616
mockGetStorageConfig,
1717
mockIsUsingCloudStorage,
1818
mockGetStorageProvider,
19-
mockHasCloudStorage,
20-
mockGeneratePresignedUploadUrl,
21-
mockGeneratePresignedDownloadUrl,
2219
mockValidateFileType,
2320
mockGenerateCopilotUploadUrl,
2421
mockIsImageFileType,
@@ -32,9 +29,6 @@ const {
3229
mockGetStorageConfig: vi.fn(),
3330
mockIsUsingCloudStorage: vi.fn(),
3431
mockGetStorageProvider: vi.fn(),
35-
mockHasCloudStorage: vi.fn(),
36-
mockGeneratePresignedUploadUrl: vi.fn(),
37-
mockGeneratePresignedDownloadUrl: vi.fn().mockResolvedValue('https://example.com/presigned-url'),
3832
mockValidateFileType: vi.fn().mockReturnValue(null),
3933
mockGenerateCopilotUploadUrl: vi.fn().mockResolvedValue({
4034
url: 'https://example.com/presigned-url',
@@ -63,11 +57,7 @@ vi.mock('@/lib/uploads/config', () => ({
6357
getStorageProvider: mockGetStorageProvider,
6458
}))
6559

66-
vi.mock('@/lib/uploads/core/storage-service', () => ({
67-
hasCloudStorage: mockHasCloudStorage,
68-
generatePresignedUploadUrl: mockGeneratePresignedUploadUrl,
69-
generatePresignedDownloadUrl: mockGeneratePresignedDownloadUrl,
70-
}))
60+
vi.mock('@/lib/uploads/core/storage-service', () => storageServiceMock)
7161

7262
vi.mock('@/lib/uploads/utils/validation', () => ({
7363
validateFileType: mockValidateFileType,
@@ -132,8 +122,8 @@ function setupFileApiMocks(
132122
storageProvider === 'blob' ? 'Azure Blob' : storageProvider === 's3' ? 'S3' : 'Local'
133123
)
134124

135-
mockHasCloudStorage.mockReturnValue(cloudEnabled)
136-
mockGeneratePresignedUploadUrl.mockImplementation(
125+
storageServiceMockFns.mockHasCloudStorage.mockReturnValue(cloudEnabled)
126+
storageServiceMockFns.mockGeneratePresignedUploadUrl.mockImplementation(
137127
async (opts: { fileName: string; context: string }) => {
138128
const timestamp = Date.now()
139129
const safeFileName = opts.fileName.replace(/[^a-zA-Z0-9.-]/g, '_')
@@ -144,7 +134,9 @@ function setupFileApiMocks(
144134
}
145135
}
146136
)
147-
mockGeneratePresignedDownloadUrl.mockResolvedValue('https://example.com/presigned-url')
137+
storageServiceMockFns.mockGeneratePresignedDownloadUrl.mockResolvedValue(
138+
'https://example.com/presigned-url'
139+
)
148140

149141
mockValidateFileType.mockReturnValue(null)
150142

@@ -431,7 +423,7 @@ describe('/api/files/presigned', () => {
431423
storageProvider: 's3',
432424
})
433425

434-
mockGeneratePresignedUploadUrl.mockRejectedValue(
426+
storageServiceMockFns.mockGeneratePresignedUploadUrl.mockRejectedValue(
435427
new Error('Unknown storage provider: unknown')
436428
)
437429

@@ -458,7 +450,9 @@ describe('/api/files/presigned', () => {
458450
storageProvider: 's3',
459451
})
460452

461-
mockGeneratePresignedUploadUrl.mockRejectedValue(new Error('S3 service unavailable'))
453+
storageServiceMockFns.mockGeneratePresignedUploadUrl.mockRejectedValue(
454+
new Error('S3 service unavailable')
455+
)
462456

463457
const request = new NextRequest('http://localhost:3000/api/files/presigned?type=chat', {
464458
method: 'POST',
@@ -483,7 +477,9 @@ describe('/api/files/presigned', () => {
483477
storageProvider: 'blob',
484478
})
485479

486-
mockGeneratePresignedUploadUrl.mockRejectedValue(new Error('Azure service unavailable'))
480+
storageServiceMockFns.mockGeneratePresignedUploadUrl.mockRejectedValue(
481+
new Error('Azure service unavailable')
482+
)
487483

488484
const request = new NextRequest('http://localhost:3000/api/files/presigned?type=chat', {
489485
method: 'POST',

apps/sim/app/api/files/serve/[...path]/route.test.ts

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,14 @@
33
*
44
* @vitest-environment node
55
*/
6-
import { hybridAuthMockFns } from '@sim/testing'
6+
import { hybridAuthMockFns, storageServiceMock, storageServiceMockFns } from '@sim/testing'
77
import { NextRequest } from 'next/server'
88
import { beforeEach, describe, expect, it, vi } from 'vitest'
99

1010
const {
1111
mockVerifyFileAccess,
1212
mockReadFile,
1313
mockIsUsingCloudStorage,
14-
mockDownloadFile,
1514
mockDownloadCopilotFile,
1615
mockInferContextFromKey,
1716
mockGetContentType,
@@ -30,7 +29,6 @@ const {
3029
mockVerifyFileAccess: vi.fn(),
3130
mockReadFile: vi.fn(),
3231
mockIsUsingCloudStorage: vi.fn(),
33-
mockDownloadFile: vi.fn(),
3432
mockDownloadCopilotFile: vi.fn(),
3533
mockInferContextFromKey: vi.fn(),
3634
mockGetContentType: vi.fn(),
@@ -58,10 +56,7 @@ vi.mock('@/lib/uploads', () => ({
5856
isUsingCloudStorage: mockIsUsingCloudStorage,
5957
}))
6058

61-
vi.mock('@/lib/uploads/core/storage-service', () => ({
62-
downloadFile: mockDownloadFile,
63-
hasCloudStorage: vi.fn().mockReturnValue(true),
64-
}))
59+
vi.mock('@/lib/uploads/core/storage-service', () => storageServiceMock)
6560

6661
vi.mock('@/lib/uploads/utils/file-utils', () => ({
6762
inferContextFromKey: mockInferContextFromKey,
@@ -104,6 +99,7 @@ describe('File Serve API Route', () => {
10499
mockVerifyFileAccess.mockResolvedValue(true)
105100
mockReadFile.mockResolvedValue(Buffer.from('test content'))
106101
mockIsUsingCloudStorage.mockReturnValue(false)
102+
storageServiceMockFns.mockHasCloudStorage.mockReturnValue(true)
107103
mockInferContextFromKey.mockReturnValue('workspace')
108104
mockGetContentType.mockReturnValue('text/plain')
109105
mockFindLocalFile.mockReturnValue('/test/uploads/test-file.txt')
@@ -161,7 +157,7 @@ describe('File Serve API Route', () => {
161157

162158
it('should serve cloud file by downloading and proxying', async () => {
163159
mockIsUsingCloudStorage.mockReturnValue(true)
164-
mockDownloadFile.mockResolvedValue(Buffer.from('test cloud file content'))
160+
storageServiceMockFns.mockDownloadFile.mockResolvedValue(Buffer.from('test cloud file content'))
165161
mockGetContentType.mockReturnValue('image/png')
166162

167163
const req = new NextRequest(
@@ -174,7 +170,7 @@ describe('File Serve API Route', () => {
174170
expect(response.status).toBe(200)
175171
expect(response.headers.get('Content-Type')).toBe('image/png')
176172

177-
expect(mockDownloadFile).toHaveBeenCalledWith({
173+
expect(storageServiceMockFns.mockDownloadFile).toHaveBeenCalledWith({
178174
key: 'workspace/test-workspace-id/1234567890-image.png',
179175
context: 'workspace',
180176
})

apps/sim/app/api/files/upload/route.test.ts

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,14 @@
33
*
44
* @vitest-environment node
55
*/
6-
import { authMockFns, hybridAuthMockFns, permissionsMock, permissionsMockFns } from '@sim/testing'
6+
import {
7+
authMockFns,
8+
hybridAuthMockFns,
9+
permissionsMock,
10+
permissionsMockFns,
11+
storageServiceMock,
12+
storageServiceMockFns,
13+
} from '@sim/testing'
714
import { NextRequest } from 'next/server'
815
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
916

@@ -16,8 +23,6 @@ const mocks = vi.hoisted(() => {
1623
const mockGetStorageProvider = vi.fn()
1724
const mockIsUsingCloudStorage = vi.fn()
1825
const mockUploadFile = vi.fn()
19-
const mockHasCloudStorage = vi.fn()
20-
const mockStorageUploadFile = vi.fn()
2126

2227
return {
2328
mockVerifyFileAccess,
@@ -28,8 +33,6 @@ const mocks = vi.hoisted(() => {
2833
mockGetStorageProvider,
2934
mockIsUsingCloudStorage,
3035
mockUploadFile,
31-
mockHasCloudStorage,
32-
mockStorageUploadFile,
3336
}
3437
})
3538

@@ -85,10 +88,7 @@ vi.mock('@/lib/uploads', () => ({
8588
uploadFile: mocks.mockUploadFile,
8689
}))
8790

88-
vi.mock('@/lib/uploads/core/storage-service', () => ({
89-
uploadFile: mocks.mockStorageUploadFile,
90-
hasCloudStorage: mocks.mockHasCloudStorage,
91-
}))
91+
vi.mock('@/lib/uploads/core/storage-service', () => storageServiceMock)
9292

9393
vi.mock('@/lib/uploads/setup.server', () => ({
9494
UPLOAD_DIR_SERVER: '/tmp/test-uploads',
@@ -153,8 +153,8 @@ function setupFileApiMocks(
153153
type: 'text/plain',
154154
})
155155

156-
mocks.mockHasCloudStorage.mockReturnValue(cloudEnabled)
157-
mocks.mockStorageUploadFile.mockResolvedValue({
156+
storageServiceMockFns.mockHasCloudStorage.mockReturnValue(cloudEnabled)
157+
storageServiceMockFns.mockUploadFile.mockResolvedValue({
158158
key: 'test-key',
159159
path: '/test/path',
160160
})
@@ -325,8 +325,8 @@ describe('File Upload Security Tests', () => {
325325
user: { id: 'test-user-id' },
326326
})
327327

328-
mocks.mockHasCloudStorage.mockReturnValue(false)
329-
mocks.mockStorageUploadFile.mockResolvedValue({
328+
storageServiceMockFns.mockHasCloudStorage.mockReturnValue(false)
329+
storageServiceMockFns.mockUploadFile.mockResolvedValue({
330330
key: 'test-key',
331331
path: '/test/path',
332332
})

0 commit comments

Comments
 (0)