quickbase-js 0.1.0-beta.12 → 0.1.0-beta.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (168) hide show
  1. package/README.md +48 -18
  2. package/dist/esm/quickbase.d.ts +13 -3
  3. package/dist/esm/quickbase.js +416 -49
  4. package/dist/esm/quickbase.js.map +1 -1
  5. package/dist/esm/quickbase.min.js +1 -1
  6. package/dist/esm/quickbase.min.js.map +1 -1
  7. package/dist/umd/quickbase.umd.js +416 -49
  8. package/dist/umd/quickbase.umd.js.map +1 -1
  9. package/dist/umd/quickbase.umd.min.js +1 -1
  10. package/dist/umd/quickbase.umd.min.js.map +1 -1
  11. package/package.json +11 -4
  12. package/CHANGELOG.md +0 -227
  13. package/build-common.js +0 -131
  14. package/build-esm.js +0 -71
  15. package/build-umd.js +0 -69
  16. package/docs/.vitepress/cache/deps/@theme_index.js +0 -275
  17. package/docs/.vitepress/cache/deps/@theme_index.js.map +0 -7
  18. package/docs/.vitepress/cache/deps/_metadata.json +0 -40
  19. package/docs/.vitepress/cache/deps/chunk-5A67QEFC.js +0 -12542
  20. package/docs/.vitepress/cache/deps/chunk-5A67QEFC.js.map +0 -7
  21. package/docs/.vitepress/cache/deps/chunk-7D4P4MMP.js +0 -9719
  22. package/docs/.vitepress/cache/deps/chunk-7D4P4MMP.js.map +0 -7
  23. package/docs/.vitepress/cache/deps/package.json +0 -3
  24. package/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js +0 -4504
  25. package/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js.map +0 -7
  26. package/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js +0 -583
  27. package/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js.map +0 -7
  28. package/docs/.vitepress/cache/deps/vue.js +0 -343
  29. package/docs/.vitepress/cache/deps/vue.js.map +0 -7
  30. package/docs/.vitepress/config.mts +0 -26
  31. package/docs/api-examples.md +0 -49
  32. package/docs/index.md +0 -59
  33. package/docs/markdown-examples.md +0 -85
  34. package/docs-data/api-docs.json +0 -4143
  35. package/examples/quicbase-jsCDN.html +0 -36
  36. package/examples/react.js +0 -48
  37. package/examples/vanillajs.html +0 -47
  38. package/index.md +0 -25
  39. package/open-api/fix-spec-main.ts +0 -133
  40. package/open-api/generate-unified-interface.ts +0 -104
  41. package/open-api/generateDocsJson.ts +0 -24
  42. package/open-api/output/quickbase-fixed.json +0 -11191
  43. package/open-api/post-process-generated.ts +0 -226
  44. package/open-api/regenerate-client.ts +0 -117
  45. package/open-api/schema/enhance-general.ts +0 -111
  46. package/open-api/schema/fix-arrays.ts +0 -68
  47. package/open-api/schema/tags/apps.ts +0 -90
  48. package/open-api/schema/tags/fields.ts +0 -471
  49. package/open-api/schema/tags/groups.ts +0 -51
  50. package/open-api/schema/tags/index.ts +0 -66
  51. package/open-api/schema/tags/records.ts +0 -115
  52. package/open-api/schema/tags/tables.ts +0 -211
  53. package/open-api/schema/tags/users.ts +0 -47
  54. package/open-api/types/spec.ts +0 -42
  55. package/open-api/utils/common.ts +0 -29
  56. package/open-api/utils/generateJsDoc.ts +0 -74
  57. package/open-api/utils/infer-schema.ts +0 -40
  58. package/open-api/utils/naming.ts +0 -10
  59. package/open-api/utils/sharedUtils.ts +0 -352
  60. package/playwright.config.ts +0 -37
  61. package/rollup.config.js +0 -114
  62. package/specs/QuickBase_RESTful_API_2025-03-04T06_22_39.725Z.json +0 -46878
  63. package/specs/split/apps.json +0 -1315
  64. package/specs/split/auth.json +0 -191
  65. package/specs/split/fields.json +0 -3869
  66. package/specs/split/records.json +0 -754
  67. package/specs/split/reports.json +0 -619
  68. package/specs/split/tables.json +0 -1605
  69. package/src/RateLimitError.ts +0 -12
  70. package/src/ThrottleBucket.ts +0 -77
  71. package/src/authorizationStrategy.ts +0 -310
  72. package/src/generated-unified/QuickbaseClient.ts +0 -1135
  73. package/src/generated-unified/missing-types-report.json +0 -3
  74. package/src/index.ts +0 -1
  75. package/src/invokeMethod.ts +0 -212
  76. package/src/quickbaseClient.ts +0 -199
  77. package/src/rateLimiter.ts +0 -30
  78. package/src/tokenCache.ts +0 -39
  79. package/src/utils.ts +0 -50
  80. package/tests/playwright/qb/auth/cacheSwitching.test.ts +0 -159
  81. package/tests/playwright/qb/auth/fetchTempToken401.test.ts +0 -219
  82. package/tests/playwright/qb/auth/getAppWithTempToken.test.ts +0 -162
  83. package/tests/playwright/qb/auth/getAppWithTempTokenConcurrency.test.ts +0 -208
  84. package/tests/playwright/qb/auth/getAppWithUserToken.test.ts +0 -153
  85. package/tests/playwright/qb/auth/getTempToken.test.ts +0 -152
  86. package/tests/playwright/qb/auth/tempTokenPrefetch.test.ts +0 -179
  87. package/tests/playwright/qb/auth/tempTokenRenewal.test.ts +0 -133
  88. package/tests/setup.ts +0 -53
  89. package/tests/vitest/qb/ThrottleBucket.test.ts +0 -77
  90. package/tests/vitest/qb/apps/copyApp.test.ts +0 -76
  91. package/tests/vitest/qb/apps/createApp.test.ts +0 -64
  92. package/tests/vitest/qb/apps/deleteApp.test.ts +0 -76
  93. package/tests/vitest/qb/apps/getApp.test.ts +0 -44
  94. package/tests/vitest/qb/apps/getAppEvents.test.ts +0 -67
  95. package/tests/vitest/qb/apps/updateApp.test.ts +0 -58
  96. package/tests/vitest/qb/auth/mockQuickbaseServer.ts +0 -60
  97. package/tests/vitest/qb/auth/retryUserToken401.test.ts +0 -73
  98. package/tests/vitest/qb/auth/ssoTokenConcurrency.test.ts +0 -68
  99. package/tests/vitest/qb/auth/ssoTokenIntegrationWithServer.test.ts +0 -65
  100. package/tests/vitest/qb/auth/userTokenConcurrency.test.ts +0 -63
  101. package/tests/vitest/qb/fields/createField.test.ts +0 -77
  102. package/tests/vitest/qb/fields/deleteFields.test.ts +0 -83
  103. package/tests/vitest/qb/fields/getField.test.ts +0 -85
  104. package/tests/vitest/qb/fields/getFieldUsage.test.ts +0 -82
  105. package/tests/vitest/qb/fields/getFields.test.ts +0 -232
  106. package/tests/vitest/qb/fields/getFieldsUsage.test.ts +0 -77
  107. package/tests/vitest/qb/fields/updateField.test.ts +0 -93
  108. package/tests/vitest/qb/formulas/runFormula.test.ts +0 -96
  109. package/tests/vitest/qb/index.ts +0 -29
  110. package/tests/vitest/qb/records/deleteRecords.test.ts +0 -110
  111. package/tests/vitest/qb/records/runQuery.test.ts +0 -146
  112. package/tests/vitest/qb/records/upsert.test.ts +0 -102
  113. package/tests/vitest/qb/tables/createRelationship.test.ts +0 -102
  114. package/tests/vitest/qb/tables/createTable.test.ts +0 -55
  115. package/tests/vitest/qb/tables/deleteRelationship.test.ts +0 -143
  116. package/tests/vitest/qb/tables/deleteTable.test.ts +0 -50
  117. package/tests/vitest/qb/tables/getAppTables.test.ts +0 -46
  118. package/tests/vitest/qb/tables/getRelationships.test.ts +0 -80
  119. package/tests/vitest/qb/tables/getTable.test.ts +0 -26
  120. package/tests/vitest/qb/tables/updateRelationship.test.ts +0 -250
  121. package/tests/vitest/qb/tables/updateTable.test.ts +0 -48
  122. package/tests/vitest/unit/ThrottleBucket.test.ts +0 -101
  123. package/tests/vitest/unit/apps/copyApp.test.ts +0 -581
  124. package/tests/vitest/unit/apps/createApp.test.ts +0 -186
  125. package/tests/vitest/unit/apps/deleteApp.test.ts +0 -216
  126. package/tests/vitest/unit/apps/getApp.test.ts +0 -128
  127. package/tests/vitest/unit/apps/getAppConcurrency.test.ts +0 -151
  128. package/tests/vitest/unit/apps/getAppEvents.test.ts +0 -193
  129. package/tests/vitest/unit/apps/updateApp.test.ts +0 -412
  130. package/tests/vitest/unit/auth/fetchTempToken401.test.ts +0 -81
  131. package/tests/vitest/unit/auth/getTempToken.test.ts +0 -119
  132. package/tests/vitest/unit/auth/retryTempToken401.test.ts +0 -95
  133. package/tests/vitest/unit/auth/retryTempTokenMaxRetries.test.ts +0 -206
  134. package/tests/vitest/unit/auth/retryUserToken401.test.ts +0 -69
  135. package/tests/vitest/unit/auth/ssoTokenRefresh.test.ts +0 -325
  136. package/tests/vitest/unit/auth/userTokenConcurrency.test.ts +0 -62
  137. package/tests/vitest/unit/fields/createField.test.ts +0 -451
  138. package/tests/vitest/unit/fields/deleteFields.test.ts +0 -141
  139. package/tests/vitest/unit/fields/getField.test.ts +0 -189
  140. package/tests/vitest/unit/fields/getFieldUsage.test.ts +0 -180
  141. package/tests/vitest/unit/fields/getFields.test.ts +0 -122
  142. package/tests/vitest/unit/fields/getFieldsUsage.test.ts +0 -160
  143. package/tests/vitest/unit/fields/updateField.test.ts +0 -285
  144. package/tests/vitest/unit/formulas/runFormula.test.ts +0 -205
  145. package/tests/vitest/unit/index.ts +0 -34
  146. package/tests/vitest/unit/quickbaseClientHttpMethods.test.ts +0 -139
  147. package/tests/vitest/unit/rateLimit.test.ts +0 -191
  148. package/tests/vitest/unit/records/deleteRecords.test.ts +0 -112
  149. package/tests/vitest/unit/records/runQuery.test.ts +0 -102
  150. package/tests/vitest/unit/records/upsert.test.ts +0 -234
  151. package/tests/vitest/unit/tables/createRelationship.test.ts +0 -212
  152. package/tests/vitest/unit/tables/createTable.test.ts +0 -70
  153. package/tests/vitest/unit/tables/deleteRelationship.test.ts +0 -97
  154. package/tests/vitest/unit/tables/deleteTable.test.ts +0 -77
  155. package/tests/vitest/unit/tables/getAppTables.test.ts +0 -85
  156. package/tests/vitest/unit/tables/getRelationships.test.ts +0 -259
  157. package/tests/vitest/unit/tables/getTable.test.ts +0 -233
  158. package/tests/vitest/unit/tables/updateRelationship.test.ts +0 -307
  159. package/tests/vitest/unit/tables/updateTable.test.ts +0 -80
  160. package/tests/vitest/unit/tokenLifespan.test.ts +0 -204
  161. package/tests/vitest/unit/umd.test.ts +0 -8
  162. package/tools/log-gen.ts +0 -251
  163. package/tools/log-gen.yaml +0 -4829
  164. package/tools/openapi-jars/openapi-generator-cli-7.12.0.jar +0 -0
  165. package/tsconfig.build.json +0 -17
  166. package/tsconfig.json +0 -32
  167. package/versionrc.json +0 -9
  168. package/vitest.config.ts +0 -27
@@ -1,77 +0,0 @@
1
- // tests/vitest/qb/fields/getFieldsUsage.test.ts
2
- import { describe, it, expect } from "vitest";
3
- import { createClient, QB_TABLE_ID_1 } from "../../../setup.ts";
4
- import { FieldUsage } from "@/generated/models";
5
-
6
- describe("QuickbaseClient Integration - getFieldsUsage", () => {
7
- const client = createClient();
8
-
9
- it("retrieves field usage statistics for a valid table", async () => {
10
- console.log("Starting retrieval of full field usage list");
11
- const response = await client.getFieldsUsage({
12
- tableId: QB_TABLE_ID_1,
13
- });
14
-
15
- expect(response).toBeInstanceOf(Array);
16
- expect(response.length).toBeGreaterThan(0); // Assumes the table has fields
17
- response.forEach((usage: FieldUsage) => {
18
- expect(usage.field).toHaveProperty("id");
19
- expect(usage.field).toHaveProperty("name");
20
- expect(usage.field).toHaveProperty("type");
21
- expect(usage.usage).toHaveProperty("actions");
22
- expect(usage.usage.actions).toHaveProperty("count");
23
- expect(typeof usage.usage.actions.count).toBe("number");
24
- expect(usage.usage).toHaveProperty("dashboards");
25
- expect(usage.usage).toHaveProperty("forms");
26
- expect(usage.usage).toHaveProperty("reports");
27
- });
28
- console.log(
29
- `Retrieved ${response.length} field usage entries for table ${QB_TABLE_ID_1}`
30
- );
31
- }, 30000); // 15-second timeout
32
-
33
- it("retrieves field usage with skip and top parameters", async () => {
34
- console.log(
35
- "Starting retrieval of full field usage list for skip/top test"
36
- );
37
- const fullResponse = await client.getFieldsUsage({
38
- tableId: QB_TABLE_ID_1,
39
- });
40
- console.log(`Full list retrieved: ${fullResponse.length} fields`);
41
-
42
- const totalFields = fullResponse.length;
43
- if (totalFields <= 1) {
44
- console.log("Skipping skip/top test: table has too few fields");
45
- return; // Skip if not enough fields to test pagination
46
- }
47
-
48
- console.log("Starting retrieval with skip=1 and top=1");
49
- const response = await client.getFieldsUsage({
50
- tableId: QB_TABLE_ID_1,
51
- skip: 1,
52
- top: 1,
53
- });
54
-
55
- expect(response).toBeInstanceOf(Array);
56
- expect(response.length).toBe(1); // Should return exactly 1 field
57
- expect(response[0].field.id).not.toBe(fullResponse[0].field.id); // Should skip the first field
58
- console.log(
59
- `Retrieved ${response.length} field usage entries with skip=1 and top=1`
60
- );
61
- }, 15000); // 15-second timeout
62
-
63
- it("fails with invalid table ID", async () => {
64
- const invalidTableId = "invalid_dbid";
65
- console.log(`Starting retrieval with invalid table ID ${invalidTableId}`);
66
- await expect(
67
- client.getFieldsUsage({
68
- tableId: invalidTableId,
69
- })
70
- ).rejects.toMatchObject({
71
- message: expect.stringContaining(
72
- "API Error: Access denied (Status: 401)"
73
- ),
74
- });
75
- console.log(`Confirmed 401 for invalid table ID ${invalidTableId}`);
76
- }, 30000); // 15-second timeout
77
- });
@@ -1,93 +0,0 @@
1
- // tests/vitest/qb/fields/updateField.test.ts
2
- import { describe, it, expect, beforeAll, afterAll } from "vitest";
3
- import { createClient, QB_TABLE_ID_1 } from "../../../setup.ts";
4
-
5
- describe("QuickbaseClient Integration - updateField", () => {
6
- const client = createClient();
7
- let fieldIdToUpdate: number;
8
-
9
- // Setup: Create a test field to update
10
- beforeAll(async () => {
11
- try {
12
- const response = await client.createField({
13
- tableId: QB_TABLE_ID_1,
14
- body: {
15
- label: "UpdateTestField",
16
- fieldType: "text",
17
- fieldHelp: "Test field for updating",
18
- },
19
- });
20
- fieldIdToUpdate = response.id;
21
- console.log(`Created field UpdateTestField with ID ${fieldIdToUpdate}`);
22
- } catch (error) {
23
- console.error("beforeAll failed:", error);
24
- throw error; // Fail the suite if setup fails
25
- }
26
- });
27
-
28
- // Teardown: Delete the test field
29
- afterAll(async () => {
30
- try {
31
- if (fieldIdToUpdate) {
32
- const response = await client.deleteFields({
33
- tableId: QB_TABLE_ID_1,
34
- body: { fieldIds: [fieldIdToUpdate] },
35
- });
36
- console.log(
37
- `Deleted field ${fieldIdToUpdate}:`,
38
- JSON.stringify(response, null, 2)
39
- );
40
- }
41
- } catch (error) {
42
- console.error("afterAll cleanup failed:", error);
43
- // Don’t throw here to avoid masking test results
44
- }
45
- });
46
-
47
- it(
48
- "updates a field successfully with user token",
49
- { timeout: 10000 },
50
- async () => {
51
- try {
52
- const updatedLabel = "UpdatedTestField";
53
- console.log("Sending updateField request at:", new Date());
54
- const response = await client.updateField({
55
- tableId: QB_TABLE_ID_1,
56
- fieldId: fieldIdToUpdate,
57
- body: {
58
- label: updatedLabel,
59
- fieldHelp: "Updated help text",
60
- },
61
- });
62
- console.log("updateField response received at:", new Date());
63
- console.log("Response:", JSON.stringify(response, null, 2));
64
-
65
- // Verify the update was successful
66
- expect(response).toBeDefined();
67
- expect(response.id).toBe(fieldIdToUpdate);
68
- expect(response.label).toBe(updatedLabel);
69
- expect(response.fieldHelp).toBe("Updated help text");
70
- } catch (error) {
71
- console.error("updateField failed:", error);
72
- throw error; // Re-throw to fail the test with details
73
- }
74
- }
75
- );
76
-
77
- it("fails with invalid field ID", { timeout: 10000 }, async () => {
78
- try {
79
- await expect(
80
- client.updateField({
81
- tableId: QB_TABLE_ID_1,
82
- fieldId: 999999, // Invalid field ID
83
- body: {
84
- label: "InvalidUpdate",
85
- },
86
- })
87
- ).rejects.toThrow("API Error: Item not found (Status: 404)"); // Updated to match actual error
88
- } catch (error) {
89
- console.error("updateField with invalid ID failed unexpectedly:", error);
90
- throw error;
91
- }
92
- });
93
- });
@@ -1,96 +0,0 @@
1
- // tests/vitest/qb/formulas/runFormula.test.ts
2
-
3
- import { describe, it, expect, beforeAll, afterAll } from "vitest";
4
- import {
5
- createClient,
6
- QB_REALM,
7
- QB_USER_TOKEN,
8
- QB_TABLE_ID_1,
9
- } from "@tests/setup.ts";
10
- import {
11
- RunFormulaRequest,
12
- RunFormula200Response,
13
- Upsert200Response,
14
- } from "@/generated/models";
15
-
16
- describe("QuickbaseClient Integration - runFormula", () => {
17
- let client: ReturnType<typeof createClient>;
18
- let testRecordId: number;
19
-
20
- beforeAll(async () => {
21
- // Validate environment variables
22
- if (!QB_REALM) throw new Error("QB_REALM is not defined in .env");
23
- if (!QB_USER_TOKEN) throw new Error("QB_USER_TOKEN is not defined in .env");
24
- if (!QB_TABLE_ID_1) throw new Error("QB_TABLE_ID_1 is not defined in .env");
25
-
26
- // Initialize client with user token only
27
- client = createClient(undefined, {
28
- realm: QB_REALM,
29
- userToken: QB_USER_TOKEN,
30
- debug: true,
31
- });
32
-
33
- // Upsert a test record to ensure we have a valid rid
34
- const upsertResponse: Upsert200Response = await client.upsert({
35
- body: {
36
- to: QB_TABLE_ID_1,
37
- data: [
38
- {
39
- "6": { value: `Test Record ${Date.now()}` }, // Assuming field 6 is a text field (e.g., "Task Name")
40
- },
41
- ],
42
- fieldsToReturn: [3], // Return Record ID# (field ID 3)
43
- },
44
- });
45
-
46
- // Extract the created record ID
47
- testRecordId = upsertResponse.data[0]["3"].value as number;
48
- console.log(`Upserted test record with ID: ${testRecordId}`);
49
- });
50
-
51
- afterAll(async () => {
52
- // Clean up the test record
53
- if (testRecordId) {
54
- await client.deleteRecords({
55
- body: {
56
- from: QB_TABLE_ID_1,
57
- where: `{3.EX.${testRecordId}}`, // Delete by Record ID#
58
- },
59
- });
60
- console.log(`Cleaned up test record with ID: ${testRecordId}`);
61
- }
62
- });
63
-
64
- it("runs simple formula without rid and returns correct result", async () => {
65
- const request: RunFormulaRequest = {
66
- from: QB_TABLE_ID_1,
67
- formula: "1 + 1", // Simple arithmetic to verify functionality
68
- };
69
-
70
- const response: RunFormula200Response = await client.runFormula({
71
- body: request,
72
- });
73
-
74
- console.log("Real API response (no rid):", response);
75
-
76
- expect(response).toHaveProperty("result");
77
- expect(response.result).toBe("2"); // Expect "2" as a string
78
- }, 10000);
79
-
80
- it("runs formula with rid and field ID 3, returns correct numeric result", async () => {
81
- const request: RunFormulaRequest = {
82
- from: QB_TABLE_ID_1,
83
- formula: "Sum([Record ID#], 20)", // Field ID 3 is "Record ID#"
84
- rid: testRecordId, // Use the upserted record ID
85
- };
86
-
87
- const response: RunFormula200Response = await client.runFormula({
88
- body: request,
89
- });
90
-
91
- console.log("Real API response (with rid):", response);
92
-
93
- expect(response).toHaveProperty("result");
94
- expect(response.result).toBe(String(testRecordId + 20)); // Dynamic result based on the record ID
95
- }, 10000);
96
- });
@@ -1,29 +0,0 @@
1
- // tests/vitest/qb/index.ts
2
-
3
- // Apps
4
- export * from "./apps/copyApp.test.ts";
5
- export * from "./apps/createApp.test.ts";
6
- export * from "./apps/deleteApp.test.ts";
7
- export * from "./apps/getApp.test.ts";
8
-
9
- // Fields
10
- export * from "./fields/createField.test.ts";
11
- export * from "./fields/deleteFields.test.ts";
12
- export * from "./fields/getFields.test.ts";
13
- export * from "./fields/getField.test.ts"; // Added new getField test
14
- export * from "./fields/getFieldsUsage.test.ts";
15
- export * from "./fields/getFieldUsage.test.ts";
16
-
17
- // Records
18
- export * from "./records/deleteRecords.test.ts";
19
- export * from "./records/runQuery.test.ts";
20
- export * from "./records/upsert.test.ts";
21
-
22
- // Tables
23
- export * from "./tables/createTable.test.ts";
24
- export * from "./tables/deleteTable.test.ts";
25
- export * from "./tables/getAppTables.test.ts";
26
- export * from "./tables/getRelationships.test.ts";
27
- export * from "./tables/getTable.test.ts";
28
- export * from "./tables/updateTable.test.ts";
29
- export * from "./tables/updateRelationship.test.ts";
@@ -1,110 +0,0 @@
1
- // tests/vitest/qb/records/deleteRecords.test.ts
2
- import { describe, test, expect, beforeEach, afterEach } from "vitest";
3
- import { quickbase } from "@/quickbaseClient.ts";
4
- import {
5
- Upsert200Response,
6
- Upsert207Response,
7
- } from "/home/drew/Projects/quickbase-js/src/generated/models";
8
-
9
- const TABLE_ID = "buwai2zws";
10
- const UNIQUE_FIELD_ID = 3; // Record ID field
11
- const MARKER_FIELD_ID = 6; // Text field for marking test records
12
-
13
- describe("QuickbaseClient - DeleteRecords Integration", () => {
14
- const qb = quickbase({
15
- realm: "builderprogram-dbradford6815",
16
- userToken: process.env.QB_USER_TOKEN,
17
- debug: true,
18
- });
19
-
20
- beforeEach(async () => {
21
- try {
22
- await qb.deleteRecords({
23
- body: {
24
- from: TABLE_ID,
25
- where: `{${MARKER_FIELD_ID}.CT.'test-marker-delete'}`,
26
- },
27
- });
28
- } catch (e) {
29
- // Ignore if no records exist
30
- }
31
- });
32
-
33
- afterEach(async () => {
34
- try {
35
- await qb.deleteRecords({
36
- body: {
37
- from: TABLE_ID,
38
- where: `{${MARKER_FIELD_ID}.CT.'test-marker-delete'}`,
39
- },
40
- });
41
- } catch (e) {}
42
- });
43
-
44
- test(
45
- "deletes a newly upserted record",
46
- async () => {
47
- const upsertResponse: Upsert200Response | Upsert207Response =
48
- await qb.upsert({
49
- body: {
50
- to: TABLE_ID,
51
- data: [{ [MARKER_FIELD_ID]: { value: "test-marker-delete" } }],
52
- fieldsToReturn: [UNIQUE_FIELD_ID], // Return record ID
53
- },
54
- });
55
-
56
- // Check metadata and createdRecordIds
57
- expect(
58
- upsertResponse.metadata,
59
- "Expected metadata to be defined"
60
- ).toBeDefined();
61
- expect(
62
- upsertResponse.metadata?.createdRecordIds,
63
- "Expected createdRecordIds to be defined"
64
- ).toBeDefined();
65
-
66
- const createdRecordIds = upsertResponse.metadata?.createdRecordIds;
67
- if (!createdRecordIds || createdRecordIds.length === 0) {
68
- throw new Error("Expected at least one created record ID");
69
- }
70
-
71
- const recordId = createdRecordIds[0];
72
- expect(recordId, "Expected recordId to be defined").toBeDefined();
73
-
74
- // Check data
75
- expect(upsertResponse.data, "Expected data to be defined").toBeDefined();
76
- if (!upsertResponse.data || upsertResponse.data.length === 0) {
77
- throw new Error("Expected at least one data entry");
78
- }
79
-
80
- const recordData = upsertResponse.data[0];
81
- expect(
82
- recordData[UNIQUE_FIELD_ID]?.value,
83
- "Expected record ID in data to match created record ID"
84
- ).toBe(recordId);
85
-
86
- const deleteResponse = await qb.deleteRecords({
87
- body: { from: TABLE_ID, where: `{${UNIQUE_FIELD_ID}.EX.${recordId}}` },
88
- });
89
-
90
- expect(deleteResponse).toEqual({ numberDeleted: 1 });
91
-
92
- const checkResponse = await qb.deleteRecords({
93
- body: { from: TABLE_ID, where: `{${UNIQUE_FIELD_ID}.EX.${recordId}}` },
94
- });
95
- expect(checkResponse.numberDeleted).toBe(0);
96
- },
97
- { timeout: 10000 }
98
- );
99
-
100
- test(
101
- "handles empty result when no records match",
102
- async () => {
103
- const response = await qb.deleteRecords({
104
- body: { from: TABLE_ID, where: "{3.EX.'999999'}" },
105
- });
106
- expect(response).toEqual({ numberDeleted: 0 });
107
- },
108
- { timeout: 10000 }
109
- );
110
- });
@@ -1,146 +0,0 @@
1
- // tests/vitest/qb/records/runQuery.test.ts
2
- import { describe, it, expect } from "vitest";
3
- import { createClient, QB_TABLE_ID_1 } from "../../../setup.ts";
4
- import {
5
- RunQueryRequest,
6
- RunQueryResponse,
7
- Upsert200Response,
8
- Upsert207Response,
9
- } from "@/generated/models";
10
-
11
- // Define a type for field data with a value property (matches generated Record type)
12
- interface FieldData {
13
- value: any; // Adjust type based on your needs (e.g., string | number)
14
- }
15
-
16
- describe("QuickbaseClient Integration - runQuery", () => {
17
- let createdRecordId: number;
18
-
19
- it(
20
- "queries real records from QuickBase",
21
- async () => {
22
- const client = createClient();
23
-
24
- // Upsert a test record to query later
25
- const upsertResponse: Upsert200Response | Upsert207Response =
26
- await client.upsert({
27
- body: {
28
- to: QB_TABLE_ID_1,
29
- data: [
30
- {
31
- "6": { value: "Test Task " + Date.now() }, // Assuming field 6 is a text field
32
- },
33
- ],
34
- fieldsToReturn: [3, 6], // Record ID# and the text field
35
- },
36
- });
37
-
38
- // Check metadata and createdRecordIds with null safety
39
- expect(
40
- upsertResponse.metadata,
41
- "Expected metadata to be defined"
42
- ).toBeDefined();
43
- expect(
44
- upsertResponse.metadata?.createdRecordIds,
45
- "Expected createdRecordIds to be defined"
46
- ).toBeDefined();
47
-
48
- const createdRecordIds = upsertResponse.metadata?.createdRecordIds;
49
- if (!createdRecordIds || createdRecordIds.length === 0) {
50
- throw new Error("Expected at least one created record ID from upsert");
51
- }
52
-
53
- createdRecordId = createdRecordIds[0];
54
- expect(
55
- createdRecordId,
56
- "Expected createdRecordId to be defined"
57
- ).toBeDefined();
58
- console.log("Created test record with ID:", createdRecordId);
59
-
60
- // Query the record
61
- const queryRequest: RunQueryRequest = {
62
- from: QB_TABLE_ID_1,
63
- select: [3, 6], // Query Record ID# and the text field
64
- where: `{3.EX.${createdRecordId}}`, // Filter by the created record
65
- sortBy: [{ fieldId: 6, order: "ASC" }],
66
- options: { skip: 0, top: 1 },
67
- };
68
-
69
- console.log("Config used:", {
70
- realm: process.env.QB_REALM,
71
- userToken: process.env.QB_USER_TOKEN,
72
- tableId: QB_TABLE_ID_1,
73
- });
74
- console.log("Query request:", queryRequest);
75
- const response: RunQueryResponse = await client.runQuery({
76
- body: queryRequest,
77
- });
78
- console.log("Real API response:", response);
79
-
80
- // Assertions with safety checks and type assertion
81
- expect(
82
- response.data,
83
- "Expected response.data to be defined"
84
- ).toBeDefined();
85
- if (!response.data || response.data.length === 0) {
86
- throw new Error(
87
- "Expected response.data to contain at least one record"
88
- );
89
- }
90
-
91
- expect(response.data).toHaveLength(1);
92
- const record = response.data[0] as { [key: string]: FieldData };
93
- expect(
94
- record["3"]?.value,
95
- "Expected field 3 to match createdRecordId"
96
- ).toBe(createdRecordId);
97
- expect(
98
- record["6"]?.value,
99
- "Expected field 6 to contain 'Test Task'"
100
- ).toContain("Test Task");
101
-
102
- expect(
103
- response.fields,
104
- "Expected response.fields to be defined"
105
- ).toBeDefined();
106
- if (!response.fields) {
107
- throw new Error("Expected response.fields to contain field metadata");
108
- }
109
- expect(response.fields).toContainEqual({
110
- id: 3,
111
- label: expect.any(String),
112
- type: expect.any(String),
113
- });
114
- expect(response.fields).toContainEqual({
115
- id: 6,
116
- label: expect.any(String),
117
- type: expect.any(String),
118
- });
119
-
120
- expect(
121
- response.metadata,
122
- "Expected response.metadata to be defined"
123
- ).toBeDefined();
124
- if (!response.metadata) {
125
- throw new Error("Expected response.metadata to be present");
126
- }
127
- expect(response.metadata).toMatchObject({
128
- numFields: 2,
129
- numRecords: 1,
130
- skip: 0,
131
- top: 1,
132
- totalRecords: expect.any(Number),
133
- });
134
-
135
- // Cleanup: Delete the test record
136
- await client.deleteRecords({
137
- body: {
138
- from: QB_TABLE_ID_1,
139
- where: `{3.EX.${createdRecordId}}`, // Assuming field 3 is Record ID#
140
- },
141
- });
142
- console.log("Cleaned up test record with ID:", createdRecordId);
143
- },
144
- { timeout: 10000 }
145
- );
146
- });
@@ -1,102 +0,0 @@
1
- // tests/vitest/qb/records/upsert.test.ts
2
- import { describe, test, expect, beforeEach, afterEach } from "vitest";
3
- import { quickbase } from "@/quickbaseClient.ts";
4
- import {
5
- Upsert200Response,
6
- Upsert207Response,
7
- } from "/home/drew/Projects/quickbase-js/src/generated/models";
8
-
9
- const TABLE_ID = "buwai2zws";
10
- const MARKER_FIELD_ID = 6; // Text field for marking test records
11
-
12
- describe("QuickbaseClient - Upsert Integration", () => {
13
- const qb = quickbase({
14
- realm: "builderprogram-dbradford6815",
15
- userToken: process.env.QB_USER_TOKEN,
16
- debug: true,
17
- });
18
-
19
- beforeEach(async () => {
20
- try {
21
- await qb.deleteRecords({
22
- body: {
23
- from: TABLE_ID,
24
- where: `{${MARKER_FIELD_ID}.CT.'test-marker-upsert'}`,
25
- },
26
- });
27
- } catch (e) {
28
- // Ignore if no records exist
29
- }
30
- });
31
-
32
- afterEach(async () => {
33
- try {
34
- await qb.deleteRecords({
35
- body: {
36
- from: TABLE_ID,
37
- where: `{${MARKER_FIELD_ID}.CT.'test-marker-upsert'}`,
38
- },
39
- });
40
- } catch (e) {}
41
- });
42
-
43
- test(
44
- "creates a new record successfully",
45
- async () => {
46
- const response: Upsert200Response | Upsert207Response = await qb.upsert({
47
- body: {
48
- to: TABLE_ID,
49
- data: [{ [MARKER_FIELD_ID]: { value: "test-marker-upsert" } }],
50
- fieldsToReturn: [MARKER_FIELD_ID, 3], // Return marker and record ID
51
- },
52
- });
53
-
54
- // Check metadata with null safety
55
- expect(
56
- response.metadata,
57
- "Expected metadata to be defined"
58
- ).toBeDefined();
59
- if (!response.metadata) {
60
- throw new Error("Expected metadata to be present in upsert response");
61
- }
62
-
63
- expect(
64
- response.metadata.createdRecordIds,
65
- "Expected createdRecordIds to be defined"
66
- ).toBeDefined();
67
- if (!response.metadata.createdRecordIds) {
68
- throw new Error(
69
- "Expected createdRecordIds to be present in upsert response"
70
- );
71
- }
72
- expect(response.metadata.createdRecordIds.length).toBe(1);
73
-
74
- // Check data with null safety
75
- expect(response.data, "Expected data to be defined").toBeDefined();
76
- if (!response.data || response.data.length === 0) {
77
- throw new Error("Expected at least one record in data");
78
- }
79
- expect(response.data).toHaveLength(1);
80
- expect(response.data[0][MARKER_FIELD_ID]?.value).toBe(
81
- "test-marker-upsert"
82
- );
83
- expect(response.data[0][3]?.value).toBeDefined(); // Record ID assigned by QuickBase
84
-
85
- // Check totalNumberOfRecordsProcessed
86
- expect(response.metadata.totalNumberOfRecordsProcessed).toBe(1);
87
- },
88
- { timeout: 10000 }
89
- );
90
-
91
- test(
92
- "handles empty data gracefully",
93
- async () => {
94
- await expect(
95
- qb.upsert({
96
- body: { to: TABLE_ID, data: [] },
97
- })
98
- ).rejects.toThrow("API Error: Bad Request (Status: 400)");
99
- },
100
- { timeout: 10000 }
101
- );
102
- });