Skip to content

Commit e49b003

Browse files
authored
Merge pull request #378 from coding-kitties/fix/376-refactor-tests-scenarios
fix: refactor tests/scenarios for deterministic offline execution (#376)
2 parents f7a905e + 82affc8 commit e49b003

54 files changed

Lines changed: 11577 additions & 93575 deletions

File tree

Some content is hidden

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

.github/workflows/test.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,11 @@ jobs:
102102
run: |
103103
source $VENV
104104
coverage run -m unittest discover -s tests
105+
- name: Generate coverage report
106+
if: always()
107+
continue-on-error: true
108+
run: |
109+
source $VENV
105110
coverage xml
106111
#----------------------------------------------
107112
# upload coverage stats

tests/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+

tests/app/reporting/test_backtest_report.py

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import os
2+
import shutil
23
from datetime import datetime, timezone
34
from unittest import TestCase
45

@@ -23,6 +24,11 @@ def setUp(self):
2324
"resources"
2425
)
2526
)
27+
self.output_path = os.path.join(self.resource_dir, "backtest_report")
28+
29+
def tearDown(self):
30+
if os.path.exists(self.output_path):
31+
shutil.rmtree(self.output_path)
2632

2733
def test_save_without_algorithm(self):
2834
"""
@@ -47,8 +53,8 @@ def test_save_without_algorithm(self):
4753
)
4854
]
4955
backtest_date_range = BacktestDateRange(
50-
start_date="2023-08-07 07:00:00",
51-
end_date="2023-12-02 00:00:00",
56+
start_date=datetime(2023, 8, 7, 7, 0, tzinfo=timezone.utc),
57+
end_date=datetime(2023, 12, 2, 0, 0, tzinfo=timezone.utc),
5258
name="Test Backtest Date Range"
5359
)
5460
run = BacktestRun(
@@ -64,36 +70,32 @@ def test_save_without_algorithm(self):
6470
initial_unallocated=1000,
6571
created_at=datetime.now(tz=timezone.utc)
6672
)
67-
data_files = [
68-
os.path.join("tests", "resources", "market_data_sources_for_testing", "OHLCV_BTC-EUR_BINANCE_2h_2023-08-07-07-59_2023-12-02-00-00.csv"),
69-
os.path.join("tests", "resources", "market_data_sources_for_testing", "OHLCV_BTC-EUR_BINANCE_15m_2023-12-14-22-00_2023-12-25-00-00.csv"),
70-
]
7173

7274
backtest = Backtest(
7375
algorithm_id="alg-025",
7476
backtest_runs=[run],
7577
)
76-
output_path = os.path.join(self.resource_dir, "backtest_report")
77-
backtest.save(output_path)
78+
backtest.save(self.output_path)
7879

7980
# Check if the report was saved correctly
80-
self.assertTrue(os.path.exists(output_path))
81+
self.assertTrue(os.path.exists(self.output_path))
8182

8283
# Check if the runs directory exists
83-
runs_dir = os.path.join(output_path, "runs")
84+
runs_dir = os.path.join(self.output_path, "runs")
8485
self.assertTrue(os.path.exists(runs_dir))
8586

8687
# Check if the backtest run directory exists
8788
backtest_run_dir = os.path.join(
88-
runs_dir, "backtest_EUR_20230807_20231201"
89+
runs_dir, "backtest_EUR_20230807_20231202"
8990
)
9091
self.assertTrue(os.path.exists(backtest_run_dir))
9192

9293
# Check if the results were saved correctly
9394
self.assertTrue(
9495
os.path.exists(os.path.join(backtest_run_dir, "run.json"))
9596
)
96-
self.assertTrue(
97+
# No backtest_metrics provided, so metrics.json should not exist
98+
self.assertFalse(
9799
os.path.exists(os.path.join(backtest_run_dir, "metrics.json"))
98100
)
99101

@@ -118,8 +120,8 @@ def test_save_with_strategies_directory(self):
118120
)
119121
]
120122
backtest_date_range = BacktestDateRange(
121-
start_date="2023-08-07 07:00:00",
122-
end_date="2023-12-02 00:00:00",
123+
start_date=datetime(2023, 8, 7, 7, 0, tzinfo=timezone.utc),
124+
end_date=datetime(2023, 12, 2, 0, 0, tzinfo=timezone.utc),
123125
name="Test Backtest Date Range"
124126
)
125127
results = BacktestRun(
@@ -160,21 +162,18 @@ def test_save_with_strategies_directory(self):
160162
backtest_runs=[results],
161163
risk_free_rate=0.0
162164
)
163-
output_path = os.path.join(self.resource_dir, "backtest_report")
164-
backtest.save(output_path)
165-
166-
print(output_path)
165+
backtest.save(self.output_path)
167166

168167
# Check if the report was saved correctly
169-
self.assertTrue(os.path.exists(output_path))
168+
self.assertTrue(os.path.exists(self.output_path))
170169

171170
# Check if the runs directory exists
172-
runs_dir = os.path.join(output_path, "runs")
171+
runs_dir = os.path.join(self.output_path, "runs")
173172
self.assertTrue(os.path.exists(runs_dir))
174173

175174
# Check if the backtest run directory exists
176175
backtest_run_dir = os.path.join(
177-
runs_dir, "backtest_EUR_20230807_20231201"
176+
runs_dir, "backtest_EUR_20230807_20231202"
178177
)
179178
self.assertTrue(os.path.exists(backtest_run_dir))
180179

tests/domain/backtests/test_backtest_save.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@ def _create_snapshots(self):
4646

4747
def _create_date_range(self):
4848
return BacktestDateRange(
49-
start_date="2023-08-07 07:00:00",
50-
end_date="2023-12-02 00:00:00",
49+
start_date=datetime(2023, 8, 7, 7, 0, tzinfo=timezone.utc),
50+
end_date=datetime(2023, 12, 2, 0, 0, tzinfo=timezone.utc),
5151
name="Test Backtest Date Range"
5252
)
5353

@@ -80,7 +80,7 @@ def test_save_without_metrics(self):
8080
self.assertTrue(os.path.exists(runs_dir))
8181

8282
backtest_run_dir = os.path.join(
83-
runs_dir, "backtest_EUR_20230807_20231201"
83+
runs_dir, "backtest_EUR_20230807_20231202"
8484
)
8585
self.assertTrue(os.path.exists(backtest_run_dir))
8686
self.assertTrue(
@@ -144,7 +144,7 @@ def test_save_with_precomputed_metrics(self):
144144
self.assertTrue(os.path.exists(runs_dir))
145145

146146
backtest_run_dir = os.path.join(
147-
runs_dir, "backtest_EUR_20230807_20231201"
147+
runs_dir, "backtest_EUR_20230807_20231202"
148148
)
149149
self.assertTrue(os.path.exists(backtest_run_dir))
150150
self.assertTrue(

tests/domain/utils/test_polars.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,11 @@ def test_convert_pandas_to_polars(self):
3232
column_names = polars_df_converted.columns.tolist()
3333
self.assertEqual(set(column_names), {'Close'})
3434

35-
# Check if the index is a datetime object
36-
self.assertEqual(polars_df_converted.index.dtype, "datetime64[us]")
35+
# Check if the index is a datetime object (accept both ns and us
36+
# resolution since it depends on pandas version)
37+
self.assertTrue(
38+
str(polars_df_converted.index.dtype).startswith("datetime64")
39+
)
3740
self.assertEqual(
3841
polars_df_converted.index[0], Timestamp('2021-01-01 00:00:00')
3942
)

tests/infrastructure/data_providers/test_csv_ohlcv_data_provider.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ def test_right_columns(self):
3434
file_name = "OHLCV_BTC-EUR_BINANCE" \
3535
"_2h_2023-08-07-07-59_2023-12-02-00-00.csv"
3636
data_provider = CSVOHLCVDataProvider(
37-
storage_path=f"{self.resource_dir}/market_data_sources/"
37+
storage_path=f"{self.resource_dir}/test_data/ohlcv/"
3838
f"{file_name}",
3939
window_size=10,
4040
market="binance",
@@ -65,7 +65,7 @@ def test_throw_exception_when_missing_column_names_columns(self):
6565
CSVOHLCVDataProvider(
6666
storage_path=os.path.join(
6767
self.resource_dir,
68-
"market_data_sources_for_testing",
68+
"test_data", "ohlcv",
6969
file_name
7070
),
7171
window_size=10,
@@ -85,7 +85,7 @@ def test_has_data(self):
8585
"_2h_2023-08-07-07-59_2023-12-02-00-00.csv"
8686
data_provider = CSVOHLCVDataProvider(
8787
storage_path=os.path.join(
88-
self.resource_dir, "market_data_sources", file_name
88+
self.resource_dir, "test_data", "ohlcv", file_name
8989
),
9090
window_size=10,
9191
market="binance",
@@ -123,7 +123,7 @@ def test_has_data_backtest_mode(self):
123123
"_2h_2023-08-07-07-59_2023-12-02-00-00.csv"
124124
data_provider = CSVOHLCVDataProvider(
125125
storage_path=os.path.join(
126-
self.resource_dir, "market_data_sources", file_name
126+
self.resource_dir, "test_data", "ohlcv", file_name
127127
),
128128
window_size=10,
129129
market="binance",
@@ -167,7 +167,7 @@ def test_get_data_start_date(self):
167167
"_2h_2023-08-07-07-59_2023-12-02-00-00.csv"
168168
csv_ohlcv_market_data_source = CSVOHLCVDataProvider(
169169
storage_path=os.path.join(
170-
self.resource_dir, "market_data_sources", file_name
170+
self.resource_dir, "test_data", "ohlcv", file_name
171171
),
172172
window_size=200,
173173
market="binance",
@@ -210,7 +210,7 @@ def test_get_data_end_date(self):
210210
"_2h_2023-08-07-07-59_2023-12-02-00-00.csv"
211211
csv_ohlcv_market_data_source = CSVOHLCVDataProvider(
212212
storage_path=os.path.join(
213-
self.resource_dir, "market_data_sources", file_name
213+
self.resource_dir, "test_data", "ohlcv", file_name
214214
),
215215
window_size=200,
216216
market="binance",
@@ -239,7 +239,7 @@ def test_get_identifier(self):
239239
"_2h_2023-08-07-07-59_2023-12-02-00-00.csv"
240240
data_provider = CSVOHLCVDataProvider(
241241
storage_path=os.path.join(
242-
self.resource_dir, "market_data_sources", file_name
242+
self.resource_dir, "test_data", "ohlcv", file_name
243243
),
244244
data_provider_identifier="test",
245245
window_size=10,
@@ -254,7 +254,7 @@ def test_get_market(self):
254254
"_2h_2023-08-07-07-59_2023-12-02-00-00.csv"
255255
data_provider = CSVOHLCVDataProvider(
256256
storage_path=os.path.join(
257-
self.resource_dir, "market_data_sources", file_name
257+
self.resource_dir, "test_data", "ohlcv", file_name
258258
),
259259
market="test",
260260
symbol="BTC/EUR",
@@ -268,7 +268,7 @@ def test_get_symbol(self):
268268
"_2h_2023-08-07-07-59_2023-12-02-00-00.csv"
269269
data_provider = CSVOHLCVDataProvider(
270270
storage_path=os.path.join(
271-
self.resource_dir, "market_data_sources", file_name
271+
self.resource_dir, "test_data", "ohlcv", file_name
272272
),
273273
symbol="BTC/EUR",
274274
window_size=10,
@@ -289,7 +289,7 @@ def test_prepare_backtest_data(self):
289289
)
290290
data_provider = CSVOHLCVDataProvider(
291291
storage_path=os.path.join(
292-
self.resource_dir, "market_data_sources", file_name
292+
self.resource_dir, "test_data", "ohlcv", file_name
293293
),
294294
data_provider_identifier="test",
295295
market="binance",
@@ -345,7 +345,7 @@ def test_get_backtest_data(self):
345345
)
346346
data_provider = CSVOHLCVDataProvider(
347347
storage_path=os.path.join(
348-
self.resource_dir, "market_data_sources", file_name
348+
self.resource_dir, "test_data", "ohlcv", file_name
349349
),
350350
data_provider_identifier="test",
351351
market="binance",

0 commit comments

Comments
 (0)