|
1 | 1 | from __future__ import annotations
|
2 | 2 |
|
| 3 | +import typing as t |
3 | 4 | from pathlib import Path
|
4 | 5 |
|
5 | 6 | import pytest
|
|
25 | 26 | )
|
26 | 27 | from singer_sdk.testing.templates import TargetFileTestTemplate
|
27 | 28 |
|
| 29 | +if t.TYPE_CHECKING: |
| 30 | + from target_snowflake.connector import SnowflakeConnector |
| 31 | + |
28 | 32 |
|
29 | 33 | class SnowflakeTargetArrayData(TargetArrayData):
|
30 | 34 | def validate(self) -> None:
|
@@ -65,7 +69,7 @@ def validate(self) -> None:
|
65 | 69 |
|
66 | 70 | class SnowflakeTargetCamelcaseComplexSchema(TargetCamelcaseComplexSchema):
|
67 | 71 | def validate(self) -> None:
|
68 |
| - connector = self.target.default_sink_class.connector_class(self.target.config) |
| 72 | + connector: SnowflakeConnector = self.target.default_sink_class.connector_class(self.target.config) |
69 | 73 | table = f"{self.target.config['database']}.{self.target.config['default_target_schema']}.ForecastingTypeToCategory".upper() # noqa: E501
|
70 | 74 | table_schema = connector.get_table(table)
|
71 | 75 | expected_types = {
|
@@ -458,6 +462,61 @@ def setup(self) -> None:
|
458 | 462 | )
|
459 | 463 |
|
460 | 464 |
|
| 465 | +class SnowflakeTargetExistingReservedNameTableAlter(TargetFileTestTemplate): |
| 466 | + name = "existing_reserved_name_table_alter" |
| 467 | + # This sends a schema that will request altering from TIMESTAMP_NTZ to VARCHAR |
| 468 | + |
| 469 | + @property |
| 470 | + def singer_filepath(self) -> Path: |
| 471 | + current_dir = Path(__file__).resolve().parent |
| 472 | + return current_dir / "target_test_streams" / "reserved_words_in_table.singer" |
| 473 | + |
| 474 | + def setup(self) -> None: |
| 475 | + connector = self.target.default_sink_class.connector_class(self.target.config) |
| 476 | + table = f"{self.target.config['database']}.{self.target.config['default_target_schema']}.\"order\"".upper() |
| 477 | + connector.connection.execute( |
| 478 | + f""" |
| 479 | + CREATE OR REPLACE TABLE {table} ( |
| 480 | + ID VARCHAR(16777216), |
| 481 | + COL_STR VARCHAR(16777216), |
| 482 | + COL_TS TIMESTAMP_NTZ(9), |
| 483 | + COL_INT STRING, |
| 484 | + COL_BOOL BOOLEAN, |
| 485 | + COL_VARIANT VARIANT, |
| 486 | + _SDC_BATCHED_AT TIMESTAMP_NTZ(9), |
| 487 | + _SDC_DELETED_AT VARCHAR(16777216), |
| 488 | + _SDC_EXTRACTED_AT TIMESTAMP_NTZ(9), |
| 489 | + _SDC_RECEIVED_AT TIMESTAMP_NTZ(9), |
| 490 | + _SDC_SEQUENCE NUMBER(38,0), |
| 491 | + _SDC_TABLE_VERSION NUMBER(38,0), |
| 492 | + PRIMARY KEY (ID) |
| 493 | + ) |
| 494 | + """, |
| 495 | + ) |
| 496 | + |
| 497 | + |
| 498 | +class SnowflakeTargetReservedWordsInTable(TargetFileTestTemplate): |
| 499 | + # Contains reserved words from |
| 500 | + # https://docs.snowflake.com/en/sql-reference/reserved-keywords |
| 501 | + # Syncs records then alters schema by adding a non-reserved word column. |
| 502 | + name = "reserved_words_in_table" |
| 503 | + |
| 504 | + @property |
| 505 | + def singer_filepath(self) -> Path: |
| 506 | + current_dir = Path(__file__).resolve().parent |
| 507 | + return current_dir / "target_test_streams" / "reserved_words_in_table.singer" |
| 508 | + |
| 509 | + def validate(self) -> None: |
| 510 | + connector = self.target.default_sink_class.connector_class(self.target.config) |
| 511 | + table = f"{self.target.config['database']}.{self.target.config['default_target_schema']}.\"order\"".upper() |
| 512 | + result = connector.connection.execute( |
| 513 | + f"select * from {table}", |
| 514 | + ) |
| 515 | + assert result.rowcount == 1 |
| 516 | + row = result.first() |
| 517 | + assert len(row) == 13, f"Row has unexpected length {len(row)}" |
| 518 | + |
| 519 | + |
461 | 520 | class SnowflakeTargetTypeEdgeCasesTest(TargetFileTestTemplate):
|
462 | 521 | name = "type_edge_cases"
|
463 | 522 |
|
@@ -540,6 +599,8 @@ def singer_filepath(self) -> Path:
|
540 | 599 | SnowflakeTargetColonsInColName,
|
541 | 600 | SnowflakeTargetExistingTable,
|
542 | 601 | SnowflakeTargetExistingTableAlter,
|
| 602 | + SnowflakeTargetExistingReservedNameTableAlter, |
| 603 | + SnowflakeTargetReservedWordsInTable, |
543 | 604 | SnowflakeTargetTypeEdgeCasesTest,
|
544 | 605 | SnowflakeTargetColumnOrderMismatch,
|
545 | 606 | ],
|
|
0 commit comments