| 
									
										
										
										
											2023-04-21 08:55:54 +02:00
										 |  |  | #  Copyright 2022 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. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | Redshift E2E tests | 
					
						
							|  |  |  | """
 | 
					
						
							| 
									
										
										
										
											2024-10-24 07:47:50 +02:00
										 |  |  | from typing import List, Tuple | 
					
						
							| 
									
										
										
										
											2023-04-21 08:55:54 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-24 07:47:50 +02:00
										 |  |  | from metadata.generated.schema.entity.data.table import DmlOperationType, SystemProfile | 
					
						
							|  |  |  | from metadata.generated.schema.type.basic import Timestamp | 
					
						
							| 
									
										
										
										
											2024-06-28 08:01:52 +02:00
										 |  |  | from metadata.ingestion.api.status import Status | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-21 08:55:54 +02:00
										 |  |  | from .common.test_cli_db import CliCommonDB | 
					
						
							|  |  |  | from .common_e2e_sqa_mixins import SQACommonMethods | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class RedshiftCliTest(CliCommonDB.TestSuite, SQACommonMethods): | 
					
						
							|  |  |  |     create_table_query: str = """
 | 
					
						
							| 
									
										
										
										
											2023-04-25 10:11:06 +05:30
										 |  |  |         CREATE TABLE IF NOT EXISTS e2e_cli_tests.dbt_jaffle.persons ( | 
					
						
							| 
									
										
										
										
											2023-04-21 08:55:54 +02:00
										 |  |  |             person_id int, | 
					
						
							|  |  |  |             full_name varchar(255), | 
					
						
							| 
									
										
										
										
											2024-07-12 17:23:53 +05:30
										 |  |  |             birthdate date, | 
					
						
							|  |  |  |             bigint_col bigint | 
					
						
							| 
									
										
										
										
											2023-04-21 08:55:54 +02:00
										 |  |  |         ) | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     create_view_query: str = """
 | 
					
						
							| 
									
										
										
										
											2023-04-25 10:11:06 +05:30
										 |  |  |         CREATE OR REPLACE VIEW e2e_cli_tests.dbt_jaffle.view_persons AS | 
					
						
							| 
									
										
										
										
											2023-04-21 08:55:54 +02:00
										 |  |  |             SELECT * | 
					
						
							|  |  |  |             FROM e2e_cli_tests.dbt_jaffle.persons; | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     insert_data_queries: List[str] = [ | 
					
						
							|  |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2024-07-12 17:23:53 +05:30
										 |  |  |     INSERT INTO e2e_cli_tests.dbt_jaffle.persons (person_id, full_name, birthdate, bigint_col) VALUES | 
					
						
							|  |  |  |         (1,'Peter Parker', '2004-08-10', 9223372036854775807), | 
					
						
							|  |  |  |         (2,'Bruce Banner', '1988-12-18', 9223372036854775807), | 
					
						
							|  |  |  |         (3,'Steve Rogers', '1988-07-04', 9223372036854775807), | 
					
						
							|  |  |  |         (4,'Natasha Romanoff', '1997-12-03', 9223372036854775807), | 
					
						
							|  |  |  |         (5,'Wanda Maximoff', '1998-02-10', 9223372036854775807), | 
					
						
							|  |  |  |         (6,'Diana Prince', '1976-03-17', 9000000000000000007); | 
					
						
							| 
									
										
										
										
											2023-04-21 08:55:54 +02:00
										 |  |  |     """
 | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     drop_table_query: str = """
 | 
					
						
							| 
									
										
										
										
											2023-04-25 10:11:06 +05:30
										 |  |  |         DROP TABLE IF EXISTS "e2e_cli_tests"."dbt_jaffle"."persons"; | 
					
						
							| 
									
										
										
										
											2023-04-21 08:55:54 +02:00
										 |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     drop_view_query: str = """
 | 
					
						
							| 
									
										
										
										
											2023-04-25 10:11:06 +05:30
										 |  |  |         DROP VIEW IF EXISTS "e2e_cli_tests"."dbt_jaffle"."view_persons"; | 
					
						
							| 
									
										
										
										
											2023-04-21 08:55:54 +02:00
										 |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def setUp(self) -> None: | 
					
						
							|  |  |  |         self.create_table_and_view() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def tearDown(self) -> None: | 
					
						
							|  |  |  |         self.delete_table_and_view() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-28 08:01:52 +02:00
										 |  |  |     def assert_for_vanilla_ingestion( | 
					
						
							|  |  |  |         self, source_status: Status, sink_status: Status | 
					
						
							|  |  |  |     ) -> None: | 
					
						
							|  |  |  |         self.assertEqual(len(source_status.failures), 0) | 
					
						
							|  |  |  |         self.assertEqual(len(source_status.warnings), 0) | 
					
						
							|  |  |  |         self.assertEqual(len(source_status.filtered), 1) | 
					
						
							|  |  |  |         self.assertGreaterEqual( | 
					
						
							|  |  |  |             (len(source_status.records) + len(source_status.updated_records)), | 
					
						
							|  |  |  |             self.expected_tables(), | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         self.assertEqual(len(sink_status.failures), 0) | 
					
						
							|  |  |  |         self.assertEqual(len(sink_status.warnings), 0) | 
					
						
							|  |  |  |         self.assertGreater( | 
					
						
							|  |  |  |             (len(sink_status.records) + len(sink_status.updated_records)), | 
					
						
							|  |  |  |             self.expected_tables(), | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-21 08:55:54 +02:00
										 |  |  |     def create_table_and_view(self) -> None: | 
					
						
							|  |  |  |         SQACommonMethods.create_table_and_view(self) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def delete_table_and_view(self) -> None: | 
					
						
							|  |  |  |         SQACommonMethods.delete_table_and_view(self) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-09 12:05:35 +02:00
										 |  |  |     def delete_table_rows(self) -> None: | 
					
						
							|  |  |  |         SQACommonMethods.run_delete_queries(self) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def update_table_row(self) -> None: | 
					
						
							|  |  |  |         SQACommonMethods.run_update_queries(self) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-21 08:55:54 +02:00
										 |  |  |     @staticmethod | 
					
						
							|  |  |  |     def get_connector_name() -> str: | 
					
						
							|  |  |  |         return "redshift" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @staticmethod | 
					
						
							|  |  |  |     def expected_tables() -> int: | 
					
						
							|  |  |  |         return 5 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def inserted_rows_count(self) -> int: | 
					
						
							| 
									
										
										
										
											2023-11-10 14:15:14 +05:30
										 |  |  |         return 50 | 
					
						
							| 
									
										
										
										
											2023-04-21 08:55:54 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def view_column_lineage_count(self) -> int: | 
					
						
							|  |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2023-06-01 09:44:27 +02:00
										 |  |  |         Gives us the lineage for the view_listing | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         return 9 | 
					
						
							| 
									
										
										
										
											2023-04-21 08:55:54 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     @staticmethod | 
					
						
							|  |  |  |     def fqn_created_table() -> str: | 
					
						
							|  |  |  |         return "e2e_redshift.e2e_cli_tests.dbt_jaffle.listing" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @staticmethod | 
					
						
							|  |  |  |     def _fqn_deleted_table() -> str: | 
					
						
							|  |  |  |         return "e2e_redshift.e2e_cli_tests.dbt_jaffle.persons" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @staticmethod | 
					
						
							|  |  |  |     def get_profiler_time_partition() -> dict: | 
					
						
							|  |  |  |         return { | 
					
						
							|  |  |  |             "fullyQualifiedName": "e2e_redshift.e2e_cli_tests.dbt_jaffle.listing", | 
					
						
							|  |  |  |             "partitionConfig": { | 
					
						
							|  |  |  |                 "enablePartitioning": True, | 
					
						
							|  |  |  |                 "partitionColumnName": "date", | 
					
						
							|  |  |  |                 "partitionIntervalType": "TIME-UNIT", | 
					
						
							|  |  |  |                 "partitionInterval": 5, | 
					
						
							|  |  |  |                 "partitionIntervalUnit": "YEAR", | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @staticmethod | 
					
						
							|  |  |  |     def get_includes_schemas() -> List[str]: | 
					
						
							|  |  |  |         return ["dbt_jaffle"] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-28 08:01:52 +02:00
										 |  |  |     @classmethod | 
					
						
							|  |  |  |     def get_excludes_schemas(cls) -> List[str]: | 
					
						
							|  |  |  |         return ["dbt_jaffle", "information_schema"] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-21 08:55:54 +02:00
										 |  |  |     @staticmethod | 
					
						
							|  |  |  |     def get_includes_tables() -> List[str]: | 
					
						
							|  |  |  |         return ["customer", "listing"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @staticmethod | 
					
						
							|  |  |  |     def get_excludes_tables() -> List[str]: | 
					
						
							|  |  |  |         return ["foo"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @staticmethod | 
					
						
							|  |  |  |     def expected_filtered_schema_includes() -> int: | 
					
						
							|  |  |  |         return 3 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @staticmethod | 
					
						
							|  |  |  |     def expected_filtered_schema_excludes() -> int: | 
					
						
							| 
									
										
										
										
											2024-06-28 08:01:52 +02:00
										 |  |  |         return 2 | 
					
						
							| 
									
										
										
										
											2023-04-21 08:55:54 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     @staticmethod | 
					
						
							|  |  |  |     def expected_filtered_table_includes() -> int: | 
					
						
							| 
									
										
										
										
											2024-06-28 08:01:52 +02:00
										 |  |  |         return 6 | 
					
						
							| 
									
										
										
										
											2023-04-21 08:55:54 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     @staticmethod | 
					
						
							|  |  |  |     def expected_filtered_table_excludes() -> int: | 
					
						
							| 
									
										
										
										
											2024-06-28 08:01:52 +02:00
										 |  |  |         return 3 | 
					
						
							| 
									
										
										
										
											2023-04-21 08:55:54 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     @staticmethod | 
					
						
							|  |  |  |     def expected_filtered_mix() -> int: | 
					
						
							|  |  |  |         return 8 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @staticmethod | 
					
						
							|  |  |  |     def get_profiler_time_partition_results() -> dict: | 
					
						
							|  |  |  |         return { | 
					
						
							|  |  |  |             "table_profile": { | 
					
						
							|  |  |  |                 "columnCount": 9.0, | 
					
						
							| 
									
										
										
										
											2023-05-22 09:04:18 +02:00
										 |  |  |                 "rowCount": 101.0, | 
					
						
							| 
									
										
										
										
											2023-04-21 08:55:54 +02:00
										 |  |  |             }, | 
					
						
							|  |  |  |             "column_profile": [ | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     "totalprice": { | 
					
						
							|  |  |  |                         "distinctCount": 22.0, | 
					
						
							|  |  |  |                         "distinctProportion": 1.0, | 
					
						
							|  |  |  |                         "duplicateCount": None, | 
					
						
							| 
									
										
										
										
											2023-05-03 04:42:32 +02:00
										 |  |  |                         "firstQuartile": -451.0775, | 
					
						
							| 
									
										
										
										
											2024-01-30 14:05:51 +05:30
										 |  |  |                         "histogram": { | 
					
						
							|  |  |  |                             "boundaries": [ | 
					
						
							|  |  |  |                                 "-999.630 to -665.732", | 
					
						
							|  |  |  |                                 "-665.732 to -331.834", | 
					
						
							|  |  |  |                                 "-331.834 to 2.064", | 
					
						
							|  |  |  |                                 "2.064 to 335.962", | 
					
						
							|  |  |  |                                 "335.962 to 669.859", | 
					
						
							|  |  |  |                                 "669.859 and up", | 
					
						
							| 
									
										
										
										
											2023-04-21 08:55:54 +02:00
										 |  |  |                             ], | 
					
						
							| 
									
										
										
										
											2024-01-30 14:05:51 +05:30
										 |  |  |                             "frequencies": [3, 7, 6, 1, 2, 3], | 
					
						
							|  |  |  |                         }, | 
					
						
							| 
									
										
										
										
											2023-05-03 04:42:32 +02:00
										 |  |  |                         "interQuartileRange": 467.7975, | 
					
						
							| 
									
										
										
										
											2023-04-21 08:55:54 +02:00
										 |  |  |                         "max": 856.41, | 
					
						
							|  |  |  |                         "maxLength": None, | 
					
						
							| 
									
										
										
										
											2024-07-12 17:23:53 +05:30
										 |  |  |                         "mean": -159.0, | 
					
						
							| 
									
										
										
										
											2023-04-21 08:55:54 +02:00
										 |  |  |                         "median": -288.81, | 
					
						
							|  |  |  |                         "min": -999.63, | 
					
						
							|  |  |  |                         "minLength": None, | 
					
						
							|  |  |  |                         "missingCount": None, | 
					
						
							|  |  |  |                         "missingPercentage": None, | 
					
						
							| 
									
										
										
										
											2024-07-12 17:23:53 +05:30
										 |  |  |                         "nonParametricSkew": 0.24571372424720792, | 
					
						
							| 
									
										
										
										
											2023-04-21 08:55:54 +02:00
										 |  |  |                         "nullCount": 0.0, | 
					
						
							|  |  |  |                         "nullProportion": 0.0, | 
					
						
							|  |  |  |                         "stddev": 528.297718809555, | 
					
						
							|  |  |  |                         "sum": -3518.0, | 
					
						
							| 
									
										
										
										
											2023-05-03 04:42:32 +02:00
										 |  |  |                         "thirdQuartile": 16.72, | 
					
						
							| 
									
										
										
										
											2023-04-21 08:55:54 +02:00
										 |  |  |                         "uniqueCount": 22.0, | 
					
						
							|  |  |  |                         "uniqueProportion": 1.0, | 
					
						
							|  |  |  |                         "validCount": None, | 
					
						
							|  |  |  |                         "valuesCount": 22.0, | 
					
						
							|  |  |  |                         "valuesPercentage": None, | 
					
						
							|  |  |  |                         "variance": None, | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             ], | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2023-05-09 12:05:35 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     @staticmethod | 
					
						
							|  |  |  |     def delete_queries() -> List[str]: | 
					
						
							|  |  |  |         return [ | 
					
						
							|  |  |  |             """
 | 
					
						
							|  |  |  |             DELETE FROM e2e_cli_tests.dbt_jaffle.persons WHERE person_id IN (1,2) | 
					
						
							|  |  |  |             """,
 | 
					
						
							|  |  |  |         ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @staticmethod | 
					
						
							|  |  |  |     def update_queries() -> List[str]: | 
					
						
							|  |  |  |         return [ | 
					
						
							|  |  |  |             """
 | 
					
						
							|  |  |  |             UPDATE e2e_cli_tests.dbt_jaffle.persons SET full_name = 'Bruce Wayne' WHERE person_id = 3 | 
					
						
							|  |  |  |             """,
 | 
					
						
							|  |  |  |         ] | 
					
						
							| 
									
										
										
										
											2024-10-24 07:47:50 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def get_system_profile_cases(self) -> List[Tuple[str, List[SystemProfile]]]: | 
					
						
							|  |  |  |         return [ | 
					
						
							|  |  |  |             ( | 
					
						
							|  |  |  |                 "e2e_redshift.e2e_cli_tests.dbt_jaffle.persons", | 
					
						
							|  |  |  |                 [ | 
					
						
							|  |  |  |                     SystemProfile( | 
					
						
							|  |  |  |                         timestamp=Timestamp(root=0), | 
					
						
							|  |  |  |                         operation=DmlOperationType.INSERT, | 
					
						
							|  |  |  |                         rowsAffected=6, | 
					
						
							|  |  |  |                     ) | 
					
						
							|  |  |  |                 ], | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |         ] |