From 6660dbefeeffc2b39ddfed4928a59ed6da32ddf4 Mon Sep 17 00:00:00 2001 From: Clayton Walker Date: Thu, 18 Feb 2021 17:28:08 -0700 Subject: [PATCH 1/2] feat: add project audit endpoint --- gitlab/tests/objects/test_audit_events.py | 79 +++++++++++++++++++++++ gitlab/v4/objects/audit_events.py | 23 +++++++ gitlab/v4/objects/projects.py | 2 + 3 files changed, 104 insertions(+) create mode 100644 gitlab/tests/objects/test_audit_events.py create mode 100644 gitlab/v4/objects/audit_events.py diff --git a/gitlab/tests/objects/test_audit_events.py b/gitlab/tests/objects/test_audit_events.py new file mode 100644 index 000000000..23c419900 --- /dev/null +++ b/gitlab/tests/objects/test_audit_events.py @@ -0,0 +1,79 @@ +""" +GitLab API: +https://docs.gitlab.com/ee/api/audit_events.html#project-audit-events +""" + +import re + +import pytest +import responses + +from gitlab.v4.objects.audit_events import ProjectAudit + +id = 5 + +audit_events_content = { + "id": 5, + "author_id": 1, + "entity_id": 7, + "entity_type": "Project", + "details": { + "change": "prevent merge request approval from reviewers", + "from": "", + "to": "true", + "author_name": "Administrator", + "target_id": 7, + "target_type": "Project", + "target_details": "twitter/typeahead-js", + "ip_address": "127.0.0.1", + "entity_path": "twitter/typeahead-js", + }, + "created_at": "2020-05-26T22:55:04.230Z", +} + +audit_events_url = re.compile( + r"http://localhost/api/v4/(((groups|projects)/1)|(admin/ci))/audit_events" +) + +audit_events_url_id = re.compile( + rf"http://localhost/api/v4/(((groups|projects)/1)|(admin/ci))/audit_events/{id}" +) + + +@pytest.fixture +def resp_list_audit_events(): + with responses.RequestsMock() as rsps: + rsps.add( + method=responses.GET, + url=audit_events_url, + json=[audit_events_content], + content_type="application/json", + status=200, + ) + yield rsps + + +@pytest.fixture +def resp_get_variable(): + with responses.RequestsMock() as rsps: + rsps.add( + method=responses.GET, + url=audit_events_url_id, + json=audit_events_content, + content_type="application/json", + status=200, + ) + yield rsps + + +def test_list_project_audit_events(project, resp_list_audit_events): + audit_events = project.audit_events.list() + assert isinstance(audit_events, list) + assert isinstance(audit_events[0], ProjectAudit) + assert audit_events[0].id == id + + +def test_get_project_audit_events(project, resp_get_variable): + audit_event = project.audit_events.get(id) + assert isinstance(audit_event, ProjectAudit) + assert audit_event.id == id diff --git a/gitlab/v4/objects/audit_events.py b/gitlab/v4/objects/audit_events.py new file mode 100644 index 000000000..24ec3096c --- /dev/null +++ b/gitlab/v4/objects/audit_events.py @@ -0,0 +1,23 @@ +""" +GitLab API: +https://docs.gitlab.com/ee/api/audit_events.html#project-audit-events +""" + +from gitlab.base import * # noqa +from gitlab.mixins import * # noqa + +__all__ = [ + "ProjectAudit", + "ProjectAuditManager", +] + + +class ProjectAudit(RESTObject): + _id_attr = "id" + + +class ProjectAuditManager(RetrieveMixin, RESTManager): + _path = "/projects/%(project_id)s/audit_events" + _obj_cls = ProjectAudit + _from_parent_attrs = {"project_id": "id"} + _list_filters = ("created_after", "created_before") diff --git a/gitlab/v4/objects/projects.py b/gitlab/v4/objects/projects.py index 0284e9869..722b9ea9e 100644 --- a/gitlab/v4/objects/projects.py +++ b/gitlab/v4/objects/projects.py @@ -16,6 +16,7 @@ from .deployments import ProjectDeploymentManager from .environments import ProjectEnvironmentManager from .events import ProjectEventManager +from .audit_events import ProjectAuditManager from .export_import import ProjectExportManager, ProjectImportManager from .files import ProjectFileManager from .hooks import ProjectHookManager @@ -100,6 +101,7 @@ class Project(SaveMixin, ObjectDeleteMixin, RESTObject): ("deployments", "ProjectDeploymentManager"), ("environments", "ProjectEnvironmentManager"), ("events", "ProjectEventManager"), + ("audit_events", "ProjectAuditManager"), ("exports", "ProjectExportManager"), ("files", "ProjectFileManager"), ("forks", "ProjectForkManager"), From 66f0b6c23396b849f8653850b099e664daa05eb4 Mon Sep 17 00:00:00 2001 From: Nejc Habjan Date: Sat, 20 Feb 2021 12:49:21 +0100 Subject: [PATCH 2/2] chore(tests): remove unused URL segment --- gitlab/tests/objects/test_audit_events.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gitlab/tests/objects/test_audit_events.py b/gitlab/tests/objects/test_audit_events.py index 23c419900..75bc11c04 100644 --- a/gitlab/tests/objects/test_audit_events.py +++ b/gitlab/tests/objects/test_audit_events.py @@ -32,11 +32,11 @@ } audit_events_url = re.compile( - r"http://localhost/api/v4/(((groups|projects)/1)|(admin/ci))/audit_events" + r"http://localhost/api/v4/((groups|projects)/1/)audit_events" ) audit_events_url_id = re.compile( - rf"http://localhost/api/v4/(((groups|projects)/1)|(admin/ci))/audit_events/{id}" + rf"http://localhost/api/v4/((groups|projects)/1/)audit_events/{id}" )