Skip to content

Commit 98392dd

Browse files
committed
resolve breaking tests
1 parent ffd87ad commit 98392dd

File tree

5 files changed

+52
-34
lines changed

5 files changed

+52
-34
lines changed

servicex/query_core.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,6 @@ def transform_complete(task: Task):
319319
else None
320320
)
321321

322-
begin_at = datetime.datetime.now(tz=datetime.timezone.utc)
323322
if not cached_record:
324323

325324
if self.cache.is_transform_request_submitted(sx_request_hash):
@@ -348,7 +347,6 @@ def transform_complete(task: Task):
348347
expandable_progress,
349348
download_progress,
350349
cached_record,
351-
begin_at,
352350
)
353351
)
354352

@@ -524,7 +522,6 @@ async def download_files(
524522
progress: ExpandableProgress,
525523
download_progress: TaskID,
526524
cached_record: Optional[TransformedResults],
527-
begin_at: datetime.datetime,
528525
) -> List[str]:
529526
"""
530527
Task to monitor the list of files in the transform output's bucket. Any new files
@@ -560,17 +557,16 @@ async def get_signed_url(
560557
if progress:
561558
progress.advance(task_id=download_progress, task_type="Download")
562559

560+
later_than: datetime.datetime | None = None
563561
while True:
564562
if not cached_record:
565563
await asyncio.sleep(self.minio_polling_interval)
566564
if self.minio:
567565
# if self.minio exists, self.current_status will too
568566
if self.current_status.files_completed > len(files_seen):
569-
new_begin_at = datetime.datetime.now(tz=datetime.timezone.utc)
570567
files = await self.servicex.get_transformation_results(
571-
self.current_status.request_id, begin_at
568+
self.current_status.request_id, later_than
572569
)
573-
begin_at = new_begin_at
574570

575571
for file in files:
576572
filename = file.filename
@@ -601,6 +597,9 @@ async def get_signed_url(
601597
) # NOQA 501
602598
files_seen.add(filename)
603599

600+
if later_than is None or file.created_at > later_than:
601+
later_than = file.created_at
602+
604603
# Once the transform is complete and all files are seen we can stop polling.
605604
# Also, if we are just downloading or signing urls for a previous transform
606605
# then we know it is complete as well

servicex/servicex_adapter.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ class AuthorizationError(BaseException):
5252

5353
@dataclass
5454
class ServiceXFile:
55+
created_at: datetime.datetime
5556
filename: str
5657

5758

@@ -236,13 +237,13 @@ async def delete_transform(self, transform_id=None):
236237
)
237238

238239
async def get_transformation_results(
239-
self, request_id: str, begin_at: datetime.datetime
240+
self, request_id: str, later_than: datetime.datetime | None = None
240241
):
241242
headers = await self._get_authorization()
242243
url = self.url + f"/servicex/transformation/{request_id}/results"
243-
params = {
244-
"begin_at": begin_at.isoformat(),
245-
}
244+
params = {}
245+
if later_than:
246+
params["later_than"] = later_than.isoformat()
246247

247248
async with ClientSession() as session:
248249
async with session.get(headers=headers, url=url, params=params) as r:
@@ -261,7 +262,10 @@ async def get_transformation_results(
261262
data = await r.json()
262263
response = list()
263264
for result in data.get("results", []):
264-
file = ServiceXFile(filename=result["file-path"].replace("/", ":"))
265+
file = ServiceXFile(
266+
filename=result["file-path"].replace("/", ":"),
267+
created_at=datetime.datetime.fromisoformat(result["created_at"]),
268+
)
265269
response.append(file)
266270
return response
267271

tests/test_dataset.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@
4545
)
4646
from rich.progress import Progress
4747

48+
from servicex.servicex_adapter import ServiceXFile
49+
4850

4951
@pytest.mark.asyncio
5052
async def test_as_signed_urls_happy(transformed_result):
@@ -121,16 +123,15 @@ async def test_as_files_cached(transformed_result, python_dataset):
121123
@pytest.mark.asyncio
122124
async def test_download_files(python_dataset):
123125
signed_urls_only = False
124-
begin_at = datetime.datetime.now(tz=datetime.timezone.utc)
125126
download_progress = "download_task_id"
126127
minio_mock = AsyncMock()
127128
config = Configuration(cache_path="temp_dir", api_endpoints=[])
128129
python_dataset.configuration = config
129130
python_dataset.servicex = AsyncMock()
130131
python_dataset.servicex.get_transformation_results = AsyncMock()
131132
python_dataset.servicex.get_transformation_results.return_value = [
132-
Mock(filename="file1.txt"),
133-
Mock(filename="file2.txt"),
133+
ServiceXFile(filename="file1.txt", created_at=datetime.datetime.now(datetime.timezone.utc)),
134+
ServiceXFile(filename="file2.txt", created_at=datetime.datetime.now(datetime.timezone.utc)),
134135
]
135136

136137
minio_mock.download_file.return_value = Path("/path/to/downloaded_file")
@@ -143,7 +144,7 @@ async def test_download_files(python_dataset):
143144
python_dataset.configuration.shortened_downloaded_filename = False
144145

145146
result_uris = await python_dataset.download_files(
146-
signed_urls_only, progress_mock, download_progress, None, begin_at
147+
signed_urls_only, progress_mock, download_progress, None
147148
)
148149
minio_mock.download_file.assert_awaited()
149150
minio_mock.get_signed_url.assert_not_awaited()
@@ -153,7 +154,6 @@ async def test_download_files(python_dataset):
153154
@pytest.mark.asyncio
154155
async def test_download_files_with_signed_urls(python_dataset):
155156
signed_urls_only = True
156-
begin_at = datetime.datetime.now(tz=datetime.timezone.utc)
157157
download_progress = "download_task_id"
158158
minio_mock = AsyncMock()
159159
config = Configuration(cache_path="temp_dir", api_endpoints=[])
@@ -165,8 +165,8 @@ async def test_download_files_with_signed_urls(python_dataset):
165165
python_dataset.servicex = AsyncMock()
166166
python_dataset.servicex.get_transformation_results = AsyncMock()
167167
python_dataset.servicex.get_transformation_results.return_value = [
168-
Mock(filename="file1.txt"),
169-
Mock(filename="file2.txt"),
168+
ServiceXFile(filename="file1.txt", created_at=datetime.datetime.now(datetime.timezone.utc)),
169+
ServiceXFile(filename="file2.txt", created_at=datetime.datetime.now(datetime.timezone.utc)),
170170
]
171171

172172
python_dataset.minio_polling_interval = 0
@@ -175,7 +175,7 @@ async def test_download_files_with_signed_urls(python_dataset):
175175
python_dataset.configuration.shortened_downloaded_filename = False
176176

177177
result_uris = await python_dataset.download_files(
178-
signed_urls_only, progress_mock, download_progress, None, begin_at
178+
signed_urls_only, progress_mock, download_progress, None
179179
)
180180
minio_mock.download_file.assert_not_called()
181181
minio_mock.get_signed_url.assert_called()

tests/test_servicex_adapter.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import tempfile
3030
import time
3131
import datetime
32+
from unittest import result
3233
from unittest.mock import patch, AsyncMock
3334

3435
import httpx
@@ -512,8 +513,8 @@ async def test_get_transformation_results_success(get, servicex):
512513
get.return_value.__aenter__.return_value.json = AsyncMock(
513514
return_value={
514515
"results": [
515-
{"file-path": "file1.txt"},
516-
{"file-path": "file2.txt"},
516+
{"file-path": "file1.txt", "created_at": datetime.datetime.now(datetime.timezone.utc).isoformat()},
517+
{"file-path": "file2.txt", "created_at": datetime.datetime.now(datetime.timezone.utc).isoformat()},
517518
]
518519
}
519520
)
@@ -528,7 +529,7 @@ async def test_get_transformation_results_success(get, servicex):
528529
url=f"https://servicex.org/servicex/transformation/{request_id}/results",
529530
headers={},
530531
params={
531-
"begin_at": now.isoformat(),
532+
"later_than": now.isoformat(),
532533
},
533534
)
534535

@@ -549,7 +550,7 @@ async def test_get_transformation_results_not_found(
549550
url=f"https://servicex.org/servicex/transformation/{request_id}/results",
550551
headers={},
551552
params={
552-
"begin_at": now.isoformat(),
553+
"later_than": now.isoformat(),
553554
},
554555
)
555556

@@ -570,7 +571,7 @@ async def test_get_transformation_results_not_authorized(
570571
url=f"https://servicex.org/servicex/transformation/{request_id}/results",
571572
headers={},
572573
params={
573-
"begin_at": now.isoformat(),
574+
"later_than": now.isoformat(),
574575
},
575576
)
576577

@@ -591,6 +592,6 @@ async def test_get_transformation_results_server_error(
591592
url=f"https://servicex.org/servicex/transformation/{request_id}/results",
592593
headers={},
593594
params={
594-
"begin_at": now.isoformat(),
595+
"later_than": now.isoformat(),
595596
},
596597
)

tests/test_servicex_dataset.py

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
2626
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2727
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28+
import datetime
2829
import tempfile
2930
from typing import List
3031
from unittest.mock import AsyncMock, patch, Mock
@@ -46,6 +47,7 @@
4647
)
4748
from servicex.query_cache import QueryCache
4849
from servicex.query_core import ServiceXException, Query
50+
from servicex.servicex_adapter import ServiceXFile
4951
from servicex.servicex_client import ServiceXClient
5052
from servicex.uproot_raw.uproot_raw import UprootRawQuery
5153

@@ -208,10 +210,15 @@ async def test_submit(mocker):
208210
servicex.submit_transform = AsyncMock()
209211
servicex.submit_transform.return_value = {"request_id": '123-456-789"'}
210212

211-
servicex.get_transformation_results = AsyncMock(
212-
side_effect=[[file1], [file1, file2]]
213-
)
214-
213+
servicex.get_transformation_results = AsyncMock(side_effect=[
214+
[
215+
ServiceXFile(filename="file1", created_at=datetime.datetime.now(datetime.timezone.utc)),
216+
],
217+
[
218+
ServiceXFile(filename="file1", created_at=datetime.datetime.now(datetime.timezone.utc)),
219+
ServiceXFile(filename="file2", created_at=datetime.datetime.now(datetime.timezone.utc)),
220+
]
221+
])
215222
servicex.get_transform_status = AsyncMock()
216223
servicex.get_transform_status.side_effect = [
217224
transform_status1,
@@ -256,7 +263,14 @@ async def test_submit_partial_success(mocker):
256263
servicex = AsyncMock()
257264
servicex.submit_transform = AsyncMock()
258265
servicex.submit_transform.return_value = {"request_id": '123-456-789"'}
259-
servicex.get_transformation_results = AsyncMock(side_effect=[[file1], [file1]])
266+
servicex.get_transformation_results = AsyncMock(side_effect=[
267+
[
268+
ServiceXFile(filename="file1", created_at=datetime.datetime.now(datetime.timezone.utc)),
269+
],
270+
[
271+
ServiceXFile(filename="file1", created_at=datetime.datetime.now(datetime.timezone.utc)),
272+
]
273+
])
260274

261275
servicex.get_transform_status = AsyncMock()
262276
servicex.get_transform_status.side_effect = [
@@ -304,8 +318,8 @@ async def test_use_of_cache(mocker):
304318
servicex.submit_transform.return_value = {"request_id": '123-456-789"'}
305319
servicex.get_transformation_results = AsyncMock()
306320
servicex.get_transformation_results.return_value = [
307-
Mock(filename="file1.txt"),
308-
Mock(filename="file2.txt"),
321+
ServiceXFile(filename="file1.txt", created_at=datetime.datetime.now(datetime.timezone.utc)),
322+
ServiceXFile(filename="file2.txt", created_at=datetime.datetime.now(datetime.timezone.utc)),
309323
]
310324
servicex.get_transform_status = AsyncMock()
311325
servicex.get_transform_status.side_effect = [
@@ -610,8 +624,8 @@ async def test_use_of_ignore_cache(mocker, servicex):
610624
)
611625
servicex.get_transformation_results = AsyncMock()
612626
servicex.get_transformation_results.return_value = [
613-
Mock(filename="file1.txt"),
614-
Mock(filename="file2.txt"),
627+
ServiceXFile(filename="file1.txt", created_at=datetime.datetime.now(datetime.timezone.utc)),
628+
ServiceXFile(filename="file2.txt", created_at=datetime.datetime.now(datetime.timezone.utc)),
615629
]
616630
# Prepare Minio
617631
mock_minio = AsyncMock()

0 commit comments

Comments
 (0)