| 
									
										
										
										
											2023-04-18 09:08:17 +05:30
										 |  |  | #  Copyright 2021 Collate | 
					
						
							|  |  |  | #  Licensed under the Apache License, Version 2.0 (the "License"); | 
					
						
							|  |  |  | #  you may not use this file except in compliance with the License. | 
					
						
							|  |  |  | #  You may obtain a copy of the License at | 
					
						
							|  |  |  | #  http://www.apache.org/licenses/LICENSE-2.0 | 
					
						
							|  |  |  | #  Unless required by applicable law or agreed to in writing, software | 
					
						
							|  |  |  | #  distributed under the License is distributed on an "AS IS" BASIS, | 
					
						
							|  |  |  | #  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
					
						
							|  |  |  | #  See the License for the specific language governing permissions and | 
					
						
							|  |  |  | #  limitations under the License. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-08 06:24:49 -08:00
										 |  |  | """
 | 
					
						
							|  |  |  | Test QuickSight using the topology | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import json | 
					
						
							|  |  |  | from pathlib import Path | 
					
						
							|  |  |  | from unittest import TestCase | 
					
						
							|  |  |  | from unittest.mock import patch | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-18 20:37:41 +05:30
										 |  |  | import pytest | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-08 06:24:49 -08:00
										 |  |  | from metadata.generated.schema.api.data.createChart import CreateChartRequest | 
					
						
							|  |  |  | from metadata.generated.schema.api.data.createDashboard import CreateDashboardRequest | 
					
						
							|  |  |  | from metadata.generated.schema.entity.data.dashboard import Dashboard | 
					
						
							|  |  |  | from metadata.generated.schema.entity.services.dashboardService import ( | 
					
						
							|  |  |  |     DashboardConnection, | 
					
						
							|  |  |  |     DashboardService, | 
					
						
							|  |  |  |     DashboardServiceType, | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | from metadata.generated.schema.metadataIngestion.workflow import ( | 
					
						
							|  |  |  |     OpenMetadataWorkflowConfig, | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2023-02-13 00:08:55 -08:00
										 |  |  | from metadata.generated.schema.type.basic import FullyQualifiedEntityName | 
					
						
							| 
									
										
										
										
											2022-11-08 06:24:49 -08:00
										 |  |  | from metadata.generated.schema.type.entityReference import EntityReference | 
					
						
							| 
									
										
										
										
											2023-08-30 15:49:42 +02:00
										 |  |  | from metadata.ingestion.api.models import Either | 
					
						
							| 
									
										
										
										
											2023-01-18 20:37:41 +05:30
										 |  |  | from metadata.ingestion.source.dashboard.quicksight.metadata import QuicksightSource | 
					
						
							| 
									
										
										
										
											2024-05-17 12:10:20 +05:30
										 |  |  | from metadata.ingestion.source.dashboard.quicksight.models import DashboardDetail | 
					
						
							| 
									
										
										
										
											2022-11-08 06:24:49 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | mock_file_path = ( | 
					
						
							|  |  |  |     Path(__file__).parent.parent.parent / "resources/datasets/quicksight_dataset.json" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | with open(mock_file_path, encoding="UTF-8") as file: | 
					
						
							|  |  |  |     mock_data: dict = json.load(file) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | MOCK_DASHBOARD_SERVICE = DashboardService( | 
					
						
							|  |  |  |     id="c3eb265f-5445-4ad3-ba5e-797d3a3071bb", | 
					
						
							|  |  |  |     name="quicksight_source_test", | 
					
						
							| 
									
										
										
										
											2024-06-05 21:18:37 +02:00
										 |  |  |     fullyQualifiedName=FullyQualifiedEntityName("quicksight_source_test"), | 
					
						
							| 
									
										
										
										
											2022-11-08 06:24:49 -08:00
										 |  |  |     connection=DashboardConnection(), | 
					
						
							|  |  |  |     serviceType=DashboardServiceType.QuickSight, | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | MOCK_DASHBOARD = Dashboard( | 
					
						
							|  |  |  |     id="a58b1856-729c-493b-bc87-6d2269b43ec0", | 
					
						
							|  |  |  |     name="do_it_all_with_default_config", | 
					
						
							|  |  |  |     fullyQualifiedName="quicksight_source.do_it_all_with_default_config", | 
					
						
							|  |  |  |     displayName="do_it_all_with_default_config", | 
					
						
							|  |  |  |     service=EntityReference( | 
					
						
							|  |  |  |         id="85811038-099a-11ed-861d-0242ac120002", type="dashboardService" | 
					
						
							|  |  |  |     ), | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | mock_quicksight_config = { | 
					
						
							|  |  |  |     "source": { | 
					
						
							|  |  |  |         "type": "quicksight", | 
					
						
							|  |  |  |         "serviceName": "local_quicksight", | 
					
						
							|  |  |  |         "serviceConnection": { | 
					
						
							|  |  |  |             "config": { | 
					
						
							|  |  |  |                 "type": "QuickSight", | 
					
						
							|  |  |  |                 "awsConfig": { | 
					
						
							|  |  |  |                     "awsAccessKeyId": "aws_access_key_id", | 
					
						
							|  |  |  |                     "awsSecretAccessKey": "aws_secret_access_key", | 
					
						
							|  |  |  |                     "awsRegion": "us-east-2", | 
					
						
							|  |  |  |                     "endPointURL": "https://endpoint.com/", | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |                 "awsAccountId": "6733-5329-5256", | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         "sourceConfig": { | 
					
						
							|  |  |  |             "config": {"dashboardFilterPattern": {}, "chartFilterPattern": {}} | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     "sink": {"type": "metadata-rest", "config": {}}, | 
					
						
							|  |  |  |     "workflowConfig": { | 
					
						
							|  |  |  |         "openMetadataServerConfig": { | 
					
						
							|  |  |  |             "hostPort": "http://localhost:8585/api", | 
					
						
							|  |  |  |             "authProvider": "openmetadata", | 
					
						
							|  |  |  |             "securityConfig": { | 
					
						
							|  |  |  |                 "jwtToken": "eyJraWQiOiJHYjM4OWEtOWY3Ni1nZGpzLWE5MmotMDI0MmJrOTQzNTYiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImlzQm90IjpmYWxzZSwiaXNzIjoib3Blbi1tZXRhZGF0YS5vcmciLCJpYXQiOjE2NjM5Mzg0NjIsImVtYWlsIjoiYWRtaW5Ab3Blbm1ldGFkYXRhLm9yZyJ9.tS8um_5DKu7HgzGBzS1VTA5uUjKWOCU0B_j08WXBiEC0mr0zNREkqVfwFDD-d24HlNEbrqioLsBuFRiwIWKc1m_ZlVQbG7P36RUxhuv2vbSp80FKyNM-Tj93FDzq91jsyNmsQhyNv_fNr3TXfzzSPjHt8Go0FMMP66weoKMgW2PbXlhVKwEuXUHyakLLzewm9UMeQaEiRzhiTMU3UkLXcKbYEJJvfNFcLwSl9W8JCO_l0Yj3ud-qt_nQYEZwqW6u5nfdQllN133iikV4fM5QZsMCnm8Rq1mvLR0y9bmJiD7fwM1tmJ791TUWqmKaTnP49U493VanKpUAfzIiOiIbhg" | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | MOCK_DASHBOARD_DETAILS = { | 
					
						
							|  |  |  |     "DashboardId": "552315335", | 
					
						
							|  |  |  |     "Name": "New Dashboard", | 
					
						
							|  |  |  |     "Version": { | 
					
						
							|  |  |  |         "Sheets": [], | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | EXPECTED_DASHBOARD = CreateDashboardRequest( | 
					
						
							|  |  |  |     name="552315335", | 
					
						
							|  |  |  |     displayName="New Dashboard", | 
					
						
							| 
									
										
										
										
											2023-06-15 14:44:48 +05:30
										 |  |  |     sourceUrl="https://us-east-2.quicksight.aws.amazon.com/sn/dashboards/552315335", | 
					
						
							| 
									
										
										
										
											2022-11-08 06:24:49 -08:00
										 |  |  |     charts=[], | 
					
						
							|  |  |  |     tags=None, | 
					
						
							| 
									
										
										
										
											2024-07-29 23:06:39 -07:00
										 |  |  |     owners=None, | 
					
						
							| 
									
										
										
										
											2023-02-13 00:08:55 -08:00
										 |  |  |     service="quicksight_source_test", | 
					
						
							| 
									
										
										
										
											2022-11-08 06:24:49 -08:00
										 |  |  |     extension=None, | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | EXPECTED_DASHBOARDS = [ | 
					
						
							|  |  |  |     CreateChartRequest( | 
					
						
							| 
									
										
										
										
											2023-01-19 17:33:21 +05:30
										 |  |  |         name="1108771657", | 
					
						
							| 
									
										
										
										
											2022-11-08 06:24:49 -08:00
										 |  |  |         displayName="Top Salespeople", | 
					
						
							|  |  |  |         chartType="Other", | 
					
						
							| 
									
										
										
										
											2023-06-15 14:44:48 +05:30
										 |  |  |         sourceUrl="https://us-east-2.quicksight.aws.amazon.com/sn/dashboards/552315335", | 
					
						
							| 
									
										
										
										
											2022-11-08 06:24:49 -08:00
										 |  |  |         tags=None, | 
					
						
							| 
									
										
										
										
											2024-07-29 23:06:39 -07:00
										 |  |  |         owners=None, | 
					
						
							| 
									
										
										
										
											2023-02-13 00:08:55 -08:00
										 |  |  |         service="quicksight_source_test", | 
					
						
							| 
									
										
										
										
											2022-11-08 06:24:49 -08:00
										 |  |  |     ), | 
					
						
							|  |  |  |     CreateChartRequest( | 
					
						
							| 
									
										
										
										
											2023-01-19 17:33:21 +05:30
										 |  |  |         name="1985861713", | 
					
						
							| 
									
										
										
										
											2022-11-08 06:24:49 -08:00
										 |  |  |         displayName="Milan Datasets", | 
					
						
							|  |  |  |         chartType="Other", | 
					
						
							| 
									
										
										
										
											2023-06-15 14:44:48 +05:30
										 |  |  |         sourceUrl="https://us-east-2.quicksight.aws.amazon.com/sn/dashboards/552315335", | 
					
						
							| 
									
										
										
										
											2022-11-08 06:24:49 -08:00
										 |  |  |         tags=None, | 
					
						
							| 
									
										
										
										
											2024-07-29 23:06:39 -07:00
										 |  |  |         owners=None, | 
					
						
							| 
									
										
										
										
											2023-02-13 00:08:55 -08:00
										 |  |  |         service="quicksight_source_test", | 
					
						
							| 
									
										
										
										
											2022-11-08 06:24:49 -08:00
										 |  |  |     ), | 
					
						
							|  |  |  |     CreateChartRequest( | 
					
						
							| 
									
										
										
										
											2023-01-19 17:33:21 +05:30
										 |  |  |         name="2025899139", | 
					
						
							| 
									
										
										
										
											2022-11-08 06:24:49 -08:00
										 |  |  |         displayName="Page Fans", | 
					
						
							|  |  |  |         chartType="Other", | 
					
						
							| 
									
										
										
										
											2023-06-15 14:44:48 +05:30
										 |  |  |         sourceUrl="https://us-east-2.quicksight.aws.amazon.com/sn/dashboards/552315335", | 
					
						
							| 
									
										
										
										
											2022-11-08 06:24:49 -08:00
										 |  |  |         tags=None, | 
					
						
							| 
									
										
										
										
											2024-07-29 23:06:39 -07:00
										 |  |  |         owners=None, | 
					
						
							| 
									
										
										
										
											2023-02-13 00:08:55 -08:00
										 |  |  |         service="quicksight_source_test", | 
					
						
							| 
									
										
										
										
											2022-11-08 06:24:49 -08:00
										 |  |  |     ), | 
					
						
							|  |  |  | ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class QuickSightUnitTest(TestCase): | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     Implements the necessary methods to extract | 
					
						
							|  |  |  |     QuickSight Unit Test | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-02 13:52:27 +01:00
										 |  |  |     @patch( | 
					
						
							|  |  |  |         "metadata.ingestion.source.dashboard.dashboard_service.DashboardServiceSource.test_connection" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2022-11-08 06:24:49 -08:00
										 |  |  |     def __init__(self, methodName, test_connection) -> None: | 
					
						
							|  |  |  |         super().__init__(methodName) | 
					
						
							|  |  |  |         test_connection.return_value = False | 
					
						
							| 
									
										
										
										
											2024-06-07 04:36:17 +02:00
										 |  |  |         self.config = OpenMetadataWorkflowConfig.model_validate(mock_quicksight_config) | 
					
						
							| 
									
										
										
										
											2023-01-18 20:37:41 +05:30
										 |  |  |         self.quicksight = QuicksightSource.create( | 
					
						
							| 
									
										
										
										
											2022-11-08 06:24:49 -08:00
										 |  |  |             mock_quicksight_config["source"], | 
					
						
							|  |  |  |             self.config.workflowConfig.openMetadataServerConfig, | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2023-03-15 13:35:38 +05:30
										 |  |  |         self.quicksight.dashboard_url = ( | 
					
						
							|  |  |  |             "https://us-east-2.quicksight.aws.amazon.com/sn/dashboards/552315335" | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2024-03-25 18:20:40 +01:00
										 |  |  |         self.quicksight.context.get().__dict__[ | 
					
						
							| 
									
										
										
										
											2023-11-27 16:15:47 +05:30
										 |  |  |             "dashboard" | 
					
						
							| 
									
										
										
										
											2024-06-05 21:18:37 +02:00
										 |  |  |         ] = MOCK_DASHBOARD.fullyQualifiedName.root | 
					
						
							| 
									
										
										
										
											2024-03-25 18:20:40 +01:00
										 |  |  |         self.quicksight.context.get().__dict__[ | 
					
						
							| 
									
										
										
										
											2023-11-27 16:15:47 +05:30
										 |  |  |             "dashboard_service" | 
					
						
							| 
									
										
										
										
											2024-06-05 21:18:37 +02:00
										 |  |  |         ] = MOCK_DASHBOARD_SERVICE.fullyQualifiedName.root | 
					
						
							| 
									
										
										
										
											2022-11-08 06:24:49 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-18 20:37:41 +05:30
										 |  |  |     @pytest.mark.order(1) | 
					
						
							| 
									
										
										
										
											2022-11-08 06:24:49 -08:00
										 |  |  |     def test_dashboard(self): | 
					
						
							|  |  |  |         dashboard_list = [] | 
					
						
							| 
									
										
										
										
											2024-05-17 12:10:20 +05:30
										 |  |  |         results = self.quicksight.yield_dashboard( | 
					
						
							|  |  |  |             DashboardDetail(**MOCK_DASHBOARD_DETAILS) | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2022-11-08 06:24:49 -08:00
										 |  |  |         for result in results: | 
					
						
							| 
									
										
										
										
											2023-08-30 15:49:42 +02:00
										 |  |  |             if isinstance(result, Either) and result.right: | 
					
						
							|  |  |  |                 dashboard_list.append(result.right) | 
					
						
							| 
									
										
										
										
											2022-11-08 06:24:49 -08:00
										 |  |  |         self.assertEqual(EXPECTED_DASHBOARD, dashboard_list[0]) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-18 20:37:41 +05:30
										 |  |  |     @pytest.mark.order(2) | 
					
						
							| 
									
										
										
										
											2022-11-08 06:24:49 -08:00
										 |  |  |     def test_dashboard_name(self): | 
					
						
							|  |  |  |         assert ( | 
					
						
							| 
									
										
										
										
											2024-05-17 12:10:20 +05:30
										 |  |  |             self.quicksight.get_dashboard_name( | 
					
						
							|  |  |  |                 DashboardDetail(**MOCK_DASHBOARD_DETAILS) | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2022-11-08 06:24:49 -08:00
										 |  |  |             == mock_data["Name"] | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-18 20:37:41 +05:30
										 |  |  |     @pytest.mark.order(3) | 
					
						
							| 
									
										
										
										
											2022-11-08 06:24:49 -08:00
										 |  |  |     def test_chart(self): | 
					
						
							| 
									
										
										
										
											2024-05-17 12:10:20 +05:30
										 |  |  |         dashboard_details = DashboardDetail(**MOCK_DASHBOARD_DETAILS) | 
					
						
							|  |  |  |         dashboard_details.Version.Charts = mock_data["Version"]["Sheets"] | 
					
						
							| 
									
										
										
										
											2022-11-08 06:24:49 -08:00
										 |  |  |         results = self.quicksight.yield_dashboard_chart(dashboard_details) | 
					
						
							|  |  |  |         chart_list = [] | 
					
						
							|  |  |  |         for result in results: | 
					
						
							|  |  |  |             if isinstance(result, CreateChartRequest): | 
					
						
							|  |  |  |                 chart_list.append(result) | 
					
						
							|  |  |  |         for _, (expected, original) in enumerate(zip(EXPECTED_DASHBOARDS, chart_list)): | 
					
						
							|  |  |  |             self.assertEqual(expected, original) |