1
1
import datetime
2
- import os
2
+ import re
3
3
import subprocess
4
4
import time
5
5
from pathlib import Path
6
6
7
7
from sqlalchemy import create_engine
8
+ from sqlalchemy_utils import create_database , database_exists , drop_database
8
9
9
10
import fakeredis
10
11
import freezegun
11
12
import pytest
12
13
from passari .config import CONFIG as PAS_CONFIG
13
14
from passari_workflow .config import CONFIG
14
15
from passari_workflow .db import DBSession
15
- from passari_workflow .db .connection import connect_db
16
+ from passari_workflow .db .connection import connect_db , get_connection_uri
16
17
from passari_workflow .db .models import (Base , MuseumAttachment ,
17
18
MuseumObject , MuseumPackage ,
18
19
SyncStatus )
19
- from pytest_postgresql .janitor import DatabaseJanitor
20
20
21
21
22
22
@pytest .fixture (scope = "function" , autouse = True )
@@ -42,68 +42,20 @@ def redis(monkeypatch):
42
42
43
43
@pytest .fixture (scope = "session" )
44
44
def database (request ):
45
- def get_psql_version ():
46
- result = subprocess .check_output (["psql" , "--version" ]).decode ("utf-8" )
47
- version = result .split (" " )[- 1 ].strip ()
48
- major , minor , * _ = version .split ("." )
49
-
50
- # Get the major and minor version, which are what pytest-postgresql
51
- # wants
52
- return f"{ major } .{ minor } "
53
-
54
- if os .environ .get ("POSTGRES_USER" ):
55
- # Use separately launched process if environments variables are defined
56
- # This is used in Gitlab CI tests which run in a Docker container
57
- user = os .environ ["POSTGRES_USER" ]
58
- host = os .environ ["POSTGRES_HOST" ]
59
- password = os .environ ["POSTGRES_PASSWORD" ]
60
-
61
- # POSTGRES_PORT can also be a value such as "tcp://1.1.1.1:5432"
62
- # This handles that format as well
63
- port = int (os .environ .get ("POSTGRES_PORT" , "5432" ).split (":" )[- 1 ])
64
- db_name = "passari_test"
65
- version = os .environ ["POSTGRES_VERSION" ]
66
- create_engine (
67
- f"postgresql://{ user } :{ password } @{ host } :{ port } /{ db_name } "
68
- )
69
-
70
- yield request .getfixturevalue ("postgresql_nooproc" )
71
- else :
72
- # Launch PostgreSQL ourselves
73
- postgresql = request .getfixturevalue ("postgresql_proc" )
74
-
75
- user = postgresql .user
76
- host = postgresql .host
77
- port = postgresql .port
78
- db_name = "passari_test"
79
-
80
- version = get_psql_version ()
81
-
82
- with DatabaseJanitor (
83
- user = user ,
84
- host = host ,
85
- port = port ,
86
- dbname = db_name ,
87
- version = version
88
- ):
89
- create_engine (
90
- f"postgresql://{ user } @{ host } :{ port } /{ db_name } "
91
- )
92
- yield postgresql
45
+ db_url = get_connection_uri (default = "postgresql:///passari" )
46
+ test_db_url = re .sub (r"^([^?]*[^/?])(/?[?]?.*)$" , r"\1_test\2" , db_url )
47
+ assert "_test" in test_db_url
48
+ if database_exists (test_db_url ):
49
+ drop_database (test_db_url )
50
+ create_database (test_db_url )
51
+ yield create_engine (test_db_url )
93
52
94
53
95
54
@pytest .fixture (scope = "function" )
96
55
def engine (database , monkeypatch ):
97
- monkeypatch .setitem (CONFIG ["db" ], "url" , "" )
98
- monkeypatch .setitem (CONFIG ["db" ], "user" , database .user )
99
- monkeypatch .setitem (
100
- CONFIG ["db" ], "password" ,
101
- # Password authentication is used when running tests under Docker
102
- os .environ .get ("POSTGRES_PASSWORD" , "" )
103
- )
104
- monkeypatch .setitem (CONFIG ["db" ], "host" , database .host )
105
- monkeypatch .setitem (CONFIG ["db" ], "port" , database .port )
106
- monkeypatch .setitem (CONFIG ["db" ], "name" , "passari_test" )
56
+ monkeypatch .setitem (CONFIG ["db" ], "url" , str (database .url ))
57
+ for item in ("user" , "password" , "host" , "port" , "name" ):
58
+ monkeypatch .setitem (CONFIG ["db" ], item , "" )
107
59
108
60
engine = connect_db ()
109
61
engine .echo = True
0 commit comments