import numpy as np from sklearn.preprocessing import MinMaxScaler from app.services.forecaster import forecast_recursive class IncrementModel: def predict(self, model_input, verbose=0): return np.asarray([[model_input[0, -1, 0] + 0.1]]) def test_recursive_forecast_uses_scaled_feedback_and_keeps_prefix(): scaler = MinMaxScaler().fit(np.asarray([[0.0], [100.0]])) window = np.asarray([10.0, 20.0, 30.0]) prices, out_of_range = forecast_recursive(IncrementModel(), scaler, window, 5) assert prices == [40, 50, 60, 70, 80] assert out_of_range is False def test_forecast_never_returns_negative_prices(): class NegativeModel: def predict(self, model_input, verbose=0): return np.asarray([[-2.0]]) scaler = MinMaxScaler().fit(np.asarray([[0.0], [100.0]])) prices, _ = forecast_recursive(NegativeModel(), scaler, np.asarray([10.0, 20.0, 30.0]), 1) assert prices == [0]