77import asyncio
88import logging
99from collections .abc import AsyncIterator
10- from dataclasses import astuple
1110from datetime import datetime , timedelta , timezone
1211from unittest .mock import AsyncMock , MagicMock
1312
@@ -55,6 +54,12 @@ async def source_chan() -> AsyncIterator[Broadcast[Sample[Quantity]]]:
5554 await chan .close ()
5655
5756
57+ def as_float_tuple (sample : Sample [Quantity ]) -> tuple [datetime , float ]:
58+ """Convert a sample to a tuple of datetime and float value."""
59+ assert sample .value is not None , "Sample value should not be None"
60+ return (sample .timestamp , sample .value .base_value )
61+
62+
5863async def _advance_time (fake_time : time_machine .Coordinates , seconds : float ) -> None :
5964 """Advance the time by the given number of seconds.
6065
@@ -160,7 +165,7 @@ async def test_helper_buffer_too_big(
160165 helper = _ResamplingHelper ("test" , config )
161166
162167 for i in range (DEFAULT_BUFFER_LEN_MAX + 1 ):
163- sample = (datetime .now (timezone .utc ), Quantity ( i ) )
168+ sample = (datetime .now (timezone .utc ), i )
164169 helper .add_sample (sample )
165170 await _advance_time (fake_time , 1 )
166171
@@ -315,7 +320,7 @@ async def test_resampling_window_size_is_constant(
315320 )
316321 )
317322 resampling_fun_mock .assert_called_once_with (
318- a_sequence (astuple (sample1s )), config , source_props
323+ a_sequence (as_float_tuple (sample1s )), config , source_props
319324 )
320325 sink_mock .reset_mock ()
321326 resampling_fun_mock .reset_mock ()
@@ -343,9 +348,9 @@ async def test_resampling_window_size_is_constant(
343348 )
344349 resampling_fun_mock .assert_called_once_with (
345350 a_sequence (
346- astuple (sample2_5s ),
347- astuple (sample3s ),
348- astuple (sample4s ),
351+ as_float_tuple (sample2_5s ),
352+ as_float_tuple (sample3s ),
353+ as_float_tuple (sample4s ),
349354 ),
350355 config ,
351356 source_props ,
@@ -415,8 +420,8 @@ async def test_timer_errors_are_logged( # pylint: disable=too-many-statements
415420 )
416421 resampling_fun_mock .assert_called_once_with (
417422 a_sequence (
418- astuple (sample0s ),
419- astuple (sample1s ),
423+ as_float_tuple (sample0s ),
424+ as_float_tuple (sample1s ),
420425 ),
421426 config ,
422427 source_props ,
@@ -454,10 +459,10 @@ async def test_timer_errors_are_logged( # pylint: disable=too-many-statements
454459 )
455460 resampling_fun_mock .assert_called_once_with (
456461 a_sequence (
457- astuple (sample1s ),
458- astuple (sample2_5s ),
459- astuple (sample3s ),
460- astuple (sample4s ),
462+ as_float_tuple (sample1s ),
463+ as_float_tuple (sample2_5s ),
464+ as_float_tuple (sample3s ),
465+ as_float_tuple (sample4s ),
461466 ),
462467 config ,
463468 source_props ,
@@ -493,11 +498,11 @@ async def test_timer_errors_are_logged( # pylint: disable=too-many-statements
493498 )
494499 resampling_fun_mock .assert_called_once_with (
495500 a_sequence (
496- astuple (sample3s ),
497- astuple (sample4s ),
498- astuple (sample4_5s ),
499- astuple (sample5s ),
500- astuple (sample6s ),
501+ as_float_tuple (sample3s ),
502+ as_float_tuple (sample4s ),
503+ as_float_tuple (sample4_5s ),
504+ as_float_tuple (sample5s ),
505+ as_float_tuple (sample6s ),
501506 ),
502507 config ,
503508 source_props ,
@@ -570,8 +575,8 @@ async def test_future_samples_not_included(
570575 )
571576 resampling_fun_mock .assert_called_once_with (
572577 a_sequence (
573- astuple (sample0s ),
574- astuple (sample1s ),
578+ as_float_tuple (sample0s ),
579+ as_float_tuple (sample1s ),
575580 ),
576581 config ,
577582 source_props , # sample2_1s is not here
@@ -600,9 +605,9 @@ async def test_future_samples_not_included(
600605 )
601606 resampling_fun_mock .assert_called_once_with (
602607 a_sequence (
603- astuple (sample1s ),
604- astuple (sample2_1s ),
605- astuple (sample3s ),
608+ as_float_tuple (sample1s ),
609+ as_float_tuple (sample2_1s ),
610+ as_float_tuple (sample3s ),
606611 ),
607612 config ,
608613 source_props , # sample4_1s is not here
@@ -662,7 +667,7 @@ async def test_resampling_with_one_window(
662667 )
663668 resampling_fun_mock .assert_called_once_with (
664669 a_sequence (
665- astuple (sample1s ),
670+ as_float_tuple (sample1s ),
666671 ),
667672 config ,
668673 source_props ,
@@ -693,9 +698,9 @@ async def test_resampling_with_one_window(
693698 )
694699 resampling_fun_mock .assert_called_once_with (
695700 a_sequence (
696- astuple (sample2_5s ),
697- astuple (sample3s ),
698- astuple (sample4s ),
701+ as_float_tuple (sample2_5s ),
702+ as_float_tuple (sample3s ),
703+ as_float_tuple (sample4s ),
699704 ),
700705 config ,
701706 source_props ,
@@ -786,8 +791,8 @@ async def test_resampling_with_one_and_a_half_windows( # pylint: disable=too-ma
786791 )
787792 resampling_fun_mock .assert_called_once_with (
788793 a_sequence (
789- astuple (sample0s ),
790- astuple (sample1s ),
794+ as_float_tuple (sample0s ),
795+ as_float_tuple (sample1s ),
791796 ),
792797 config ,
793798 source_props ,
@@ -819,9 +824,9 @@ async def test_resampling_with_one_and_a_half_windows( # pylint: disable=too-ma
819824 # It should include samples in the interval (1, 4] seconds
820825 resampling_fun_mock .assert_called_once_with (
821826 a_sequence (
822- astuple (sample2_5s ),
823- astuple (sample3s ),
824- astuple (sample4s ),
827+ as_float_tuple (sample2_5s ),
828+ as_float_tuple (sample3s ),
829+ as_float_tuple (sample4s ),
825830 ),
826831 config ,
827832 source_props ,
@@ -851,9 +856,9 @@ async def test_resampling_with_one_and_a_half_windows( # pylint: disable=too-ma
851856 # It should include samples in the interval (3, 6] seconds
852857 resampling_fun_mock .assert_called_once_with (
853858 a_sequence (
854- astuple (sample4s ),
855- astuple (sample5s ),
856- astuple (sample6s ),
859+ as_float_tuple (sample4s ),
860+ as_float_tuple (sample5s ),
861+ as_float_tuple (sample6s ),
857862 ),
858863 config ,
859864 source_props ,
@@ -885,7 +890,7 @@ async def test_resampling_with_one_and_a_half_windows( # pylint: disable=too-ma
885890 )
886891 # It should include samples in the interval (5, 8] seconds
887892 resampling_fun_mock .assert_called_once_with (
888- a_sequence (astuple (sample6s )),
893+ a_sequence (as_float_tuple (sample6s )),
889894 config ,
890895 source_props ,
891896 )
@@ -965,8 +970,8 @@ async def test_resampling_with_two_windows( # pylint: disable=too-many-statemen
965970 )
966971 resampling_fun_mock .assert_called_once_with (
967972 a_sequence (
968- astuple (sample0s ),
969- astuple (sample1s ),
973+ as_float_tuple (sample0s ),
974+ as_float_tuple (sample1s ),
970975 ),
971976 config ,
972977 source_props ,
@@ -998,10 +1003,10 @@ async def test_resampling_with_two_windows( # pylint: disable=too-many-statemen
9981003 # It should include samples in the interval (0, 4] seconds
9991004 resampling_fun_mock .assert_called_once_with (
10001005 a_sequence (
1001- astuple (sample1s ),
1002- astuple (sample2_5s ),
1003- astuple (sample3s ),
1004- astuple (sample4s ),
1006+ as_float_tuple (sample1s ),
1007+ as_float_tuple (sample2_5s ),
1008+ as_float_tuple (sample3s ),
1009+ as_float_tuple (sample4s ),
10051010 ),
10061011 config ,
10071012 source_props ,
@@ -1031,11 +1036,11 @@ async def test_resampling_with_two_windows( # pylint: disable=too-many-statemen
10311036 # It should include samples in the interval (2, 6] seconds
10321037 resampling_fun_mock .assert_called_once_with (
10331038 a_sequence (
1034- astuple (sample2_5s ),
1035- astuple (sample3s ),
1036- astuple (sample4s ),
1037- astuple (sample5s ),
1038- astuple (sample6s ),
1039+ as_float_tuple (sample2_5s ),
1040+ as_float_tuple (sample3s ),
1041+ as_float_tuple (sample4s ),
1042+ as_float_tuple (sample5s ),
1043+ as_float_tuple (sample6s ),
10391044 ),
10401045 config ,
10411046 source_props ,
@@ -1061,8 +1066,8 @@ async def test_resampling_with_two_windows( # pylint: disable=too-many-statemen
10611066 # It should include samples in the interval (4, 8] seconds
10621067 resampling_fun_mock .assert_called_once_with (
10631068 a_sequence (
1064- astuple (sample5s ),
1065- astuple (sample6s ),
1069+ as_float_tuple (sample5s ),
1070+ as_float_tuple (sample6s ),
10661071 ),
10671072 config ,
10681073 source_props ,
@@ -1130,7 +1135,7 @@ async def test_receiving_stopped_resampling_error(
11301135 )
11311136 )
11321137 resampling_fun_mock .assert_called_once_with (
1133- a_sequence (astuple (sample0s )), config , source_props
1138+ a_sequence (as_float_tuple (sample0s )), config , source_props
11341139 )
11351140 sink_mock .reset_mock ()
11361141 resampling_fun_mock .reset_mock ()
@@ -1266,11 +1271,11 @@ async def test_timer_is_aligned(
12661271 )
12671272 resampling_fun_mock .assert_called_once_with (
12681273 a_sequence (
1269- astuple (sample1s ),
1270- astuple (sample1_5s ),
1271- astuple (sample2_5s ),
1272- astuple (sample3s ),
1273- astuple (sample4s ),
1274+ as_float_tuple (sample1s ),
1275+ as_float_tuple (sample1_5s ),
1276+ as_float_tuple (sample2_5s ),
1277+ as_float_tuple (sample3s ),
1278+ as_float_tuple (sample4s ),
12741279 ),
12751280 config ,
12761281 source_props ,
@@ -1337,7 +1342,7 @@ async def test_resampling_all_zeros(
13371342 )
13381343 )
13391344 resampling_fun_mock .assert_called_once_with (
1340- a_sequence (astuple (sample1s )), config , source_props
1345+ a_sequence (as_float_tuple (sample1s )), config , source_props
13411346 )
13421347 assert source_props == SourceProperties (
13431348 sampling_start = timestamp , received_samples = 2 , sampling_period = None
@@ -1365,9 +1370,9 @@ async def test_resampling_all_zeros(
13651370 )
13661371 resampling_fun_mock .assert_called_once_with (
13671372 a_sequence (
1368- astuple (sample2_5s ),
1369- astuple (sample3s ),
1370- astuple (sample4s ),
1373+ as_float_tuple (sample2_5s ),
1374+ as_float_tuple (sample3s ),
1375+ as_float_tuple (sample4s ),
13711376 ),
13721377 config ,
13731378 source_props ,
0 commit comments