Skip to content

Commit 5897d88

Browse files
committed
tests: stub out constructor tests
1 parent c8f643d commit 5897d88

File tree

5 files changed

+114
-30
lines changed

5 files changed

+114
-30
lines changed

.env.dev

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
# Pins optional config ----
2+
#PINS_CACHE_DIR=.pins_cache
3+
#PINS_DATA_DIR=.pins_data
4+
15
# AWS S3 backend ----
26
AWS_ACCESS_KEY_ID=
37
AWS_SECRET_ACCESS_KEY=

pins/tests/conftest.py

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,29 @@
11
import pytest
22
import tempfile
3+
import os
34

45
from importlib_resources import files
56
from pytest import mark as m
67
from pathlib import Path
7-
from pins.tests.helpers import BoardBuilder, RscBoardBuilder, Snapshot
8+
from pins.tests.helpers import BoardBuilder, RscBoardBuilder, Snapshot, rm_env
9+
10+
PATH_TO_EXAMPLE_BOARD = files("pins") / "tests/pins-compat"
11+
812

913
# Based on https://github.com/machow/siuba/blob/main/siuba/tests/helpers.py
1014
BACKEND_MARKS = ["fs_s3", "fs_file", "fs_rsc"]
1115

12-
param_rsc = pytest.param(lambda: RscBoardBuilder("rsc"), id="rsc", marks=m.fs_rsc)
13-
14-
params_backend = [
16+
# parameters that can be used more than once per session
17+
params_safe = [
1518
pytest.param(lambda: BoardBuilder("file"), id="file", marks=m.fs_file),
1619
pytest.param(lambda: BoardBuilder("s3"), id="s3", marks=m.fs_s3),
17-
param_rsc,
1820
]
1921

22+
# rsc should only be used once, because users are created at docker setup time
23+
param_rsc = pytest.param(lambda: RscBoardBuilder("rsc"), id="rsc", marks=m.fs_rsc)
24+
25+
params_backend = [*params_safe, param_rsc]
26+
2027

2128
@pytest.fixture(params=params_backend, scope="session")
2229
def backend(request):
@@ -25,6 +32,15 @@ def backend(request):
2532
backend.teardown()
2633

2734

35+
@pytest.fixture(scope="session")
36+
def http_example_board_path():
37+
# backend = BoardBuilder("s3")
38+
# yield backend.create_tmp_board(str(PATH_TO_EXAMPLE_BOARD.absolute())).board
39+
# backend.teardown()
40+
# TODO: could putting it in a publically available bucket folder
41+
return "https://raw.githubusercontent.com/machow/pins-python/main/pins/tests/pins-compat"
42+
43+
2844
@pytest.fixture
2945
def snapshot(request):
3046
p_snap = files("pins") / "tests/_snapshots" / request.node.originalname
@@ -49,6 +65,22 @@ def tmp_dir2():
4965
yield Path(tmp_dir)
5066

5167

68+
@pytest.fixture
69+
def tmp_cache(tmp_dir2):
70+
with rm_env("PINS_CACHE_DIR"):
71+
os.environ["PINS_CACHE_DIR"] = str(tmp_dir2)
72+
73+
yield tmp_dir2
74+
75+
76+
@pytest.fixture
77+
def tmp_data_dir(tmp_dir2):
78+
with rm_env("PINS_DATA_DIR"):
79+
os.environ["PINS_DATA_DIR"] = str(tmp_dir2)
80+
81+
yield tmp_dir2
82+
83+
5284
def pytest_addoption(parser):
5385
parser.addoption("--snapshot-update", action="store_true")
5486

pins/tests/helpers.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import pytest
22

3+
import contextlib
34
import uuid
45
import os
56
import json
@@ -104,7 +105,8 @@ def __init__(self, fs_name: str, path=None):
104105
self.fs_name = fs_name
105106
self.board_path_registry = []
106107

107-
def get_param_from_env(self, entry):
108+
@staticmethod
109+
def get_param_from_env(entry):
108110
name, default = entry
109111

110112
value = os.environ.get(name, default)
@@ -249,3 +251,22 @@ def assert_equal_file(self, dst_file):
249251
shutil.copy(dst_file, self.path)
250252

251253
assert self.path.read_text() == Path(dst_file).read_text()
254+
255+
256+
@contextlib.contextmanager
257+
def rm_env(*args):
258+
"""
259+
Temporarily set the process environment variables.
260+
261+
262+
"""
263+
old_environ = dict(os.environ)
264+
for arg in args:
265+
if arg in os.environ:
266+
del os.environ[arg]
267+
268+
try:
269+
yield
270+
finally:
271+
os.environ.clear()
272+
os.environ.update(old_environ)

pins/tests/test_compat.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,21 @@
11
import pytest
22
import datetime
33

4-
import importlib_resources as resources
54

65
from pins.errors import PinsError
76
from pins.tests.helpers import xfail_fs
7+
from pins.tests.conftest import PATH_TO_EXAMPLE_BOARD
88

99

1010
NOT_A_PIN = "not_a_pin_abcdefg"
1111
PIN_CSV = "df_csv"
1212

13-
path_to_board = resources.files("pins") / "tests/pins-compat"
14-
15-
1613
# set up board ----
1714

1815

1916
@pytest.fixture(scope="session")
2017
def board(backend):
21-
board = backend.create_tmp_board(str(path_to_board.absolute()))
18+
board = backend.create_tmp_board(str(PATH_TO_EXAMPLE_BOARD.absolute()))
2219

2320
yield board
2421

@@ -112,7 +109,7 @@ def test_compat_pin_meta_version_arg_error(board):
112109
def test_compat_pin_read(board):
113110
import pandas as pd
114111

115-
p_data = path_to_board / "df_csv" / "20220214T163720Z-9bfad" / "df_csv.csv"
112+
p_data = PATH_TO_EXAMPLE_BOARD / "df_csv" / "20220214T163720Z-9bfad" / "df_csv.csv"
116113

117114
src_df = board.pin_read("df_csv")
118115
dst_df = pd.read_csv(p_data, index_col=0)

pins/tests/test_constructors.py

Lines changed: 48 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,66 @@
1-
import contextlib
21
import os
32
import pytest
43

54
from pathlib import Path
65

76
from pins import constructors as c
7+
from pins.tests.conftest import PATH_TO_EXAMPLE_BOARD
8+
from pins.tests.helpers import rm_env
9+
810

911
# adapted from https://stackoverflow.com/a/34333710
1012

1113

12-
@contextlib.contextmanager
13-
def rm_env(*args):
14-
"""
15-
Temporarily set the process environment variables.
14+
def check_dir_writable(p_dir):
15+
assert p_dir.parent.exists()
16+
assert os.access(p_dir.parent.absolute(), os.W_OK)
1617

1718

18-
"""
19-
old_environ = dict(os.environ)
20-
for arg in args:
21-
if arg in os.environ:
22-
del os.environ[arg]
19+
# End-to-end constructor tests
2320

24-
try:
25-
yield
26-
finally:
27-
os.environ.clear()
28-
os.environ.update(old_environ)
21+
# there are two facets of boards: reading and writing.
22+
# copied from test_compat
23+
def test_constructor_board_url(tmp_cache, http_example_board_path):
24+
board = c.board_urls(
25+
http_example_board_path, pin_paths={"df_csv": "df_csv/20220214T163718Z-eceac/"}
26+
)
2927

28+
board.pin_read("df_csv")
3029

31-
def check_dir_writable(p_dir):
32-
assert p_dir.parent.exists()
33-
assert os.access(p_dir.parent.absolute(), os.W_OK)
30+
# check cache
31+
# check data
32+
33+
34+
def test_constructor_board_github(tmp_cache, http_example_board_path):
35+
board = c.board_github("machow", "pins-python", PATH_TO_EXAMPLE_BOARD) # noqa
36+
37+
38+
@pytest.fixture(scope="session")
39+
def board(backend):
40+
# TODO: copied from test_compat.py
41+
42+
board = backend.create_tmp_board(str(PATH_TO_EXAMPLE_BOARD.absolute()))
43+
yield board
44+
backend.teardown_board(board)
45+
46+
47+
def test_constructor_board(board):
48+
prot = board.fs.protocol
49+
50+
fs_name = prot if isinstance(prot, str) else prot[0]
51+
52+
if fs_name == "file":
53+
con_name = "local"
54+
elif fs_name == "rsc":
55+
con_name = "rsconnect"
56+
pytest.xfail()
57+
else:
58+
con_name = fs_name
59+
60+
board = getattr(c, f"board_{con_name}")(board.board)
61+
62+
# check cache
63+
# check data
3464

3565

3666
# Board particulars ===========================================================

0 commit comments

Comments
 (0)