summaryrefslogtreecommitdiff
path: root/gitlab
diff options
context:
space:
mode:
Diffstat (limited to 'gitlab')
-rw-r--r--gitlab/tests/objects/test_projects.py94
-rw-r--r--gitlab/v4/objects.py13
2 files changed, 107 insertions, 0 deletions
diff --git a/gitlab/tests/objects/test_projects.py b/gitlab/tests/objects/test_projects.py
index 1c2347a..48347f9 100644
--- a/gitlab/tests/objects/test_projects.py
+++ b/gitlab/tests/objects/test_projects.py
@@ -90,6 +90,77 @@ def resp_import_github(url, request):
return response(200, content, headers, None, 25, request)
+@urlmatch(
+ scheme="http",
+ netloc="localhost",
+ path="/api/v4/projects/1/remote_mirrors",
+ method="get",
+)
+def resp_get_remote_mirrors(url, request):
+ """Mock for Project Remote Mirrors GET response."""
+ content = """[
+ {
+ "enabled": true,
+ "id": 101486,
+ "last_error": null,
+ "last_successful_update_at": "2020-01-06T17:32:02.823Z",
+ "last_update_at": "2020-01-06T17:32:02.823Z",
+ "last_update_started_at": "2020-01-06T17:31:55.864Z",
+ "only_protected_branches": true,
+ "update_status": "finished",
+ "url": "https://*****:*****@gitlab.com/gitlab-org/security/gitlab.git"
+ }
+ ]"""
+ content = content.encode("utf-8")
+ return response(200, content, headers, None, 5, request)
+
+
+@urlmatch(
+ scheme="http",
+ netloc="localhost",
+ path="/api/v4/projects/1/remote_mirrors",
+ method="post",
+)
+def resp_create_remote_mirror(url, request):
+ """Mock for Project Remote Mirrors POST response."""
+ content = """{
+ "enabled": false,
+ "id": 101486,
+ "last_error": null,
+ "last_successful_update_at": null,
+ "last_update_at": null,
+ "last_update_started_at": null,
+ "only_protected_branches": false,
+ "update_status": "none",
+ "url": "https://*****:*****@example.com/gitlab/example.git"
+ }"""
+ content = content.encode("utf-8")
+ return response(200, content, headers, None, 5, request)
+
+
+@urlmatch(
+ scheme="http",
+ netloc="localhost",
+ path="/api/v4/projects/1/remote_mirrors/1",
+ method="put",
+)
+def resp_update_remote_mirror(url, request):
+ """Mock for Project Remote Mirrors PUT response."""
+ content = """{
+ "enabled": false,
+ "id": 101486,
+ "last_error": null,
+ "last_successful_update_at": "2020-01-06T17:32:02.823Z",
+ "last_update_at": "2020-01-06T17:32:02.823Z",
+ "last_update_started_at": "2020-01-06T17:31:55.864Z",
+ "only_protected_branches": true,
+ "update_status": "finished",
+ "url": "https://*****:*****@gitlab.com/gitlab-org/security/gitlab.git"
+ }"""
+ content = content.encode("utf-8")
+ return response(200, content, headers, None, 5, request)
+
+
class TestProject(unittest.TestCase):
"""Base class for GitLab Project tests."""
@@ -262,3 +333,26 @@ class TestProjectImport(TestProject):
self.assertEqual(ret["name"], name)
self.assertEqual(ret["full_path"], "/".join((base_path, name)))
self.assertTrue(ret["full_name"].endswith(name))
+
+
+class TestProjectRemoteMirrors(TestProject):
+ @with_httmock(resp_get_remote_mirrors)
+ def test_list_project_remote_mirrors(self):
+ mirrors = self.project.remote_mirrors.list()
+ self.assertIsInstance(mirrors, list)
+ self.assertIsInstance(mirrors[0], ProjectRemoteMirror)
+ self.assertTrue(mirrors[0].enabled)
+
+ @with_httmock(resp_create_remote_mirror)
+ def test_create_project_remote_mirror(self):
+ mirror = self.project.remote_mirrors.create({"url": "https://example.com"})
+ self.assertIsInstance(mirror, ProjectRemoteMirror)
+ self.assertEqual(mirror.update_status, "none")
+
+ @with_httmock(resp_create_remote_mirror, resp_update_remote_mirror)
+ def test_update_project_remote_mirror(self):
+ mirror = self.project.remote_mirrors.create({"url": "https://example.com"})
+ mirror.only_protected_branches = True
+ mirror.save()
+ self.assertEqual(mirror.update_status, "finished")
+ self.assertTrue(mirror.only_protected_branches)
diff --git a/gitlab/v4/objects.py b/gitlab/v4/objects.py
index 9855196..25d890e 100644
--- a/gitlab/v4/objects.py
+++ b/gitlab/v4/objects.py
@@ -1745,6 +1745,18 @@ class ProjectRegistryTagManager(DeleteMixin, RetrieveMixin, RESTManager):
self.gitlab.http_delete(self.path, query_data=data, **kwargs)
+class ProjectRemoteMirror(SaveMixin, RESTObject):
+ pass
+
+
+class ProjectRemoteMirrorManager(ListMixin, CreateMixin, UpdateMixin, RESTManager):
+ _path = "/projects/%(project_id)s/remote_mirrors"
+ _obj_cls = ProjectRemoteMirror
+ _from_parent_attrs = {"project_id": "id"}
+ _create_attrs = (("url",), ("enabled", "only_protected_branches"))
+ _update_attrs = (tuple(), ("enabled", "only_protected_branches"))
+
+
class ProjectBoardList(SaveMixin, ObjectDeleteMixin, RESTObject):
pass
@@ -4246,6 +4258,7 @@ class Project(SaveMixin, ObjectDeleteMixin, RESTObject):
("pipelineschedules", "ProjectPipelineScheduleManager"),
("pushrules", "ProjectPushRulesManager"),
("releases", "ProjectReleaseManager"),
+ ("remote_mirrors", "ProjectRemoteMirrorManager"),
("repositories", "ProjectRegistryRepositoryManager"),
("runners", "ProjectRunnerManager"),
("services", "ProjectServiceManager"),