diff --git a/python/lib/sift_client/_tests/resources/test_test_results.py b/python/lib/sift_client/_tests/resources/test_test_results.py index a2f0a3a5e..06edebc2d 100644 --- a/python/lib/sift_client/_tests/resources/test_test_results.py +++ b/python/lib/sift_client/_tests/resources/test_test_results.py @@ -1,5 +1,6 @@ from __future__ import annotations +import uuid from datetime import datetime, timedelta, timezone from pathlib import Path from typing import ClassVar @@ -22,6 +23,7 @@ TestStepCreate, TestStepType, ) +from sift_client.util import cel_utils as cel pytestmark = pytest.mark.integration @@ -47,6 +49,8 @@ def test_create_test_report(self, sift_client, nostromo_run): "name": "Test Report with Steps and Measurements", "test_system_name": "Test System", "test_case": "Test Case", + "serial_number": str(uuid.uuid4()), + "part_number": "1234567890", "start_time": simulated_time, "end_time": simulated_time, "run_id": nostromo_run.id_, @@ -309,6 +313,53 @@ def test_update_test_report(self, sift_client): self.test_reports["basic_test_report"] = updated_report + def test_list_test_reports(self, sift_client): + reports = sift_client.test_results.list_( + filter_query=cel.not_(cel.equals("serial_number", "")) + and cel.not_(cel.equals("part_number", "")), + ) + existing_report = reports[0] + assert len(reports) + existing_report = reports[0] + reports = sift_client.test_results.list_( + status=existing_report.status, + test_system_name=existing_report.test_system_name, + test_case=existing_report.test_case, + serial_numbers=[existing_report.serial_number], + part_numbers=[existing_report.part_number], + system_operator=existing_report.system_operator, + ) + assert existing_report in reports + + def test_list_test_steps(self, sift_client): + steps = sift_client.test_results.list_steps() + existing_step = None + for step in steps: + if step.parent_step_id is not None: + existing_step = step + break + assert len(steps) + steps = sift_client.test_results.list_steps( + test_reports=[existing_step.test_report_id], + parent_steps=[existing_step.parent_step_id], + name=existing_step.name, + step_type=existing_step.step_type, + status=existing_step.status, + ) + assert existing_step in steps + + def test_list_test_measurements(self, sift_client): + measurements = sift_client.test_results.list_measurements() + assert len(measurements) + existing_measurement = measurements[0] + measurements = sift_client.test_results.list_measurements( + test_steps=[existing_measurement.test_step_id], + name=existing_measurement.name, + measurement_type=existing_measurement.measurement_type, + passed=existing_measurement.passed, + ) + assert existing_measurement in measurements + def test_archive_and_delete_test_report(self, sift_client): test_report = self.test_reports.get("basic_test_report") if not test_report: diff --git a/python/lib/sift_client/resources/sync_stubs/__init__.pyi b/python/lib/sift_client/resources/sync_stubs/__init__.pyi index d2f8a99e6..af2b49156 100644 --- a/python/lib/sift_client/resources/sync_stubs/__init__.pyi +++ b/python/lib/sift_client/resources/sync_stubs/__init__.pyi @@ -1283,8 +1283,8 @@ class TestResultsAPI: status: TestStatus | None = None, test_system_name: str | None = None, test_case: str | None = None, - serial_number: str | None = None, - part_number: str | None = None, + serial_numbers: list[str] | None = None, + part_numbers: list[str] | None = None, system_operator: str | None = None, created_by: str | None = None, modified_by: str | None = None, @@ -1309,8 +1309,8 @@ class TestResultsAPI: status: Status to filter by (TestStatus enum). test_system_name: Test system name to filter by. test_case: Test case to filter by. - serial_number: Serial number to filter by. - part_number: Part number to filter by. + serial_numbers: Serial numbers to filter by. + part_numbers: Part numbers to filter by. system_operator: System operator to filter by. created_by: User ID who created the test report. modified_by: User ID who last modified the test report. diff --git a/python/lib/sift_client/resources/test_results.py b/python/lib/sift_client/resources/test_results.py index 5c4f6abda..5f3198d4d 100644 --- a/python/lib/sift_client/resources/test_results.py +++ b/python/lib/sift_client/resources/test_results.py @@ -105,8 +105,8 @@ async def list_( status: TestStatus | None = None, test_system_name: str | None = None, test_case: str | None = None, - serial_number: str | None = None, - part_number: str | None = None, + serial_numbers: list[str] | None = None, + part_numbers: list[str] | None = None, system_operator: str | None = None, created_by: str | None = None, modified_by: str | None = None, @@ -131,8 +131,8 @@ async def list_( status: Status to filter by (TestStatus enum). test_system_name: Test system name to filter by. test_case: Test case to filter by. - serial_number: Serial number to filter by. - part_number: Part number to filter by. + serial_numbers: Serial numbers to filter by. + part_numbers: Part numbers to filter by. system_operator: System operator to filter by. created_by: User ID who created the test report. modified_by: User ID who last modified the test report. @@ -173,6 +173,8 @@ async def list_( filter_parts.append(in_("test_report_id", test_report_ids)) if status is not None: + if isinstance(status, TestStatus): + status = status.name.lower() # type: ignore filter_parts.append(equals("status", status)) if test_system_name: @@ -181,11 +183,11 @@ async def list_( if test_case: filter_parts.append(equals("test_case", test_case)) - if serial_number: - filter_parts.append(equals("serial_number", serial_number)) + if serial_numbers: + filter_parts.append(in_("serial_number", serial_numbers)) - if part_number: - filter_parts.append(equals("part_number", part_number)) + if part_numbers: + filter_parts.append(in_("part_number", part_numbers)) if system_operator: filter_parts.append(equals("system_operator", system_operator)) @@ -351,10 +353,10 @@ async def list_steps( filter_parts.append(in_("parent_step_id", parent_step_ids)) if status is not None: - filter_parts.append(equals("status", status)) + filter_parts.append(equals("status", status.name.lower())) if step_type is not None: - filter_parts.append(equals("step_type", step_type)) + filter_parts.append(equals("step_type", step_type.name.lower())) query_filter = and_(*filter_parts) @@ -517,7 +519,7 @@ async def list_measurements( filter_parts.append(in_("test_report_id", test_report_ids)) if measurement_type is not None: - filter_parts.append(equals("measurement_type", measurement_type)) + filter_parts.append(equals("measurement_type", measurement_type.name.lower())) if passed is not None: filter_parts.append(equals("passed", passed))