summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharles Oliveira <charles.oliveira@linaro.org>2020-07-28 20:33:09 -0300
committerCharles Oliveira <charles.oliveira@linaro.org>2020-07-28 23:31:01 -0300
commit06733ea930fec64941611549718a11ae5fa8063c (patch)
tree33e89350368e8e904a6af8f9037308d3765d28f4
parente975ff1f142786e98a2d4fb860a3e9948ba474ef (diff)
shortcuts: add create_or_update_project shortcut
-rw-r--r--squad_client/core/models.py3
-rw-r--r--squad_client/shortcuts.py69
-rw-r--r--tests/test_shortcuts.py192
3 files changed, 262 insertions, 2 deletions
diff --git a/squad_client/core/models.py b/squad_client/core/models.py
index de1a63d..8b3425c 100644
--- a/squad_client/core/models.py
+++ b/squad_client/core/models.py
@@ -361,7 +361,8 @@ class Project(SquadObject):
def pre_save(self):
if not hasattr(self, 'enabled_plugins_list'):
- self.enabled_plugins_list = []
+ # TODO: make enabled_plugins_list optional
+ self.enabled_plugins_list = ['linux-log-parser']
class Build(SquadObject):
diff --git a/squad_client/shortcuts.py b/squad_client/shortcuts.py
index 30d8f83..a1879e0 100644
--- a/squad_client/shortcuts.py
+++ b/squad_client/shortcuts.py
@@ -1,4 +1,4 @@
-from .core.models import Squad, Group, Project, Build, Environment, Test, Metric, TestRun
+from .core.models import Squad, Group, Project, Build, Environment, Test, Metric, TestRun, SquadObjectException
from .utils import split_build_url, first, split_group_project_slug
@@ -83,3 +83,70 @@ def submit_results(group_project_slug=None, build_version=None, env_slug=None, t
testrun.add_metric(metric)
return testrun.submit_results()
+
+
+def create_or_update_project(group_slug=None, slug=None, name=None, description=None, settings=None,
+ is_public=None, html_mail=None, moderate_notifications=None, is_archived=None,
+ email_template=None, plugins=None, important_metadata_keys=None,
+ wait_before_notification_timeout=None, notification_timeout=None,
+ data_retention=None, overwrite=False):
+ errors = []
+ group = None
+ project = None
+
+ if group_slug is None:
+ errors.append('Group slug is required')
+ return None, errors
+
+ group = first(squad.groups(slug=group_slug))
+ if group is None:
+ errors.append('Group "%s" not found' % group_slug)
+ return None, errors
+
+ if slug is None:
+ errors.append('Project slug is required')
+ return None, errors
+
+ project = group.project(slug)
+ if project is not None:
+ if not overwrite:
+ errors.append('Project exists already')
+ return None, errors
+ else:
+ project = Project()
+ project.group = group
+ project.slug = slug
+
+ if name:
+ project.name = name
+ if plugins:
+ project.enabled_plugins_list = plugins
+ if settings:
+ project.project_settings = settings
+ if html_mail is not None:
+ project.html_mail = html_mail
+ if is_public is not None:
+ project.is_public = is_public
+ if is_archived is not None:
+ project.is_archived = is_archived
+ if description:
+ project.description = description
+ if data_retention is not None:
+ project.data_retention_days = data_retention
+ if notification_timeout is not None:
+ project.notification_timeout = notification_timeout
+ if moderate_notifications is not None:
+ project.moderate_notifications = moderate_notifications
+ if important_metadata_keys:
+ project.important_metadata_keys = '\n'.join(important_metadata_keys) if type(important_metadata_keys) == list else important_metadata_keys
+ if wait_before_notification_timeout is not None:
+ project.wait_before_notification = wait_before_notification_timeout
+
+ try:
+ project.save()
+ except SquadObjectException as e:
+ errors.append(str(e))
+
+ if len(errors):
+ return None, errors
+ return project, []
diff --git a/tests/test_shortcuts.py b/tests/test_shortcuts.py
index 167607d..a4ea86b 100644
--- a/tests/test_shortcuts.py
+++ b/tests/test_shortcuts.py
@@ -4,10 +4,12 @@ from unittest import TestCase
from . import settings
from squad_client.core.api import SquadApi
from squad_client.core.models import Squad
+from squad_client.utils import first
from squad_client.shortcuts import (
retrieve_latest_builds,
retrieve_build_results,
submit_results,
+ create_or_update_project,
)
@@ -70,3 +72,193 @@ class SubmitResultsShortcutTest(TestCase):
results = self.squad.tests(name="test-malformed")
self.assertTrue(len(results) == 0)
self.assertFalse(success)
+
+
+class CreateOrUpdateShortcutTest(TestCase):
+ def setUp(self):
+ self.squad = Squad()
+ SquadApi.configure(
+ url="http://localhost:%s" % settings.DEFAULT_SQUAD_PORT,
+ token="193cd8bb41ab9217714515954e8724f651ef8601",
+ )
+
+ self.group_slug = 'my_group'
+
+ def assertEqualProjects(self, project1, project2):
+ self.assertEqual(project1.id, project2.id)
+ self.assertEqual(project1.name, project2.name)
+ self.assertEqual(project1.description, project2.description)
+ self.assertEqual(project1.project_settings, project2.project_settings)
+ self.assertEqual(project1.is_public, project2.is_public)
+ self.assertEqual(project1.html_mail, project2.html_mail)
+ self.assertEqual(project1.moderate_notifications, project2.moderate_notifications)
+ self.assertEqual(project1.is_archived, project2.is_archived)
+ self.assertEqual(project1.enabled_plugins_list, project2.enabled_plugins_list)
+ self.assertEqual(project1.important_metadata_keys, project2.important_metadata_keys)
+ self.assertEqual(project1.wait_before_notification, project2.wait_before_notification)
+ self.assertEqual(project1.notification_timeout, project2.notification_timeout)
+ self.assertEqual(project1.data_retention_days, project2.data_retention_days)
+
+ def test_minimum_parameters(self):
+ project_slug = 'project-with-minimum-parameteres'
+ project, errors = create_or_update_project(
+ group_slug=self.group_slug,
+ slug=project_slug,
+ )
+
+ self.assertIsNotNone(project)
+ self.assertEqual(0, len(errors))
+
+ check_project = first(self.squad.projects(group__slug=self.group_slug, slug=project_slug))
+ self.assertEqual(check_project.id, project.id)
+
+ project.delete()
+
+ def test_all_parameters(self):
+ project_slug = 'project-with-all-parameteres'
+ project, errors = create_or_update_project(
+ group_slug=self.group_slug,
+ slug=project_slug,
+ name='project name',
+ description='project description',
+ settings='{"SETTING_KEY": "SETTING VALUE"}',
+ is_public=True,
+ html_mail=False,
+ moderate_notifications=False,
+ is_archived=False,
+ plugins=['linux-log-parser'],
+ important_metadata_keys="important-key-1,important key 2",
+ wait_before_notification_timeout=60,
+ notification_timeout=120,
+ data_retention=1,
+ )
+
+ self.assertIsNotNone(project)
+ self.assertEqual(0, len(errors))
+
+ check_project = first(self.squad.projects(group__slug=self.group_slug, slug=project_slug))
+ self.assertEqualProjects(check_project, project)
+
+ project.delete()
+
+ def test_overwrite(self):
+ project_slug = 'project-with-overwritten-data'
+ project, errors = create_or_update_project(
+ group_slug=self.group_slug,
+ slug=project_slug,
+ name='new name',
+ )
+
+ self.assertIsNotNone(project)
+ self.assertEqual(0, len(errors))
+
+ check_project = first(self.squad.projects(group__slug=self.group_slug, slug=project_slug))
+ self.assertEqual(check_project.id, project.id)
+ self.assertEqual(check_project.name, project.name)
+
+ project_edited, errors = create_or_update_project(
+ group_slug=self.group_slug,
+ slug=project_slug,
+ name='new name edited',
+ overwrite=True,
+ )
+
+ self.assertIsNotNone(project_edited)
+ self.assertEqual(0, len(errors))
+
+ check_project = first(self.squad.projects(group__slug=self.group_slug, slug=project_slug))
+ self.assertEqual(check_project.id, project_edited.id)
+ self.assertEqual(check_project.name, project_edited.name)
+
+ project_edited.delete()
+
+ def test_overwrite_selected_fields_only(self):
+ project_slug = 'project-with-overwritten-data-specific-fields-only'
+ description = 'project description'
+ settings = '{"SETTING_KEY": "SETTING VALUE"}'
+ is_public = True
+ html_mail = False
+ moderate_notifications = False
+ is_archived = False
+ plugins = ['linux-log-parser']
+ important_metadata_keys = 'important-key-1,important key 2'
+ wait_before_notification_timeout = 60
+ notification_timeout = 120
+ data_retention = 1
+
+ project, errors = create_or_update_project(
+ group_slug=self.group_slug,
+ slug=project_slug,
+ name='new name',
+ description=description,
+ settings=settings,
+ is_public=is_public,
+ html_mail=html_mail,
+ moderate_notifications=moderate_notifications,
+ is_archived=is_archived,
+ plugins=plugins,
+ important_metadata_keys=important_metadata_keys,
+ wait_before_notification_timeout=wait_before_notification_timeout,
+ notification_timeout=notification_timeout,
+ data_retention=data_retention,
+ )
+
+ self.assertIsNotNone(project)
+ self.assertEqual(0, len(errors))
+
+ check_project = first(self.squad.projects(group__slug=self.group_slug, slug=project_slug))
+ self.assertEqualProjects(check_project, project)
+
+ project_edited, errors = create_or_update_project(
+ group_slug=self.group_slug,
+ slug=project_slug,
+ name='new name edited',
+ overwrite=True,
+ )
+
+ self.assertIsNotNone(project_edited)
+ self.assertEqual(0, len(errors))
+
+ check_project = first(self.squad.projects(group__slug=self.group_slug, slug=project_slug))
+ self.assertEqualProjects(check_project, project_edited)
+ self.assertEqual(description, project_edited.description)
+ self.assertEqual(settings, project_edited.project_settings)
+ self.assertEqual(is_public, project_edited.is_public)
+ self.assertEqual(html_mail, project_edited.html_mail)
+ self.assertEqual(moderate_notifications, project_edited.moderate_notifications)
+ self.assertEqual(is_archived, project_edited.is_archived)
+ self.assertEqual(plugins, project_edited.enabled_plugins_list)
+ self.assertEqual(important_metadata_keys, project_edited.important_metadata_keys)
+ self.assertEqual(wait_before_notification_timeout, project_edited.wait_before_notification)
+ self.assertEqual(notification_timeout, project_edited.notification_timeout)
+ self.assertEqual(data_retention, project_edited.data_retention_days)
+
+ project_edited.delete()
+
+ def test_no_overwrite(self):
+ project_slug = 'project-without-overwritten-data'
+ project, errors = create_or_update_project(
+ group_slug=self.group_slug,
+ slug=project_slug,
+ name='new name',
+ )
+
+ self.assertIsNotNone(project)
+ self.assertEqual(0, len(errors))
+
+ check_project = first(self.squad.projects(group__slug=self.group_slug, slug=project_slug))
+ self.assertEqual(check_project.id, project.id)
+ self.assertEqual(check_project.name, project.name)
+
+ project_edited, errors = create_or_update_project(
+ group_slug=self.group_slug,
+ slug=project_slug,
+ name='new name edited',
+ overwrite=False,
+ )
+
+ self.assertIsNone(project_edited)
+ self.assertEqual(1, len(errors))
+ self.assertEqual(['Project exists already'], errors)
+
+ project.delete()