diff options
author | Charles Oliveira <charles.oliveira@linaro.org> | 2020-07-28 20:33:09 -0300 |
---|---|---|
committer | Charles Oliveira <charles.oliveira@linaro.org> | 2020-07-28 23:31:01 -0300 |
commit | 06733ea930fec64941611549718a11ae5fa8063c (patch) | |
tree | 33e89350368e8e904a6af8f9037308d3765d28f4 | |
parent | e975ff1f142786e98a2d4fb860a3e9948ba474ef (diff) |
shortcuts: add create_or_update_project shortcut
-rw-r--r-- | squad_client/core/models.py | 3 | ||||
-rw-r--r-- | squad_client/shortcuts.py | 69 | ||||
-rw-r--r-- | tests/test_shortcuts.py | 192 |
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() |