From efbb5c4bc47df645760ba1a55efd26aee037050f Mon Sep 17 00:00:00 2001 From: Darun Seethammagari Date: Fri, 9 Aug 2024 18:21:18 -0700 Subject: [PATCH] Add happy case test --- .../provisioning-state.test.ts.snap | 66 +++++++++++++++++++ .../provisioning-state.test.ts | 56 +++++++++++++--- .../provisioning-state/provisioning-state.ts | 7 +- 3 files changed, 118 insertions(+), 11 deletions(-) create mode 100644 runner/src/provisioner/provisioning-state/__snapshots__/provisioning-state.test.ts.snap diff --git a/runner/src/provisioner/provisioning-state/__snapshots__/provisioning-state.test.ts.snap b/runner/src/provisioner/provisioning-state/__snapshots__/provisioning-state.test.ts.snap new file mode 100644 index 00000000..2bf3b0f8 --- /dev/null +++ b/runner/src/provisioner/provisioning-state/__snapshots__/provisioning-state.test.ts.snap @@ -0,0 +1,66 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`ProvisioiningState correctly fetch metadata for source and schema 1`] = ` +[ + { + "delete_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "insert_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "select_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "table": { + "name": "tableA", + "schema": "account_id_function_name", + }, + "update_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + }, + { + "delete_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "insert_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "select_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "table": { + "name": "tableB", + "schema": "account_id_function_name", + }, + "update_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + }, +] +`; diff --git a/runner/src/provisioner/provisioning-state/provisioning-state.test.ts b/runner/src/provisioner/provisioning-state/provisioning-state.test.ts index 156b87e6..9c9d1d9d 100644 --- a/runner/src/provisioner/provisioning-state/provisioning-state.test.ts +++ b/runner/src/provisioner/provisioning-state/provisioning-state.test.ts @@ -13,8 +13,8 @@ describe('ProvisioiningState', () => { ); it('can create state whether source exists or not', async () => { - const sourceWithoutUser = generateSourceWithTables(['some_schema'], ['tableA', 'tableB'], 'someAccount'); - const mockExportMetadata = jest.fn().mockResolvedValue(sourceWithoutUser); + const metadataWithoutUser = generateHasuraMetadata(['some_schema'], ['tableA', 'tableB'], 'someAccount'); + const mockExportMetadata = jest.fn().mockResolvedValue(metadataWithoutUser); const mockGetTableNames = jest.fn().mockResolvedValue([]); const mockHasuraClient = { exportMetadata: mockExportMetadata, @@ -26,9 +26,43 @@ describe('ProvisioiningState', () => { expect(provisioningState.doesSchemaExist()).toBe(false); expect(provisioningState.getCreatedTables()).toEqual([]); }); + + it('state works with existing source', async () => { + const metadataWithUser = generateHasuraMetadata([provisioningConfig.schemaName(), 'some_schema'], ['tableA', 'tableB'], provisioningConfig.hasuraRoleName()); + metadataWithUser.sources.push(generateSourceWithTables(['anotherSchema'], ['anotherTable'], 'anotherRole')); + const mockExportMetadata = jest.fn().mockResolvedValue(metadataWithUser); + const mockGetTableNames = jest.fn().mockResolvedValue(['tableA']); + const mockHasuraClient = { + exportMetadata: mockExportMetadata, + getTableNames: mockGetTableNames, + } as unknown as HasuraClient; + + const provisioningState = await ProvisioningState.loadProvisioningState(mockHasuraClient, provisioningConfig); + expect(provisioningState.doesSourceExist()).toBe(true); + expect(provisioningState.doesSchemaExist()).toBe(true); + expect(provisioningState.getCreatedTables()).toEqual(['tableA']); + }); + + it('correctly fetch metadata for source and schema', async () => { + const metadataWithUser = generateHasuraMetadata([provisioningConfig.schemaName(), 'some_schema'], ['tableA', 'tableB'], provisioningConfig.hasuraRoleName()); + metadataWithUser.sources.push(generateSourceWithTables(['anotherSchema'], ['anotherTable'], 'anotherRole')); + const mockExportMetadata = jest.fn().mockResolvedValue(metadataWithUser); + const mockGetTableNames = jest.fn().mockResolvedValue(['tableA']); + const mockHasuraClient = { + exportMetadata: mockExportMetadata, + getTableNames: mockGetTableNames, + } as unknown as HasuraClient; + + const provisioningState = await ProvisioningState.loadProvisioningState(mockHasuraClient, provisioningConfig); + expect(provisioningState.getSourceMetadata().name).toBe(provisioningConfig.hasuraRoleName()); + expect(provisioningState.getMetadataForTables().length).toBe(2); + expect(provisioningState.getMetadataForTables()).toMatchSnapshot(); + expect(provisioningState.getTrackedTables()).toEqual(['tableA', 'tableB']); + expect(provisioningState.getTablesWithPermissions()).toEqual(['tableA', 'tableB']); + }); }); -function generateSourceWithTables (schemaNames: string[], tableNames: string[], role: string): HasuraMetadata { +function generateHasuraMetadata (schemaNames: string[], tableNames: string[], role: string): HasuraMetadata { const sources: HasuraSource[] = []; // Insert default source which has different format than the rest sources.push({ @@ -42,6 +76,15 @@ function generateSourceWithTables (schemaNames: string[], tableNames: string[], } }); + sources.push(generateSourceWithTables(schemaNames, tableNames, role)); + + return { + version: 3, + sources + }; +} + +function generateSourceWithTables (schemaNames: string[], tableNames: string[], role: string): HasuraSource { const tables: HasuraTableMetadata[] = []; schemaNames.forEach((schemaName) => { tableNames.forEach((tableName) => { @@ -49,16 +92,11 @@ function generateSourceWithTables (schemaNames: string[], tableNames: string[], }); }); - sources.push({ + return { name: role, kind: 'postgres', tables, configuration: generateHasuraConfiguration(role, 'password'), - }); - - return { - version: 3, - sources }; } diff --git a/runner/src/provisioner/provisioning-state/provisioning-state.ts b/runner/src/provisioner/provisioning-state/provisioning-state.ts index cd34d573..cd79ab14 100644 --- a/runner/src/provisioner/provisioning-state/provisioning-state.ts +++ b/runner/src/provisioner/provisioning-state/provisioning-state.ts @@ -49,12 +49,15 @@ export default class ProvisioningState { private tableContainsAllPermissions (tableMetadata: HasuraTableMetadata): boolean { const allPermissions: string[] = HASURA_PERMISSION_TYPES.map(permission => `${permission}_permissions`); - return allPermissions.every(permission => Object.keys(tableMetadata).includes(`${permission}_permissions`)); + const metadataKeys = Object.keys(tableMetadata); + return allPermissions.every(permission => metadataKeys.includes(permission)); } // Does not check for partial permissions getTablesWithPermissions (): string[] { const tableMetadataList = this.getMetadataForTables(); - return tableMetadataList.filter(metadata => this.tableContainsAllPermissions(metadata)).map(metadata => metadata.table.name); + return tableMetadataList + .filter(metadata => this.tableContainsAllPermissions(metadata)) + .map(metadata => metadata.table.name); } }