blob: bc5f818b2c2deb3687263e8023528b8f3493e820 [file]
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
"""Unit tests for the plain (un-decorated) Hamilton functions.
The point of these tests: a Hamilton function is just a Python function. You
can import it and call it directly -- no Driver, no DAG, no fixtures required.
"""
import my_functions
import pandas as pd
import pytest
def test_avg_3wk_spend_returns_rolling_mean() -> None:
spend = pd.Series([10.0, 20.0, 30.0, 40.0])
result = my_functions.avg_3wk_spend(spend)
# The first two entries are NaN (window not full), then rolling mean of 3.
expected = pd.Series([float("nan"), float("nan"), 20.0, 30.0])
pd.testing.assert_series_equal(result, expected)
def test_spend_per_signup_divides_elementwise() -> None:
spend = pd.Series([100.0, 200.0])
signups = pd.Series([10.0, 50.0])
result = my_functions.spend_per_signup(spend=spend, signups=signups)
pd.testing.assert_series_equal(result, pd.Series([10.0, 4.0]))
def test_spend_zero_mean_centres_the_series() -> None:
spend = pd.Series([10.0, 20.0, 30.0])
spend_mean = 20.0
result = my_functions.spend_zero_mean(spend=spend, spend_mean=spend_mean)
pd.testing.assert_series_equal(result, pd.Series([-10.0, 0.0, 10.0]))
@pytest.mark.parametrize(
("raw", "expected_first"),
[
(pd.Series([0, 1, 2]), 1), # header sentinel dropped
(pd.Series([99, 5, 5, 5]), 5),
],
)
def test_signups_drops_header_row(raw: pd.Series, expected_first: int) -> None:
"""`pytest.mark.parametrize` is a clean way to cover edge cases."""
result = my_functions.signups(raw_signups=raw)
assert result.iloc[0] == expected_first
assert len(result) == len(raw) - 1