|
2 | 2 |
|
3 | 3 | from typing import TYPE_CHECKING |
4 | 4 |
|
5 | | -from apify_shared.consts import ApifyEnvVars |
6 | | - |
7 | | -from ._utils import generate_unique_resource_name |
8 | 5 | from apify import Actor |
9 | 6 |
|
10 | 7 | if TYPE_CHECKING: |
11 | | - import pytest |
12 | | - |
13 | | - from apify_client import ApifyClientAsync |
14 | | - |
15 | 8 | from .conftest import MakeActorFunction, RunActorFunction |
16 | 9 |
|
17 | 10 |
|
18 | | -async def test_same_references_in_default_kvs( |
19 | | - make_actor: MakeActorFunction, |
20 | | - run_actor: RunActorFunction, |
21 | | -) -> None: |
22 | | - async def main() -> None: |
23 | | - async with Actor: |
24 | | - kvs1 = await Actor.open_key_value_store() |
25 | | - kvs2 = await Actor.open_key_value_store() |
26 | | - assert kvs1 is kvs2 |
27 | | - |
28 | | - actor = await make_actor(label='kvs-same-ref-default', main_func=main) |
29 | | - run_result = await run_actor(actor) |
30 | | - |
31 | | - assert run_result.status == 'SUCCEEDED' |
32 | | - |
33 | | - |
34 | | -async def test_same_references_in_named_kvs( |
35 | | - make_actor: MakeActorFunction, |
36 | | - run_actor: RunActorFunction, |
37 | | -) -> None: |
38 | | - kvs_name = generate_unique_resource_name('key-value-store') |
39 | | - |
40 | | - async def main() -> None: |
41 | | - async with Actor: |
42 | | - input_object = await Actor.get_input() |
43 | | - kvs_name = input_object['kvsName'] |
44 | | - kvs_by_name_1 = await Actor.open_key_value_store(name=kvs_name) |
45 | | - kvs_by_name_2 = await Actor.open_key_value_store(name=kvs_name) |
46 | | - assert kvs_by_name_1 is kvs_by_name_2 |
47 | | - |
48 | | - kvs_1_metadata = await kvs_by_name_1.get_metadata() |
49 | | - kvs_by_id_1 = await Actor.open_key_value_store(id=kvs_1_metadata.id) |
50 | | - kvs_by_id_2 = await Actor.open_key_value_store(id=kvs_1_metadata.id) |
51 | | - assert kvs_by_id_1 is kvs_by_name_1 |
52 | | - assert kvs_by_id_2 is kvs_by_id_1 |
53 | | - |
54 | | - await kvs_by_name_1.drop() |
55 | | - |
56 | | - actor = await make_actor(label='kvs-same-ref-named', main_func=main) |
57 | | - run_result = await run_actor(actor, run_input={'kvsName': kvs_name}) |
58 | | - |
59 | | - assert run_result.status == 'SUCCEEDED' |
60 | | - |
61 | | - |
62 | | -async def test_force_cloud( |
63 | | - apify_client_async: ApifyClientAsync, |
64 | | - monkeypatch: pytest.MonkeyPatch, |
65 | | -) -> None: |
66 | | - assert apify_client_async.token is not None |
67 | | - monkeypatch.setenv(ApifyEnvVars.TOKEN, apify_client_async.token) |
68 | | - |
69 | | - key_value_store_name = generate_unique_resource_name('key_value_store') |
70 | | - |
71 | | - async with Actor: |
72 | | - key_value_store = await Actor.open_key_value_store(name=key_value_store_name, force_cloud=True) |
73 | | - key_value_store_id = (await key_value_store.get_metadata()).id |
74 | | - |
75 | | - await key_value_store.set_value('foo', 'bar') |
76 | | - |
77 | | - key_value_store_client = apify_client_async.key_value_store(key_value_store_id) |
78 | | - |
79 | | - try: |
80 | | - key_value_store_details = await key_value_store_client.get() |
81 | | - assert key_value_store_details is not None |
82 | | - assert key_value_store_details.get('name') == key_value_store_name |
83 | | - |
84 | | - key_value_store_record = await key_value_store_client.get_record('foo') |
85 | | - assert key_value_store_record is not None |
86 | | - assert key_value_store_record['value'] == 'bar' |
87 | | - finally: |
88 | | - await key_value_store_client.delete() |
89 | | - |
90 | | - |
91 | | -async def test_set_and_get_value_in_same_run( |
92 | | - make_actor: MakeActorFunction, |
93 | | - run_actor: RunActorFunction, |
94 | | -) -> None: |
95 | | - async def main() -> None: |
96 | | - async with Actor: |
97 | | - await Actor.set_value('test', {'number': 123, 'string': 'a string', 'nested': {'test': 1}}) |
98 | | - value = await Actor.get_value('test') |
99 | | - assert value['number'] == 123 |
100 | | - assert value['string'] == 'a string' |
101 | | - assert value['nested']['test'] == 1 |
102 | | - |
103 | | - actor = await make_actor(label='actor-get-set-value', main_func=main) |
104 | | - run_result = await run_actor(actor) |
105 | | - |
106 | | - assert run_result.status == 'SUCCEEDED' |
107 | | - |
108 | | - |
109 | | -async def test_set_value_in_one_run_and_get_value_in_another( |
110 | | - make_actor: MakeActorFunction, |
111 | | - run_actor: RunActorFunction, |
112 | | -) -> None: |
113 | | - async def main_set() -> None: |
114 | | - async with Actor: |
115 | | - await Actor.set_value('test', {'number': 123, 'string': 'a string', 'nested': {'test': 1}}) |
116 | | - |
117 | | - actor_set = await make_actor(label='actor-set-value', main_func=main_set) |
118 | | - run_result_set = await run_actor(actor_set) |
119 | | - |
120 | | - assert run_result_set.status == 'SUCCEEDED' |
121 | | - |
122 | | - # Externally check if the value is present in key-value store |
123 | | - test_record = await actor_set.last_run().key_value_store().get_record('test') |
124 | | - assert test_record is not None |
125 | | - test_value = test_record['value'] |
126 | | - assert test_value['number'] == 123 |
127 | | - assert test_value['string'] == 'a string' |
128 | | - assert test_value['nested']['test'] == 1 |
129 | | - |
130 | | - async def main_get() -> None: |
131 | | - async with Actor: |
132 | | - input_object = await Actor.get_input() |
133 | | - # Access KVS of the previous 'set' run |
134 | | - kvs = await Actor.open_key_value_store(id=input_object['kvs-id']) |
135 | | - value = await kvs.get_value('test') |
136 | | - assert value['number'] == 123 |
137 | | - assert value['string'] == 'a string' |
138 | | - assert value['nested']['test'] == 1 |
139 | | - |
140 | | - actor_get = await make_actor(label='actor-get-value', main_func=main_get) |
141 | | - default_kvs_info = await actor_set.last_run().key_value_store().get() |
142 | | - assert default_kvs_info is not None |
143 | | - |
144 | | - run_result_get = await run_actor(actor_get, run_input={'kvs-id': default_kvs_info['id']}) |
145 | | - |
146 | | - assert run_result_get.status == 'SUCCEEDED' |
147 | | - |
148 | | - |
149 | 11 | async def test_actor_get_input_from_run( |
150 | 12 | make_actor: MakeActorFunction, |
151 | 13 | run_actor: RunActorFunction, |
@@ -197,41 +59,6 @@ async def main(): |
197 | 59 | assert run_result.status == 'SUCCEEDED' |
198 | 60 |
|
199 | 61 |
|
200 | | -async def test_generate_public_url_for_kvs_record( |
201 | | - make_actor: MakeActorFunction, |
202 | | - run_actor: RunActorFunction, |
203 | | -) -> None: |
204 | | - async def main() -> None: |
205 | | - from apify._crypto import create_hmac_signature |
206 | | - from apify.storage_clients._apify._models import ApifyKeyValueStoreMetadata |
207 | | - |
208 | | - async with Actor: |
209 | | - public_api_url = Actor.configuration.api_public_base_url |
210 | | - default_kvs_id = Actor.configuration.default_key_value_store_id |
211 | | - record_key = 'public-record-key' |
212 | | - |
213 | | - kvs = await Actor.open_key_value_store() |
214 | | - metadata = await kvs.get_metadata() |
215 | | - |
216 | | - assert isinstance(metadata, ApifyKeyValueStoreMetadata) |
217 | | - assert metadata.url_signing_secret_key is not None |
218 | | - |
219 | | - await kvs.set_value(record_key, {'exposedData': 'test'}, 'application/json') |
220 | | - |
221 | | - record_url = await kvs.get_public_url(record_key) |
222 | | - signature = create_hmac_signature(metadata.url_signing_secret_key, record_key) |
223 | | - expected_record_url = ( |
224 | | - f'{public_api_url}/v2/key-value-stores/{default_kvs_id}/records/{record_key}?signature={signature}' |
225 | | - ) |
226 | | - |
227 | | - assert record_url == expected_record_url |
228 | | - |
229 | | - actor = await make_actor(label='kvs-get-public-url', main_func=main) |
230 | | - run_result = await run_actor(actor) |
231 | | - |
232 | | - assert run_result.status == 'SUCCEEDED' |
233 | | - |
234 | | - |
235 | 62 | async def test_kvs_defaults( |
236 | 63 | make_actor: MakeActorFunction, |
237 | 64 | run_actor: RunActorFunction, |
|
0 commit comments