From 186b9c9fa1df73456074dc57ce5f0d98ffcd3a97 Mon Sep 17 00:00:00 2001
From: mlbonhomme <bonhomme@teklia.com>
Date: Thu, 3 Nov 2022 14:40:44 +0000
Subject: [PATCH] Remove _deserialize functions in worker runs tests

---
 arkindex/process/tests/test_workerruns.py | 930 +++++++++++++++++++---
 1 file changed, 819 insertions(+), 111 deletions(-)

diff --git a/arkindex/process/tests/test_workerruns.py b/arkindex/process/tests/test_workerruns.py
index c86015ea65..928b7fcce4 100644
--- a/arkindex/process/tests/test_workerruns.py
+++ b/arkindex/process/tests/test_workerruns.py
@@ -2,7 +2,6 @@ import uuid
 
 from django.urls import reverse
 from rest_framework import status
-from rest_framework.serializers import DateTimeField
 
 from arkindex.process.models import GitRefType, ProcessMode, Revision, WorkerRun, WorkerVersion
 from arkindex.process.utils import get_default_farm_id
@@ -25,101 +24,6 @@ tasks:
 ARTIFACT_ID = uuid.uuid4()
 
 
-def _deserialize_worker_configuration(worker_config):
-    return {
-        'id': str(worker_config.id),
-        'name': worker_config.name,
-        'configuration': worker_config.configuration,
-        'archived': worker_config.archived,
-    }
-
-
-def _deserialize_worker(worker):
-    return {
-        'id': str(worker.id),
-        'name': worker.name,
-        'type': str(worker.type),
-        'slug': worker.slug
-    }
-
-
-def _deserialize_model(model):
-    return {
-        'id': str(model.id),
-        'name': model.name
-    }
-
-
-def _deserialize_model_version(model_version):
-    return {
-        'id': str(model_version.id),
-        'model': _deserialize_model(model_version.model),
-        'tag': model_version.tag,
-        'state': model_version.state.value,
-        'size': model_version.size,
-        'configuration': model_version.configuration
-    }
-
-
-def _deserialize_revision(revision):
-    return {
-        'id': str(revision.id),
-        'commit_url': revision.commit_url,
-        'author': revision.author,
-        'created': DateTimeField().to_representation(value=revision.created),
-        'hash': revision.hash,
-        'message': revision.message,
-        'refs': [],
-    }
-
-
-def _deserialize_worker_version(worker_version):
-    return {
-        'id': str(worker_version.id),
-        'revision': _deserialize_revision(worker_version.revision),
-        'docker_image': str(worker_version.docker_image.id) if worker_version.docker_image else None,
-        'docker_image_iid': str(worker_version.docker_image_iid) if worker_version.docker_image_iid else None,
-        'docker_image_name': worker_version.docker_image_name,
-        'configuration': worker_version.configuration,
-        'state': worker_version.state.value,
-        'gpu_usage': worker_version.gpu_usage.value,
-        'model_usage': worker_version.model_usage,
-        'worker': _deserialize_worker(worker_version.worker),
-    }
-
-
-def _deserialize_worker_process(process):
-    return {
-        'id': str(process.id),
-        'name': process.name,
-        'state': process.state.value,
-        'mode': process.mode.value,
-        'corpus': str(process.corpus.id),
-        'workflow': (str(process.workflow) if process.workflow else None),
-        'activity_state': process.activity_state.value,
-        'model_id': str(process.model_id) if process.model_id else None,
-        'train_folder_id': str(process.train_folder_id) if process.train_folder_id else None,
-        'test_folder_id': str(process.test_folder_id) if process.test_folder_id else None,
-        'validation_folder_id': str(process.validation_folder_id) if process.validation_folder_id else None,
-    }
-
-
-def _deserialize_worker_run(worker_run):
-    return {
-        'id': str(worker_run.id),
-        'worker_version_id': str(worker_run.version.id),
-        'process_id': str(worker_run.process.id),
-        'parents': [str(parent_id) for parent_id in worker_run.parents],
-        'model_version_id': str(worker_run.model_version_id) if worker_run.model_version_id else None,
-        'worker': _deserialize_worker(worker_run.version.worker),
-        'model_version': _deserialize_model_version(worker_run.model_version) if worker_run.model_version else None,
-        'configuration_id': str(worker_run.configuration.id) if worker_run.configuration else None,
-        'configuration': (_deserialize_worker_configuration(worker_run.configuration) if worker_run.configuration else None),
-        'worker_version': _deserialize_worker_version(worker_run.version),
-        'process': _deserialize_worker_process(worker_run.process),
-    }
-
-
 class TestWorkerRuns(FixtureAPITestCase):
     """
     Test worker runs endpoints and methods
@@ -436,7 +340,60 @@ class TestWorkerRuns(FixtureAPITestCase):
                 reverse('api:worker-run-details', kwargs={'pk': str(self.run_1.id)})
             )
         self.assertEqual(response.status_code, status.HTTP_200_OK)
-        self.assertDictEqual(response.json(), _deserialize_worker_run(self.run_1))
+        self.assertDictEqual(response.json(), {
+            'configuration': None,
+            'configuration_id': None,
+            'id': str(self.run_1.id),
+            'model_version': None,
+            'model_version_id': None,
+            'parents': [],
+            'process': {
+                'activity_state': 'disabled',
+                'corpus': str(self.corpus.id),
+                'id': str(self.process_1.id),
+                'mode': 'workers',
+                'model_id': None,
+                'name': None,
+                'state': 'unscheduled',
+                'test_folder_id': None,
+                'train_folder_id': None,
+                'validation_folder_id': None,
+                'workflow': None
+            },
+            'process_id': str(self.process_1.id),
+            'worker': {
+                'id': str(self.worker_1.id),
+                'name': 'Recognizer',
+                'slug': 'reco',
+                'type': 'recognizer'
+            },
+            'worker_version': {
+                'configuration': {'test': 42},
+                'docker_image': str(self.version_1.docker_image.id),
+                'docker_image_iid': None,
+                'docker_image_name': f'my_repo.fake/workers/worker/reco:{self.version_1.id}',
+                'gpu_usage': 'disabled',
+                'id': str(self.version_1.id),
+                'model_usage': False,
+                'revision': {
+                    'author': 'Test user',
+                    'commit_url': 'http://my_repo.fake/workers/worker/commit/1337',
+                    'created': self.version_1.revision.created.isoformat().replace('+00:00', 'Z'),
+                    'hash': '1337',
+                    'id': str(self.version_1.revision.id),
+                    'message': 'My w0rk3r',
+                    'refs': []
+                },
+                'state': 'available',
+                'worker': {
+                    'id': str(self.worker_1.id),
+                    'name': 'Recognizer',
+                    'slug': 'reco',
+                    'type': 'recognizer'
+                }
+            },
+            'worker_version_id': str(self.version_1.id)
+        })
 
     def test_retrieve_run_invalid_id(self):
         self.client.force_login(self.user)
@@ -450,7 +407,60 @@ class TestWorkerRuns(FixtureAPITestCase):
         with self.assertNumQueries(8):
             response = self.client.get(reverse('api:worker-run-details', kwargs={'pk': str(self.run_1.id)}))
         self.assertEqual(response.status_code, status.HTTP_200_OK)
-        self.assertDictEqual(response.json(), _deserialize_worker_run(self.run_1))
+        self.assertDictEqual(response.json(), {
+            'configuration': None,
+            'configuration_id': None,
+            'id': str(self.run_1.id),
+            'model_version': None,
+            'model_version_id': None,
+            'parents': [],
+            'process': {
+                'activity_state': 'disabled',
+                'corpus': str(self.corpus.id),
+                'id': str(self.process_1.id),
+                'mode': 'workers',
+                'model_id': None,
+                'name': None,
+                'state': 'unscheduled',
+                'test_folder_id': None,
+                'train_folder_id': None,
+                'validation_folder_id': None,
+                'workflow': None
+            },
+            'process_id': str(self.process_1.id),
+            'worker': {
+                'id': str(self.worker_1.id),
+                'name': 'Recognizer',
+                'slug': 'reco',
+                'type': 'recognizer'
+            },
+            'worker_version': {
+                'configuration': {'test': 42},
+                'docker_image': str(self.version_1.docker_image.id),
+                'docker_image_iid': None,
+                'docker_image_name': f'my_repo.fake/workers/worker/reco:{self.version_1.id}',
+                'gpu_usage': 'disabled',
+                'id': str(self.version_1.id),
+                'model_usage': False,
+                'revision': {
+                    'author': 'Test user',
+                    'commit_url': 'http://my_repo.fake/workers/worker/commit/1337',
+                    'created': self.version_1.revision.created.isoformat().replace('+00:00', 'Z'),
+                    'hash': '1337',
+                    'id': str(self.version_1.revision.id),
+                    'message': 'My w0rk3r',
+                    'refs': []
+                },
+                'state': 'available',
+                'worker': {
+                    'id': str(self.worker_1.id),
+                    'name': 'Recognizer',
+                    'slug': 'reco',
+                    'type': 'recognizer'
+                }
+            },
+            'worker_version_id': str(self.version_1.id)
+        })
 
     def test_update_run_requires_id_and_parents(self):
         self.client.force_login(self.user)
@@ -562,7 +572,60 @@ class TestWorkerRuns(FixtureAPITestCase):
             )
         self.assertEqual(response.status_code, status.HTTP_200_OK)
 
-        self.assertEqual(response.json(), _deserialize_worker_run(self.run_1))
+        self.assertEqual(response.json(), {
+            'configuration': None,
+            'configuration_id': None,
+            'id': str(self.run_1.id),
+            'model_version': None,
+            'model_version_id': None,
+            'parents': [],
+            'process': {
+                'activity_state': 'disabled',
+                'corpus': str(self.corpus.id),
+                'id': str(self.process_1.id),
+                'mode': 'workers',
+                'model_id': None,
+                'name': None,
+                'state': 'unscheduled',
+                'test_folder_id': None,
+                'train_folder_id': None,
+                'validation_folder_id': None,
+                'workflow': None
+            },
+            'process_id': str(self.process_1.id),
+            'worker': {
+                'id': str(self.worker_1.id),
+                'name': 'Recognizer',
+                'slug': 'reco',
+                'type': 'recognizer'
+            },
+            'worker_version': {
+                'configuration': {'test': 42},
+                'docker_image': str(self.version_1.docker_image.id),
+                'docker_image_iid': None,
+                'docker_image_name': f'my_repo.fake/workers/worker/reco:{self.version_1.id}',
+                'gpu_usage': 'disabled',
+                'id': str(self.version_1.id),
+                'model_usage': False,
+                'revision': {
+                    'author': 'Test user',
+                    'commit_url': 'http://my_repo.fake/workers/worker/commit/1337',
+                    'created': self.version_1.revision.created.isoformat().replace('+00:00', 'Z'),
+                    'hash': '1337',
+                    'id': str(self.version_1.revision.id),
+                    'message': 'My w0rk3r',
+                    'refs': []
+                },
+                'state': 'available',
+                'worker': {
+                    'id': str(self.worker_1.id),
+                    'name': 'Recognizer',
+                    'slug': 'reco',
+                    'type': 'recognizer'
+                }
+            },
+            'worker_version_id': str(self.version_1.id)
+        })
         self.run_1.refresh_from_db()
         self.assertEqual(self.run_1.process.id, self.process_1.id)
 
@@ -581,7 +644,60 @@ class TestWorkerRuns(FixtureAPITestCase):
                 }, format='json'
             )
         self.assertEqual(response.status_code, status.HTTP_200_OK)
-        self.assertEqual(response.json(), _deserialize_worker_run(self.run_1))
+        self.assertEqual(response.json(), {
+            'configuration': None,
+            'configuration_id': None,
+            'id': str(self.run_1.id),
+            'model_version': None,
+            'model_version_id': None,
+            'parents': [],
+            'process': {
+                'activity_state': 'disabled',
+                'corpus': str(self.corpus.id),
+                'id': str(self.process_1.id),
+                'mode': 'workers',
+                'model_id': None,
+                'name': None,
+                'state': 'unscheduled',
+                'test_folder_id': None,
+                'train_folder_id': None,
+                'validation_folder_id': None,
+                'workflow': None
+            },
+            'process_id': str(self.process_1.id),
+            'worker': {
+                'id': str(self.worker_1.id),
+                'name': 'Recognizer',
+                'slug': 'reco',
+                'type': 'recognizer'
+            },
+            'worker_version': {
+                'configuration': {'test': 42},
+                'docker_image': str(self.version_1.docker_image.id),
+                'docker_image_iid': None,
+                'docker_image_name': f'my_repo.fake/workers/worker/reco:{self.version_1.id}',
+                'gpu_usage': 'disabled',
+                'id': str(self.version_1.id),
+                'model_usage': False,
+                'revision': {
+                    'author': 'Test user',
+                    'commit_url': 'http://my_repo.fake/workers/worker/commit/1337',
+                    'created': self.version_1.revision.created.isoformat().replace('+00:00', 'Z'),
+                    'hash': '1337',
+                    'id': str(self.version_1.revision.id),
+                    'message': 'My w0rk3r',
+                    'refs': []
+                },
+                'state': 'available',
+                'worker': {
+                    'id': str(self.worker_1.id),
+                    'name': 'Recognizer',
+                    'slug': 'reco',
+                    'type': 'recognizer'
+                }
+            },
+            'worker_version_id': str(self.version_1.id)
+        })
         self.run_1.refresh_from_db()
         self.assertNotEqual(self.run_1.version_id, dla_version.id)
 
@@ -601,7 +717,66 @@ class TestWorkerRuns(FixtureAPITestCase):
             )
             self.assertEqual(response.status_code, status.HTTP_200_OK)
         self.run_1.refresh_from_db()
-        self.assertEqual(response.json(), _deserialize_worker_run(self.run_1))
+
+        self.assertEqual(response.json(), {
+            'configuration': {
+                'archived': False,
+                'configuration': {'key': 'value'},
+                'id': str(self.configuration_1.id),
+                'name': 'My config'
+            },
+            'configuration_id': str(self.configuration_1.id),
+            'id': str(self.run_1.id),
+            'model_version': None,
+            'model_version_id': None,
+            'parents': [],
+            'process': {
+                'activity_state': 'disabled',
+                'corpus': str(self.corpus.id),
+                'id': str(self.process_1.id),
+                'mode': 'workers',
+                'model_id': None,
+                'name': None,
+                'state': 'unscheduled',
+                'test_folder_id': None,
+                'train_folder_id': None,
+                'validation_folder_id': None,
+                'workflow': None
+            },
+            'process_id': str(self.process_1.id),
+            'worker': {
+                'id': str(self.worker_1.id),
+                'name': 'Recognizer',
+                'slug': 'reco',
+                'type': 'recognizer'
+            },
+            'worker_version': {
+                'configuration': {'test': 42},
+                'docker_image': str(self.version_1.docker_image.id),
+                'docker_image_iid': None,
+                'docker_image_name': f'my_repo.fake/workers/worker/reco:{self.version_1.id}',
+                'gpu_usage': 'disabled',
+                'id': str(self.version_1.id),
+                'model_usage': False,
+                'revision': {
+                    'author': 'Test user',
+                    'commit_url': 'http://my_repo.fake/workers/worker/commit/1337',
+                    'created': self.version_1.revision.created.isoformat().replace('+00:00', 'Z'),
+                    'hash': '1337',
+                    'id': str(self.version_1.revision.id),
+                    'message': 'My w0rk3r',
+                    'refs': []
+                },
+                'state': 'available',
+                'worker': {
+                    'id': str(self.worker_1.id),
+                    'name': 'Recognizer',
+                    'slug': 'reco',
+                    'type': 'recognizer'
+                }
+            },
+            'worker_version_id': str(self.version_1.id)
+        })
         self.assertEqual(self.run_1.configuration.id, self.configuration_1.id)
         # Check generated summary, after the update, the configuration should be displayed as well
         self.assertEqual(self.run_1.summary, f"Worker {self.run_1.version.worker.name} @ {str(self.run_1.version.id)[:6]} using configuration '{self.configuration_1.name}'")
@@ -775,7 +950,71 @@ class TestWorkerRuns(FixtureAPITestCase):
             )
         self.assertEqual(response.status_code, status.HTTP_200_OK)
         run.refresh_from_db()
-        self.assertEqual(response.json(), _deserialize_worker_run(run))
+
+        self.assertEqual(response.json(), {
+            'configuration': None,
+            'configuration_id': None,
+            'id': str(run.id),
+            'model_version': {
+                'configuration': {},
+                'id': str(self.model_version_1.id),
+                'model': {
+                    'id': str(self.model_1.id),
+                    'name': 'My model'
+                },
+                'size': 8,
+                'state': 'available',
+                'tag': None
+            },
+            'model_version_id': str(self.model_version_1.id),
+            'parents': [],
+            'process': {
+                'activity_state': 'disabled',
+                'corpus': str(self.corpus.id),
+                'id': str(self.process_1.id),
+                'mode': 'workers',
+                'model_id': None,
+                'name': None,
+                'state': 'unscheduled',
+                'test_folder_id': None,
+                'train_folder_id': None,
+                'validation_folder_id': None,
+                'workflow': None
+            },
+            'process_id': str(self.process_1.id),
+            'worker': {
+                'id': str(self.worker_1.id),
+                'name': 'Recognizer',
+                'slug': 'reco',
+                'type': 'recognizer'
+            },
+            'worker_version': {
+                'configuration': {'test': 'test2'},
+                'docker_image': None,
+                'docker_image_iid': None,
+                'docker_image_name': f'my_repo.fake/workers/worker/reco:{version_with_model.id}',
+                'gpu_usage': 'disabled',
+                'id': str(version_with_model.id),
+                'model_usage': True,
+                'revision': {
+                    'author': 'bob',
+                    'commit_url': 'http://my_repo.fake/workers/worker/commit/2',
+                    'created': rev.created.isoformat().replace('+00:00', 'Z'),
+                    'hash': '2',
+                    'id': str(rev.id),
+                    'message': 'beep boop',
+                    'refs': []
+                },
+                'state': 'created',
+                'worker': {
+                    'id': str(self.worker_1.id),
+                    'name': 'Recognizer',
+                    'slug': 'reco',
+                    'type': 'recognizer'
+                }
+            },
+            'worker_version_id': str(version_with_model.id)
+        })
         self.assertEqual(run.model_version_id, self.model_version_1.id)
         # Check generated summary, after updating, there should be information about the model loaded
         self.assertEqual(run.summary, f"Worker {self.worker_1.name} @ {str(version_with_model.id)[:6]} with model {self.model_version_1.model.name} @ {str(self.model_version_1.id)[:6]}")
@@ -815,7 +1054,75 @@ class TestWorkerRuns(FixtureAPITestCase):
             )
         self.assertEqual(response.status_code, status.HTTP_200_OK)
         run.refresh_from_db()
-        self.assertEqual(response.json(), _deserialize_worker_run(run))
+        self.assertEqual(response.json(), {
+            'configuration': {
+                'archived': False,
+                'configuration': {'key': 'value'},
+                'id': str(self.configuration_1.id),
+                'name': 'My config'
+            },
+            'configuration_id': str(self.configuration_1.id),
+            'id': str(run.id),
+            'model_version': {
+                'configuration': {},
+                'id': str(self.model_version_1.id),
+                'model': {
+                    'id': str(self.model_1.id),
+                    'name': 'My model'
+                },
+                'size': 8,
+                'state': 'available',
+                'tag': None
+            },
+            'model_version_id': str(self.model_version_1.id),
+            'parents': [],
+            'process': {
+                'activity_state': 'disabled',
+                'corpus': str(self.corpus.id),
+                'id': str(self.process_1.id),
+                'mode': 'workers',
+                'model_id': None,
+                'name': None,
+                'state': 'unscheduled',
+                'test_folder_id': None,
+                'train_folder_id': None,
+                'validation_folder_id': None,
+                'workflow': None
+            },
+            'process_id': str(self.process_1.id),
+            'worker': {
+                'id': str(self.worker_1.id),
+                'name': 'Recognizer',
+                'slug': 'reco',
+                'type': 'recognizer'
+            },
+            'worker_version': {
+                'configuration': {'test': 'test2'},
+                'docker_image': None,
+                'docker_image_iid': None,
+                'docker_image_name': f'my_repo.fake/workers/worker/reco:{version_with_model.id}',
+                'gpu_usage': 'disabled',
+                'id': str(version_with_model.id),
+                'model_usage': True,
+                'revision': {
+                    'author': 'bob',
+                    'commit_url': 'http://my_repo.fake/workers/worker/commit/2',
+                    'created': rev_2.created.isoformat().replace('+00:00', 'Z'),
+                    'hash': '2',
+                    'id': str(rev_2.id),
+                    'message': 'beep boop',
+                    'refs': []
+                },
+                'state': 'created',
+                'worker': {
+                    'id': str(self.worker_1.id),
+                    'name': 'Recognizer',
+                    'slug': 'reco',
+                    'type': 'recognizer'
+                }
+            },
+            'worker_version_id': str(version_with_model.id)
+        })
         self.assertEqual(run.model_version_id, self.model_version_1.id)
         # Check generated summary, after updating, there should be information about the model loaded
         self.assertEqual(run.summary, f"Worker {self.worker_1.name} @ {str(version_with_model.id)[:6]} with model {self.model_version_1.model.name} @ {str(self.model_version_1.id)[:6]} using configuration '{self.configuration_1.name}'")
@@ -845,7 +1152,60 @@ class TestWorkerRuns(FixtureAPITestCase):
             )
         self.assertEqual(response.status_code, status.HTTP_200_OK)
         self.run_1.refresh_from_db()
-        self.assertDictEqual(response.json(), _deserialize_worker_run(self.run_1))
+        self.assertDictEqual(response.json(), {
+            'configuration': None,
+            'configuration_id': None,
+            'id': str(self.run_1.id),
+            'model_version': None,
+            'model_version_id': None,
+            'parents': [str(run_2.id)],
+            'process': {
+                'activity_state': 'disabled',
+                'corpus': str(self.corpus.id),
+                'id': str(self.process_1.id),
+                'mode': 'workers',
+                'model_id': None,
+                'name': None,
+                'state': 'unscheduled',
+                'test_folder_id': None,
+                'train_folder_id': None,
+                'validation_folder_id': None,
+                'workflow': None
+            },
+            'process_id': str(self.process_1.id),
+            'worker': {
+                'id': str(self.worker_1.id),
+                'name': 'Recognizer',
+                'slug': 'reco',
+                'type': 'recognizer'
+            },
+            'worker_version': {
+                'configuration': {'test': 42},
+                'docker_image': str(self.version_1.docker_image.id),
+                'docker_image_iid': None,
+                'docker_image_name': f'my_repo.fake/workers/worker/reco:{self.version_1.id}',
+                'gpu_usage': 'disabled',
+                'id': str(self.version_1.id),
+                'model_usage': False,
+                'revision': {
+                    'author': 'Test user',
+                    'commit_url': 'http://my_repo.fake/workers/worker/commit/1337',
+                    'created': self.version_1.revision.created.isoformat().replace('+00:00', 'Z'),
+                    'hash': '1337',
+                    'id': str(self.version_1.revision.id),
+                    'message': 'My w0rk3r',
+                    'refs': []
+                },
+                'state': 'available',
+                'worker': {
+                    'id': str(self.worker_1.id),
+                    'name': 'Recognizer',
+                    'slug': 'reco',
+                    'type': 'recognizer'
+                }
+            },
+            'worker_version_id': str(self.version_1.id)
+        })
 
     def test_partial_update_run_requires_login(self):
         rev_2 = self.repo.revisions.create(
@@ -941,8 +1301,60 @@ class TestWorkerRuns(FixtureAPITestCase):
                 }, format='json'
             )
         self.assertEqual(response.status_code, status.HTTP_200_OK)
-
-        self.assertEqual(response.json(), _deserialize_worker_run(self.run_1))
+        self.assertEqual(response.json(), {
+            'configuration': None,
+            'configuration_id': None,
+            'id': str(self.run_1.id),
+            'model_version': None,
+            'model_version_id': None,
+            'parents': [],
+            'process': {
+                'activity_state': 'disabled',
+                'corpus': str(self.corpus.id),
+                'id': str(self.process_1.id),
+                'mode': 'workers',
+                'model_id': None,
+                'name': None,
+                'state': 'unscheduled',
+                'test_folder_id': None,
+                'train_folder_id': None,
+                'validation_folder_id': None,
+                'workflow': None
+            },
+            'process_id': str(self.process_1.id),
+            'worker': {
+                'id': str(self.worker_1.id),
+                'name': 'Recognizer',
+                'slug': 'reco',
+                'type': 'recognizer'
+            },
+            'worker_version': {
+                'configuration': {'test': 42},
+                'docker_image': str(self.version_1.docker_image.id),
+                'docker_image_iid': None,
+                'docker_image_name': f'my_repo.fake/workers/worker/reco:{self.version_1.id}',
+                'gpu_usage': 'disabled',
+                'id': str(self.version_1.id),
+                'model_usage': False,
+                'revision': {
+                    'author': 'Test user',
+                    'commit_url': 'http://my_repo.fake/workers/worker/commit/1337',
+                    'created': self.version_1.revision.created.isoformat().replace('+00:00', 'Z'),
+                    'hash': '1337',
+                    'id': str(self.version_1.revision.id),
+                    'message': 'My w0rk3r',
+                    'refs': []
+                },
+                'state': 'available',
+                'worker': {
+                    'id': str(self.worker_1.id),
+                    'name': 'Recognizer',
+                    'slug': 'reco',
+                    'type': 'recognizer'
+                }
+            },
+            'worker_version_id': str(self.version_1.id)
+        })
         self.run_1.refresh_from_db()
         self.assertEqual(self.run_1.process.id, self.process_1.id)
 
@@ -961,7 +1373,60 @@ class TestWorkerRuns(FixtureAPITestCase):
                 }, format='json'
             )
         self.assertEqual(response.status_code, status.HTTP_200_OK)
-        self.assertEqual(response.json(), _deserialize_worker_run(self.run_1))
+        self.assertEqual(response.json(), {
+            'configuration': None,
+            'configuration_id': None,
+            'id': str(self.run_1.id),
+            'model_version': None,
+            'model_version_id': None,
+            'parents': [],
+            'process': {
+                'activity_state': 'disabled',
+                'corpus': str(self.corpus.id),
+                'id': str(self.process_1.id),
+                'mode': 'workers',
+                'model_id': None,
+                'name': None,
+                'state': 'unscheduled',
+                'test_folder_id': None,
+                'train_folder_id': None,
+                'validation_folder_id': None,
+                'workflow': None
+            },
+            'process_id': str(self.process_1.id),
+            'worker': {
+                'id': str(self.worker_1.id),
+                'name': 'Recognizer',
+                'slug': 'reco',
+                'type': 'recognizer'
+            },
+            'worker_version': {
+                'configuration': {'test': 42},
+                'docker_image': str(self.version_1.docker_image.id),
+                'docker_image_iid': None,
+                'docker_image_name': f'my_repo.fake/workers/worker/reco:{self.version_1.id}',
+                'gpu_usage': 'disabled',
+                'id': str(self.version_1.id),
+                'model_usage': False,
+                'revision': {
+                    'author': 'Test user',
+                    'commit_url': 'http://my_repo.fake/workers/worker/commit/1337',
+                    'created': self.version_1.revision.created.isoformat().replace('+00:00', 'Z'),
+                    'hash': '1337',
+                    'id': str(self.version_1.revision.id),
+                    'message': 'My w0rk3r',
+                    'refs': []
+                },
+                'state': 'available',
+                'worker': {
+                    'id': str(self.worker_1.id),
+                    'name': 'Recognizer',
+                    'slug': 'reco',
+                    'type': 'recognizer'
+                }
+            },
+            'worker_version_id': str(self.version_1.id)
+        })
         self.run_1.refresh_from_db()
         self.assertNotEqual(self.run_1.version_id, dla_version.id)
 
@@ -979,7 +1444,65 @@ class TestWorkerRuns(FixtureAPITestCase):
             )
             self.assertEqual(response.status_code, status.HTTP_200_OK)
         self.run_1.refresh_from_db()
-        self.assertEqual(response.json(), _deserialize_worker_run(self.run_1))
+        self.assertEqual(response.json(), {
+            'configuration': {
+                'archived': False,
+                'configuration': {'key': 'value'},
+                'id': str(self.configuration_1.id),
+                'name': 'My config'
+            },
+            'configuration_id': str(self.configuration_1.id),
+            'id': str(self.run_1.id),
+            'model_version': None,
+            'model_version_id': None,
+            'parents': [],
+            'process': {
+                'activity_state': 'disabled',
+                'corpus': str(self.corpus.id),
+                'id': str(self.process_1.id),
+                'mode': 'workers',
+                'model_id': None,
+                'name': None,
+                'state': 'unscheduled',
+                'test_folder_id': None,
+                'train_folder_id': None,
+                'validation_folder_id': None,
+                'workflow': None
+            },
+            'process_id': str(self.process_1.id),
+            'worker': {
+                'id': str(self.worker_1.id),
+                'name': 'Recognizer',
+                'slug': 'reco',
+                'type': 'recognizer'
+            },
+            'worker_version': {
+                'configuration': {'test': 42},
+                'docker_image': str(self.version_1.docker_image.id),
+                'docker_image_iid': None,
+                'docker_image_name': f'my_repo.fake/workers/worker/reco:{self.version_1.id}',
+                'gpu_usage': 'disabled',
+                'id': str(self.version_1.id),
+                'model_usage': False,
+                'revision': {
+                    'author': 'Test user',
+                    'commit_url': 'http://my_repo.fake/workers/worker/commit/1337',
+                    'created': self.version_1.revision.created.isoformat().replace('+00:00', 'Z'),
+                    'hash': '1337',
+                    'id': str(self.version_1.revision.id),
+                    'message': 'My w0rk3r',
+                    'refs': []
+                },
+                'state': 'available',
+                'worker': {
+                    'id': str(self.worker_1.id),
+                    'name': 'Recognizer',
+                    'slug': 'reco',
+                    'type': 'recognizer'
+                }
+            },
+            'worker_version_id': str(self.version_1.id)
+        })
         self.assertEqual(self.run_1.configuration.id, self.configuration_1.id)
         self.assertEqual(self.run_1.summary, f"Worker {self.run_1.version.worker.name} @ {str(self.run_1.version.id)[:6]} using configuration '{self.configuration_1.name}'")
 
@@ -1147,7 +1670,70 @@ class TestWorkerRuns(FixtureAPITestCase):
             )
         self.assertEqual(response.status_code, status.HTTP_200_OK)
         run.refresh_from_db()
-        self.assertEqual(response.json(), _deserialize_worker_run(run))
+        self.assertEqual(response.json(), {
+            'configuration': None,
+            'configuration_id': None,
+            'id': str(run.id),
+            'model_version': {
+                'configuration': {},
+                'id': str(self.model_version_1.id),
+                'model': {
+                    'id': str(self.model_1.id),
+                    'name': 'My model'
+                },
+                'size': 8,
+                'state': 'available',
+                'tag': None
+            },
+            'model_version_id': str(self.model_version_1.id),
+            'parents': [],
+            'process': {
+                'activity_state': 'disabled',
+                'corpus': str(self.corpus.id),
+                'id': str(self.process_1.id),
+                'mode': 'workers',
+                'model_id': None,
+                'name': None,
+                'state': 'unscheduled',
+                'test_folder_id': None,
+                'train_folder_id': None,
+                'validation_folder_id': None,
+                'workflow': None
+            },
+            'process_id': str(self.process_1.id),
+            'worker': {
+                'id': str(self.worker_1.id),
+                'name': 'Recognizer',
+                'slug': 'reco',
+                'type': 'recognizer'
+            },
+            'worker_version': {
+                'configuration': {'test': 'test2'},
+                'docker_image': None,
+                'docker_image_iid': None,
+                'docker_image_name': f'my_repo.fake/workers/worker/reco:{version_with_model.id}',
+                'gpu_usage': 'disabled',
+                'id': str(version_with_model.id),
+                'model_usage': True,
+                'revision': {
+                    'author': 'bob',
+                    'commit_url': 'http://my_repo.fake/workers/worker/commit/2',
+                    'created': rev.created.isoformat().replace('+00:00', 'Z'),
+                    'hash': '2',
+                    'id': str(rev.id),
+                    'message': 'beep boop',
+                    'refs': []
+                },
+                'state': 'created',
+                'worker': {
+                    'id': str(self.worker_1.id),
+                    'name': 'Recognizer',
+                    'slug': 'reco',
+                    'type': 'recognizer'
+                }
+            },
+            'worker_version_id': str(version_with_model.id)
+        })
         self.assertEqual(run.model_version_id, self.model_version_1.id)
         self.assertEqual(run.summary, f"Worker {version_with_model.worker.name} @ {str(version_with_model.id)[:6]} with model {self.model_version_1.model.name} @ {str(self.model_version_1.id)[:6]}")
 
@@ -1183,7 +1769,76 @@ class TestWorkerRuns(FixtureAPITestCase):
             )
         self.assertEqual(response.status_code, status.HTTP_200_OK)
         run.refresh_from_db()
-        self.assertEqual(response.json(), _deserialize_worker_run(run))
+        self.maxDiff = None
+        self.assertEqual(response.json(), {
+            'configuration': {
+                'archived': False,
+                'configuration': {'key': 'value'},
+                'id': str(self.configuration_1.id),
+                'name': 'My config'
+            },
+            'configuration_id': str(self.configuration_1.id),
+            'id': str(run.id),
+            'model_version': {
+                'configuration': {},
+                'id': str(self.model_version_1.id),
+                'model': {
+                    'id': str(self.model_1.id),
+                    'name': 'My model'
+                },
+                'size': 8,
+                'state': 'available',
+                'tag': None
+            },
+            'model_version_id': str(self.model_version_1.id),
+            'parents': [],
+            'process': {
+                'activity_state': 'disabled',
+                'corpus': str(self.corpus.id),
+                'id': str(self.process_1.id),
+                'mode': 'workers',
+                'model_id': None,
+                'name': None,
+                'state': 'unscheduled',
+                'test_folder_id': None,
+                'train_folder_id': None,
+                'validation_folder_id': None,
+                'workflow': None
+            },
+            'process_id': str(self.process_1.id),
+            'worker': {
+                'id': str(self.worker_1.id),
+                'name': 'Recognizer',
+                'slug': 'reco',
+                'type': 'recognizer'
+            },
+            'worker_version': {
+                'configuration': {'test': 'test2'},
+                'docker_image': None,
+                'docker_image_iid': None,
+                'docker_image_name': f'my_repo.fake/workers/worker/reco:{version_with_model.id}',
+                'gpu_usage': 'disabled',
+                'id': str(version_with_model.id),
+                'model_usage': True,
+                'revision': {
+                    'author': 'bob',
+                    'commit_url': 'http://my_repo.fake/workers/worker/commit/2',
+                    'created': rev_2.created.isoformat().replace('+00:00', 'Z'),
+                    'hash': '2',
+                    'id': str(rev_2.id),
+                    'message': 'beep boop',
+                    'refs': []
+                },
+                'state': 'created',
+                'worker': {
+                    'id': str(self.worker_1.id),
+                    'name': 'Recognizer',
+                    'slug': 'reco',
+                    'type': 'recognizer'
+                }
+            },
+            'worker_version_id': str(version_with_model.id)
+        })
         self.assertEqual(run.model_version_id, self.model_version_1.id)
         self.assertEqual(run.configuration_id, self.configuration_1.id)
 
@@ -1212,7 +1867,60 @@ class TestWorkerRuns(FixtureAPITestCase):
             )
         self.assertEqual(response.status_code, status.HTTP_200_OK)
         self.run_1.refresh_from_db()
-        self.assertDictEqual(response.json(), _deserialize_worker_run(self.run_1))
+        self.assertDictEqual(response.json(), {
+            'configuration': None,
+            'configuration_id': None,
+            'id': str(self.run_1.id),
+            'model_version': None,
+            'model_version_id': None,
+            'parents': [str(run_2.id)],
+            'process': {
+                'activity_state': 'disabled',
+                'corpus': str(self.corpus.id),
+                'id': str(self.process_1.id),
+                'mode': 'workers',
+                'model_id': None,
+                'name': None,
+                'state': 'unscheduled',
+                'test_folder_id': None,
+                'train_folder_id': None,
+                'validation_folder_id': None,
+                'workflow': None
+            },
+            'process_id': str(self.process_1.id),
+            'worker': {
+                'id': str(self.worker_1.id),
+                'name': 'Recognizer',
+                'slug': 'reco',
+                'type': 'recognizer'
+            },
+            'worker_version': {
+                'configuration': {'test': 42},
+                'docker_image': str(self.version_1.docker_image.id),
+                'docker_image_iid': None,
+                'docker_image_name': f'my_repo.fake/workers/worker/reco:{self.version_1.id}',
+                'gpu_usage': 'disabled',
+                'id': str(self.version_1.id),
+                'model_usage': False,
+                'revision': {
+                    'author': 'Test user',
+                    'commit_url': 'http://my_repo.fake/workers/worker/commit/1337',
+                    'created': self.version_1.revision.created.isoformat().replace('+00:00', 'Z'),
+                    'hash': '1337',
+                    'id': str(self.version_1.revision.id),
+                    'message': 'My w0rk3r',
+                    'refs': []
+                },
+                'state': 'available',
+                'worker': {
+                    'id': str(self.worker_1.id),
+                    'name': 'Recognizer',
+                    'slug': 'reco',
+                    'type': 'recognizer'
+                }
+            },
+            'worker_version_id': str(self.version_1.id)
+        })
 
     def test_delete_run_requires_login(self):
         response = self.client.delete(
-- 
GitLab