From 9db4433e0194a67b8762fad880d38799e98058cb Mon Sep 17 00:00:00 2001
From: manon blanco <blanco@teklia.com>
Date: Tue, 10 Nov 2020 14:49:36 +0000
Subject: [PATCH] Create a fake worker version

---
 .../commands/fake_worker_version.py           |  69 +++++++++++
 arkindex/dataimport/models.py                 |   3 +-
 .../tests/test_fake_worker_version.py         | 116 ++++++++++++++++++
 3 files changed, 187 insertions(+), 1 deletion(-)
 create mode 100644 arkindex/dataimport/management/commands/fake_worker_version.py
 create mode 100644 arkindex/dataimport/tests/test_fake_worker_version.py

diff --git a/arkindex/dataimport/management/commands/fake_worker_version.py b/arkindex/dataimport/management/commands/fake_worker_version.py
new file mode 100644
index 0000000000..1efe887bae
--- /dev/null
+++ b/arkindex/dataimport/management/commands/fake_worker_version.py
@@ -0,0 +1,69 @@
+#!/usr/bin/env python3
+import logging
+import uuid
+
+from django.core.management.base import BaseCommand
+
+from arkindex.dataimport.models import Repository, RepositoryType, Revision, Worker, WorkerVersion
+from arkindex_common.ml_tool import MLToolType
+
+logging.basicConfig(
+    level=logging.INFO,
+    format='[%(levelname)s] %(message)s',
+)
+logger = logging.getLogger(__name__)
+
+
+class Command(BaseCommand):
+    help = 'Create a fake worker version'
+
+    def add_arguments(self, parser):
+        parser.add_argument(
+            "--url",
+            help="URL of the repository",
+            required=True
+        )
+        parser.add_argument(
+            "--name",
+            help="Name of the worker",
+            required=True
+        )
+        parser.add_argument(
+            "--slug",
+            help="Slug of the worker",
+            required=True
+        )
+
+    def handle(self, url, name, slug, *args, **options):
+        versions = WorkerVersion.objects.filter(worker__slug=slug)
+        if versions.exists():
+            versions_id = list(versions.values_list('id', flat=True).distinct())
+            logger.info(f"This worker already has versions: {versions_id}")
+            return
+
+        repo, _ = Repository.objects.get_or_create(
+            url=url,
+            type=RepositoryType.Worker,
+        )
+
+        worker, _ = Worker.objects.get_or_create(
+            name=name,
+            slug=slug,
+            type=MLToolType.Classifier,
+            repository=repo
+        )
+
+        revision = Revision.objects.create(
+            repo_id=repo.id,
+            hash=uuid.uuid4().hex,
+            message="Fake revision",
+            author="Teklia Bot"
+        )
+
+        version = WorkerVersion.objects.create(
+            worker=worker,
+            revision=revision,
+            configuration="",
+        )
+
+        logger.info(f"Created a worker version: {version.id}")
diff --git a/arkindex/dataimport/models.py b/arkindex/dataimport/models.py
index 21449e3f3a..01dfc88346 100644
--- a/arkindex/dataimport/models.py
+++ b/arkindex/dataimport/models.py
@@ -349,7 +349,8 @@ class Revision(IndexableModel):
         return '{}/commit/{}'.format(self.repo.url.rstrip('/'), self.hash)
 
     def __str__(self):
-        return '{} "{}" by {}'.format(self.hash[:8], self.message.splitlines()[0], self.author)
+        message = ' "{}"'.format(self.message.splitlines()[0]) if self.message else ''
+        return '{}{} by {}'.format(self.hash[:8], message, self.author)
 
     @property
     def state(self):
diff --git a/arkindex/dataimport/tests/test_fake_worker_version.py b/arkindex/dataimport/tests/test_fake_worker_version.py
new file mode 100644
index 0000000000..41d6735f86
--- /dev/null
+++ b/arkindex/dataimport/tests/test_fake_worker_version.py
@@ -0,0 +1,116 @@
+from django.core.management import call_command
+
+from arkindex.dataimport.models import Repository, RepositoryType, Revision, Worker, WorkerVersion, WorkerVersionState
+from arkindex.project.tests import FixtureTestCase
+from arkindex_common.ml_tool import MLToolType
+
+
+class TestFakeWorker(FixtureTestCase):
+
+    def test_create_version(self):
+        slug = 'myslug'
+        name = 'My name'
+        url = 'http://fake'
+
+        self.assertFalse(WorkerVersion.objects.filter(worker__slug=slug).exists())
+
+        call_command(
+            'fake_worker_version',
+            slug=slug,
+            name=name,
+            url=url,
+        )
+
+        worker = Worker.objects.get(slug=slug)
+        version = WorkerVersion.objects.get(worker__slug=slug)
+        repo = worker.repository
+        revision = Revision.objects.get(repo_id=repo.id)
+
+        self.assertEqual(repo.url, url)
+        self.assertEqual(repo.type, RepositoryType.Worker)
+
+        self.assertEqual(worker.name, name)
+        self.assertEqual(worker.slug, slug)
+        self.assertEqual(worker.type, MLToolType.Classifier)
+
+        self.assertIsNotNone(revision.hash)
+        self.assertEqual(revision.message, "Fake revision")
+        self.assertEqual(revision.author, "Teklia Bot")
+
+        self.assertEqual(version.worker, worker)
+        self.assertEqual(version.revision, revision)
+        self.assertEqual(version.state, WorkerVersionState.Created)
+
+    def test_version_already_exists(self):
+        slug = 'myslug'
+        name = 'My name'
+        url = 'http://fake'
+        call_command(
+            'fake_worker_version',
+            slug=slug,
+            name=name,
+            url=url,
+        )
+
+        old_versions = WorkerVersion.objects.filter(worker__slug=slug)
+        old_versions_id = list(old_versions.values_list('id', flat=True).distinct())
+        self.assertTrue(old_versions.exists())
+
+        call_command(
+            'fake_worker_version',
+            slug=slug,
+            name=name,
+            url=url,
+        )
+
+        new_versions = WorkerVersion.objects.filter(worker__slug=slug)
+        new_versions_id = list(new_versions.values_list('id', flat=True).distinct())
+        self.assertEqual(old_versions_id, new_versions_id)
+
+    def test_repository_already_exists(self):
+        slug = 'myslug'
+        name = 'My name'
+        url = 'http://fake'
+
+        repo = Repository.objects.create(
+            url=url,
+            type=RepositoryType.Worker,
+        )
+
+        call_command(
+            'fake_worker_version',
+            slug=slug,
+            name=name,
+            url=url,
+        )
+
+        version = WorkerVersion.objects.get(worker__slug=slug)
+        self.assertEqual(version.worker.repository.id, repo.id)
+
+    def test_worker_already_exists(self):
+        slug = 'myslug'
+        name = 'My name'
+        url = 'http://fake'
+
+        repo = Repository.objects.create(
+            url=url,
+            type=RepositoryType.Worker,
+        )
+
+        worker = Worker.objects.create(
+            name=name,
+            slug=slug,
+            type=MLToolType.Classifier,
+            repository=repo
+        )
+
+        call_command(
+            'fake_worker_version',
+            slug=slug,
+            name=name,
+            url=url,
+        )
+
+        version = WorkerVersion.objects.get(worker__slug=slug)
+        self.assertEqual(version.worker.repository.id, repo.id)
+        self.assertEqual(version.worker.id, worker.id)
-- 
GitLab