Skip to content

Commit 9178a6a

Browse files
authored
test: make tests independent of working directory (#67)
Closes #57. ### Summary of Changes `pytest` can now be launched in any subdirectory of the `tests` folder and tests still work. When we access test data in the `tests/resources` folder, we should now always use the new function `resolve_resource_path` to get an absolute path to a resource, which is thus independent of the working directory. --------- Co-authored-by: lars-reimann <[email protected]>
1 parent ec27236 commit 9178a6a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+245
-132
lines changed

tests/fixtures/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from ._resources import resolve_resource_path

tests/fixtures/_resources.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import os
2+
3+
_resources_root = os.path.join(os.path.dirname(__file__), "..", "resources")
4+
5+
6+
def resolve_resource_path(resource_path: str) -> str:
7+
"""
8+
Resolves a path relative to the `resources` directory to an absolute path.
9+
10+
Parameters
11+
----------
12+
resource_path : str
13+
The path to the resource relative to the `resources` directory.
14+
15+
Returns
16+
-------
17+
absolute_path : str
18+
The absolute path to the resource.
19+
"""
20+
21+
return os.path.join(_resources_root, resource_path)
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
from safeds.data.tabular.containers import Table
2+
from tests.fixtures import resolve_resource_path
23

34

45
def test_has_column_positive() -> None:
5-
table = Table.from_csv("tests/resources/test_table_has_column.csv")
6+
table = Table.from_csv(resolve_resource_path("test_table_has_column.csv"))
67
row = table.to_rows()[0]
78
assert row.has_column("A")
89

910

1011
def test_has_column_negative() -> None:
11-
table = Table.from_csv("tests/resources/test_table_has_column.csv")
12+
table = Table.from_csv(resolve_resource_path("test_table_has_column.csv"))
1213
row = table.to_rows()[0]
1314
assert not row.has_column("C")
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
import pytest
22
from safeds.data.tabular.containers import Table
33
from safeds.exceptions import UnknownColumnNameError
4+
from tests.fixtures import resolve_resource_path
45

56

67
def test_table_column_drop() -> None:
7-
table = Table.from_csv("tests/resources/test_table_read_csv.csv")
8+
table = Table.from_csv(resolve_resource_path("test_table_read_csv.csv"))
89
transformed_table = table.drop_columns(["A"])
910
assert transformed_table.schema.has_column(
1011
"B"
1112
) and not transformed_table.schema.has_column("A")
1213

1314

1415
def test_table_column_drop_warning() -> None:
15-
table = Table.from_csv("tests/resources/test_table_read_csv.csv")
16+
table = Table.from_csv(resolve_resource_path("test_table_read_csv.csv"))
1617
with pytest.raises(UnknownColumnNameError):
1718
table.drop_columns(["C"])
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
import pytest
22
from safeds.data.tabular.containers import Table
33
from safeds.exceptions import UnknownColumnNameError
4+
from tests.fixtures import resolve_resource_path
45

56

67
def test_table_column_keep() -> None:
7-
table = Table.from_csv("tests/resources/test_table_read_csv.csv")
8+
table = Table.from_csv(resolve_resource_path("test_table_read_csv.csv"))
89
transformed_table = table.keep_columns(["A"])
910
assert transformed_table.schema.has_column(
1011
"A"
1112
) and not transformed_table.schema.has_column("B")
1213

1314

1415
def test_table_column_keep_warning() -> None:
15-
table = Table.from_csv("tests/resources/test_table_read_csv.csv")
16+
table = Table.from_csv(resolve_resource_path("test_table_read_csv.csv"))
1617
with pytest.raises(UnknownColumnNameError):
1718
table.keep_columns(["C"])
Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
import pandas as pd
22
import pytest
33
from safeds.data.tabular.containers import Table
4+
from tests.fixtures import resolve_resource_path
45

56

67
@pytest.mark.parametrize(
78
"path",
89
[
9-
"tests/resources/test_table_duplicate_rows_duplicates.csv",
10-
"tests/resources/test_table_duplicate_rows_no_duplicates.csv",
10+
"test_table_duplicate_rows_duplicates.csv",
11+
"test_table_duplicate_rows_no_duplicates.csv",
1112
],
1213
)
1314
def test_drop_duplicate_rows(path: str) -> None:
1415
expected_table = Table(pd.DataFrame(data={"A": [1, 4], "B": [2, 5]}))
15-
table = Table.from_csv(path)
16+
table = Table.from_csv(resolve_resource_path(path))
1617
result_table = table.drop_duplicate_rows()
1718
assert expected_table == result_table

tests/safeds/data/tabular/containers/_table/test_from_columns.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@
22
import pytest
33
from safeds.data.tabular.containers import Column, Table
44
from safeds.exceptions import MissingDataError
5+
from tests.fixtures import resolve_resource_path
56

67

78
def test_from_columns() -> None:
8-
table_expected = Table.from_csv("tests/resources/test_column_table.csv")
9+
table_expected = Table.from_csv(resolve_resource_path("test_column_table.csv"))
910
columns_table: list[Column] = [
1011
Column(pd.Series([1, 4]), "A"),
1112
Column(pd.Series([2, 5]), "B"),

tests/safeds/data/tabular/containers/_table/test_from_rows.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import pytest
22
from safeds.data.tabular.containers import Row, Table
33
from safeds.exceptions import MissingDataError
4+
from tests.fixtures import resolve_resource_path
45

56

67
def test_from_rows() -> None:
7-
table_expected = Table.from_csv("tests/resources/test_row_table.csv")
8+
table_expected = Table.from_csv(resolve_resource_path("test_row_table.csv"))
89
rows_is: list[Row] = table_expected.to_rows()
910
table_is: Table = Table.from_rows(rows_is)
1011

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,22 @@
11
import pytest
22
from safeds.data.tabular.containers import Table
33
from safeds.exceptions import IndexOutOfBoundsError
4+
from tests.fixtures import resolve_resource_path
45

56

67
def test_get_row() -> None:
7-
table = Table.from_csv("tests/resources/test_table_read_csv.csv")
8+
table = Table.from_csv(resolve_resource_path("test_table_read_csv.csv"))
89
val = table.get_row(0)
910
assert val.get_value("A") == 1 and val.get_value("B") == 2
1011

1112

1213
def test_get_row_negative_index() -> None:
13-
table = Table.from_csv("tests/resources/test_table_read_csv.csv")
14+
table = Table.from_csv(resolve_resource_path("test_table_read_csv.csv"))
1415
with pytest.raises(IndexOutOfBoundsError):
1516
table.get_row(-1)
1617

1718

1819
def test_get_row_out_of_bounds_index() -> None:
19-
table = Table.from_csv("tests/resources/test_table_read_csv.csv")
20+
table = Table.from_csv(resolve_resource_path("test_table_read_csv.csv"))
2021
with pytest.raises(IndexOutOfBoundsError):
2122
table.get_row(5)
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
from safeds.data.tabular.containers import Table
2+
from tests.fixtures import resolve_resource_path
23

34

45
def test_has_column_positive() -> None:
5-
table = Table.from_csv("tests/resources/test_table_has_column.csv")
6+
table = Table.from_csv(resolve_resource_path("test_table_has_column.csv"))
67
assert table.has_column("A")
78

89

910
def test_has_column_negative() -> None:
10-
table = Table.from_csv("tests/resources/test_table_has_column.csv")
11+
table = Table.from_csv(resolve_resource_path("test_table_has_column.csv"))
1112
assert not table.has_column("C")
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import pytest
22
from safeds.data.tabular.containers import Table
3+
from tests.fixtures import resolve_resource_path
34

45

56
def test_read_csv_valid() -> None:
6-
table = Table.from_csv("tests/resources/test_table_read_csv.csv")
7+
table = Table.from_csv(resolve_resource_path("test_table_read_csv.csv"))
78
assert (
89
table.get_column("A").get_value(0) == 1
910
and table.get_column("B").get_value(0) == 2
@@ -12,4 +13,4 @@ def test_read_csv_valid() -> None:
1213

1314
def test_read_csv_invalid() -> None:
1415
with pytest.raises(FileNotFoundError):
15-
Table.from_csv("tests/resources/test_table_read_csv_invalid.csv")
16+
Table.from_csv(resolve_resource_path("test_table_read_csv_invalid.csv"))
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import pytest
22
from safeds.data.tabular.containers import Table
3+
from tests.fixtures import resolve_resource_path
34

45

56
def test_read_json_valid() -> None:
6-
table = Table.from_json("tests/resources/test_table_read_json.json")
7+
table = Table.from_json(resolve_resource_path("test_table_read_json.json"))
78
assert (
89
table.get_column("A").get_value(0) == 1
910
and table.get_column("B").get_value(0) == 2
@@ -12,4 +13,4 @@ def test_read_json_valid() -> None:
1213

1314
def test_read_json_invalid() -> None:
1415
with pytest.raises(FileNotFoundError):
15-
Table.from_json("tests/resources/test_table_read_json_invalid.json")
16+
Table.from_json(resolve_resource_path("test_table_read_json_invalid.json"))

tests/safeds/data/tabular/containers/_table/test_rename.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import pytest
22
from safeds.data.tabular.containers import Table
33
from safeds.exceptions import DuplicateColumnNameError, UnknownColumnNameError
4+
from tests.fixtures import resolve_resource_path
45

56

67
@pytest.mark.parametrize(
@@ -10,7 +11,7 @@
1011
def test_rename_valid(
1112
name_from: str, name_to: str, column_one: str, column_two: str
1213
) -> None:
13-
table: Table = Table.from_csv("tests/resources/test_table_read_csv.csv")
14+
table: Table = Table.from_csv(resolve_resource_path("test_table_read_csv.csv"))
1415
renamed_table = table.rename_column(name_from, name_to)
1516
assert renamed_table.schema.has_column(column_one)
1617
assert renamed_table.schema.has_column(column_two)
@@ -26,6 +27,6 @@ def test_rename_valid(
2627
],
2728
)
2829
def test_rename_invalid(name_from: str, name_to: str, error: Exception) -> None:
29-
table: Table = Table.from_csv("tests/resources/test_table_read_csv.csv")
30+
table: Table = Table.from_csv(resolve_resource_path("test_table_read_csv.csv"))
3031
with pytest.raises(error):
3132
table.rename_column(name_from, name_to)

tests/safeds/data/tabular/containers/_table/test_replace_column.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,21 @@
66
DuplicateColumnNameError,
77
UnknownColumnNameError,
88
)
9+
from tests.fixtures import resolve_resource_path
910

1011

1112
@pytest.mark.parametrize(
1213
"column_name, path",
1314
[
14-
("C", "tests/resources/test_table_replace_column_output_different_name.csv"),
15-
("D", "tests/resources/test_table_replace_column_output_same_name.csv"),
15+
("C", "test_table_replace_column_output_different_name.csv"),
16+
("D", "test_table_replace_column_output_same_name.csv"),
1617
],
1718
)
1819
def test_replace_valid(column_name: str, path: str) -> None:
1920
input_table: Table = Table.from_csv(
20-
"tests/resources/test_table_replace_column_input.csv"
21+
resolve_resource_path("test_table_replace_column_input.csv")
2122
)
22-
expected: Table = Table.from_csv(path)
23+
expected: Table = Table.from_csv(resolve_resource_path(path))
2324

2425
column = Column(pd.Series(["d", "e", "f"]), column_name)
2526

@@ -43,7 +44,7 @@ def test_replace_invalid(
4344
error: type[Exception],
4445
) -> None:
4546
input_table: Table = Table.from_csv(
46-
"tests/resources/test_table_replace_column_input.csv"
47+
resolve_resource_path("test_table_replace_column_input.csv")
4748
)
4849
column = Column(pd.Series(column_values), column_name)
4950

tests/safeds/data/tabular/containers/_table/test_table_add_column.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,16 @@
22
import pytest
33
from safeds.data.tabular.containers import Column, Table
44
from safeds.exceptions import ColumnSizeError, DuplicateColumnNameError
5+
from tests.fixtures import resolve_resource_path
56

67

78
def test_table_add_column_valid() -> None:
89
input_table = Table.from_csv(
9-
"tests/resources/test_table_add_column_valid_input.csv"
10+
resolve_resource_path("test_table_add_column_valid_input.csv")
11+
)
12+
expected = Table.from_csv(
13+
resolve_resource_path("test_table_add_column_valid_output.csv")
1014
)
11-
expected = Table.from_csv("tests/resources/test_table_add_column_valid_output.csv")
1215
column = Column(pd.Series(["a", "b", "c"]), "C")
1316

1417
result = input_table.add_column(column)
@@ -26,7 +29,7 @@ def test_table_add_column_(
2629
column_values: list[str], column_name: str, error: type[Exception]
2730
) -> None:
2831
input_table = Table.from_csv(
29-
"tests/resources/test_table_add_column_valid_input.csv"
32+
resolve_resource_path("test_table_add_column_valid_input.csv")
3033
)
3134
column = Column(pd.Series(column_values), column_name)
3235

tests/safeds/data/tabular/containers/_table/test_to_columns.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
import pandas as pd
22
import pytest
33
from safeds.data.tabular.containers import Column, Table
4+
from tests.fixtures import resolve_resource_path
45

56

67
@pytest.mark.parametrize(
78
"values, name, index",
89
[([1, 4], "A", 0), ([2, 5], "B", 1)],
910
)
1011
def test_to_columns(values: list[int], name: str, index: int) -> None:
11-
table = Table.from_csv("tests/resources/test_column_table.csv")
12+
table = Table.from_csv(resolve_resource_path("test_column_table.csv"))
1213
columns_list: list[Column] = table.to_columns()
1314

1415
column_expected: Column = Column(pd.Series(values, name=name), name)

tests/safeds/data/tabular/containers/_table/test_to_rows.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import pandas as pd
22
from safeds.data.tabular.containers import Row, Table
33
from safeds.data.tabular.typing import IntColumnType, StringColumnType, TableSchema
4+
from tests.fixtures import resolve_resource_path
45

56

67
def test_to_rows() -> None:
7-
table = Table.from_csv("tests/resources/test_row_table.csv")
8+
table = Table.from_csv(resolve_resource_path("test_row_table.csv"))
89
expected_schema: TableSchema = TableSchema(
910
{
1011
"A": IntColumnType(),

tests/safeds/data/tabular/containers/_table/test_transform_column.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,26 @@
11
import pytest
22
from safeds.data.tabular.containers import Table
33
from safeds.exceptions import UnknownColumnNameError
4+
from tests.fixtures import resolve_resource_path
45

56

67
def test_transform_column_valid() -> None:
78
input_table: Table = Table.from_csv(
8-
"tests/resources/test_table_transform_column.csv"
9+
resolve_resource_path("test_table_transform_column.csv")
910
)
1011

1112
result: Table = input_table.transform_column(
1213
"A", lambda row: row.get_value("A") * 2
1314
)
1415

1516
assert result == Table.from_csv(
16-
"tests/resources/test_table_transform_column_output.csv"
17+
resolve_resource_path("test_table_transform_column_output.csv")
1718
)
1819

1920

2021
def test_transform_column_invalid() -> None:
2122
input_table: Table = Table.from_csv(
22-
"tests/resources/test_table_transform_column.csv"
23+
resolve_resource_path("test_table_transform_column.csv")
2324
)
2425

2526
with pytest.raises(UnknownColumnNameError):

tests/safeds/data/tabular/containers/_tagged_table/test_feature_vectors.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
from safeds.data.tabular.containers import Table, TaggedTable
2+
from tests.fixtures import resolve_resource_path
23

34

45
def test_tagged_table_feature_vectors() -> None:
5-
table = Table.from_csv("tests/resources/test_tagged_table.csv")
6+
table = Table.from_csv(resolve_resource_path("test_tagged_table.csv"))
67
tagged_table = TaggedTable(table, "T")
78
assert "T" not in tagged_table.feature_vectors._data
89
assert tagged_table.feature_vectors.schema.has_column("A")
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
from safeds.data.tabular.containers import Table, TaggedTable
2+
from tests.fixtures import resolve_resource_path
23

34

45
def test_tagged_table_target_values() -> None:
5-
table = Table.from_csv("tests/resources/test_tagged_table.csv")
6+
table = Table.from_csv(resolve_resource_path("test_tagged_table.csv"))
67
tagged_table = TaggedTable(table, "T")
78
assert tagged_table.target_values._data[0] == 0
89
assert tagged_table.target_values._data[1] == 1
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import numpy as np
22
from safeds.data.tabular.containers import Table
33
from safeds.data.tabular.typing import ColumnType
4+
from tests.fixtures import resolve_resource_path
45

56

67
def test_get_type_of_column() -> None:
7-
table = Table.from_json("tests/resources/test_schema_table.json")
8+
table = Table.from_json(resolve_resource_path("test_schema_table.json"))
89
table_column_type = table.schema.get_type_of_column("A")
910
assert table_column_type == ColumnType.from_numpy_dtype(np.dtype("int64"))

0 commit comments

Comments
 (0)