| 
									
										
										
										
											2022-07-27 20:50:56 +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. | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | Test fivetran using the topology | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | import json | 
					
						
							|  |  |  | from pathlib import Path | 
					
						
							|  |  |  | from unittest import TestCase | 
					
						
							|  |  |  | from unittest.mock import patch | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from metadata.generated.schema.api.data.createPipeline import CreatePipelineRequest | 
					
						
							|  |  |  | from metadata.generated.schema.entity.data.pipeline import Pipeline, Task | 
					
						
							|  |  |  | from metadata.generated.schema.entity.services.pipelineService import ( | 
					
						
							|  |  |  |     PipelineConnection, | 
					
						
							|  |  |  |     PipelineService, | 
					
						
							|  |  |  |     PipelineServiceType, | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 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-07-27 20:50:56 +05:30
										 |  |  | from metadata.generated.schema.type.entityReference import EntityReference | 
					
						
							| 
									
										
										
										
											2022-12-27 15:00:22 +01:00
										 |  |  | from metadata.ingestion.source.pipeline.fivetran.metadata import ( | 
					
						
							| 
									
										
										
										
											2022-07-27 20:50:56 +05:30
										 |  |  |     FivetranPipelineDetails, | 
					
						
							|  |  |  |     FivetranSource, | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | mock_file_path = ( | 
					
						
							|  |  |  |     Path(__file__).parent.parent.parent / "resources/datasets/fivetran_dataset.json" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | with open(mock_file_path) as file: | 
					
						
							|  |  |  |     mock_data: dict = json.load(file) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | mock_fivetran_config = { | 
					
						
							|  |  |  |     "source": { | 
					
						
							|  |  |  |         "type": "fivetran", | 
					
						
							|  |  |  |         "serviceName": "fivetran_source", | 
					
						
							|  |  |  |         "serviceConnection": { | 
					
						
							|  |  |  |             "config": { | 
					
						
							|  |  |  |                 "type": "Fivetran", | 
					
						
							|  |  |  |                 "apiKey": "sample_api_key", | 
					
						
							|  |  |  |                 "apiSecret": "sample_api_secret", | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         "sourceConfig": {"config": {"type": "PipelineMetadata"}}, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     "sink": {"type": "metadata-rest", "config": {}}, | 
					
						
							|  |  |  |     "workflowConfig": { | 
					
						
							|  |  |  |         "openMetadataServerConfig": { | 
					
						
							|  |  |  |             "hostPort": "http://localhost:8585/api", | 
					
						
							| 
									
										
										
										
											2022-09-26 16:19:47 +05:30
										 |  |  |             "authProvider": "openmetadata", | 
					
						
							|  |  |  |             "securityConfig": { | 
					
						
							|  |  |  |                 "jwtToken": "eyJraWQiOiJHYjM4OWEtOWY3Ni1nZGpzLWE5MmotMDI0MmJrOTQzNTYiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImlzQm90IjpmYWxzZSwiaXNzIjoib3Blbi1tZXRhZGF0YS5vcmciLCJpYXQiOjE2NjM5Mzg0NjIsImVtYWlsIjoiYWRtaW5Ab3Blbm1ldGFkYXRhLm9yZyJ9.tS8um_5DKu7HgzGBzS1VTA5uUjKWOCU0B_j08WXBiEC0mr0zNREkqVfwFDD-d24HlNEbrqioLsBuFRiwIWKc1m_ZlVQbG7P36RUxhuv2vbSp80FKyNM-Tj93FDzq91jsyNmsQhyNv_fNr3TXfzzSPjHt8Go0FMMP66weoKMgW2PbXlhVKwEuXUHyakLLzewm9UMeQaEiRzhiTMU3UkLXcKbYEJJvfNFcLwSl9W8JCO_l0Yj3ud-qt_nQYEZwqW6u5nfdQllN133iikV4fM5QZsMCnm8Rq1mvLR0y9bmJiD7fwM1tmJ791TUWqmKaTnP49U493VanKpUAfzIiOiIbhg" | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2022-07-27 20:50:56 +05:30
										 |  |  |         } | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | EXPECTED_FIVETRAN_DETAILS = FivetranPipelineDetails( | 
					
						
							|  |  |  |     source=mock_data.get("source"), | 
					
						
							|  |  |  |     destination=mock_data.get("destination"), | 
					
						
							|  |  |  |     group=mock_data.get("group"), | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | EXPECTED_CREATED_PIPELINES = CreatePipelineRequest( | 
					
						
							|  |  |  |     name="wackiness_remote_aiding_pointless", | 
					
						
							|  |  |  |     displayName="test <> postgres_rds", | 
					
						
							|  |  |  |     description="", | 
					
						
							|  |  |  |     pipelineUrl="", | 
					
						
							|  |  |  |     tasks=[ | 
					
						
							|  |  |  |         Task( | 
					
						
							|  |  |  |             name="wackiness_remote_aiding_pointless", | 
					
						
							|  |  |  |             displayName="test <> postgres_rds", | 
					
						
							|  |  |  |             description="", | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |     ], | 
					
						
							| 
									
										
										
										
											2023-02-13 00:08:55 -08:00
										 |  |  |     service=FullyQualifiedEntityName(__root__="fivetran_source"), | 
					
						
							| 
									
										
										
										
											2022-07-27 20:50:56 +05:30
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | MOCK_PIPELINE_SERVICE = PipelineService( | 
					
						
							|  |  |  |     id="85811038-099a-11ed-861d-0242ac120002", | 
					
						
							|  |  |  |     name="fivetran_source", | 
					
						
							| 
									
										
										
										
											2023-02-13 00:08:55 -08:00
										 |  |  |     fullyQualifiedName=FullyQualifiedEntityName(__root__="fivetran_source"), | 
					
						
							| 
									
										
										
										
											2022-07-27 20:50:56 +05:30
										 |  |  |     connection=PipelineConnection(), | 
					
						
							|  |  |  |     serviceType=PipelineServiceType.Fivetran, | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | MOCK_PIPELINE = Pipeline( | 
					
						
							|  |  |  |     id="2aaa012e-099a-11ed-861d-0242ac120002", | 
					
						
							|  |  |  |     name="wackiness_remote_aiding_pointless", | 
					
						
							|  |  |  |     fullyQualifiedName="fivetran_source.wackiness_remote_aiding_pointless", | 
					
						
							|  |  |  |     displayName="test <> postgres_rds", | 
					
						
							|  |  |  |     description="", | 
					
						
							|  |  |  |     pipelineUrl="", | 
					
						
							|  |  |  |     tasks=[ | 
					
						
							|  |  |  |         Task( | 
					
						
							|  |  |  |             name="wackiness_remote_aiding_pointless", | 
					
						
							|  |  |  |             displayName="test <> postgres_rds", | 
					
						
							|  |  |  |             description="", | 
					
						
							|  |  |  |             taskUrl="", | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |     ], | 
					
						
							|  |  |  |     service=EntityReference( | 
					
						
							|  |  |  |         id="85811038-099a-11ed-861d-0242ac120002", type="pipelineService" | 
					
						
							|  |  |  |     ), | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class FivetranUnitTest(TestCase): | 
					
						
							| 
									
										
										
										
											2023-01-02 13:52:27 +01:00
										 |  |  |     @patch( | 
					
						
							|  |  |  |         "metadata.ingestion.source.pipeline.pipeline_service.PipelineServiceSource.test_connection" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2023-03-21 12:57:48 +01:00
										 |  |  |     @patch("metadata.ingestion.source.pipeline.fivetran.connection.get_connection") | 
					
						
							| 
									
										
										
										
											2022-07-27 20:50:56 +05:30
										 |  |  |     def __init__(self, methodName, fivetran_client, test_connection) -> None: | 
					
						
							|  |  |  |         super().__init__(methodName) | 
					
						
							|  |  |  |         test_connection.return_value = False | 
					
						
							|  |  |  |         config = OpenMetadataWorkflowConfig.parse_obj(mock_fivetran_config) | 
					
						
							|  |  |  |         self.fivetran = FivetranSource.create( | 
					
						
							|  |  |  |             mock_fivetran_config["source"], | 
					
						
							|  |  |  |             config.workflowConfig.openMetadataServerConfig, | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         self.fivetran.context.__dict__["pipeline"] = MOCK_PIPELINE | 
					
						
							|  |  |  |         self.fivetran.context.__dict__["pipeline_service"] = MOCK_PIPELINE_SERVICE | 
					
						
							|  |  |  |         self.client = fivetran_client.return_value | 
					
						
							|  |  |  |         self.client.list_groups.return_value = [mock_data.get("group")] | 
					
						
							|  |  |  |         self.client.list_group_connectors.return_value = [mock_data.get("source")] | 
					
						
							|  |  |  |         self.client.get_destination_details.return_value = mock_data.get("destination") | 
					
						
							|  |  |  |         self.client.get_connector_details.return_value = mock_data.get("source") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_pipeline_list(self): | 
					
						
							|  |  |  |         assert list(self.fivetran.get_pipelines_list())[0] == EXPECTED_FIVETRAN_DETAILS | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_pipeline_name(self): | 
					
						
							|  |  |  |         assert ( | 
					
						
							|  |  |  |             self.fivetran.get_pipeline_name(EXPECTED_FIVETRAN_DETAILS) | 
					
						
							|  |  |  |             == f'{mock_data.get("group").get("id")}_{mock_data.get("source").get("id")}' | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_pipelines(self): | 
					
						
							|  |  |  |         pipline = list(self.fivetran.yield_pipeline(EXPECTED_FIVETRAN_DETAILS))[0] | 
					
						
							|  |  |  |         assert pipline == EXPECTED_CREATED_PIPELINES |