From 517db36e11d52d0d5ec8b252509296ba911bd2e2 Mon Sep 17 00:00:00 2001 From: Matheus Fernandes Date: Thu, 20 Aug 2015 12:11:49 -0300 Subject: [PATCH] Improved data_api tests --- colab/plugins/gitlab/data_api.py | 148 ++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------------------------------------------------------------------ colab/plugins/gitlab/tests/data.py | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/plugins/gitlab/tests/test_data_api.py | 49 +++++++++++++++++++++++++++++++++++++++++++------ 3 files changed, 141 insertions(+), 108 deletions(-) create mode 100644 colab/plugins/gitlab/tests/data.py diff --git a/colab/plugins/gitlab/data_api.py b/colab/plugins/gitlab/data_api.py index 8e9f76e..0457777 100644 --- a/colab/plugins/gitlab/data_api.py +++ b/colab/plugins/gitlab/data_api.py @@ -65,138 +65,82 @@ class GitlabDataAPI(ProxyDataAPI): return _object - def fetch_projects(self): + def fetch(self, url, gitlab_class): page = 1 - projects = [] + obj_list = [] while True: - json_data = self.get_json_data('/api/v3/projects/all', page) + json_data = self.get_json_data(url, page) page = page + 1 if not len(json_data): break for element in json_data: - project = GitlabProject() - self.fill_object_data(element, project) - projects.append(project) - - return projects - - def fetch_groups(self): - page = 1 - groups = [] + obj = gitlab_class() + self.fill_object_data(element, obj) + obj_list.append(obj) - while True: - json_data = self.get_json_data('/api/v3/groups', page) - page = page + 1 + return obj_list - if not len(json_data): - break - - for element in json_data: - group = GitlabGroup() - self.fill_object_data(element, group) - groups.append(group) - - return groups - - def fetch_merge_request(self, projects): - all_merge_request = [] + def fetch_comments(self, url, parent_class, issue_comment): + all_comments = [] + all_parent_objects = parent_class.objects.all() - for project in projects: + for parent_obj in all_parent_objects: page = 1 while True: - url = '/api/v3/projects/{}/merge_requests'.format(project.id) - json_data_mr = self.get_json_data(url, page) + formated_url = url.format(parent_obj.project_id, parent_obj.id) + json_data = self.get_json_data(formated_url, page) page = page + 1 - if len(json_data_mr) == 0: + if len(json_data) == 0: break - for element in json_data_mr: - single_merge_request = GitlabMergeRequest() - self.fill_object_data(element, single_merge_request) - all_merge_request.append(single_merge_request) - - return all_merge_request + for element in json_data: + single_comment = GitlabComment() + self.fill_object_data(element, single_comment) + single_comment.project = parent_obj.project + single_comment.issue_comment = issue_comment + single_comment.parent_id = parent_obj.id + all_comments.append(single_comment) - def fetch_issue(self, projects): - all_issues = [] + return all_comments - for project in projects: - page = 1 - while True: - url = '/api/v3/projects/{}/issues'.format(project.id) - json_data_issue = self.get_json_data(url, page) - page = page + 1 + def fetch_projects(self): + return self.fetch('/api/v3/projects/all', GitlabProject) - if len(json_data_issue) == 0: - break + def fetch_groups(self): + return self.fetch('/api/v3/groups', GitlabGroup) - for element in json_data_issue: - single_issue = GitlabIssue() - self.fill_object_data(element, single_issue) - all_issues.append(single_issue) + def fetch_merge_request(self, projects): + merge_requests = [] + for project in projects: + url = '/api/v3/projects/{}/merge_requests'.format(project.id) + merge_requests.extend(self.fetch(url, GitlabMergeRequest)) + return merge_requests - return all_issues + def fetch_issue(self, projects): + issues = [] + for project in projects: + url = '/api/v3/projects/{}/issues'.format(project.id) + issues.extend(self.fetch(url, GitlabIssue)) + return issues - def fetch_comments(self): + def fetch_all_comments(self): all_comments = [] - all_comments.extend(self.fetch_comments_MR()) + all_comments.extend(self.fetch_comments_mr()) all_comments.extend(self.fetch_comments_issues()) return all_comments - def fetch_comments_MR(self): - all_comments = [] - all_merge_requests = GitlabMergeRequest.objects.all() - - for merge_request in all_merge_requests: - page = 1 - while True: - url = '/api/v3/projects/{}/merge_requests/{}/notes'.format( - merge_request.project_id, merge_request.id) - json_data_mr = self.get_json_data(url, page) - page = page + 1 - - if len(json_data_mr) == 0: - break - - for element in json_data_mr: - single_comment = GitlabComment() - self.fill_object_data(element, single_comment) - single_comment.project = merge_request.project - single_comment.issue_comment = False - single_comment.parent_id = merge_request.id - all_comments.append(single_comment) - - return all_comments + def fetch_comments_mr(self): + url = '/api/v3/projects/{}/merge_requests/{}/notes' + return self.fetch_comments(url, GitlabMergeRequest, False) def fetch_comments_issues(self): - all_comments = [] - all_issues = GitlabIssue.objects.all() - - for issue in all_issues: - page = 1 - while True: - url = '/api/v3/projects/{}/issues/{}/notes'.format( - issue.project_id, issue.id) - json_data_mr = self.get_json_data(url, page) - page = page + 1 - - if len(json_data_mr) == 0: - break - - for element in json_data_mr: - single_comment = GitlabComment() - self.fill_object_data(element, single_comment) - single_comment.project = issue.project - single_comment.issue_comment = True - single_comment.parent_id = issue.id - all_comments.append(single_comment) - - return all_comments + url = '/api/v3/projects/{}/issues/{}/notes' + return self.fetch_comments(url, GitlabIssue, True) def fetch_data(self): LOGGER.info("Importing Projects") @@ -209,7 +153,7 @@ class GitlabDataAPI(ProxyDataAPI): issues = self.fetch_issue(projects) LOGGER.info("Importing Comments") - comments = self.fetch_comments() + comments = self.fetch_all_comments() LOGGER.info("Importing Groups") groups = self.fetch_groups() diff --git a/colab/plugins/gitlab/tests/data.py b/colab/plugins/gitlab/tests/data.py new file mode 100644 index 0000000..7ec8e43 --- /dev/null +++ b/colab/plugins/gitlab/tests/data.py @@ -0,0 +1,52 @@ +proxied_app = {'menu_title': None, + 'private_token': 'token', + 'upstream': 'localhost/gitlab/'} + +projects_json = [{"id": 32, + "description": "Test Gitlab", + "default_branch": "master", + "public": True, + "archived": False, + "visibility_level": 20, + "ssh_url_to_repo": "git@localhost/gitlabhq.git", + "http_url_to_repo": "localhost/gitlabhq.git", + "web_url": "localhost/gitlabhq", + "name": "Gitlab", + "name_with_namespace": "Test / Gitlab", + "path": "gitlabhq"}] + +groups_json = [{"id": 23, + "name": "Group 1", + "path": "group-1", + "owner_id": None}, + {"id": 27, + "name": "Group 2", + "path": "group-2", + "owner_id": None}] + +merge_json = [{"id": 7, + "iid": 1, + "project_id": 14, + "title": "Merge Title", + "description": "description", + "state": "merged", + "created_at": "2014-10-24T12:05:55.659Z", + "updated_at": "2014-10-24T12:06:15.572Z", + "target_branch": "master", + "source_branch": "settings_fix", + "upvotes": 0, + "downvotes": 0, + "author": {"name": "user", + "username": "user", + "id": 8, + "state": "active", + "avatar_url": "localhost"}, + "assignee": {"name": "user", + "username": "user", + "id": 8, + "state": "active", + "avatar_url": "localhost"}, + "source_project_id": 14, + "target_project_id": 14, + "labels": [], + "milestone": None}] diff --git a/colab/plugins/gitlab/tests/test_data_api.py b/colab/plugins/gitlab/tests/test_data_api.py index 37f2156..c8c301a 100644 --- a/colab/plugins/gitlab/tests/test_data_api.py +++ b/colab/plugins/gitlab/tests/test_data_api.py @@ -1,13 +1,16 @@ from django.test import TestCase -from colab.plugins.gitlab.data_api import GitlabDataAPI +from ..data_api import GitlabDataAPI +from colab.plugins.gitlab.models import GitlabProject from mock import patch +import data class GitlabDataApiTest(TestCase): - data = {'menu_title': None, - 'private_token': 'token', - 'upstream': 'localhost/gitlab/'} + proxied_app = data.proxied_app + projects_json = data.projects_json + groups_json = data.groups_json + merge_json = data.merge_json def setUp(self): self.api = GitlabDataAPI() @@ -15,14 +18,48 @@ class GitlabDataApiTest(TestCase): def tearDown(self): pass - @patch.dict('django.conf.settings.PROXIED_APPS', gitlab=data) + @patch.dict('django.conf.settings.PROXIED_APPS', gitlab=proxied_app) def test_resquest_url(self): url = self.api.get_request_url('/test/') expected = 'localhost/gitlab/test/?private_token=token' self.assertEqual(url, expected) - @patch.dict('django.conf.settings.PROXIED_APPS', gitlab=data) + @patch.dict('django.conf.settings.PROXIED_APPS', gitlab=proxied_app) def test_resquest_url_with_params(self): url = self.api.get_request_url('/test/', param='param') expected = 'localhost/gitlab/test/?private_token=token¶m=param' self.assertEqual(url, expected) + + @patch.object(GitlabDataAPI, 'get_json_data') + def test_fetch_projects(self, mock_json): + mock_json.side_effect = [self.projects_json, []] + + projects = self.api.fetch_projects() + self.assertEqual(len(projects), 1) + + self.assertEqual(projects[0].description, "Test Gitlab") + self.assertEqual(projects[0].public, True) + + @patch.object(GitlabDataAPI, 'get_json_data') + def test_fetch_groups(self, mock_json): + mock_json.side_effect = [self.groups_json, []] + + groups = self.api.fetch_groups() + self.assertEqual(len(groups), 2) + self.assertEqual(groups[0].name, "Group 1") + self.assertEqual(groups[1].name, "Group 2") + + self.assertEqual(groups[0].path, "group-1") + self.assertEqual(groups[1].path, "group-2") + + @patch.object(GitlabDataAPI, 'get_json_data') + def test_fetch_merge(self, mock_json): + mock_json.side_effect = [self.groups_json, []] + + merges = self.api.fetch_merge_request([GitlabProject()]) + print merges[0].title + print merges[1].title + self.assertEqual(len(merges), 1) + self.assertEqual(merges[0].title, "Merge Title") + self.assertEqual(merges[0].description, "description") + self.assertEqual(merges[0].user.username, "user") -- libgit2 0.21.2