From 5574f1de050142fb2c3d51b72b15124cdf699ff9 Mon Sep 17 00:00:00 2001 From: sumukhswamy Date: Tue, 19 Dec 2023 15:02:55 -0800 Subject: [PATCH] added new jest tests for sidebar and for data selector Signed-off-by: sumukhswamy --- .../SQLPage/__tests__/DataSelect.test.tsx | 65 + .../__snapshots__/DataSelect.test.tsx.snap | 140 ++ .../__snapshots__/table_view.test.tsx.snap | 1846 ++++++++++++++++- .../SQLPage/__tests__/table_view.test.tsx | 279 ++- test/mocks/mockData.ts | 225 +- 5 files changed, 2459 insertions(+), 96 deletions(-) create mode 100644 public/components/SQLPage/__tests__/DataSelect.test.tsx create mode 100644 public/components/SQLPage/__tests__/__snapshots__/DataSelect.test.tsx.snap diff --git a/public/components/SQLPage/__tests__/DataSelect.test.tsx b/public/components/SQLPage/__tests__/DataSelect.test.tsx new file mode 100644 index 00000000..c5587d3f --- /dev/null +++ b/public/components/SQLPage/__tests__/DataSelect.test.tsx @@ -0,0 +1,65 @@ +import '@testing-library/jest-dom'; +import '@testing-library/jest-dom/extend-expect'; +import { render, screen, waitFor } from '@testing-library/react'; +import React from 'react'; +import { HttpResponse } from '../../../../../../src/core/public'; +import { httpClientMock } from '../../../../test/mocks'; +import { + mockDataSelectQuery +} from '../../../../test/mocks/mockData'; +import { DataSelect } from '../DataSelect'; + +describe('Renders the Datasource picker component', () => { + + it('fetches the datasources and selects S3glue as source', async () => { + const client = httpClientMock; + client.get = jest.fn(() => { + return (Promise.resolve(mockDataSelectQuery) as unknown) as HttpResponse; + }); + + const mockOnSelect = jest.fn(); + const mockDataSource = jest.fn() + const asyncTest = () => { + render( + + ); + }; + + await waitFor(() => { + asyncTest() + expect(screen.getByText('glue_1')).toBeInTheDocument(); + }); + expect(document.body.children[0]).toMatchSnapshot(); + }); + it('fetches the datasources and selects Opensearch as source', async () => { + const client = httpClientMock; + client.get = jest.fn(() => { + return (Promise.resolve(mockDataSelectQuery) as unknown) as HttpResponse; + }); + + const mockOnSelect = jest.fn(); + const mockDataSource = jest.fn() + const asyncTest = () => { + render( + + ); + }; + + await waitFor(() => { + asyncTest() + expect(screen.getByText('OpenSearch')).toBeInTheDocument(); + }); + expect(document.body.children[0]).toMatchSnapshot(); + }); + +}); \ No newline at end of file diff --git a/public/components/SQLPage/__tests__/__snapshots__/DataSelect.test.tsx.snap b/public/components/SQLPage/__tests__/__snapshots__/DataSelect.test.tsx.snap new file mode 100644 index 00000000..ca2aad44 --- /dev/null +++ b/public/components/SQLPage/__tests__/__snapshots__/DataSelect.test.tsx.snap @@ -0,0 +1,140 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Renders the Datasource picker component fetches the datasources and selects Opensearch as source 1`] = ` +
+ +`; + +exports[`Renders the Datasource picker component fetches the datasources and selects S3glue as source 1`] = ` +
+ +`; diff --git a/public/components/SQLPage/__tests__/__snapshots__/table_view.test.tsx.snap b/public/components/SQLPage/__tests__/__snapshots__/table_view.test.tsx.snap index b16a4bf3..70c8ad27 100644 --- a/public/components/SQLPage/__tests__/__snapshots__/table_view.test.tsx.snap +++ b/public/components/SQLPage/__tests__/__snapshots__/table_view.test.tsx.snap @@ -1,67 +1,754 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`Render databases in tree fetches and displays database nodes when datasource is s3 1`] = ` +exports[`Render databases in tree fetches Materialized view in the Side tree 1`] = `
-
- -
-
- Loading data +

+ You can quickly navigate this list using arrow keys. +

+
    +
  • + +
    +
    +
      +
    • + +
      +
    • +
    • + +
      +
    • +
    +
    +
    +
  • +
+
+
+`; + +exports[`Render databases in tree fetches No materilaized views badge in side tree 1`] = ` +
+
-
-
+
    +
  • +
    -
    - Loading may take over 30 seconds -
    +
  • + +
    +
  • +
  • + +
    +
  • +
-
-
+ +
+
+
+`; + +exports[`Render databases in tree fetches and displays No indicies in the side tree 1`] = ` +
+
+
+

+ You can quickly navigate this list using arrow keys. +

+
    +
  • +
    -
    - Status: - Query Not Run -
    +
  • + +
    +
  • +
  • + +
    +
    +
      +
    • + +
      +
    • +
    +
    +
    +
  • +
  • + +
    +
  • +
-
-
+ +
@@ -102,14 +789,18 @@ exports[`Render databases in tree fetches and displays indicies when datasource > + > + + + > + + + > + + + > + + + > + + + > + + + > + + + > + + + > + + + > + + + > + + + > + + + > + + + > + + + > + + + > + + + > + + + > + + + > + + + > + + + > + + `; + +exports[`Render databases in tree fetches and displays skipping index in the side tree 1`] = ` +
+
+
+

+ You can quickly navigate this list using arrow keys. +

+
    +
  • + +
    +
    +
      +
    • + +
      +
    • +
    • + +
      +
      +
        +
      • + +
        +
      • +
      • + +
        +
      • +
      • + +
        +
      • +
      +
      +
      +
    • +
    • + +
      +
    • +
    +
    +
    +
  • +
+
+
+
+`; + +exports[`Render databases in tree fetches and displays tables in the side tree 1`] = ` +
+
+
+

+ You can quickly navigate this list using arrow keys. +

+
    +
  • + +
    +
    +
      +
    • + +
      +
    • +
    • + +
      +
    • +
    • + +
      +
    • +
    +
    +
    +
  • +
+
+
+
+`; + +exports[`Render databases in tree fetches default databse in the side tree 1`] = ` +
+
+
+

+ You can quickly navigate this list using arrow keys. +

+
    +
  • + +
    +
  • +
+
+
+
+`; + +exports[`Render databases in tree fetches the tree when datasource is S3 1`] = ` +
+
+
+

+ You can quickly navigate this list using arrow keys. +

+
    +
  • + +
    +
  • +
+
+
+
+`; diff --git a/public/components/SQLPage/__tests__/table_view.test.tsx b/public/components/SQLPage/__tests__/table_view.test.tsx index e794a8f5..ec8a1ae3 100644 --- a/public/components/SQLPage/__tests__/table_view.test.tsx +++ b/public/components/SQLPage/__tests__/table_view.test.tsx @@ -5,57 +5,310 @@ import '@testing-library/jest-dom'; import '@testing-library/jest-dom/extend-expect'; -import { render } from '@testing-library/react'; +import { act, fireEvent, render, screen, waitFor, waitForElementToBeRemoved } from '@testing-library/react'; import React from 'react'; import { HttpResponse } from '../../../../../../src/core/public'; import { httpClientMock } from '../../../../test/mocks'; import { + mockCoveringIndexQuery, mockDatabaseQuery, + mockEmptyCoveringIndexQuery, + mockEmptySkippingIndexQuery, mockJobId, + mockMVEmptyQuery, + mockMVquery, mockOpenSearchIndicies, + mockSkippingIndexQuery, + mockTableQuery } from '../../../../test/mocks/mockData'; import { TableView } from '../table_view'; describe('Render databases in tree', () => { - it('fetches and displays indicies when datasource is OpenSearch', async () => { + + it('fetches the tree when datasource is S3', async () => { const client = httpClientMock; client.post = jest.fn(() => { - return (Promise.resolve(mockOpenSearchIndicies) as unknown) as HttpResponse; + return (Promise.resolve(mockJobId) as unknown) as HttpResponse; + }); + client.get = jest.fn(() => { + return (Promise.resolve(mockDatabaseQuery) as unknown) as HttpResponse; }); - const asyncTest = () => { render( {}} refreshTree={false} /> ); }; - await asyncTest(); + + await waitFor(() => { + asyncTest() + expect(screen.getByLabelText('Sample Folder Tree')).toBeInTheDocument(); + }); expect(document.body.children[0]).toMatchSnapshot(); }); - it('fetches and displays database nodes when datasource is s3', async () => { + it('fetches and displays indicies when datasource is OpenSearch', async () => { const client = httpClientMock; client.post = jest.fn(() => { - return (Promise.resolve(mockJobId) as unknown) as HttpResponse; - }); - client.get = jest.fn(() => { - return (Promise.resolve(mockDatabaseQuery) as unknown) as HttpResponse; + return (Promise.resolve(mockOpenSearchIndicies) as unknown) as HttpResponse; }); const asyncTest = () => { render( {}} refreshTree={false} /> ); }; await asyncTest(); + expect(screen.getByLabelText('Sample Folder Tree')).toBeInTheDocument(); + expect(document.body.children[0]).toMatchSnapshot(); + }); + it('fetches default databse in the side tree', async () => { + const client = httpClientMock; + client.post = jest.fn(() => { + return (Promise.resolve(mockJobId) as unknown) as HttpResponse; + }); + client.get = jest.fn(() => { + return (Promise.resolve(mockDatabaseQuery) as unknown) as HttpResponse; + }); + const default_database = jest.fn(); + const {getByText } = render( + {}} + refreshTree={false} + /> + ); + await waitForElementToBeRemoved(await getByText('Loading may take over 30 seconds')) + await waitFor(() => { + expect(getByText('default')).toBeInTheDocument(); + }) + expect(document.body.children[0]).toMatchSnapshot(); + }); + it('fetches Materialized view in the Side tree', async () => { + const client = httpClientMock; + client.post = jest.fn(() => { + return (Promise.resolve(mockJobId) as unknown) as HttpResponse; + }); + client.get = jest.fn(() => { + return (Promise.resolve(mockDatabaseQuery) as unknown) as HttpResponse; + }); + const default_database = jest.fn(); + const {getByText } = render( + {}} + refreshTree={false} + /> + ); + await waitForElementToBeRemoved(await getByText('Loading may take over 30 seconds')) + await waitFor(() => { + fireEvent.click(getByText('default')); + }) + act(() => { + fireEvent.click(getByText('Load Materialized View')) + }); + + await waitFor(() => { + + client.post = jest.fn(() => { + return (Promise.resolve(mockJobId) as unknown) as HttpResponse; + }); + client.get = jest.fn(() => { + return (Promise.resolve(mockMVquery) as unknown) as HttpResponse; + }); + + expect(getByText('http_count_view')).toBeInTheDocument(); + }); + expect(document.body.children[0]).toMatchSnapshot(); + + }); + it('fetches No materilaized views badge in side tree', async () => { + const client = httpClientMock; + client.post = jest.fn(() => { + return (Promise.resolve(mockJobId) as unknown) as HttpResponse; + }); + client.get = jest.fn(() => { + return (Promise.resolve(mockDatabaseQuery) as unknown) as HttpResponse; + }); + const default_database = jest.fn(); + const {getByText } = render( + {}} + refreshTree={false} + /> + ); + await waitForElementToBeRemoved(await getByText('Loading may take over 30 seconds')) + await waitFor(() => { + fireEvent.click(getByText('default')); + + }) + act(() => { + fireEvent.click(getByText('Load Materialized View')) + }); + + await waitFor(() => { + + client.post = jest.fn(() => { + return (Promise.resolve(mockJobId) as unknown) as HttpResponse; + }); + client.get = jest.fn(() => { + return (Promise.resolve(mockMVEmptyQuery) as unknown) as HttpResponse; + }); + + expect(getByText('No Materialized View')).toBeInTheDocument(); + }); + expect(document.body.children[0]).toMatchSnapshot(); + + }); + it('fetches and displays tables in the side tree', async () => { + const client = httpClientMock; + client.post = jest.fn(() => { + return (Promise.resolve(mockJobId) as unknown) as HttpResponse; + }); + client.get = jest.fn(() => { + return (Promise.resolve(mockDatabaseQuery) as unknown) as HttpResponse; + }); + const {getByText } = render( + {}} + refreshTree={false} + /> + ); + await waitForElementToBeRemoved(await getByText('Loading may take over 30 seconds')) + fireEvent.click(getByText('default')); + + await act(() => { + client.post = jest.fn(() => { + return (Promise.resolve(mockJobId) as unknown) as HttpResponse; + }); + client.get = jest.fn(() => { + return (Promise.resolve(mockTableQuery) as unknown) as HttpResponse; + }); + + }); + await waitFor(()=>{ + expect(screen.getByText('http_logs2')).toBeInTheDocument(); + }) + expect(document.body.children[0]).toMatchSnapshot(); + + }); + it('fetches and displays skipping index in the side tree', async () => { + const client = httpClientMock; + client.post = jest.fn(() => { + return (Promise.resolve(mockJobId) as unknown) as HttpResponse; + }); + client.get = jest.fn(() => { + return (Promise.resolve(mockDatabaseQuery) as unknown) as HttpResponse; + }); + const {getByText } = render( + {}} + refreshTree={false} + /> + ); + await waitForElementToBeRemoved(await getByText('Loading may take over 30 seconds')) + fireEvent.click(getByText('default')); + + await act(() => { + client.post = jest.fn(() => { + return (Promise.resolve(mockJobId) as unknown) as HttpResponse; + }); + client.get = jest.fn(() => { + return (Promise.resolve(mockTableQuery) as unknown) as HttpResponse; + }); + + }); + await waitFor(()=>{ + expect(screen.getByText('http_logs2')).toBeInTheDocument(); + }) + fireEvent.click(getByText('http_logs2')); + act(() => { + client.post = jest.fn(() => { + return (Promise.resolve(mockJobId) as unknown) as HttpResponse; + }); + client.get = jest.fn(() => { + return (Promise.resolve(mockSkippingIndexQuery) as unknown) as HttpResponse; + }); + client.post = jest.fn(() => { + return (Promise.resolve(mockJobId) as unknown) as HttpResponse; + }); + client.get = jest.fn(() => { + return (Promise.resolve(mockCoveringIndexQuery) as unknown) as HttpResponse; + }); + }); + await waitFor(()=>{ + expect(screen.getByText('skipping_index')).toBeInTheDocument(); + expect(screen.getByText('status_clientip_and_day')).toBeInTheDocument(); + }) + expect(document.body.children[0]).toMatchSnapshot(); + + }); + it('fetches and displays No indicies in the side tree', async () => { + const client = httpClientMock; + client.post = jest.fn(() => { + return (Promise.resolve(mockJobId) as unknown) as HttpResponse; + }); + client.get = jest.fn(() => { + return (Promise.resolve(mockDatabaseQuery) as unknown) as HttpResponse; + }); + const {getByText } = render( + {}} + refreshTree={false} + /> + ); + await waitForElementToBeRemoved(await getByText('Loading may take over 30 seconds')) + fireEvent.click(getByText('default')); + + await act(() => { + client.post = jest.fn(() => { + return (Promise.resolve(mockJobId) as unknown) as HttpResponse; + }); + client.get = jest.fn(() => { + return (Promise.resolve(mockTableQuery) as unknown) as HttpResponse; + }); + + }); + await waitFor(()=>{ + expect(screen.getByText('http_logs2')).toBeInTheDocument(); + }) + fireEvent.click(getByText('http_logs2')); + act(() => { + client.post = jest.fn(() => { + return (Promise.resolve(mockJobId) as unknown) as HttpResponse; + }); + client.get = jest.fn(() => { + return (Promise.resolve(mockEmptySkippingIndexQuery) as unknown) as HttpResponse; + }); + client.post = jest.fn(() => { + return (Promise.resolve(mockJobId) as unknown) as HttpResponse; + }); + client.get = jest.fn(() => { + return (Promise.resolve(mockEmptyCoveringIndexQuery) as unknown) as HttpResponse; + }); + + }); + await waitFor(()=>{ + expect(screen.getByText('No Indicies')).toBeInTheDocument(); + }) expect(document.body.children[0]).toMatchSnapshot(); }); -}); +}); \ No newline at end of file diff --git a/test/mocks/mockData.ts b/test/mocks/mockData.ts index 7bfafa50..944c0751 100644 --- a/test/mocks/mockData.ts +++ b/test/mocks/mockData.ts @@ -2154,8 +2154,9 @@ export const mockDatasourcesQuery = { export const mockJobId = { data: { ok: true, - resp: '{ "queryId": "00fe3fjpnfnn400q" }', - }, + resp: + {"queryId": "00fe3fjpnfnn400q","sessionId": "czVtMWZoZm9xMWdsdWVfMg=="} + } }; export const mockOpenSearchIndicies = { @@ -2169,11 +2170,85 @@ export const mockOpenSearchIndicies = { export const mockDatabaseQuery = { data: { ok: true, - resp: - '{ "schema": [ { "name": "namespace", "type": "string" } ], "datarows": [ [ "default" ] ], "total": 1, "size": 1}', + "resp": { + "status": "SUCCESS", + "schema": [ + { + "name": "namespace", + "type": "string" + } + ], + "datarows": [ + [ + "default" + ] + ], + "total": 1, + "size": 1 + }, }, }; +export const mockMVquery = { + "data": { + "ok": true, + "resp": { + "status": "SUCCESS", + "schema": [ + { + "name": "materialized_view_name", + "type": "string" + } + ], + "datarows": [ + [ + "http_count_view" + ] + ], + "total": 1, + "size": 1 + } + } +} + + +export const mockTableQuery = { + "data": { + "ok": true, + "resp": { + "status": "SUCCESS", + "schema": [ + { + "name": "namespace", + "type": "string" + }, + { + "name": "tableName", + "type": "string" + }, + { + "name": "isTemporary", + "type": "boolean" + } + ], + "datarows": [ + [ + "default", + "http_logs", + false + ], + [ + "default", + "http_logs2", + false + ] + ], + "total": 2, + "size": 2 + } + } +} + export const mockOpenSearchTreeQuery = { data: { ok: true, @@ -2181,3 +2256,145 @@ export const mockOpenSearchTreeQuery = { '{"schema":[{"name":"TABLE_CAT","type":"keyword"},{"name":"TABLE_SCHEM","type":"keyword"},{"name":"TABLE_NAME","type":"keyword"},{"name":"TABLE_TYPE","type":"keyword"},{"name":"REMARKS","type":"keyword"},{"name":"TYPE_CAT","type":"keyword"},{"name":"TYPE_SCHEM","type":"keyword"},{"name":"TYPE_NAME","type":"keyword"},{"name":"SELF_REFERENCING_COL_NAME","type":"keyword"},{"name":"REF_GENERATION","type":"keyword"}],"datarows":[["opensearch-cluster",null,".kibana_1","BASE TABLE",null,null,null,null,null,null],["opensearch-cluster",null,".opendistro-job-scheduler-lock","BASE TABLE",null,null,null,null,null,null],["opensearch-cluster",null,".opendistro-reports-definitions","BASE TABLE",null,null,null,null,null,null],["opensearch-cluster",null,".opendistro-reports-instances","BASE TABLE",null,null,null,null,null,null],["opensearch-cluster",null,".opendistro_security","BASE TABLE",null,null,null,null,null,null],["opensearch-cluster",null,".opensearch-observability","BASE TABLE",null,null,null,null,null,null],["opensearch-cluster",null,".plugins-ml-config","BASE TABLE",null,null,null,null,null,null],["opensearch-cluster",null,".ql-datasources","BASE TABLE",null,null,null,null,null,null],["opensearch-cluster",null,"jaeger-service-2023-01-24","BASE TABLE",null,null,null,null,null,null],["opensearch-cluster",null,"jaeger-span-2023-01-24","BASE TABLE",null,null,null,null,null,null],["opensearch-cluster",null,"opensearch_dashboards_sample_data_ecommerce","BASE TABLE",null,null,null,null,null,null],["opensearch-cluster",null,"opensearch_dashboards_sample_data_flights","BASE TABLE",null,null,null,null,null,null],["opensearch-cluster",null,"opensearch_dashboards_sample_data_logs","BASE TABLE",null,null,null,null,null,null],["opensearch-cluster",null,"otel-v1-apm-service-map","BASE TABLE",null,null,null,null,null,null],["opensearch-cluster",null,"otel-v1-apm-span-000001","BASE TABLE",null,null,null,null,null,null],["opensearch-cluster",null,"otel-v1-apm-span-000002","BASE TABLE",null,null,null,null,null,null],["opensearch-cluster",null,"sample-ecommerce","BASE TABLE",null,null,null,null,null,null],["opensearch-cluster",null,"sample-host-health","BASE TABLE",null,null,null,null,null,null],["opensearch-cluster",null,"sample-http-responses","BASE TABLE",null,null,null,null,null,null],["opensearch-cluster",null,"security-auditlog-2023.10.16","BASE TABLE",null,null,null,null,null,null],["opensearch-cluster",null,"security-auditlog-2023.10.17","BASE TABLE",null,null,null,null,null,null],["opensearch-cluster",null,"security-auditlog-2023.10.18","BASE TABLE",null,null,null,null,null,null],["opensearch-cluster",null,"security-auditlog-2023.10.19","BASE TABLE",null,null,null,null,null,null],["opensearch-cluster",null,"security-auditlog-2023.10.20","BASE TABLE",null,null,null,null,null,null],["opensearch-cluster",null,"security-auditlog-2023.10.21","BASE TABLE",null,null,null,null,null,null],["opensearch-cluster",null,"security-auditlog-2023.10.22","BASE TABLE",null,null,null,null,null,null],["opensearch-cluster",null,"security-auditlog-2023.10.23","BASE TABLE",null,null,null,null,null,null],["opensearch-cluster",null,"security-auditlog-2023.10.24","BASE TABLE",null,null,null,null,null,null],["opensearch-cluster",null,"security-auditlog-2023.10.25","BASE TABLE",null,null,null,null,null,null],["opensearch-cluster",null,"windows","BASE TABLE",null,null,null,null,null,null],["opensearch-cluster",null,".kibana","BASE TABLE",null,null,null,null,null,null],["opensearch-cluster",null,"s3--pWlOosB5t9LzIj0oUsS","BASE TABLE",null,null,null,null,null,null]],"total":32,"size":32,"status":200}', }, }; + +export const mockCoveringIndexQuery = { + "data": { + "ok": true, + "resp": { + "status": "SUCCESS", + "schema": [ + { + "name": "index_name", + "type": "string" + } + ], + "datarows": [ + [ + "sample_index" + ], + [ + "status_clientip_and_day" + ] + ], + "total": 2, + "size": 2 + } + } +} +export const mockMVEmptyQuery = { + "data": { + "ok": true, + "resp": { + "status": "SUCCESS", + "schema": [ + { + "name": "materialized_view_name", + "type": "string" + } + ], + "datarows": [], + "total": 0, + "size": 0 + } + } +} +export const mockSkippingIndexQuery = { + "data": { + "ok": true, + "resp": { + "status": "SUCCESS", + "schema": [ + { + "name": "indexed_col_name", + "type": "string" + }, + { + "name": "data_type", + "type": "string" + }, + { + "name": "skip_type", + "type": "string" + } + ], + "datarows": [ + [ + "skipping_index" + ] + ], + "total": 1, + "size": 1 + } + } +} + +export const mockEmptySkippingIndexQuery = { + "data": { + "ok": true, + "resp": { + "status": "SUCCESS", + "schema": [ + { + "name": "index_name", + "type": "string" + } + ], + "datarows": [], + "total": 0, + "size": 0 + } + } +} +export const mockEmptyCoveringIndexQuery = { + "data": { + "ok": true, + "resp": { + "status": "SUCCESS", + "schema": [ + { + "name": "index_name", + "type": "string" + } + ], + "datarows": [], + "total": 0, + "size": 0 + } + } +} + +export const mockDataSelectQuery = { + "data": { + "ok": true, + "resp": [ + { + "name": "glue_2", + "description": "", + "connector": "S3GLUE", + "allowedRoles": [], + "properties": { + "glue.indexstore.opensearch.auth": "awssigv4", + "glue.indexstore.opensearch.uri": "https://search-flint-test-lchvlhaowzh4vhwyeutf52fteq.us-east-1.es.amazonaws.com", + "glue.auth.role_arn": "arn:aws:iam::294600734191:role/pratik-flint-role", + "glue.auth.type": "iam_role", + "glue.indexstore.opensearch.region": "us-east-1" + }, + "resultIndex": "query_execution_result_glue_2" + }, + { + "name": "glue_1", + "description": "", + "connector": "S3GLUE", + "allowedRoles": [], + "properties": { + "glue.indexstore.opensearch.auth": "awssigv4", + "glue.indexstore.opensearch.uri": "https://search-flint-test-lchvlhaowzh4vhwyeutf52fteq.us-east-1.es.amazonaws.com", + "glue.auth.role_arn": "arn:aws:iam::294600734191:role/pratik-flint-role", + "glue.auth.type": "iam_role", + "glue.indexstore.opensearch.region": "us-east-1" + }, + "resultIndex": "query_execution_result_glue_1" + } + ] + } +} \ No newline at end of file