Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
96 changes: 95 additions & 1 deletion workspace-server/src/__tests__/services/DriveService.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,8 @@ describe('DriveService', () => {
q: "mimeType='application/vnd.google-apps.folder' and name = 'TestFolder'",
fields: 'files(id, name)',
spaces: 'drive',
supportsAllDrives: true,
includeItemsFromAllDrives: true,
});

expect(JSON.parse(result.content[0].text)).toEqual(mockFolders);
Expand All @@ -116,6 +118,10 @@ describe('DriveService', () => {
const result = await driveService.findFolder({ folderName: 'NonExistentFolder' });

expect(mockDriveAPI.files.list).toHaveBeenCalledTimes(1);
expect(mockDriveAPI.files.list).toHaveBeenCalledWith(expect.objectContaining({
supportsAllDrives: true,
includeItemsFromAllDrives: true
}));
expect(JSON.parse(result.content[0].text)).toEqual([]);
});

Expand Down Expand Up @@ -145,6 +151,7 @@ describe('DriveService', () => {
mimeType: 'application/vnd.google-apps.folder',
},
fields: 'id, name',
supportsAllDrives: true,
});

expect(JSON.parse(result.content[0].text)).toEqual(mockFolder);
Expand All @@ -166,6 +173,7 @@ describe('DriveService', () => {
parents: ['parent-id'],
},
fields: 'id, name',
supportsAllDrives: true,
});

expect(JSON.parse(result.content[0].text)).toEqual(mockFolder);
Expand Down Expand Up @@ -206,6 +214,8 @@ describe('DriveService', () => {
pageToken: undefined,
corpus: undefined,
fields: 'nextPageToken, files(id, name, modifiedTime, viewedByMeTime, mimeType, parents)',
supportsAllDrives: true,
includeItemsFromAllDrives: true,
});

const responseData = JSON.parse(result.content[0].text);
Expand Down Expand Up @@ -237,6 +247,8 @@ describe('DriveService', () => {
pageToken: undefined,
corpus: undefined,
fields: 'nextPageToken, files(id, name, modifiedTime, viewedByMeTime, mimeType, parents)',
supportsAllDrives: true,
includeItemsFromAllDrives: true,
});

const responseData = JSON.parse(result.content[0].text);
Expand Down Expand Up @@ -267,6 +279,8 @@ describe('DriveService', () => {
pageToken: undefined,
corpus: undefined,
fields: 'nextPageToken, files(id, name, modifiedTime, viewedByMeTime, mimeType, parents)',
supportsAllDrives: true,
includeItemsFromAllDrives: true,
});

const responseData = JSON.parse(result.content[0].text);
Expand Down Expand Up @@ -296,6 +310,8 @@ describe('DriveService', () => {
pageToken: undefined,
corpus: undefined,
fields: 'nextPageToken, files(id, name, modifiedTime, viewedByMeTime, mimeType, parents)',
supportsAllDrives: true,
includeItemsFromAllDrives: true,
});

const responseData = JSON.parse(result.content[0].text);
Expand Down Expand Up @@ -324,6 +340,8 @@ describe('DriveService', () => {
pageToken: undefined,
corpus: undefined,
fields: 'nextPageToken, files(id, name, modifiedTime, viewedByMeTime, mimeType, parents)',
supportsAllDrives: true,
includeItemsFromAllDrives: true,
});

const responseData = JSON.parse(result.content[0].text);
Expand Down Expand Up @@ -351,6 +369,8 @@ describe('DriveService', () => {
pageToken: undefined,
corpus: undefined,
fields: 'nextPageToken, files(id, name, modifiedTime, viewedByMeTime, mimeType, parents)',
supportsAllDrives: true,
includeItemsFromAllDrives: true,
});

const responseData = JSON.parse(result.content[0].text);
Expand Down Expand Up @@ -404,6 +424,8 @@ describe('DriveService', () => {
pageToken: 'previous-token',
corpus: undefined,
fields: 'nextPageToken, files(id, name, modifiedTime, viewedByMeTime, mimeType, parents)',
supportsAllDrives: true,
includeItemsFromAllDrives: true,
});
});

Expand All @@ -425,6 +447,8 @@ describe('DriveService', () => {
pageToken: undefined,
corpus: 'domain',
fields: 'nextPageToken, files(id, name, modifiedTime, viewedByMeTime, mimeType, parents)',
supportsAllDrives: true,
includeItemsFromAllDrives: true,
});
});

Expand Down Expand Up @@ -454,6 +478,8 @@ describe('DriveService', () => {
pageToken: undefined,
corpus: undefined,
fields: 'nextPageToken, files(id, name, modifiedTime, viewedByMeTime, mimeType, parents)',
supportsAllDrives: true,
includeItemsFromAllDrives: true,
});
});

Expand All @@ -479,6 +505,8 @@ describe('DriveService', () => {
pageToken: undefined,
corpus: undefined,
fields: 'nextPageToken, files(id, name, modifiedTime, viewedByMeTime, mimeType, parents)',
supportsAllDrives: true,
includeItemsFromAllDrives: true,
});

const responseData = JSON.parse(result.content[0].text);
Expand Down Expand Up @@ -508,6 +536,8 @@ describe('DriveService', () => {
pageToken: undefined,
corpus: undefined,
fields: 'nextPageToken, files(id, name, modifiedTime, viewedByMeTime, mimeType, parents)',
supportsAllDrives: true,
includeItemsFromAllDrives: true,
});

const responseData = JSON.parse(result.content[0].text);
Expand All @@ -529,6 +559,7 @@ describe('DriveService', () => {
expect(mockDriveAPI.files.get).toHaveBeenCalledWith({
fileId: 'file456',
fields: 'id, name, modifiedTime, viewedByMeTime, mimeType, parents',
supportsAllDrives: true,
});
expect(mockDriveAPI.files.list).not.toHaveBeenCalled();

Expand All @@ -552,6 +583,7 @@ describe('DriveService', () => {
expect(mockDriveAPI.files.get).toHaveBeenCalledWith({
fileId: 'doc789',
fields: 'id, name, modifiedTime, viewedByMeTime, mimeType, parents',
supportsAllDrives: true,
});
expect(mockDriveAPI.files.list).not.toHaveBeenCalled();

Expand Down Expand Up @@ -597,13 +629,16 @@ describe('DriveService', () => {
expect(mockDriveAPI.files.get).toHaveBeenCalledWith({
fileId: 'folder789',
fields: 'mimeType',
supportsAllDrives: true,
});
expect(mockDriveAPI.files.list).toHaveBeenCalledWith({
q: "'folder789' in parents",
pageSize: 10,
pageToken: undefined,
corpus: undefined,
fields: 'nextPageToken, files(id, name, modifiedTime, viewedByMeTime, mimeType, parents)',
supportsAllDrives: true,
includeItemsFromAllDrives: true,
});

const responseData = JSON.parse(result.content[0].text);
Expand All @@ -627,10 +662,12 @@ describe('DriveService', () => {
expect(mockDriveAPI.files.get).toHaveBeenCalledWith({
fileId: 'file123',
fields: 'mimeType',
supportsAllDrives: true,
});
expect(mockDriveAPI.files.get).toHaveBeenCalledWith({
fileId: 'file123',
fields: 'id, name, modifiedTime, viewedByMeTime, mimeType, parents',
supportsAllDrives: true,
});
expect(mockDriveAPI.files.list).not.toHaveBeenCalled();

Expand Down Expand Up @@ -661,6 +698,8 @@ describe('DriveService', () => {
pageToken: undefined,
corpus: undefined,
fields: 'nextPageToken, files(id, name, modifiedTime, viewedByMeTime, mimeType, parents)',
supportsAllDrives: true,
includeItemsFromAllDrives: true,
});

const responseData = JSON.parse(result.content[0].text);
Expand Down Expand Up @@ -688,6 +727,8 @@ describe('DriveService', () => {
pageToken: undefined,
corpus: undefined,
fields: 'nextPageToken, files(id, name, modifiedTime, viewedByMeTime, mimeType, parents)',
supportsAllDrives: true,
includeItemsFromAllDrives: true,
});

const responseData = JSON.parse(result.content[0].text);
Expand Down Expand Up @@ -718,10 +759,11 @@ describe('DriveService', () => {
expect(mockDriveAPI.files.get).toHaveBeenCalledWith({
fileId: mockFileId,
fields: 'id, name, mimeType',
supportsAllDrives: true,
});

expect(mockDriveAPI.files.get).toHaveBeenCalledWith(
{ fileId: mockFileId, alt: 'media' },
{ fileId: mockFileId, alt: 'media', supportsAllDrives: true },
{ responseType: 'arraybuffer' }
);

Expand Down Expand Up @@ -753,4 +795,56 @@ describe('DriveService', () => {
expect(JSON.parse(result.content[0].text)).toEqual({ error: 'API Error' });
});
});

describe('Shared Drive Support', () => {
it('findFolder should include shared drive flags (currently fails to do so)', async () => {
mockDriveAPI.files.list.mockResolvedValue({ data: { files: [] } });

await driveService.findFolder({ folderName: 'SharedFolder' });

// This test is intended to fail until we add shared drive support
expect(mockDriveAPI.files.list).toHaveBeenCalledWith(expect.objectContaining({
supportsAllDrives: true,
includeItemsFromAllDrives: true
}));
});

it('search should include shared drive flags (currently fails to do so)', async () => {
mockDriveAPI.files.list.mockResolvedValue({ data: { files: [] } });

await driveService.search({ query: 'test' });

expect(mockDriveAPI.files.list).toHaveBeenCalledWith(expect.objectContaining({
supportsAllDrives: true,
includeItemsFromAllDrives: true
}));
});

it('createFolder should include supportsAllDrives flag (currently fails to do so)', async () => {
mockDriveAPI.files.create.mockResolvedValue({ data: { id: 'new-id', name: 'new' } });

await driveService.createFolder({ name: 'New Folder', parentId: 'shared-drive-parent-id' });

expect(mockDriveAPI.files.create).toHaveBeenCalledWith(expect.objectContaining({
supportsAllDrives: true
}));
});

it('downloadFile should include supportsAllDrives flag for metadata and media (currently fails to do so)', async () => {
mockDriveAPI.files.get.mockResolvedValueOnce({ data: { mimeType: 'text/plain', name: 'test.txt' } });
mockDriveAPI.files.get.mockResolvedValueOnce({ data: { data: Buffer.from('content') } });

await driveService.downloadFile({ fileId: 'shared-file-id', localPath: 'test.txt' });

// First call for metadata
expect(mockDriveAPI.files.get).toHaveBeenNthCalledWith(1, expect.objectContaining({
supportsAllDrives: true
}));

// Second call for media
expect(mockDriveAPI.files.get).toHaveBeenNthCalledWith(2, expect.objectContaining({
supportsAllDrives: true
}), expect.any(Object));
});
});
});
14 changes: 13 additions & 1 deletion workspace-server/src/services/DriveService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ export class DriveService {
q: query,
fields: 'files(id, name)',
spaces: 'drive',
supportsAllDrives: true,
includeItemsFromAllDrives: true,
});

const folders = res.data.files || [];
Expand Down Expand Up @@ -85,6 +87,7 @@ export class DriveService {
const file = await drive.files.create({
requestBody: fileMetadata,
fields: 'id, name',
supportsAllDrives: true,
});

logToFile(`Created folder: ${file.data.name} (${file.data.id})`);
Expand Down Expand Up @@ -137,7 +140,11 @@ export class DriveService {

if (urlType === 'unknown') {
try {
const file = await drive.files.get({ fileId, fields: 'mimeType' });
const file = await drive.files.get({
fileId,
fields: 'mimeType',
supportsAllDrives: true,
});
if (file.data.mimeType === 'application/vnd.google-apps.folder') {
isFolder = true;
}
Expand All @@ -155,6 +162,7 @@ export class DriveService {
const res = await drive.files.get({
fileId: fileId,
fields: 'id, name, modifiedTime, viewedByMeTime, mimeType, parents',
supportsAllDrives: true,
});
return {
content: [{
Expand Down Expand Up @@ -240,6 +248,8 @@ export class DriveService {
pageToken: pageToken,
corpus: corpus as 'user' | 'domain' | undefined,
fields: 'nextPageToken, files(id, name, modifiedTime, viewedByMeTime, mimeType, parents)',
supportsAllDrives: true,
includeItemsFromAllDrives: true,
});

let files = res.data.files || [];
Expand Down Expand Up @@ -284,6 +294,7 @@ export class DriveService {
const metadata = await drive.files.get({
fileId: fileId,
fields: 'id, name, mimeType',
supportsAllDrives: true,
});
const mimeType = metadata.data.mimeType || '';

Expand Down Expand Up @@ -316,6 +327,7 @@ export class DriveService {
const response = await drive.files.get({
fileId: fileId,
alt: 'media',
supportsAllDrives: true,
}, { responseType: 'arraybuffer' });

const buffer = Buffer.from(response.data as unknown as ArrayBuffer);
Expand Down