diff --git a/tests/api/__init__.py b/tests/api/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..4265cc3e6c16c09774190fa55d609cd9fe0808e4 --- /dev/null +++ b/tests/api/__init__.py @@ -0,0 +1 @@ +#!/usr/bin/env python diff --git a/tests/core/test_creation.py b/tests/api/test_creation.py similarity index 100% rename from tests/core/test_creation.py rename to tests/api/test_creation.py diff --git a/tests/integration/__init__.py b/tests/cli/__init__.py similarity index 100% rename from tests/integration/__init__.py rename to tests/cli/__init__.py diff --git a/tests/integration/test_integration.py b/tests/cli/test_integration.py similarity index 100% rename from tests/integration/test_integration.py rename to tests/cli/test_integration.py diff --git a/tests/common.py b/tests/common.py index e4c3bf9220266ba2e5f95df45ea9336411cdb008..3c4ce5ffac3607a5ccb3d424866958db7338b42e 100644 --- a/tests/common.py +++ b/tests/common.py @@ -23,8 +23,17 @@ def flagAll(data, field, flags, **kwargs): return data, flags +def dataDios(columns, start_date="2017-01-01", freq='1d', rows=10): + di = dios.DictOfSeries(itype=dios.DtItype) + dates = pd.date_range(start=start_date, end=None, freq=freq, periods=rows) + dummy = np.arange(len(dates)) + for i, col in enumerate(columns): + di[col] = pd.Series(data=dummy * (i+1), index=dates) + return di + + def initData( - cols=2, start_date="2017-01-01", end_date="2017-12-31", freq=None, rows=None + cols=2, start_date="2017-01-01", end_date="2017-12-31", freq=None, rows=None ): if rows is None: freq = freq or "1h" diff --git a/tests/core/test_core.py b/tests/core/test_core.py index 297f211c15c6e2271b8a77e3a4d7a677fb6974aa..aad2edddcf0b35b1bc889f1ea68067b7e5030a72 100644 --- a/tests/core/test_core.py +++ b/tests/core/test_core.py @@ -13,13 +13,13 @@ import pandas as pd import saqc from saqc.core import initFlagsLike, SaQC, register from saqc.core.flags import Flags -from saqc.core.register import processing +from saqc.core.register import processing, flagging +import copy from tests.common import initData, flagAll OPTIONAL = [False, True] - register(mask=["field"], demask=["field"], squeeze=["field"])(flagAll) @@ -40,22 +40,10 @@ def test_errorHandling(data): raise TypeError var1 = data.columns[0] + qc = SaQC(data) with pytest.raises(TypeError): - SaQC(data).raisingFunc(var1) - - -def test_duplicatedVariable(): - data = initData(1) - var1 = data.columns[0] - - pflags = SaQC(data).flagDummy(var1).result.flags - - if isinstance(pflags.columns, pd.MultiIndex): - cols = pflags.columns.get_level_values(0).drop_duplicates() - assert np.all(cols == [var1]) - else: - assert (pflags.columns == [var1]).all() + qc.raisingFunc(var1) @pytest.mark.parametrize("optional", OPTIONAL) @@ -191,3 +179,62 @@ def test_sourceTargetMulti(): return data, flags SaQC(data, flags).flagMulti(field=fields, target=targets) + + +def test_unknown_attribute(): + qc = SaQC() + with pytest.raises(AttributeError): + qc._construct(_spam="eggs") + + +def test_validation(data): + """Test if validation detects different columns in data and flags.""" + df = pd.DataFrame( + data=np.arange(8).reshape(4, 2), + index=pd.date_range("2020", None, 4, "1d"), + columns=list("ab"), + ) + qc = SaQC(df) + + @flagging() + def flagFoo(data, field, flags, **kwargs): + data["spam"] = data[field] + return data, flags + + with pytest.raises(RuntimeError): + qc.flagFoo("a") + + +@pytest.mark.skip(reason="bug in register, see #GL 342") +def test_validation_flags(data): + """Test if validation detects different columns in data and flags.""" + df = pd.DataFrame( + data=np.arange(8).reshape(4, 2), + index=pd.date_range("2020", None, 4, "1d"), + columns=list("ab"), + ) + qc = SaQC(df) + + @flagging() + def flagFoo(data, field, flags, **kwargs): + flags["spam"] = flags[field] + return data, flags + + with pytest.raises(RuntimeError): + qc.flagFoo("a") + + +def test__copy__(): + orig = SaQC() + orig.attrs["spam"] = [] # a higher object + shallow = copy.copy(orig) + assert shallow is not orig + assert shallow.attrs["spam"] is orig.attrs["spam"] + + +def test__deepcopy__(): + orig = SaQC() + orig.attrs["spam"] = [] # a higher object + shallow = copy.deepcopy(orig) + assert shallow is not orig + assert shallow.attrs["spam"] is not orig.attrs["spam"] diff --git a/tests/core/test_register.py b/tests/core/test_register.py new file mode 100644 index 0000000000000000000000000000000000000000..4265cc3e6c16c09774190fa55d609cd9fe0808e4 --- /dev/null +++ b/tests/core/test_register.py @@ -0,0 +1 @@ +#!/usr/bin/env python diff --git a/tests/deprecated/__init__.py b/tests/deprecated/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..4265cc3e6c16c09774190fa55d609cd9fe0808e4 --- /dev/null +++ b/tests/deprecated/__init__.py @@ -0,0 +1 @@ +#!/usr/bin/env python diff --git a/tests/deprecated/test_deprecated.py b/tests/deprecated/test_deprecated.py new file mode 100644 index 0000000000000000000000000000000000000000..905a5ca6feb8afdc9acb32b9ad2a7468fa25ef38 --- /dev/null +++ b/tests/deprecated/test_deprecated.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python + +import pytest +from tests.common import initData +from saqc import SaQC +import pandas as pd +import numpy as np + + +# this tests seems to do nothing with duplicates +@pytest.mark.parametrize("data", [initData(1)]) +def test_duplicatedVariable(data): + var1 = data.columns[0] + + pflags = SaQC(data).flagDummy(var1).result.flags + + if isinstance(pflags.columns, pd.MultiIndex): + cols = pflags.columns.get_level_values(0).drop_duplicates() + assert np.all(cols == [var1]) + else: + assert (pflags.columns == [var1]).all()