Skip to content
Snippets Groups Projects

Add more filters on ListWorkerActivities

Merged ml bonhomme requested to merge filter-worker-activities into master
All threads resolved!
Files
2
@@ -884,87 +884,189 @@ class TestWorkerActivity(FixtureTestCase):
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertDictEqual(response.json(), {"process_id": ["This process does not exist."]})
def test_list_filter_process(self):
process = self.corpus.processes.create(
def test_list_filters(self):
# Delete all worker activities
WorkerActivity.objects.all().delete()
# Create objects
process_1 = self.corpus.processes.create(
mode=ProcessMode.Workers,
creator=self.user,
)
process_2 = self.corpus.processes.create(
mode=ProcessMode.Workers,
creator=self.user,
)
activity = process.activities.create(
worker_version_2 = WorkerVersion.objects.get(worker__slug="dla")
model_version_2 = self.model.versions.create(
state=ModelVersionState.Available,
hash="b",
)
configuration_2 = WorkerConfiguration.objects.create(worker=self.worker_version.worker, name="Another configuration", configuration={"c": "d"})
# Create all the worker activities
activity_1 = process_1.activities.create(
element=self.element,
worker_version=self.worker_version,
state=WorkerActivityState.Processed,
model_version=self.model_version,
configuration=self.configuration
)
self.client.force_login(self.user)
with self.assertNumQueries(6):
response = self.client.get(
reverse("api:corpus-activity", kwargs={"corpus": self.corpus.id}),
{"process_id": str(process.id)}
)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertDictEqual(response.json(), {
"count": 1,
"number": 1,
"previous": None,
"next": None,
"results": [
{
"created": activity.created.isoformat().replace("+00:00", "Z"),
"updated": activity.updated.isoformat().replace("+00:00", "Z"),
"started": None,
"element_id": str(self.element.id),
"process_id": str(process.id),
"worker_version_id": str(self.worker_version.id),
"configuration_id": None,
"model_version_id": None,
"state": "queued"
}
]
})
def test_list_filter_state(self):
element = Element.objects.get(name="Volume 1")
activity = element.activities.create(
process=self.process,
activity_2 = process_1.activities.create(
element=self.element,
worker_version=worker_version_2,
state=WorkerActivityState.Error,
model_version=self.model_version,
configuration=self.configuration
)
activity_3 = process_1.activities.create(
element=self.element,
worker_version=self.worker_version,
state=WorkerActivityState.Processed,
model_version=self.model_version,
configuration=configuration_2
)
activity_4 = process_1.activities.create(
element=self.element,
worker_version=self.worker_version,
state=WorkerActivityState.Processed,
model_version=model_version_2,
configuration=configuration_2
)
activity_5 = process_2.activities.create(
element=self.element,
worker_version=worker_version_2,
state=WorkerActivityState.Processed,
model_version=model_version_2,
configuration=self.configuration
)
activity_6 = process_1.activities.create(
element=self.element,
worker_version=self.worker_version,
state=WorkerActivityState.Processed,
model_version=self.model_version,
configuration=None
)
self.assertEqual(WorkerActivity.objects.filter(state=WorkerActivityState.Processed).count(), 1)
self.client.force_login(self.user)
with self.assertNumQueries(5):
response = self.client.get(
reverse("api:corpus-activity", kwargs={"corpus": self.corpus.id}),
{"state": "processed"}
)
self.assertEqual(response.status_code, status.HTTP_200_OK)
# Worker activity responses
worker_activities = {
activity.id: {
"created": activity.created.isoformat().replace("+00:00", "Z"),
"updated": activity.updated.isoformat().replace("+00:00", "Z"),
"started": None,
"element_id": str(self.element.id),
"process_id": str(activity.process_id),
"worker_version_id": str(activity.worker_version.id),
"configuration_id": str(activity.configuration_id) if activity.configuration_id else None,
"model_version_id": str(activity.model_version_id) if activity.model_version_id else None,
"state": activity.state.value
}
for activity in WorkerActivity.objects.all()
}
self.assertDictEqual(response.json(), {
"count": 1,
"number": 1,
"previous": None,
"next": None,
"results": [
# Test cases
cases = [
(
{"process_id": str(process_1.id)}, [activity_1.id, activity_2.id, activity_3.id, activity_4.id, activity_6.id]
),
(
{"state": "processed"}, [activity_1.id, activity_3.id, activity_4.id, activity_5.id, activity_6.id]
),
(
{"process_id": str(process_1.id), "state": "error"}, [activity_2.id]
),
(
{"process_id": str(process_1.id), "state": "processed", "worker_version_id": str(self.worker_version.id)},
[activity_1.id, activity_3.id, activity_4.id, activity_6.id]
),
(
{"worker_version_id": str(worker_version_2.id)}, [activity_2.id, activity_5.id]
),
(
{
"created": activity.created.isoformat().replace("+00:00", "Z"),
"updated": activity.updated.isoformat().replace("+00:00", "Z"),
"started": None,
"element_id": str(element.id),
"process_id": str(self.process.id),
"process_id": str(process_1.id),
"state": "processed",
"worker_version_id": str(self.worker_version.id),
"configuration_id": None,
"model_version_id": None,
"state": "processed"
}
]
})
"model_version_id": str(self.model_version.id)
},
[activity_1.id, activity_3.id, activity_6.id]
),
(
{"model_version_id": str(model_version_2.id)}, [activity_4.id, activity_5.id]
),
(
{
"process_id": str(process_1.id),
"state": "processed",
"worker_version_id": str(self.worker_version.id),
"model_version_id": str(self.model_version.id),
"worker_configuration_id": str(self.configuration.id)
},
[activity_1.id]
),
(
{"worker_configuration_id": str(configuration_2.id)}, [activity_3.id, activity_4.id]
),
(
{
"process_id": str(process_1.id),
"state": "processed",
"worker_version_id": str(self.worker_version.id),
"model_version_id": False,
"worker_configuration_id": str(self.configuration.id)
},
[]
),
(
{
"process_id": str(process_1.id),
"state": "processed",
"worker_version_id": str(self.worker_version.id),
"model_version_id": str(self.model_version.id),
"worker_configuration_id": False
},
[activity_6.id]
),
]
self.client.force_login(self.user)
for filters, activity_ids in cases:
# Sort activities by ID, like in the API response
activity_ids.sort()
# Filtering by process_id adds 1 query as it checks if the process exists
queries_count = 6 if "process_id" in filters else 5
# If there are no results returned, only the request to return a 'count' is made so we get one less query
if not len(activity_ids):
queries_count -= 1
with self.assertNumQueries(queries_count):
response = self.client.get(
reverse("api:corpus-activity", kwargs={"corpus": self.corpus.id}),
{**filters}
)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertDictEqual(response.json(), {
"count": len(activity_ids),
"number": 1,
"previous": None,
"next": None,
"results": [
worker_activities[id] for id in activity_ids
]
})
def test_list_invalid_filters(self):
self.client.force_login(self.superuser)
cases = [
(
{"process_id": "a"},
{"process_id": ["Process ID should be an UUID."]},
{"process_id": "a", "worker_version_id": "neon", "model_version_id": "genesis", "worker_configuration_id": "evangelion"},
{
"process_id": ["Not a valid UUID."],
"worker_version_id": ["Not a valid UUID."],
"model_version_id": ["Not a valid UUID."],
"worker_configuration_id": ["Not a valid UUID."]
},
),
(
{"process_id": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"},
@@ -977,7 +1079,7 @@ class TestWorkerActivity(FixtureTestCase):
(
{"process_id": "a", "state": "lol"},
{
"process_id": ["Process ID should be an UUID."],
"process_id": ["Not a valid UUID."],
"state": ["'lol' is not a valid WorkerActivity state"],
},
),
Loading