1
+ from datetime import datetime , timezone
1
2
from typing import Callable
2
3
3
4
import pytest
8
9
9
10
10
11
@pytest .mark .parametrize ('purge_on_start' , [True , False ])
11
- async def test_actor_memory_storage_client_e2e (
12
+ async def test_actor_memory_storage_client_key_value_store_e2e (
12
13
monkeypatch : pytest .MonkeyPatch ,
13
14
purge_on_start : bool ,
14
15
reset_default_instances : Callable [[], None ],
@@ -17,7 +18,7 @@ async def test_actor_memory_storage_client_e2e(
17
18
The second run attempts to access data created by the first one.
18
19
We run 2 configurations with different `purge_on_start`."""
19
20
# Configure purging env var
20
- monkeypatch .setenv (ApifyEnvVars .PURGE_ON_START , 'true' if purge_on_start else 'false ' )
21
+ monkeypatch .setenv (ApifyEnvVars .PURGE_ON_START , f' { int ( purge_on_start ) } ' )
21
22
# Store old storage client so we have the object reference for comparison
22
23
old_client = StorageClientManager .get_storage_client ()
23
24
async with Actor :
@@ -45,3 +46,77 @@ async def test_actor_memory_storage_client_e2e(
45
46
else :
46
47
assert default_value == 'default value'
47
48
assert non_default_value == 'non-default value'
49
+
50
+
51
+ @pytest .mark .parametrize ('purge_on_start' , [True , False ])
52
+ async def test_actor_memory_storage_client_request_queue_e2e (
53
+ monkeypatch : pytest .MonkeyPatch ,
54
+ purge_on_start : bool ,
55
+ reset_default_instances : Callable [[], None ],
56
+ ) -> None :
57
+ """This test simulates two clean runs using memory storage.
58
+ The second run attempts to access data created by the first one.
59
+ We run 2 configurations with different `purge_on_start`."""
60
+ # Configure purging env var
61
+ monkeypatch .setenv (ApifyEnvVars .PURGE_ON_START , f'{ int (purge_on_start )} ' )
62
+ async with Actor :
63
+ # Add some requests to the default queue
64
+ default_queue = await Actor .open_request_queue ()
65
+ for i in range (6 ):
66
+ request_url = f'http://example.com/{ i } '
67
+ forefront = i % 3 == 1
68
+ was_handled = i % 3 == 2
69
+ await default_queue .add_request ({
70
+ 'uniqueKey' : str (i ),
71
+ 'url' : request_url ,
72
+ 'handledAt' : datetime .now (timezone .utc ) if was_handled else None ,
73
+ }, forefront = forefront )
74
+
75
+ # We simulate another clean run, we expect the memory storage to read from the local data directory
76
+ # Default storages are purged based on purge_on_start parameter.
77
+ reset_default_instances ()
78
+
79
+ async with Actor :
80
+ # Add some more requests to the default queue
81
+ default_queue = await Actor .open_request_queue ()
82
+ for i in range (6 , 12 ):
83
+ request_url = f'http://example.com/{ i } '
84
+ forefront = i % 3 == 1
85
+ was_handled = i % 3 == 2
86
+ await default_queue .add_request ({
87
+ 'uniqueKey' : str (i ),
88
+ 'url' : request_url ,
89
+ 'handledAt' : datetime .now (timezone .utc ) if was_handled else None ,
90
+ }, forefront = forefront )
91
+
92
+ queue_info = await default_queue .get_info ()
93
+ assert queue_info is not None
94
+
95
+ # If the queue was purged between the runs, only the requests from the second run should be present, in the right order
96
+ if purge_on_start :
97
+ assert queue_info .get ('totalRequestCount' ) == 6
98
+ assert queue_info .get ('handledRequestCount' ) == 2
99
+
100
+ expected_pending_request_order = [10 , 7 , 6 , 9 ]
101
+ for request_number in expected_pending_request_order :
102
+ next_request = await default_queue .fetch_next_request ()
103
+ assert next_request is not None
104
+ assert next_request .get ('uniqueKey' ) == f'{ request_number } '
105
+ assert next_request .get ('url' ) == f'http://example.com/{ request_number } '
106
+
107
+ next_request = await default_queue .fetch_next_request ()
108
+ assert next_request is None
109
+ # If the queue was NOT purged between the runs, all the requests should be in the queue in the right order
110
+ else :
111
+ assert queue_info .get ('totalRequestCount' ) == 12
112
+ assert queue_info .get ('handledRequestCount' ) == 4
113
+
114
+ expected_pending_request_order = [10 , 7 , 4 , 1 , 0 , 3 , 6 , 9 ]
115
+ for request_number in expected_pending_request_order :
116
+ next_request = await default_queue .fetch_next_request ()
117
+ assert next_request is not None
118
+ assert next_request .get ('uniqueKey' ) == f'{ request_number } '
119
+ assert next_request .get ('url' ) == f'http://example.com/{ request_number } '
120
+
121
+ next_request = await default_queue .fetch_next_request ()
122
+ assert next_request is None
0 commit comments