google-docs-mcp / src /tools /docs /tableRowDataHelpers.test.ts
iFightDucks's picture
Initial HF Space deploy: a-bonus/google-docs-mcp with HF metadata
7dc28be
import { describe, expect, it } from 'vitest';
import {
buildReplaceTableCellContentRequests,
buildReplaceTableRowRequests,
} from './tableRowDataHelpers.js';
describe('buildReplaceTableCellContentRequests', () => {
it('builds delete + insert requests for a populated cell', () => {
const requests = buildReplaceTableCellContentRequests(
{
rowIndex: 1,
columnIndex: 2,
startIndex: 100,
endIndex: 120,
contentStartIndex: 101,
contentEndIndex: 110,
text: 'Old value',
},
'New value'
);
expect(requests).toHaveLength(2);
expect(requests[0].deleteContentRange?.range).toEqual({
startIndex: 101,
endIndex: 109,
});
expect(requests[1].insertText?.location?.index).toBe(101);
expect(requests[1].insertText?.text).toBe('New value');
});
it('builds insert-only requests for an empty cell with a writable content index', () => {
const requests = buildReplaceTableCellContentRequests(
{
rowIndex: 0,
columnIndex: 0,
startIndex: 50,
endIndex: 60,
contentStartIndex: 51,
contentEndIndex: 52,
text: '',
},
'Value'
);
expect(requests).toHaveLength(1);
expect(requests[0].insertText?.location?.index).toBe(51);
expect(requests[0].insertText?.text).toBe('Value');
});
it('builds delete-only requests when replacing with an empty string', () => {
const requests = buildReplaceTableCellContentRequests(
{
rowIndex: 0,
columnIndex: 1,
startIndex: 70,
endIndex: 90,
contentStartIndex: 71,
contentEndIndex: 75,
text: 'ABC',
},
''
);
expect(requests).toHaveLength(1);
expect(requests[0].deleteContentRange?.range).toEqual({
startIndex: 71,
endIndex: 74,
});
});
it('builds one atomic request list for the whole row in reverse column order', () => {
const requests = buildReplaceTableRowRequests(
{
tableId: 'table:body:1',
ordinal: 1,
startIndex: 100,
endIndex: 140,
rowCount: 2,
columnCount: 2,
cells: [
{
rowIndex: 1,
columnIndex: 0,
startIndex: 101,
endIndex: 110,
contentStartIndex: 102,
contentEndIndex: 105,
text: 'A',
},
{
rowIndex: 1,
columnIndex: 1,
startIndex: 110,
endIndex: 120,
contentStartIndex: 111,
contentEndIndex: 114,
text: 'B',
},
],
},
1,
['left', 'right']
);
expect(requests).toHaveLength(4);
expect(requests[0].deleteContentRange?.range).toEqual({ startIndex: 111, endIndex: 113 });
expect(requests[1].insertText?.location?.index).toBe(111);
expect(requests[1].insertText?.text).toBe('right');
expect(requests[2].deleteContentRange?.range).toEqual({ startIndex: 102, endIndex: 104 });
expect(requests[3].insertText?.location?.index).toBe(102);
expect(requests[3].insertText?.text).toBe('left');
});
});