Skip to content

Commit 21473eb

Browse files
committed
format tableName
1 parent 2f62f08 commit 21473eb

3 files changed

Lines changed: 44 additions & 31 deletions

File tree

src/data-connect/data-connect-api-client-internal.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,14 @@ export class DataConnectApiClient {
246246
return String(data);
247247
}
248248

249+
private formatTableName(tableName: string): string {
250+
// Format tableName: first character to lowercase
251+
if (tableName && tableName.length > 0) {
252+
return tableName.charAt(0).toLowerCase() + tableName.slice(1);
253+
}
254+
return tableName;
255+
}
256+
249257
/**
250258
* Insert a single row into the specified table.
251259
*/
@@ -264,6 +272,7 @@ export class DataConnectApiClient {
264272
throw new FirebaseDataConnectError('invalid-argument', '`data` must be a non-null object.');
265273
}
266274

275+
tableName = this.formatTableName(tableName);
267276
try {
268277
const gqlDataString = this.objectToString(data);
269278
const mutation = `mutation { ${tableName}_insert(data: ${gqlDataString}) }`;
@@ -288,6 +297,7 @@ export class DataConnectApiClient {
288297
throw new FirebaseDataConnectError('invalid-argument', '`data` must be a non-empty array for insertMany.');
289298
}
290299

300+
tableName = this.formatTableName(tableName);
291301
try {
292302
const gqlDataString = this.objectToString(data);
293303
const mutation = `mutation { ${tableName}_insertMany(data: ${gqlDataString}) }`;
@@ -316,6 +326,7 @@ export class DataConnectApiClient {
316326
throw new FirebaseDataConnectError('invalid-argument', '`data` must be a non-null object.');
317327
}
318328

329+
tableName = this.formatTableName(tableName);
319330
try {
320331
const gqlDataString = this.objectToString(data);
321332
const mutation = `mutation { ${tableName}_upsert(data: ${gqlDataString}) }`;
@@ -340,6 +351,7 @@ export class DataConnectApiClient {
340351
throw new FirebaseDataConnectError('invalid-argument', '`data` must be a non-empty array for upsertMany.');
341352
}
342353

354+
tableName = this.formatTableName(tableName);
343355
try {
344356
const gqlDataString = this.objectToString(data);
345357
const mutation = `mutation { ${tableName}_upsertMany(data: ${gqlDataString}) }`;

test/unit/data-connect/data-connect-api-client-internal.spec.ts

Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,8 @@ describe('DataConnectApiClient CRUD helpers', () => {
247247
projectId: 'test-project-crud',
248248
};
249249

250-
const testTableName = 'TestTable';
250+
const tableName = 'TestTable';
251+
const formatedTableName = 'testTable';
251252

252253
// Helper function to normalize GraphQL strings
253254
const normalizeGraphQLString = (str: string): string => {
@@ -275,25 +276,25 @@ describe('DataConnectApiClient CRUD helpers', () => {
275276
const simpleData = { name: 'test', value: 123 };
276277
const expectedMutation = `
277278
mutation {
278-
${testTableName}_insert(data: {
279+
${formatedTableName}_insert(data: {
279280
name: "test",
280281
value: 123
281282
})
282283
}`;
283-
await apiClient.insert(testTableName, simpleData);
284+
await apiClient.insert(tableName, simpleData);
284285
expect(executeGraphqlStub).to.have.been.calledOnceWithExactly(normalizeGraphQLString(expectedMutation));
285286
});
286287

287288
it('should call executeGraphql with the correct mutation for complex data', async () => {
288289
const complexData = { id: 'abc', active: true, scores: [10, 20], info: { nested: 'yes/no "quote" \\slash\\' } };
289290
const expectedMutation = `
290291
mutation {
291-
${testTableName}_insert(data: {
292+
${formatedTableName}_insert(data: {
292293
id: "abc", active: true, scores: [10, 20],
293294
info: { nested: "yes/no \\"quote\\" \\\\slash\\\\" }
294295
})
295296
}`;
296-
await apiClient.insert(testTableName, complexData);
297+
await apiClient.insert(tableName, complexData);
297298
expect(executeGraphqlStub).to.have.been.calledOnceWithExactly(normalizeGraphQLString(expectedMutation));
298299
});
299300

@@ -312,15 +313,15 @@ describe('DataConnectApiClient CRUD helpers', () => {
312313
};
313314
const expectedMutation = `
314315
mutation {
315-
${testTableName}_insert(data: {
316+
${formatedTableName}_insert(data: {
316317
genre: "Action",
317318
title: "Die Hard",
318319
ratings: null,
319320
director: {},
320321
extras: [1, null, "hello", null, { a: 1 }]
321322
})
322323
}`;
323-
await apiClient.insert(testTableName, dataWithUndefined);
324+
await apiClient.insert(tableName, dataWithUndefined);
324325
expect(executeGraphqlStub).to.have.been.calledOnceWithExactly(normalizeGraphQLString(expectedMutation));
325326
});
326327

@@ -330,12 +331,12 @@ describe('DataConnectApiClient CRUD helpers', () => {
330331
});
331332

332333
it('should throw FirebaseDataConnectError for null data', async () => {
333-
await expect(apiClient.insert(testTableName, null as any))
334+
await expect(apiClient.insert(tableName, null as any))
334335
.to.be.rejectedWith(FirebaseDataConnectError, /`data` must be a non-null object./);
335336
});
336337

337338
it('should throw FirebaseDataConnectError for array data', async() => {
338-
await expect(apiClient.insert(testTableName, []))
339+
await expect(apiClient.insert(tableName, []))
339340
.to.be.rejectedWith(FirebaseDataConnectError, /`data` must be an object, not an array, for single insert./);
340341
});
341342
});
@@ -346,8 +347,8 @@ describe('DataConnectApiClient CRUD helpers', () => {
346347
const simpleDataArray = [{ name: 'test1' }, { name: 'test2', value: 456 }];
347348
const expectedMutation = `
348349
mutation {
349-
${testTableName}_insertMany(data: [{ name: "test1" }, { name: "test2", value: 456 }]) }`;
350-
await apiClient.insertMany(testTableName, simpleDataArray);
350+
${formatedTableName}_insertMany(data: [{ name: "test1" }, { name: "test2", value: 456 }]) }`;
351+
await apiClient.insertMany(tableName, simpleDataArray);
351352
expect(executeGraphqlStub).to.have.been.calledOnceWithExactly(normalizeGraphQLString(expectedMutation));
352353
});
353354

@@ -358,10 +359,10 @@ describe('DataConnectApiClient CRUD helpers', () => {
358359
];
359360
const expectedMutation = `
360361
mutation {
361-
${testTableName}_insertMany(data:
362+
${formatedTableName}_insertMany(data:
362363
[{ id: "a", active: true, info: { nested: "n1 \\"quote\\"" } }, { id: "b", scores: [1, 2],
363364
info: { nested: "n2/\\\\" } }]) }`;
364-
await apiClient.insertMany(testTableName, complexDataArray);
365+
await apiClient.insertMany(tableName, complexDataArray);
365366
expect(executeGraphqlStub).to.have.been.calledOnceWithExactly(normalizeGraphQLString(expectedMutation));
366367
});
367368

@@ -371,17 +372,17 @@ describe('DataConnectApiClient CRUD helpers', () => {
371372
});
372373

373374
it('should throw FirebaseDataConnectError for null data', () => {
374-
expect(apiClient.insertMany(testTableName, null as any))
375+
expect(apiClient.insertMany(tableName, null as any))
375376
.to.be.rejectedWith(FirebaseDataConnectError, /`data` must be a non-empty array for insertMany./);
376377
});
377378

378379
it('should throw FirebaseDataConnectError for empty array data', () => {
379-
expect(apiClient.insertMany(testTableName, []))
380+
expect(apiClient.insertMany(tableName, []))
380381
.to.be.rejectedWith(FirebaseDataConnectError, /`data` must be a non-empty array for insertMany./);
381382
});
382383

383384
it('should throw FirebaseDataConnectError for non-array data', () => {
384-
expect(apiClient.insertMany(testTableName, { data: 1 } as any))
385+
expect(apiClient.insertMany(tableName, { data: 1 } as any))
385386
.to.be.rejectedWith(FirebaseDataConnectError, /`data` must be a non-empty array for insertMany./);
386387
});
387388
});
@@ -390,18 +391,18 @@ describe('DataConnectApiClient CRUD helpers', () => {
390391
describe('upsert()', () => {
391392
it('should call executeGraphql with the correct mutation for simple data', async () => {
392393
const simpleData = { id: 'key1', value: 'updated' };
393-
const expectedMutation = `mutation { ${testTableName}_upsert(data: { id: "key1", value: "updated" }) }`;
394-
await apiClient.upsert(testTableName, simpleData);
394+
const expectedMutation = `mutation { ${formatedTableName}_upsert(data: { id: "key1", value: "updated" }) }`;
395+
await apiClient.upsert(tableName, simpleData);
395396
expect(executeGraphqlStub).to.have.been.calledOnceWithExactly(expectedMutation);
396397
});
397398

398399
it('should call executeGraphql with the correct mutation for complex data', async () => {
399400
const complexData = { id: 'key2', active: false, items: [1, null], detail: { status: 'done/\\' } };
400401
// Note: Matching specific escaping: / -> \\, ' -> \'
401402
const expectedMutation = `
402-
mutation { ${testTableName}_upsert(data:
403+
mutation { ${formatedTableName}_upsert(data:
403404
{ id: "key2", active: false, items: [1, null], detail: { status: "done/\\\\" } }) }`;
404-
await apiClient.upsert(testTableName, complexData);
405+
await apiClient.upsert(tableName, complexData);
405406
expect(executeGraphqlStub).to.have.been.calledOnceWithExactly(normalizeGraphQLString(expectedMutation));
406407
});
407408

@@ -411,12 +412,12 @@ describe('DataConnectApiClient CRUD helpers', () => {
411412
});
412413

413414
it('should throw FirebaseDataConnectError for null data', async () => {
414-
await expect(apiClient.upsert(testTableName, null as any))
415+
await expect(apiClient.upsert(tableName, null as any))
415416
.to.be.rejectedWith(FirebaseDataConnectError, /`data` must be a non-null object./);
416417
});
417418

418419
it('should throw FirebaseDataConnectError for array data', async () => {
419-
await expect(apiClient.upsert(testTableName, [{ data: 1 }]))
420+
await expect(apiClient.upsert(tableName, [{ data: 1 }]))
420421
.to.be.rejectedWith(FirebaseDataConnectError, /`data` must be an object, not an array, for single upsert./);
421422
});
422423
});
@@ -426,8 +427,8 @@ describe('DataConnectApiClient CRUD helpers', () => {
426427
it('should call executeGraphql with the correct mutation for simple data array', async () => {
427428
const simpleDataArray = [{ id: 'k1' }, { id: 'k2', value: 99 }];
428429
const expectedMutation = `
429-
mutation { ${testTableName}_upsertMany(data: [{ id: "k1" }, { id: "k2", value: 99 }]) }`;
430-
await apiClient.upsertMany(testTableName, simpleDataArray);
430+
mutation { ${formatedTableName}_upsertMany(data: [{ id: "k1" }, { id: "k2", value: 99 }]) }`;
431+
await apiClient.upsertMany(tableName, simpleDataArray);
431432
expect(executeGraphqlStub).to.have.been.calledOnceWithExactly(normalizeGraphQLString(expectedMutation));
432433
});
433434

@@ -437,9 +438,9 @@ describe('DataConnectApiClient CRUD helpers', () => {
437438
{ id: 'y', scores: [null, 2] }
438439
];
439440
const expectedMutation = `
440-
mutation { ${testTableName}_upsertMany(data:
441+
mutation { ${formatedTableName}_upsertMany(data:
441442
[{ id: "x", active: true, info: { nested: "n1/\\\\\\"x" } }, { id: "y", scores: [null, 2] }]) }`;
442-
await apiClient.upsertMany(testTableName, complexDataArray);
443+
await apiClient.upsertMany(tableName, complexDataArray);
443444
expect(executeGraphqlStub).to.have.been.calledOnceWithExactly(normalizeGraphQLString(expectedMutation));
444445
});
445446

@@ -449,17 +450,17 @@ describe('DataConnectApiClient CRUD helpers', () => {
449450
});
450451

451452
it('should throw FirebaseDataConnectError for null data', async () => {
452-
expect(apiClient.upsertMany(testTableName, null as any))
453+
expect(apiClient.upsertMany(tableName, null as any))
453454
.to.be.rejectedWith(FirebaseDataConnectError, /`data` must be a non-empty array for upsertMany./);
454455
});
455456

456457
it('should throw FirebaseDataConnectError for empty array data', async () => {
457-
expect(apiClient.upsertMany(testTableName, []))
458+
expect(apiClient.upsertMany(tableName, []))
458459
.to.be.rejectedWith(FirebaseDataConnectError, /`data` must be a non-empty array for upsertMany./);
459460
});
460461

461462
it('should throw FirebaseDataConnectError for non-array data', async () => {
462-
await expect(apiClient.upsertMany(testTableName, { data: 1 } as any))
463+
await expect(apiClient.upsertMany(tableName, { data: 1 } as any))
463464
.to.be.rejectedWith(FirebaseDataConnectError, /`data` must be a non-empty array for upsertMany./);
464465
});
465466
});

test/unit/data-connect/index.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ describe('DataConnect', () => {
8787
});
8888
});
8989

90-
describe('DataConnect CRUD helpers delegation', () => { // Renamed suite for clarity
90+
describe('DataConnect CRUD helpers delegation', () => {
9191
let mockApp: App;
9292
let dataConnect: DataConnect;
9393
// Stubs for the client methods
@@ -105,7 +105,7 @@ describe('DataConnect CRUD helpers delegation', () => { // Renamed suite for cla
105105

106106
beforeEach(() => {
107107
mockApp = mocks.app();
108-
// Instantiate DataConnect normally
108+
109109
dataConnect = getDataConnect(connectorConfig, mockApp);
110110

111111
// Stub the DataConnectApiClient prototype methods

0 commit comments

Comments
 (0)