|
1 |
| -""" Attempt at making some standard Target Tests. """ |
| 1 | +""" Postgres target tests """ |
2 | 2 | # flake8: noqa
|
3 | 3 | import copy
|
4 | 4 | import io
|
5 |
| -import uuid |
6 | 5 | from contextlib import redirect_stdout
|
7 | 6 | from decimal import Decimal
|
8 | 7 | from pathlib import Path
|
|
11 | 10 | import pytest
|
12 | 11 | import sqlalchemy
|
13 | 12 | from singer_sdk.exceptions import MissingKeyPropertiesError
|
14 |
| -from singer_sdk.testing import sync_end_to_end |
| 13 | +from singer_sdk.testing import get_target_test_class, sync_end_to_end |
15 | 14 | from sqlalchemy.dialects.postgresql import ARRAY
|
16 | 15 | from sqlalchemy.types import TEXT, TIMESTAMP
|
17 | 16 |
|
|
22 | 21 | SampleTapCountries,
|
23 | 22 | )
|
24 | 23 |
|
| 24 | +from .core import ( |
| 25 | + create_engine, |
| 26 | + postgres_config, |
| 27 | + postgres_config_no_ssl, |
| 28 | + postgres_config_ssh_tunnel, |
| 29 | +) |
25 | 30 |
|
26 |
| -@pytest.fixture(scope="session") |
27 |
| -def postgres_config(): |
28 |
| - return { |
29 |
| - "dialect+driver": "postgresql+psycopg2", |
30 |
| - "host": "localhost", |
31 |
| - "user": "postgres", |
32 |
| - "password": "postgres", |
33 |
| - "database": "postgres", |
34 |
| - "port": 5432, |
35 |
| - "ssl_enable": True, |
36 |
| - "ssl_client_certificate_enable": True, |
37 |
| - "ssl_mode": "verify-full", |
38 |
| - "ssl_certificate_authority": "./ssl/root.crt", |
39 |
| - "ssl_client_certificate": "./ssl/cert.crt", |
40 |
| - "ssl_client_private_key": "./ssl/pkey.key", |
41 |
| - "add_record_metadata": True, |
42 |
| - "hard_delete": False, |
43 |
| - "default_target_schema": "melty", |
44 |
| - } |
45 | 31 |
|
| 32 | +# The below syntax is documented at https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly |
| 33 | +@pytest.fixture(scope="session", name="postgres_config") |
| 34 | +def postgres_config_fixture(): |
| 35 | + return postgres_config() |
46 | 36 |
|
47 |
| -@pytest.fixture(scope="session") |
48 |
| -def postgres_config_no_ssl(): |
49 |
| - return { |
50 |
| - "dialect+driver": "postgresql+psycopg2", |
51 |
| - "host": "localhost", |
52 |
| - "user": "postgres", |
53 |
| - "password": "postgres", |
54 |
| - "database": "postgres", |
55 |
| - "port": 5433, |
56 |
| - "add_record_metadata": True, |
57 |
| - "hard_delete": False, |
58 |
| - "default_target_schema": "melty", |
59 |
| - } |
60 | 37 |
|
| 38 | +@pytest.fixture(scope="session", name="postgres_config_no_ssl") |
| 39 | +def postgres_config_no_ssl_fixture(): |
| 40 | + return postgres_config_no_ssl() |
61 | 41 |
|
62 |
| -@pytest.fixture(scope="session") |
63 |
| -def postgres_config_ssh_tunnel(): |
64 |
| - return { |
65 |
| - "sqlalchemy_url": "postgresql://postgres:[email protected]:5432/main", |
66 |
| - "ssh_tunnel": { |
67 |
| - "enable": True, |
68 |
| - "host": "127.0.0.1", |
69 |
| - "port": 2223, |
70 |
| - "username": "melty", |
71 |
| - "private_key": "-----BEGIN OPENSSH PRIVATE KEY-----\n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\n-----END OPENSSH PRIVATE KEY-----", # noqa: E501 |
72 |
| - }, |
73 |
| - } |
| 42 | + |
| 43 | +@pytest.fixture(scope="session", name="postgres_config_ssh_tunnel") |
| 44 | +def postgres_config_ssh_tunnel_fixture(): |
| 45 | + return postgres_config_ssh_tunnel() |
74 | 46 |
|
75 | 47 |
|
76 | 48 | @pytest.fixture
|
77 | 49 | def postgres_target(postgres_config) -> TargetPostgres:
|
78 | 50 | return TargetPostgres(config=postgres_config)
|
79 | 51 |
|
80 | 52 |
|
81 |
| -def create_engine(target_postgres: TargetPostgres) -> sqlalchemy.engine.Engine: |
82 |
| - return TargetPostgres.default_sink_class.connector_class( |
83 |
| - config=target_postgres.config |
84 |
| - )._engine |
85 |
| - |
86 |
| - |
87 | 53 | def singer_file_to_target(file_name, target) -> None:
|
88 | 54 | """Singer file to Target, emulates a tap run
|
89 | 55 |
|
|
0 commit comments