summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNejc Habjan <nejc.habjan@siemens.com>2020-08-23 21:16:20 +0200
committerNejc Habjan <nejc.habjan@siemens.com>2020-08-23 21:19:47 +0200
commit204782a117f77f367dee87aa2c70822587829147 (patch)
treeb7d68fc7e4833139cc8c1d2360059b90ee43b3de
parent76b2cadf1418e4ea2ac420ebba5a4b4f16fbd4c7 (diff)
downloadgitlab-204782a117f77f367dee87aa2c70822587829147.tar.gz
refactor: rewrite unit tests for objects with responsesrefactor/split-unit-tests
-rw-r--r--gitlab/tests/conftest.py5
-rw-r--r--gitlab/tests/objects/conftest.py65
-rw-r--r--gitlab/tests/objects/mocks.py35
-rw-r--r--gitlab/tests/objects/test_appearance.py66
-rw-r--r--gitlab/tests/objects/test_application.py108
-rw-r--r--gitlab/tests/objects/test_applications.py45
-rw-r--r--gitlab/tests/objects/test_commits.py158
-rw-r--r--gitlab/tests/objects/test_deploy_tokens.py36
-rw-r--r--gitlab/tests/objects/test_deployments.py51
-rw-r--r--gitlab/tests/objects/test_environments.py31
-rw-r--r--gitlab/tests/objects/test_groups.py97
-rw-r--r--gitlab/tests/objects/test_hooks.py24
-rw-r--r--gitlab/tests/objects/test_issues.py52
-rw-r--r--gitlab/tests/objects/test_pipeline_schedules.py97
-rw-r--r--gitlab/tests/objects/test_project_import_export.py169
-rw-r--r--gitlab/tests/objects/test_project_statistics.py31
-rw-r--r--gitlab/tests/objects/test_projects.py44
-rw-r--r--gitlab/tests/objects/test_remote_mirrors.py111
-rw-r--r--gitlab/tests/objects/test_runners.py8
-rw-r--r--gitlab/tests/objects/test_services.py163
-rw-r--r--gitlab/tests/objects/test_snippets.py135
-rw-r--r--gitlab/tests/objects/test_submodules.py74
-rw-r--r--gitlab/tests/objects/test_todos.py69
-rw-r--r--gitlab/tests/objects/test_users.py166
24 files changed, 900 insertions, 940 deletions
diff --git a/gitlab/tests/conftest.py b/gitlab/tests/conftest.py
index 2d4cb3a..98d97ae 100644
--- a/gitlab/tests/conftest.py
+++ b/gitlab/tests/conftest.py
@@ -16,9 +16,7 @@ def gl():
@pytest.fixture
def gl_trailing():
return gitlab.Gitlab(
- "http://localhost/",
- private_token="private_token",
- api_version=4
+ "http://localhost/", private_token="private_token", api_version=4
)
@@ -38,6 +36,7 @@ def default_config(tmpdir):
config_path.write(valid_config)
return str(config_path)
+
@pytest.fixture
def group(gl):
return gl.groups.get(1, lazy=True)
diff --git a/gitlab/tests/objects/conftest.py b/gitlab/tests/objects/conftest.py
new file mode 100644
index 0000000..76f76d1
--- /dev/null
+++ b/gitlab/tests/objects/conftest.py
@@ -0,0 +1,65 @@
+"""Common mocks for resources in gitlab.v4.objects"""
+
+import re
+
+import pytest
+import responses
+
+
+@pytest.fixture
+def binary_content():
+ return b"binary content"
+
+
+@pytest.fixture
+def accepted_content():
+ return {"message": "202 Accepted"}
+
+
+@pytest.fixture
+def created_content():
+ return {"message": "201 Created"}
+
+
+@pytest.fixture
+def resp_export(accepted_content, binary_content):
+ """Common fixture for group and project exports."""
+ export_status_content = {
+ "id": 1,
+ "description": "Itaque perspiciatis minima aspernatur",
+ "name": "Gitlab Test",
+ "name_with_namespace": "Gitlab Org / Gitlab Test",
+ "path": "gitlab-test",
+ "path_with_namespace": "gitlab-org/gitlab-test",
+ "created_at": "2017-08-29T04:36:44.383Z",
+ "export_status": "finished",
+ "_links": {
+ "api_url": "https://gitlab.test/api/v4/projects/1/export/download",
+ "web_url": "https://gitlab.test/gitlab-test/download_export",
+ },
+ }
+
+ with responses.RequestsMock(assert_all_requests_are_fired=False) as rsps:
+ rsps.add(
+ method=responses.POST,
+ url=re.compile(r".*/api/v4/(groups|projects)/1/export"),
+ json=accepted_content,
+ content_type="application/json",
+ status=202,
+ )
+ rsps.add(
+ method=responses.GET,
+ url=re.compile(r".*/api/v4/(groups|projects)/1/export/download"),
+ body=binary_content,
+ content_type="application/octet-stream",
+ status=200,
+ )
+ # Currently only project export supports status checks
+ rsps.add(
+ method=responses.GET,
+ url="http://localhost/api/v4/projects/1/export",
+ json=export_status_content,
+ content_type="application/json",
+ status=200,
+ )
+ yield rsps
diff --git a/gitlab/tests/objects/mocks.py b/gitlab/tests/objects/mocks.py
deleted file mode 100644
index e051339..0000000
--- a/gitlab/tests/objects/mocks.py
+++ /dev/null
@@ -1,35 +0,0 @@
-"""Common mocks for resources in gitlab.v4.objects"""
-
-from httmock import response, urlmatch
-
-
-headers = {"content-type": "application/json"}
-binary_content = b"binary content"
-
-
-@urlmatch(
- scheme="http",
- netloc="localhost",
- path="/api/v4/(groups|projects)/1/export",
- method="post",
-)
-def resp_create_export(url, request):
- """Common mock for Group/Project Export POST response."""
- content = """{
- "message": "202 Accepted"
- }"""
- content = content.encode("utf-8")
- return response(202, content, headers, None, 25, request)
-
-
-@urlmatch(
- scheme="http",
- netloc="localhost",
- path="/api/v4/(groups|projects)/1/export/download",
- method="get",
-)
-def resp_download_export(url, request):
- """Common mock for Group/Project Export Download GET response."""
- headers = {"content-type": "application/octet-stream"}
- content = binary_content
- return response(200, content, headers, None, 25, request)
diff --git a/gitlab/tests/objects/test_appearance.py b/gitlab/tests/objects/test_appearance.py
new file mode 100644
index 0000000..7c52301
--- /dev/null
+++ b/gitlab/tests/objects/test_appearance.py
@@ -0,0 +1,66 @@
+"""
+GitLab API: https://docs.gitlab.com/ce/api/appearance.html
+"""
+
+import pytest
+import responses
+
+
+title = "GitLab Test Instance"
+description = "gitlab-test.example.com"
+new_title = "new-title"
+new_description = "new-description"
+
+
+@pytest.fixture
+def resp_application_appearance():
+ content = {
+ "title": title,
+ "description": description,
+ "logo": "/uploads/-/system/appearance/logo/1/logo.png",
+ "header_logo": "/uploads/-/system/appearance/header_logo/1/header.png",
+ "favicon": "/uploads/-/system/appearance/favicon/1/favicon.png",
+ "new_project_guidelines": "Please read the FAQs for help.",
+ "header_message": "",
+ "footer_message": "",
+ "message_background_color": "#e75e40",
+ "message_font_color": "#ffffff",
+ "email_header_and_footer_enabled": False,
+ }
+
+ with responses.RequestsMock(assert_all_requests_are_fired=False) as rsps:
+ rsps.add(
+ method=responses.GET,
+ url="http://localhost/api/v4/application/appearance",
+ json=content,
+ content_type="application/json",
+ status=200,
+ )
+
+ updated_content = dict(content)
+ updated_content["title"] = new_title
+ updated_content["description"] = new_description
+
+ rsps.add(
+ method=responses.PUT,
+ url="http://localhost/api/v4/application/appearance",
+ json=updated_content,
+ content_type="application/json",
+ status=200,
+ )
+ yield rsps
+
+
+def test_get_update_appearance(gl, resp_application_appearance):
+ appearance = gl.appearance.get()
+ assert appearance.title == title
+ assert appearance.description == description
+ appearance.title = new_title
+ appearance.description = new_description
+ appearance.save()
+ assert appearance.title == new_title
+ assert appearance.description == new_description
+
+
+def test_update_appearance(gl, resp_application_appearance):
+ resp = gl.appearance.update(title=new_title, description=new_description)
diff --git a/gitlab/tests/objects/test_application.py b/gitlab/tests/objects/test_application.py
deleted file mode 100644
index 356f0d3..0000000
--- a/gitlab/tests/objects/test_application.py
+++ /dev/null
@@ -1,108 +0,0 @@
-"""
-GitLab API: https://docs.gitlab.com/ce/api/applications.html
-"""
-
-import json
-
-from httmock import urlmatch, response, with_httmock # noqa
-
-from .mocks import headers
-
-
-title = "GitLab Test Instance"
-description = "gitlab-test.example.com"
-new_title = "new-title"
-new_description = "new-description"
-
-
-@urlmatch(
- scheme="http", netloc="localhost", path="/api/v4/applications", method="post",
-)
-def resp_application_create(url, request):
- content = '{"name": "test_app", "redirect_uri": "http://localhost:8080", "scopes": ["api", "email"]}'
- json_content = json.loads(content)
- return response(200, json_content, headers, None, 5, request)
-
-
-@urlmatch(
- scheme="http",
- netloc="localhost",
- path="/api/v4/application/appearance",
- method="get",
-)
-def resp_get_appearance(url, request):
- content = """{
- "title": "%s",
- "description": "%s",
- "logo": "/uploads/-/system/appearance/logo/1/logo.png",
- "header_logo": "/uploads/-/system/appearance/header_logo/1/header.png",
- "favicon": "/uploads/-/system/appearance/favicon/1/favicon.png",
- "new_project_guidelines": "Please read the FAQs for help.",
- "header_message": "",
- "footer_message": "",
- "message_background_color": "#e75e40",
- "message_font_color": "#ffffff",
- "email_header_and_footer_enabled": false}""" % (
- title,
- description,
- )
- content = content.encode("utf-8")
- return response(200, content, headers, None, 25, request)
-
-
-@urlmatch(
- scheme="http",
- netloc="localhost",
- path="/api/v4/application/appearance",
- method="put",
-)
-def resp_update_appearance(url, request):
- content = """{
- "title": "%s",
- "description": "%s",
- "logo": "/uploads/-/system/appearance/logo/1/logo.png",
- "header_logo": "/uploads/-/system/appearance/header_logo/1/header.png",
- "favicon": "/uploads/-/system/appearance/favicon/1/favicon.png",
- "new_project_guidelines": "Please read the FAQs for help.",
- "header_message": "",
- "footer_message": "",
- "message_background_color": "#e75e40",
- "message_font_color": "#ffffff",
- "email_header_and_footer_enabled": false}""" % (
- new_title,
- new_description,
- )
- content = content.encode("utf-8")
- return response(200, content, headers, None, 25, request)
-
-
-@with_httmock(resp_application_create)
-def test_create_application(gl):
- application = gl.applications.create(
- {
- "name": "test_app",
- "redirect_uri": "http://localhost:8080",
- "scopes": ["api", "email"],
- "confidential": False,
- }
- )
- assert application.name == "test_app"
- assert application.redirect_uri == "http://localhost:8080"
- assert application.scopes == ["api", "email"]
-
-
-@with_httmock(resp_get_appearance, resp_update_appearance)
-def test_get_update_appearance(gl):
- appearance = gl.appearance.get()
- assert appearance.title == title
- assert appearance.description == description
- appearance.title = new_title
- appearance.description = new_description
- appearance.save()
- assert appearance.title == new_title
- assert appearance.description == new_description
-
-
-@with_httmock(resp_update_appearance)
-def test_update_application_appearance(gl):
- resp = gl.appearance.update(title=new_title, description=new_description)
diff --git a/gitlab/tests/objects/test_applications.py b/gitlab/tests/objects/test_applications.py
new file mode 100644
index 0000000..f8b5d88
--- /dev/null
+++ b/gitlab/tests/objects/test_applications.py
@@ -0,0 +1,45 @@
+"""
+GitLab API: https://docs.gitlab.com/ce/api/applications.html
+"""
+
+import pytest
+import responses
+
+
+title = "GitLab Test Instance"
+description = "gitlab-test.example.com"
+new_title = "new-title"
+new_description = "new-description"
+
+
+@pytest.fixture
+def resp_application_create():
+ content = {
+ "name": "test_app",
+ "redirect_uri": "http://localhost:8080",
+ "scopes": ["api", "email"],
+ }
+
+ with responses.RequestsMock() as rsps:
+ rsps.add(
+ method=responses.POST,
+ url="http://localhost/api/v4/applications",
+ json=content,
+ content_type="application/json",
+ status=200,
+ )
+ yield rsps
+
+
+def test_create_application(gl, resp_application_create):
+ application = gl.applications.create(
+ {
+ "name": "test_app",
+ "redirect_uri": "http://localhost:8080",
+ "scopes": ["api", "email"],
+ "confidential": False,
+ }
+ )
+ assert application.name == "test_app"
+ assert application.redirect_uri == "http://localhost:8080"
+ assert application.scopes == ["api", "email"]
diff --git a/gitlab/tests/objects/test_commits.py b/gitlab/tests/objects/test_commits.py
index eaa7b82..9d11508 100644
--- a/gitlab/tests/objects/test_commits.py
+++ b/gitlab/tests/objects/test_commits.py
@@ -2,85 +2,89 @@
GitLab API: https://docs.gitlab.com/ce/api/commits.html
"""
-from httmock import urlmatch, response, with_httmock
-
-from .mocks import headers
-
-
-@urlmatch(
- scheme="http",
- netloc="localhost",
- path="/api/v4/projects/1/repository/commits/6b2257ea",
- method="get",
-)
-def resp_get_commit(url, request):
- """Mock for commit GET response."""
- content = """{
- "id": "6b2257eabcec3db1f59dafbd84935e3caea04235",
- "short_id": "6b2257ea",
- "title": "Initial commit"
- }"""
- content = content.encode("utf-8")
- return response(200, content, headers, None, 5, request)
-
-
-@urlmatch(
- scheme="http", path="/api/v4/projects/1/repository/commits", method="post",
-)
-def resp_create_commit(url, request):
- """Mock for commit create POST response."""
- content = """{
- "id": "ed899a2f4b50b4370feeea94676502b42383c746",
- "short_id": "ed899a2f",
- "title": "Commit message"
- }"""
- content = content.encode("utf-8")
- return response(200, content, headers, None, 5, request)
-
-
-@urlmatch(
- scheme="http", path="/api/v4/projects/1/repository/commits/6b2257ea", method="post",
-)
-def resp_revert_commit(url, request):
- """Mock for commit revert POST response."""
- content = """{
- "id": "8b090c1b79a14f2bd9e8a738f717824ff53aebad",
- "short_id": "8b090c1b",
- "title":"Revert \\"Initial commit\\""
- }"""
- content = content.encode("utf-8")
- return response(200, content, headers, None, 5, request)
-
-
-@urlmatch(
- scheme="http",
- netloc="localhost",
- path="/api/v4/projects/1/repository/commits/6b2257ea/signature",
- method="get",
-)
-def resp_get_commit_gpg_signature(url, request):
- """Mock for commit GPG signature GET response."""
- content = """{
- "gpg_key_id": 1,
- "gpg_key_primary_keyid": "8254AAB3FBD54AC9",
- "gpg_key_user_name": "John Doe",
- "gpg_key_user_email": "johndoe@example.com",
- "verification_status": "verified",
- "gpg_key_subkey_id": null
- }"""
- content = content.encode("utf-8")
- return response(200, content, headers, None, 5, request)
-
-
-@with_httmock(resp_get_commit)
-def test_get_commit(project):
+import pytest
+import responses
+
+
+@pytest.fixture
+def resp_create_commit():
+ content = {
+ "id": "ed899a2f4b50b4370feeea94676502b42383c746",
+ "short_id": "ed899a2f",
+ "title": "Commit message",
+ }
+
+ with responses.RequestsMock() as rsps:
+ rsps.add(
+ method=responses.POST,
+ url="http://localhost/api/v4/projects/1/repository/commits",
+ json=content,
+ content_type="application/json",
+ status=200,
+ )
+ yield rsps
+
+
+@pytest.fixture
+def resp_commit():
+ get_content = {
+ "id": "6b2257eabcec3db1f59dafbd84935e3caea04235",
+ "short_id": "6b2257ea",
+ "title": "Initial commit",
+ }
+ revert_content = {
+ "id": "8b090c1b79a14f2bd9e8a738f717824ff53aebad",
+ "short_id": "8b090c1b",
+ "title": 'Revert "Initial commit"',
+ }
+
+ with responses.RequestsMock(assert_all_requests_are_fired=False) as rsps:
+ rsps.add(
+ method=responses.GET,
+ url="http://localhost/api/v4/projects/1/repository/commits/6b2257ea",
+ json=get_content,
+ content_type="application/json",
+ status=200,
+ )
+ rsps.add(
+ method=responses.POST,
+ url="http://localhost/api/v4/projects/1/repository/commits/6b2257ea/revert",
+ json=revert_content,
+ content_type="application/json",
+ status=200,
+ )
+ yield rsps
+
+
+@pytest.fixture
+def resp_get_commit_gpg_signature():
+ content = {
+ "gpg_key_id": 1,
+ "gpg_key_primary_keyid": "8254AAB3FBD54AC9",
+ "gpg_key_user_name": "John Doe",
+ "gpg_key_user_email": "johndoe@example.com",
+ "verification_status": "verified",
+ "gpg_key_subkey_id": None,
+ }
+
+ with responses.RequestsMock() as rsps:
+ rsps.add(
+ method=responses.GET,
+ url="http://localhost/api/v4/projects/1/repository/commits/6b2257ea/signature",
+ json=content,
+ content_type="application/json",
+ status=200,
+ )
+ yield rsps
+
+
+def test_get_commit(project, resp_commit):
commit = project.commits.get("6b2257ea")
assert commit.short_id == "6b2257ea"
assert commit.title == "Initial commit"
-@with_httmock(resp_create_commit)
-def test_create_commit(project):
+def test_create_commit(project, resp_create_commit):
data = {
"branch": "master",
"commit_message": "Commit message",
@@ -91,16 +95,14 @@ def test_create_commit(project):
assert commit.title == data["commit_message"]
-@with_httmock(resp_revert_commit)
-def test_revert_commit(project):
+def test_revert_commit(project, resp_commit):
commit = project.commits.get("6b2257ea", lazy=True)
revert_commit = commit.revert(branch="master")
assert revert_commit["short_id"] == "8b090c1b"
assert revert_commit["title"] == 'Revert "Initial commit"'
-@with_httmock(resp_get_commit_gpg_signature)
-def test_get_commit_gpg_signature(project):
+def test_get_commit_gpg_signature(project, resp_get_commit_gpg_signature):
commit = project.commits.get("6b2257ea", lazy=True)
signature = commit.signature()
assert signature["gpg_key_primary_keyid"] == "8254AAB3FBD54AC9"
diff --git a/gitlab/tests/objects/test_deploy_tokens.py b/gitlab/tests/objects/test_deploy_tokens.py
index b98a670..9cfa598 100644
--- a/gitlab/tests/objects/test_deploy_tokens.py
+++ b/gitlab/tests/objects/test_deploy_tokens.py
@@ -1,34 +1,36 @@
"""
GitLab API: https://docs.gitlab.com/ce/api/deploy_tokens.html
"""
-
-from httmock import response, urlmatch, with_httmock
+import pytest
+import responses
from gitlab.v4.objects import ProjectDeployToken
-from .mocks import headers
-
-@urlmatch(
- scheme="http",
- netloc="localhost",
- path="/api/v4/projects/1/deploy_tokens",
- method="post",
-)
-def resp_deploy_token_create(url, request):
- content = """{
+create_content = {
"id": 1,
"name": "test_deploy_token",
"username": "custom-user",
"expires_at": "2022-01-01T00:00:00.000Z",
"token": "jMRvtPNxrn3crTAGukpZ",
- "scopes": [ "read_repository" ]}"""
- content = content.encode("utf-8")
- return response(200, content, headers, None, 5, request)
+ "scopes": ["read_repository"],
+}
+
+
+@pytest.fixture
+def resp_deploy_token_create():
+ with responses.RequestsMock() as rsps:
+ rsps.add(
+ method=responses.POST,
+ url="http://localhost/api/v4/projects/1/deploy_tokens",
+ json=create_content,
+ content_type="application/json",
+ status=200,
+ )
+ yield rsps
-@with_httmock(resp_deploy_token_create)
-def test_deploy_tokens(gl):
+def test_deploy_tokens(gl, resp_deploy_token_create):
deploy_token = gl.projects.get(1, lazy=True).deploytokens.create(
{
"name": "test_deploy_token",
diff --git a/gitlab/tests/objects/test_deployments.py b/gitlab/tests/objects/test_deployments.py
index 098251a..3cde8fe 100644
--- a/gitlab/tests/objects/test_deployments.py
+++ b/gitlab/tests/objects/test_deployments.py
@@ -1,39 +1,37 @@
"""
GitLab API: https://docs.gitlab.com/ce/api/deployments.html
"""
+import pytest
+import responses
-import json
-from httmock import response, urlmatch, with_httmock
+@pytest.fixture
+def resp_deployment():
+ content = {"id": 42, "status": "success", "ref": "master"}
-from .mocks import headers
+ with responses.RequestsMock() as rsps:
+ rsps.add(
+ method=responses.POST,
+ url="http://localhost/api/v4/projects/1/deployments",
+ json=content,
+ content_type="application/json",
+ status=200,
+ )
-content = '{"id": 42, "status": "success", "ref": "master"}'
-json_content = json.loads(content)
+ updated_content = dict(content)
+ updated_content["status"] = "failed"
+ rsps.add(
+ method=responses.PUT,
+ url="http://localhost/api/v4/projects/1/deployments/42",
+ json=updated_content,
+ content_type="application/json",
+ status=200,
+ )
+ yield rsps
-@urlmatch(
- scheme="http",
- netloc="localhost",
- path="/api/v4/projects/1/deployments",
- method="post",
-)
-def resp_deployment_create(url, request):
- return response(200, json_content, headers, None, 5, request)
-
-@urlmatch(
- scheme="http",
- netloc="localhost",
- path="/api/v4/projects/1/deployments/42",
- method="put",
-)
-def resp_deployment_update(url, request):
- return response(200, json_content, headers, None, 5, request)
-
-
-@with_httmock(resp_deployment_create, resp_deployment_update)
-def test_deployment(project):
+def test_deployment(project, resp_deployment):
deployment = project.deployments.create(
{
"environment": "Test",
@@ -47,7 +45,6 @@ def test_deployment(project):
assert deployment.status == "success"
assert deployment.ref == "master"
- json_content["status"] = "failed"
deployment.status = "failed"
deployment.save()
assert deployment.status == "failed"
diff --git a/gitlab/tests/objects/test_environments.py b/gitlab/tests/objects/test_environments.py
index 3175c64..b49a1db 100644
--- a/gitlab/tests/objects/test_environments.py
+++ b/gitlab/tests/objects/test_environments.py
@@ -1,29 +1,28 @@
"""
GitLab API: https://docs.gitlab.com/ce/api/environments.html
"""
-
-from httmock import response, urlmatch, with_httmock
+import pytest
+import responses
from gitlab.v4.objects import ProjectEnvironment
-from .mocks import headers
+@pytest.fixture
+def resp_get_environment():
+ content = {"name": "environment_name", "id": 1, "last_deployment": "sometime"}
-@urlmatch(
- scheme="http",
- netloc="localhost",
- path="/api/v4/projects/1/environments/1",
- method="get",
-)
-def resp_get_environment(url, request):
- content = '{"name": "environment_name", "id": 1, "last_deployment": "sometime"}'.encode(
- "utf-8"
- )
- return response(200, content, headers, None, 5, request)
+ with responses.RequestsMock() as rsps:
+ rsps.add(
+ method=responses.GET,
+ url="http://localhost/api/v4/projects/1/environments/1",
+ json=content,
+ content_type="application/json",
+ status=200,
+ )
+ yield rsps
-@with_httmock(resp_get_environment)
-def test_project_environments(project):
+def test_project_environments(project, resp_get_environment):
environment = project.environments.get(1)
assert isinstance(environment, ProjectEnvironment)
assert environment.id == 1
diff --git a/gitlab/tests/objects/test_groups.py b/gitlab/tests/objects/test_groups.py
index b5464b5..d4786f4 100644
--- a/gitlab/tests/objects/test_groups.py
+++ b/gitlab/tests/objects/test_groups.py
@@ -3,45 +3,54 @@ GitLab API: https://docs.gitlab.com/ce/api/groups.html
"""
import pytest
-
-from httmock import response, urlmatch, with_httmock
+import responses
import gitlab
-from .mocks import * # noqa
-
-
-@urlmatch(scheme="http", netloc="localhost", path="/api/v4/groups/1", method="get")
-def resp_get_group(url, request):
- content = '{"name": "name", "id": 1, "path": "path"}'
- content = content.encode("utf-8")
- return response(200, content, headers, None, 5, request)
-
-
-@urlmatch(scheme="http", netloc="localhost", path="/api/v4/groups", method="post")
-def resp_create_group(url, request):
- content = '{"name": "name", "id": 1, "path": "path"}'
- content = content.encode("utf-8")
- return response(200, content, headers, None, 5, request)
-
-
-@urlmatch(
- scheme="http", netloc="localhost", path="/api/v4/groups/import", method="post",
-)
-def resp_create_import(url, request):
- """Mock for Group import tests.
-
- GitLab does not respond with import status for group imports.
- """
-
- content = """{
- "message": "202 Accepted"
- }"""
- content = content.encode("utf-8")
- return response(202, content, headers, None, 25, request)
-@with_httmock(resp_get_group)
-def test_get_group(gl):
+@pytest.fixture
+def resp_groups():
+ content = {"name": "name", "id": 1, "path": "path"}
+
+ with responses.RequestsMock(assert_all_requests_are_fired=False) as rsps:
+ rsps.add(
+ method=responses.GET,
+ url="http://localhost/api/v4/groups/1",
+ json=content,
+ content_type="application/json",
+ status=200,
+ )
+ rsps.add(
+ method=responses.GET,
+ url="http://localhost/api/v4/groups",
+ json=[content],
+ content_type="application/json",
+ status=200,
+ )
+ rsps.add(
+ method=responses.POST,
+ url="http://localhost/api/v4/groups",
+ json=content,
+ content_type="application/json",
+ status=200,
+ )
+ yield rsps
+
+
+@pytest.fixture
+def resp_create_import(accepted_content):
+ with responses.RequestsMock() as rsps:
+ rsps.add(
+ method=responses.POST,
+ url="http://localhost/api/v4/groups/import",
+ json=accepted_content,
+ content_type="application/json",
+ status=202,
+ )
+ yield rsps
+
+
+def test_get_group(gl, resp_groups):
data = gl.groups.get(1)
assert isinstance(data, gitlab.v4.objects.Group)
assert data.name == "name"
@@ -49,8 +58,7 @@ def test_get_group(gl):
assert data.id == 1
-@with_httmock(resp_create_group)
-def test_create_group(gl):
+def test_create_group(gl, resp_groups):
name, path = "name", "path"
data = gl.groups.create({"name": name, "path": path})
assert isinstance(data, gitlab.v4.objects.Group)
@@ -58,37 +66,32 @@ def test_create_group(gl):
assert data.path == path
-@with_httmock(resp_create_export)
-def test_create_group_export(group):
+def test_create_group_export(group, resp_export):
export = group.exports.create()
assert export.message == "202 Accepted"
@pytest.mark.skip("GitLab API endpoint not implemented")
-@with_httmock(resp_create_export)
-def test_refresh_group_export_status(group):
+def test_refresh_group_export_status(group, resp_export):
export = group.exports.create()
export.refresh()
assert export.export_status == "finished"
-@with_httmock(resp_create_export, resp_download_export)
-def test_download_group_export(group):
+def test_download_group_export(group, resp_export, binary_content):
export = group.exports.create()
download = export.download()
assert isinstance(download, bytes)
assert download == binary_content
-@with_httmock(resp_create_import)
-def test_import_group(gl):
+def test_import_group(gl, resp_create_import):
group_import = gl.groups.import_group("file", "api-group", "API Group")
assert group_import["message"] == "202 Accepted"
@pytest.mark.skip("GitLab API endpoint not implemented")
-@with_httmock(resp_create_import)
-def test_refresh_group_import_status(group):
+def test_refresh_group_import_status(group, resp_groups):
group_import = group.imports.get()
group_import.refresh()
assert group_import.import_status == "finished"
diff --git a/gitlab/tests/objects/test_hooks.py b/gitlab/tests/objects/test_hooks.py
index 45403c4..fe5c21c 100644
--- a/gitlab/tests/objects/test_hooks.py
+++ b/gitlab/tests/objects/test_hooks.py
@@ -1,22 +1,28 @@
"""
GitLab API: https://docs.gitlab.com/ce/api/system_hooks.html
"""
-
-from httmock import response, urlmatch, with_httmock
+import pytest
+import responses
from gitlab.v4.objects import Hook
-from .mocks import headers
+@pytest.fixture
+def resp_get_hook():
+ content = {"url": "testurl", "id": 1}
-@urlmatch(scheme="http", netloc="localhost", path="/api/v4/hooks/1", method="get")
-def resp_get_hook(url, request):
- content = '{"url": "testurl", "id": 1}'.encode("utf-8")
- return response(200, content, headers, None, 5, request)
+ with responses.RequestsMock() as rsps:
+ rsps.add(
+ method=responses.GET,
+ url="http://localhost/api/v4/hooks/1",
+ json=content,
+ content_type="application/json",
+ status=200,
+ )
+ yield rsps
-@with_httmock(resp_get_hook)
-def test_hooks(gl):
+def test_hooks(gl, resp_get_hook):
data = gl.hooks.get(1)
assert isinstance(data, Hook)
assert data.url == "testurl"
diff --git a/gitlab/tests/objects/test_issues.py b/gitlab/tests/objects/test_issues.py
index e094841..f67d720 100644
--- a/gitlab/tests/objects/test_issues.py
+++ b/gitlab/tests/objects/test_issues.py
@@ -2,41 +2,49 @@
GitLab API: https://docs.gitlab.com/ce/api/issues.html
"""
-from httmock import urlmatch, response, with_httmock
+import pytest
+import responses
-from .mocks import headers
from gitlab.v4.objects import ProjectIssuesStatistics
-@urlmatch(scheme="http", netloc="localhost", path="/api/v4/issues", method="get")
-def resp_get_issue(url, request):
- content = '[{"name": "name", "id": 1}, ' '{"name": "other_name", "id": 2}]'
- content = content.encode("utf-8")
- return response(200, content, headers, None, 5, request)
+@pytest.fixture
+def resp_issue():
+ content = [{"name": "name", "id": 1}, {"name": "other_name", "id": 2}]
+ with responses.RequestsMock() as rsps:
+ rsps.add(
+ method=responses.GET,
+ url="http://localhost/api/v4/issues",
+ json=content,
+ content_type="application/json",
+ status=200,
+ )
+ yield rsps
-@urlmatch(
- scheme="http",
- netloc="localhost",
- path="/api/v4/projects/1/issues_statistics",
- method="get",
-)
-def resp_get_environment(url, request):
- content = """{"statistics": {"counts": {"all": 20, "closed": 5, "opened": 15}}}""".encode(
- "utf-8"
- )
- return response(200, content, headers, None, 5, request)
+@pytest.fixture
+def resp_issue_statistics():
+ content = {"statistics": {"counts": {"all": 20, "closed": 5, "opened": 15}}}
-@with_httmock(resp_get_issue)
-def test_issues(gl):
+ with responses.RequestsMock() as rsps:
+ rsps.add(
+ method=responses.GET,
+ url="http://localhost/api/v4/projects/1/issues_statistics",
+ json=content,
+ content_type="application/json",
+ status=200,
+ )
+ yield rsps
+
+
+def test_issues(gl, resp_issue):
data = gl.issues.list()
assert data[1].id == 2
assert data[1].name == "other_name"
-@with_httmock(resp_get_environment)
-def test_project_issues_statistics(project):
+def test_project_issues_statistics(project, resp_issue_statistics):
statistics = project.issuesstatistics.get()
assert isinstance(statistics, ProjectIssuesStatistics)
assert statistics.statistics["counts"]["all"] == 20
diff --git a/gitlab/tests/objects/test_pipeline_schedules.py b/gitlab/tests/objects/test_pipeline_schedules.py
index 6b56304..c5dcc76 100644
--- a/gitlab/tests/objects/test_pipeline_schedules.py
+++ b/gitlab/tests/objects/test_pipeline_schedules.py
@@ -1,61 +1,52 @@
"""
GitLab API: https://docs.gitlab.com/ce/api/pipeline_schedules.html
"""
-
-from httmock import response, urlmatch, with_httmock
-
-from .mocks import headers
-
-
-@urlmatch(
- scheme="http",
- netloc="localhost",
- path="/api/v4/projects/1/pipeline_schedules$",
- method="post",
-)
-def resp_create_project_pipeline_schedule(url, request):
- """Mock for creating project pipeline Schedules POST response."""
- content = """{
- "id": 14,
- "description": "Build packages",
- "ref": "master",
- "cron": "0 1 * * 5",
- "cron_timezone": "UTC",
- "next_run_at": "2017-05-26T01:00:00.000Z",
- "active": true,
- "created_at": "2017-05-19T13:43:08.169Z",
- "updated_at": "2017-05-19T13:43:08.169Z",
- "last_pipeline": null,
- "owner": {
- "name": "Administrator",
- "username": "root",
- "id": 1,
- "state": "active",
- "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon",
- "web_url": "https://gitlab.example.com/root"
+import pytest
+import responses
+
+
+@pytest.fixture
+def resp_project_pipeline_schedule(created_content):
+ content = {
+ "id": 14,
+ "description": "Build packages",
+ "ref": "master",
+ "cron": "0 1 * * 5",
+ "cron_timezone": "UTC",
+ "next_run_at": "2017-05-26T01:00:00.000Z",
+ "active": True,
+ "created_at": "2017-05-19T13:43:08.169Z",
+ "updated_at": "2017-05-19T13:43:08.169Z",
+ "last_pipeline": None,
+ "owner": {
+ "name": "Administrator",
+ "username": "root",
+ "id": 1,
+ "state": "active",
+ "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon",
+ "web_url": "https://gitlab.example.com/root",
+ },
}
-}"""
- content = content.encode("utf-8")
- return response(200, content, headers, None, 5, request)
-
-
-@urlmatch(
- scheme="http",
- netloc="localhost",
- path="/api/v4/projects/1/pipeline_schedules/14/play",
- method="post",
-)
-def resp_play_project_pipeline_schedule(url, request):
- """Mock for playing a project pipeline schedule POST response."""
- content = """{"message": "201 Created"}"""
- content = content.encode("utf-8")
- return response(200, content, headers, None, 5, request)
-
-@with_httmock(
- resp_create_project_pipeline_schedule, resp_play_project_pipeline_schedule
-)
-def test_project_pipeline_schedule_play(project):
+ with responses.RequestsMock() as rsps:
+ rsps.add(
+ method=responses.POST,
+ url="http://localhost/api/v4/projects/1/pipeline_schedules",
+ json=content,
+ content_type="application/json",
+ status=200,
+ )
+ rsps.add(
+ method=responses.POST,
+ url="http://localhost/api/v4/projects/1/pipeline_schedules/14/play",
+ json=created_content,
+ content_type="application/json",
+ status=201,
+ )
+ yield rsps
+
+
+def test_project_pipeline_schedule_play(project, resp_project_pipeline_schedule):
description = "Build packages"
cronline = "0 1 * * 5"
sched = project.pipelineschedules.create(
diff --git a/gitlab/tests/objects/test_project_import_export.py b/gitlab/tests/objects/test_project_import_export.py
index e5c37a8..78e51b1 100644
--- a/gitlab/tests/objects/test_project_import_export.py
+++ b/gitlab/tests/objects/test_project_import_export.py
@@ -1,104 +1,90 @@
"""
GitLab API: https://docs.gitlab.com/ce/api/project_import_export.html
"""
+import pytest
+import responses
+
+
+@pytest.fixture
+def resp_import_project():
+ content = {
+ "id": 1,
+ "description": None,
+ "name": "api-project",
+ "name_with_namespace": "Administrator / api-project",
+ "path": "api-project",
+ "path_with_namespace": "root/api-project",
+ "created_at": "2018-02-13T09:05:58.023Z",
+ "import_status": "scheduled",
+ }
+
+ with responses.RequestsMock() as rsps:
+ rsps.add(
+ method=responses.POST,
+ url="http://localhost/api/v4/projects/import",
+ json=content,
+ content_type="application/json",
+ status=200,
+ )
+ yield rsps
+
+
+@pytest.fixture
+def resp_import_status():
+ content = {
+ "id": 1,
+ "description": "Itaque perspiciatis minima aspernatur corporis consequatur.",
+ "name": "Gitlab Test",
+ "name_with_namespace": "Gitlab Org / Gitlab Test",
+ "path": "gitlab-test",
+ "path_with_namespace": "gitlab-org/gitlab-test",
+ "created_at": "2017-08-29T04:36:44.383Z",
+ "import_status": "finished",
+ }
-from httmock import response, urlmatch, with_httmock
-
-from .mocks import *
-
-
-@urlmatch(
- scheme="http", netloc="localhost", path="/api/v4/projects/1/export", method="get",
-)
-def resp_export_status(url, request):
- """Mock for Project Export GET response."""
- content = """{
- "id": 1,
- "description": "Itaque perspiciatis minima aspernatur",
- "name": "Gitlab Test",
- "name_with_namespace": "Gitlab Org / Gitlab Test",
- "path": "gitlab-test",
- "path_with_namespace": "gitlab-org/gitlab-test",
- "created_at": "2017-08-29T04:36:44.383Z",
- "export_status": "finished",
- "_links": {
- "api_url": "https://gitlab.test/api/v4/projects/1/export/download",
- "web_url": "https://gitlab.test/gitlab-test/download_export"
- }
+ with responses.RequestsMock() as rsps:
+ rsps.add(
+ method=responses.GET,
+ url="http://localhost/api/v4/projects/1/import",
+ json=content,
+ content_type="application/json",
+ status=200,
+ )
+ yield rsps
+
+
+@pytest.fixture
+def resp_import_github():
+ content = {
+ "id": 27,
+ "name": "my-repo",
+ "full_path": "/root/my-repo",
+ "full_name": "Administrator / my-repo",
}
- """
- content = content.encode("utf-8")
- return response(200, content, headers, None, 25, request)
-
-
-@urlmatch(
- scheme="http", netloc="localhost", path="/api/v4/projects/import", method="post",
-)
-def resp_import_project(url, request):
- """Mock for Project Import POST response."""
- content = """{
- "id": 1,
- "description": null,
- "name": "api-project",
- "name_with_namespace": "Administrator / api-project",
- "path": "api-project",
- "path_with_namespace": "root/api-project",
- "created_at": "2018-02-13T09:05:58.023Z",
- "import_status": "scheduled"
- }"""
- content = content.encode("utf-8")
- return response(200, content, headers, None, 25, request)
-
-
-@urlmatch(
- scheme="http", netloc="localhost", path="/api/v4/projects/1/import", method="get",
-)
-def resp_import_status(url, request):
- """Mock for Project Import GET response."""
- content = """{
- "id": 1,
- "description": "Itaque perspiciatis minima aspernatur corporis consequatur.",
- "name": "Gitlab Test",
- "name_with_namespace": "Gitlab Org / Gitlab Test",
- "path": "gitlab-test",
- "path_with_namespace": "gitlab-org/gitlab-test",
- "created_at": "2017-08-29T04:36:44.383Z",
- "import_status": "finished"
- }"""
- content = content.encode("utf-8")
- return response(200, content, headers, None, 25, request)
-
-
-@urlmatch(
- scheme="http", netloc="localhost", path="/api/v4/import/github", method="post",
-)
-def resp_import_github(url, request):
- """Mock for GitHub Project Import POST response."""
- content = """{
- "id": 27,
- "name": "my-repo",
- "full_path": "/root/my-repo",
- "full_name": "Administrator / my-repo"
- }"""
- content = content.encode("utf-8")
- return response(200, content, headers, None, 25, request)
-
-
-@with_httmock(resp_import_project)
-def test_import_project(gl):
+
+ with responses.RequestsMock() as rsps:
+ rsps.add(
+ method=responses.POST,
+ url="http://localhost/api/v4/import/github",
+ json=content,
+ content_type="application/json",
+ status=200,
+ )
+ yield rsps
+
+
+def test_import_project(gl, resp_import_project):
project_import = gl.projects.import_project("file", "api-project")
assert project_import["import_status"] == "scheduled"
-@with_httmock(resp_import_status)
-def test_refresh_project_import_status(project):
+def test_refresh_project_import_status(project, resp_import_status):
project_import = project.imports.get()
project_import.refresh()
assert project_import.import_status == "finished"
-@with_httmock(resp_import_github)
-def test_import_github(gl):
+def test_import_github(gl, resp_import_github):
base_path = "/root"
name = "my-repo"
ret = gl.projects.import_github("githubkey", 1234, base_path, name)
@@ -108,21 +94,18 @@ def test_import_github(gl):
assert ret["full_name"].endswith(name)
-@with_httmock(resp_create_export)
-def test_create_project_export(project):
+def test_create_project_export(project, resp_export):
export = project.exports.create()
assert export.message == "202 Accepted"
-@with_httmock(resp_create_export, resp_export_status)
-def test_refresh_project_export_status(project):
+def test_refresh_project_export_status(project, resp_export):
export = project.exports.create()
export.refresh()
assert export.export_status == "finished"
-@with_httmock(resp_create_export, resp_download_export)
-def test_download_project_export(project):
+def test_download_project_export(project, resp_export, binary_content):
export = project.exports.create()
download = export.download()
assert isinstance(download, bytes)
diff --git a/gitlab/tests/objects/test_project_statistics.py b/gitlab/tests/objects/test_project_statistics.py
index c2b194f..50d9a6d 100644
--- a/gitlab/tests/objects/test_project_statistics.py
+++ b/gitlab/tests/objects/test_project_statistics.py
@@ -1,29 +1,28 @@
"""
GitLab API: https://docs.gitlab.com/ce/api/project_statistics.html
"""
-
-from httmock import response, urlmatch, with_httmock
+import pytest
+import responses
from gitlab.v4.objects import ProjectAdditionalStatistics
-from .mocks import headers
+@pytest.fixture
+def resp_project_statistics():
+ content = {"fetches": {"total": 50, "days": [{"count": 10, "date": "2018-01-10"}]}}
-@urlmatch(
- scheme="http",
- netloc="localhost",
- path="/api/v4/projects/1/statistics",
- method="get",
-)
-def resp_get_statistics(url, request):
- content = """{"fetches": {"total": 50, "days": [{"count": 10, "date": "2018-01-10"}]}}""".encode(
- "utf-8"
- )
- return response(200, content, headers, None, 5, request)
+ with responses.RequestsMock() as rsps:
+ rsps.add(
+ method=responses.GET,
+ url="http://localhost/api/v4/projects/1/statistics",
+ json=content,
+ content_type="application/json",
+ status=200,
+ )
+ yield rsps
-@with_httmock(resp_get_statistics)
-def test_project_additional_statistics(project):
+def test_project_additional_statistics(project, resp_project_statistics):
statistics = project.additionalstatistics.get()
assert isinstance(statistics, ProjectAdditionalStatistics)
assert statistics.fetches["total"] == 50
diff --git a/gitlab/tests/objects/test_projects.py b/gitlab/tests/objects/test_projects.py
index 7fefe3f..1e8b8b6 100644
--- a/gitlab/tests/objects/test_projects.py
+++ b/gitlab/tests/objects/test_projects.py
@@ -3,31 +3,51 @@ GitLab API: https://docs.gitlab.com/ce/api/projects.html
"""
import pytest
-
+import responses
from gitlab.v4.objects import Project
-from httmock import urlmatch, response, with_httmock
-from .mocks import headers
+project_content = {"name": "name", "id": 1}
+
+
+@pytest.fixture
+def resp_get_project():
+ with responses.RequestsMock() as rsps:
+ rsps.add(
+ method=responses.GET,
+ url="http://localhost/api/v4/projects/1",
+ json=project_content,
+ content_type="application/json",
+ status=200,
+ )
+ yield rsps
-@urlmatch(scheme="http", netloc="localhost", path="/api/v4/projects/1", method="get")
-def resp_get_project(url, request):
- content = '{"name": "name", "id": 1}'.encode("utf-8")
- return response(200, content, headers, None, 5, request)
+@pytest.fixture
+def resp_list_projects():
+ with responses.RequestsMock() as rsps:
+ rsps.add(
+ method=responses.GET,
+ url="http://localhost/api/v4/projects",
+ json=[project_content],
+ content_type="application/json",
+ status=200,
+ )
+ yield rsps
-@with_httmock(resp_get_project)
-def test_get_project(gl):
+
+def test_get_project(gl, resp_get_project):
data = gl.projects.get(1)
assert isinstance(data, Project)
assert data.name == "name"
assert data.id == 1
-@pytest.mark.skip(reason="missing test")
-def test_list_projects(gl):
- pass
+def test_list_projects(gl, resp_list_projects):
+ projects = gl.projects.list()
+ assert isinstance(projects[0], Project)
+ assert projects[0].name == "name"
@pytest.mark.skip(reason="missing test")
diff --git a/gitlab/tests/objects/test_remote_mirrors.py b/gitlab/tests/objects/test_remote_mirrors.py
index e62a71e..1ac35a2 100644
--- a/gitlab/tests/objects/test_remote_mirrors.py
+++ b/gitlab/tests/objects/test_remote_mirrors.py
@@ -2,100 +2,69 @@
GitLab API: https://docs.gitlab.com/ce/api/remote_mirrors.html
"""
-from httmock import response, urlmatch, with_httmock
+import pytest
+import responses
from gitlab.v4.objects import ProjectRemoteMirror
-from .mocks import headers
-@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,
+@pytest.fixture
+def resp_remote_mirrors():
+ content = {
+ "enabled": True,
+ "id": 1,
+ "last_error": None,
"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,
+ "only_protected_branches": True,
"update_status": "none",
- "url": "https://*****:*****@example.com/gitlab/example.git"
- }"""
- content = content.encode("utf-8")
- return response(200, content, headers, None, 5, request)
+ "url": "https://*****:*****@gitlab.com/gitlab-org/security/gitlab.git",
+ }
+ with responses.RequestsMock(assert_all_requests_are_fired=False) as rsps:
+ rsps.add(
+ method=responses.GET,
+ url="http://localhost/api/v4/projects/1/remote_mirrors",
+ json=[content],
+ content_type="application/json",
+ status=200,
+ )
+ rsps.add(
+ method=responses.POST,
+ url="http://localhost/api/v4/projects/1/remote_mirrors",
+ json=content,
+ content_type="application/json",
+ status=200,
+ )
-@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)
+ updated_content = dict(content)
+ updated_content["update_status"] = "finished"
+
+ rsps.add(
+ method=responses.PUT,
+ url="http://localhost/api/v4/projects/1/remote_mirrors/1",
+ json=updated_content,
+ content_type="application/json",
+ status=200,
+ )
+ yield rsps
-@with_httmock(resp_get_remote_mirrors)
-def test_list_project_remote_mirrors(project):
+def test_list_project_remote_mirrors(project, resp_remote_mirrors):
mirrors = project.remote_mirrors.list()
assert isinstance(mirrors, list)
assert isinstance(mirrors[0], ProjectRemoteMirror)
assert mirrors[0].enabled
-@with_httmock(resp_create_remote_mirror)
-def test_create_project_remote_mirror(project):
+def test_create_project_remote_mirror(project, resp_remote_mirrors):
mirror = project.remote_mirrors.create({"url": "https://example.com"})
assert isinstance(mirror, ProjectRemoteMirror)
assert mirror.update_status == "none"
-@with_httmock(resp_create_remote_mirror, resp_update_remote_mirror)
-def test_update_project_remote_mirror(project):
+def test_update_project_remote_mirror(project, resp_remote_mirrors):
mirror = project.remote_mirrors.create({"url": "https://example.com"})
mirror.only_protected_branches = True
mirror.save()
diff --git a/gitlab/tests/objects/test_runners.py b/gitlab/tests/objects/test_runners.py
index 2f86bef..490ba36 100644
--- a/gitlab/tests/objects/test_runners.py
+++ b/gitlab/tests/objects/test_runners.py
@@ -1,9 +1,9 @@
-import unittest
+import re
+
+import pytest
import responses
+
import gitlab
-import pytest
-import re
-from .mocks import * # noqa
runner_detail = {
diff --git a/gitlab/tests/objects/test_services.py b/gitlab/tests/objects/test_services.py
index a0cded7..5b2bcb8 100644
--- a/gitlab/tests/objects/test_services.py
+++ b/gitlab/tests/objects/test_services.py
@@ -2,110 +2,71 @@
GitLab API: https://docs.gitlab.com/ce/api/services.html
"""
-from httmock import urlmatch, response, with_httmock
+import pytest
+import responses
from gitlab.v4.objects import ProjectService
-from .mocks import headers
-@urlmatch(
- scheme="http",
- netloc="localhost",
- path="/api/v4/projects/1/services/pipelines-email",
- method="put",
-)
-def resp_update_service(url, request):
- """Mock for Service update PUT response."""
- content = """{
+@pytest.fixture
+def resp_service():
+ content = {
"id": 100152,
"title": "Pipelines emails",
"slug": "pipelines-email",
"created_at": "2019-01-14T08:46:43.637+01:00",
"updated_at": "2019-07-01T14:10:36.156+02:00",
- "active": true,
- "commit_events": true,
- "push_events": true,
- "issues_events": true,
- "confidential_issues_events": true,
- "merge_requests_events": true,
- "tag_push_events": true,
- "note_events": true,
- "confidential_note_events": true,
- "pipeline_events": true,
- "wiki_page_events": true,
- "job_events": true,
- "comment_on_event_enabled": true,
- "project_id": 1
- }"""
- content = content.encode("utf-8")
- return response(200, content, headers, None, 5, request)
-
-
-@urlmatch(
- scheme="http",
- netloc="localhost",
- path="/api/v4/projects/1/services/pipelines-email",
- method="get",
-)
-def resp_get_service(url, request):
- """Mock for Service GET response."""
- content = """{
- "id": 100152,
- "title": "Pipelines emails",
- "slug": "pipelines-email",
- "created_at": "2019-01-14T08:46:43.637+01:00",
- "updated_at": "2019-07-01T14:10:36.156+02:00",
- "active": true,
- "commit_events": true,
- "push_events": true,
- "issues_events": true,
- "confidential_issues_events": true,
- "merge_requests_events": true,
- "tag_push_events": true,
- "note_events": true,
- "confidential_note_events": true,
- "pipeline_events": true,
- "wiki_page_events": true,
- "job_events": true,
- "comment_on_event_enabled": true,
- "project_id": 1
- }"""
- content = content.encode("utf-8")
- return response(200, content, headers, None, 5, request)
-
-
-@urlmatch(
- scheme="http", netloc="localhost", path="/api/v4/projects/1/services", method="get",
-)
-def resp_get_active_services(url, request):
- """Mock for active Services GET response."""
- content = """[{
- "id": 100152,
- "title": "Pipelines emails",
- "slug": "pipelines-email",
- "created_at": "2019-01-14T08:46:43.637+01:00",
- "updated_at": "2019-07-01T14:10:36.156+02:00",
- "active": true,
- "commit_events": true,
- "push_events": true,
- "issues_events": true,
- "confidential_issues_events": true,
- "merge_requests_events": true,
- "tag_push_events": true,
- "note_events": true,
- "confidential_note_events": true,
- "pipeline_events": true,
- "wiki_page_events": true,
- "job_events": true,
- "comment_on_event_enabled": true,
- "project_id": 1
- }]"""
- content = content.encode("utf-8")
- return response(200, content, headers, None, 5, request)
-
-
-@with_httmock(resp_get_active_services)
-def test_list_active_services(project):
+ "active": True,
+ "commit_events": True,
+ "push_events": True,
+ "issues_events": True,
+ "confidential_issues_events": True,
+ "merge_requests_events": True,
+ "tag_push_events": True,
+ "note_events": True,
+ "confidential_note_events": True,
+ "pipeline_events": True,
+ "wiki_page_events": True,
+ "job_events": True,
+ "comment_on_event_enabled": True,
+ "project_id": 1,
+ }
+
+ with responses.RequestsMock(assert_all_requests_are_fired=False) as rsps:
+ rsps.add(
+ method=responses.GET,
+ url="http://localhost/api/v4/projects/1/services",
+ json=[content],
+ content_type="application/json",
+ status=200,
+ )
+ rsps.add(
+ method=responses.GET,
+ url="http://localhost/api/v4/projects/1/services",
+ json=content,
+ content_type="application/json",
+ status=200,
+ )
+ rsps.add(
+ method=responses.GET,
+ url="http://localhost/api/v4/projects/1/services/pipelines-email",
+ json=content,
+ content_type="application/json",
+ status=200,
+ )
+ updated_content = dict(content)
+ updated_content["issues_events"] = False
+ rsps.add(
+ method=responses.PUT,
+ url="http://localhost/api/v4/projects/1/services/pipelines-email",
+ json=updated_content,
+ content_type="application/json",
+ status=200,
+ )
+ yield rsps
+
+
+def test_list_active_services(project, resp_service):
services = project.services.list()
assert isinstance(services, list)
assert isinstance(services[0], ProjectService)
@@ -113,22 +74,20 @@ def test_list_active_services(project):
assert services[0].push_events
-def test_list_available_services(project):
+def test_list_available_services(project, resp_service):
services = project.services.available()
assert isinstance(services, list)
assert isinstance(services[0], str)
-@with_httmock(resp_get_service)
-def test_get_service(project):
+def test_get_service(project, resp_service):
service = project.services.get("pipelines-email")
assert isinstance(service, ProjectService)
assert service.push_events is True
-@with_httmock(resp_get_service, resp_update_service)
-def test_update_service(project):
+def test_update_service(project, resp_service):
service = project.services.get("pipelines-email")
- service.issues_events = True
+ service.issues_events = False
service.save()
- assert service.issues_events is True
+ assert service.issues_events is False
diff --git a/gitlab/tests/objects/test_snippets.py b/gitlab/tests/objects/test_snippets.py
index 86eb54c..7e8afc2 100644
--- a/gitlab/tests/objects/test_snippets.py
+++ b/gitlab/tests/objects/test_snippets.py
@@ -3,9 +3,8 @@ GitLab API: https://docs.gitlab.com/ce/api/project_snippets.html
https://docs.gitlab.com/ee/api/snippets.html (todo)
"""
-from httmock import response, urlmatch, with_httmock
-
-from .mocks import headers
+import pytest
+import responses
title = "Example Snippet Title"
@@ -13,97 +12,67 @@ visibility = "private"
new_title = "new-title"
-@urlmatch(
- scheme="http", netloc="localhost", path="/api/v4/projects/1/snippets", method="get",
-)
-def resp_list_snippet(url, request):
- content = """[{
- "title": "%s",
- "description": "More verbose snippet description",
- "file_name": "example.txt",
- "content": "source code with multiple lines",
- "visibility": "%s"}]""" % (
- title,
- visibility,
- )
- content = content.encode("utf-8")
- return response(200, content, headers, None, 25, request)
-
-
-@urlmatch(
- scheme="http",
- netloc="localhost",
- path="/api/v4/projects/1/snippets/1",
- method="get",
-)
-def resp_get_snippet(url, request):
- content = """{
- "title": "%s",
- "description": "More verbose snippet description",
- "file_name": "example.txt",
- "content": "source code with multiple lines",
- "visibility": "%s"}""" % (
- title,
- visibility,
- )
- content = content.encode("utf-8")
- return response(200, content, headers, None, 25, request)
-
-
-@urlmatch(
- scheme="http",
- netloc="localhost",
- path="/api/v4/projects/1/snippets",
- method="post",
-)
-def resp_create_snippet(url, request):
- content = """{
- "title": "%s",
- "description": "More verbose snippet description",
- "file_name": "example.txt",
- "content": "source code with multiple lines",
- "visibility": "%s"}""" % (
- title,
- visibility,
- )
- content = content.encode("utf-8")
- return response(200, content, headers, None, 25, request)
-
-
-@urlmatch(
- scheme="http", netloc="localhost", path="/api/v4/projects/1/snippets", method="put",
-)
-def resp_update_snippet(url, request):
- content = """{
- "title": "%s",
- "description": "More verbose snippet description",
- "file_name": "example.txt",
- "content": "source code with multiple lines",
- "visibility": "%s"}""" % (
- new_title,
- visibility,
- )
- content = content.encode("utf-8")
- return response(200, content, headers, None, 25, request)
-
-
-@with_httmock(resp_list_snippet)
-def test_list_project_snippets(project):
+@pytest.fixture
+def resp_snippet():
+ content = {
+ "title": title,
+ "description": "More verbose snippet description",
+ "file_name": "example.txt",
+ "content": "source code with multiple lines",
+ "visibility": visibility,
+ }
+
+ with responses.RequestsMock(assert_all_requests_are_fired=False) as rsps:
+ rsps.add(
+ method=responses.GET,
+ url="http://localhost/api/v4/projects/1/snippets",
+ json=[content],
+ content_type="application/json",
+ status=200,
+ )
+ rsps.add(
+ method=responses.GET,
+ url="http://localhost/api/v4/projects/1/snippets/1",
+ json=content,
+ content_type="application/json",
+ status=200,
+ )
+ rsps.add(
+ method=responses.POST,
+ url="http://localhost/api/v4/projects/1/snippets",
+ json=content,
+ content_type="application/json",
+ status=200,
+ )
+
+ updated_content = dict(content)
+ updated_content["title"] = new_title
+ updated_content["visibility"] = visibility
+
+ rsps.add(
+ method=responses.PUT,
+ url="http://localhost/api/v4/projects/1/snippets",
+ json=updated_content,
+ content_type="application/json",
+ status=200,
+ )
+ yield rsps
+
+
+def test_list_project_snippets(project, resp_snippet):
snippets = project.snippets.list()
assert len(snippets) == 1
assert snippets[0].title == title
assert snippets[0].visibility == visibility
-@with_httmock(resp_get_snippet)
-def test_get_project_snippets(project):
+def test_get_project_snippet(project, resp_snippet):
snippet = project.snippets.get(1)
assert snippet.title == title
assert snippet.visibility == visibility
-@with_httmock(resp_create_snippet, resp_update_snippet)
-def test_create_update_project_snippets(project):
+def test_create_update_project_snippets(project, resp_snippet):
snippet = project.snippets.create(
{
"title": title,
diff --git a/gitlab/tests/objects/test_submodules.py b/gitlab/tests/objects/test_submodules.py
index 2e76302..539af7b 100644
--- a/gitlab/tests/objects/test_submodules.py
+++ b/gitlab/tests/objects/test_submodules.py
@@ -1,52 +1,42 @@
"""
GitLab API: https://docs.gitlab.com/ce/api/repository_submodules.html
"""
-
-from httmock import response, urlmatch, with_httmock
+import pytest
+import responses
from gitlab.v4.objects import Project
-from .mocks import headers
-
-
-@urlmatch(scheme="http", netloc="localhost", path="/api/v4/projects/1$", method="get")
-def resp_get_project(url, request):
- content = '{"name": "name", "id": 1}'.encode("utf-8")
- return response(200, content, headers, None, 5, request)
-
-
-@urlmatch(
- scheme="http",
- netloc="localhost",
- path="/api/v4/projects/1/repository/submodules/foo%2Fbar",
- method="put",
-)
-def resp_update_submodule(url, request):
- content = """{
- "id": "ed899a2f4b50b4370feeea94676502b42383c746",
- "short_id": "ed899a2f4b5",
- "title": "Message",
- "author_name": "Author",
- "author_email": "author@example.com",
- "committer_name": "Author",
- "committer_email": "author@example.com",
- "created_at": "2018-09-20T09:26:24.000-07:00",
- "message": "Message",
- "parent_ids": [ "ae1d9fb46aa2b07ee9836d49862ec4e2c46fbbba" ],
- "committed_date": "2018-09-20T09:26:24.000-07:00",
- "authored_date": "2018-09-20T09:26:24.000-07:00",
- "status": null}"""
- content = content.encode("utf-8")
- return response(200, content, headers, None, 5, request)
-
-
-@with_httmock(resp_get_project, resp_update_submodule)
-def test_update_submodule(gl):
- project = gl.projects.get(1)
- assert isinstance(project, Project)
- assert project.name == "name"
- assert project.id == 1
+@pytest.fixture
+def resp_update_submodule():
+ content = {
+ "id": "ed899a2f4b50b4370feeea94676502b42383c746",
+ "short_id": "ed899a2f4b5",
+ "title": "Message",
+ "author_name": "Author",
+ "author_email": "author@example.com",
+ "committer_name": "Author",
+ "committer_email": "author@example.com",
+ "created_at": "2018-09-20T09:26:24.000-07:00",
+ "message": "Message",
+ "parent_ids": ["ae1d9fb46aa2b07ee9836d49862ec4e2c46fbbba"],
+ "committed_date": "2018-09-20T09:26:24.000-07:00",
+ "authored_date": "2018-09-20T09:26:24.000-07:00",
+ "status": None,
+ }
+
+ with responses.RequestsMock() as rsps:
+ rsps.add(
+ method=responses.PUT,
+ url="http://localhost/api/v4/projects/1/repository/submodules/foo%2Fbar",
+ json=content,
+ content_type="application/json",
+ status=200,
+ )
+ yield rsps
+
+
+def test_update_submodule(project, resp_update_submodule):
ret = project.update_submodule(
submodule="foo/bar",
branch="master",
diff --git a/gitlab/tests/objects/test_todos.py b/gitlab/tests/objects/test_todos.py
index 5b30dc9..07bb680 100644
--- a/gitlab/tests/objects/test_todos.py
+++ b/gitlab/tests/objects/test_todos.py
@@ -5,45 +5,51 @@ GitLab API: https://docs.gitlab.com/ce/api/todos.html
import json
import os
-from httmock import response, urlmatch, with_httmock
+import pytest
+import responses
from gitlab.v4.objects import Todo
-from .mocks import headers
-
with open(os.path.dirname(__file__) + "/../data/todo.json", "r") as json_file:
todo_content = json_file.read()
json_content = json.loads(todo_content)
- encoded_content = todo_content.encode("utf-8")
-
-
-@urlmatch(scheme="http", netloc="localhost", path="/api/v4/todos", method="get")
-def resp_get_todo(url, request):
- return response(200, encoded_content, headers, None, 5, request)
-
-
-@urlmatch(
- scheme="http",
- netloc="localhost",
- path="/api/v4/todos/102/mark_as_done",
- method="post",
-)
-def resp_mark_as_done(url, request):
- single_todo = json.dumps(json_content[0])
- content = single_todo.encode("utf-8")
- return response(200, content, headers, None, 5, request)
-
-
-@urlmatch(
- scheme="http", netloc="localhost", path="/api/v4/todos/mark_as_done", method="post",
-)
-def resp_mark_all_as_done(url, request):
- return response(204, {}, headers, None, 5, request)
-@with_httmock(resp_get_todo, resp_mark_as_done)
-def test_todo(gl):
+@pytest.fixture
+def resp_todo():
+ with responses.RequestsMock(assert_all_requests_are_fired=False) as rsps:
+ rsps.add(
+ method=responses.GET,
+ url="http://localhost/api/v4/todos",
+ json=json_content,
+ content_type="application/json",
+ status=200,
+ )
+ rsps.add(
+ method=responses.POST,
+ url="http://localhost/api/v4/todos/102/mark_as_done",
+ json=json_content[0],
+ content_type="application/json",
+ status=200,
+ )
+ yield rsps
+
+
+@pytest.fixture
+def resp_mark_all_as_done():
+ with responses.RequestsMock() as rsps:
+ rsps.add(
+ method=responses.POST,
+ url="http://localhost/api/v4/todos/mark_as_done",
+ json={},
+ content_type="application/json",
+ status=204,
+ )
+ yield rsps
+
+
+def test_todo(gl, resp_todo):
todo = gl.todos.list()[0]
assert isinstance(todo, Todo)
assert todo.id == 102
@@ -53,6 +59,5 @@ def test_todo(gl):
todo.mark_as_done()
-@with_httmock(resp_mark_all_as_done)
-def test_todo_mark_all_as_done(gl):
+def test_todo_mark_all_as_done(gl, resp_mark_all_as_done):
gl.todos.mark_all_as_done()
diff --git a/gitlab/tests/objects/test_users.py b/gitlab/tests/objects/test_users.py
index 88175d0..ec282cf 100644
--- a/gitlab/tests/objects/test_users.py
+++ b/gitlab/tests/objects/test_users.py
@@ -1,94 +1,120 @@
"""
GitLab API: https://docs.gitlab.com/ce/api/users.html
"""
-
-from httmock import response, urlmatch, with_httmock
+import pytest
+import responses
from gitlab.v4.objects import User, UserMembership, UserStatus
-from .mocks import headers
-
-
-@urlmatch(scheme="http", netloc="localhost", path="/api/v4/users/1", method="get")
-def resp_get_user(url, request):
- content = (
- '{"name": "name", "id": 1, "password": "password", '
- '"username": "username", "email": "email"}'
- )
- content = content.encode("utf-8")
- return response(200, content, headers, None, 5, request)
-
-
-@urlmatch(
- scheme="http", netloc="localhost", path="/api/v4/users/1/memberships", method="get",
-)
-def resp_get_user_memberships(url, request):
- content = """[
- {
- "source_id": 1,
- "source_name": "Project one",
- "source_type": "Project",
- "access_level": "20"
- },
- {
- "source_id": 3,
- "source_name": "Group three",
- "source_type": "Namespace",
- "access_level": "20"
- }
- ]"""
- content = content.encode("utf-8")
- return response(200, content, headers, None, 5, request)
-
-
-@urlmatch(
- scheme="http", netloc="localhost", path="/api/v4/users/1/activate", method="post",
-)
-def resp_activate(url, request):
- return response(201, {}, headers, None, 5, request)
-
-
-@urlmatch(
- scheme="http", netloc="localhost", path="/api/v4/users/1/deactivate", method="post",
-)
-def resp_deactivate(url, request):
- return response(201, {}, headers, None, 5, request)
-
-
-@urlmatch(
- scheme="http", netloc="localhost", path="/api/v4/users/1/status", method="get",
-)
-def resp_get_user_status(url, request):
- content = (
- '{"message": "test", "message_html": "<h1>Message</h1>", "emoji": "thumbsup"}'
- )
- content = content.encode("utf-8")
- return response(200, content, headers, None, 5, request)
-
-
-@with_httmock(resp_get_user)
-def test_get_user(gl):
+
+
+@pytest.fixture
+def resp_get_user():
+ content = {
+ "name": "name",
+ "id": 1,
+ "password": "password",
+ "username": "username",
+ "email": "email",
+ }
+
+ with responses.RequestsMock() as rsps:
+ rsps.add(
+ method=responses.GET,
+ url="http://localhost/api/v4/users/1",
+ json=content,
+ content_type="application/json",
+ status=200,
+ )
+ yield rsps
+
+
+@pytest.fixture
+def resp_get_user_memberships():
+ content = [
+ {
+ "source_id": 1,
+ "source_name": "Project one",
+ "source_type": "Project",
+ "access_level": "20",
+ },
+ {
+ "source_id": 3,
+ "source_name": "Group three",
+ "source_type": "Namespace",
+ "access_level": "20",
+ },
+ ]
+
+ with responses.RequestsMock() as rsps:
+ rsps.add(
+ method=responses.GET,
+ url="http://localhost/api/v4/users/1/memberships",
+ json=content,
+ content_type="application/json",
+ status=200,
+ )
+ yield rsps
+
+
+@pytest.fixture
+def resp_activate():
+ with responses.RequestsMock(assert_all_requests_are_fired=False) as rsps:
+ rsps.add(
+ method=responses.POST,
+ url="http://localhost/api/v4/users/1/activate",
+ json={},
+ content_type="application/json",
+ status=201,
+ )
+ rsps.add(
+ method=responses.POST,
+ url="http://localhost/api/v4/users/1/deactivate",
+ json={},
+ content_type="application/json",
+ status=201,
+ )
+ yield rsps
+
+
+@pytest.fixture
+def resp_get_user_status():
+ content = {
+ "message": "test",
+ "message_html": "<h1>Message</h1>",
+ "emoji": "thumbsup",
+ }
+
+ with responses.RequestsMock() as rsps:
+ rsps.add(
+ method=responses.GET,
+ url="http://localhost/api/v4/users/1/status",
+ json=content,
+ content_type="application/json",
+ status=200,
+ )
+ yield rsps
+
+
+def test_get_user(gl, resp_get_user):
user = gl.users.get(1)
assert isinstance(user, User)
assert user.name == "name"
assert user.id == 1
-@with_httmock(resp_get_user_memberships)
-def test_user_memberships(user):
+def test_user_memberships(user, resp_get_user_memberships):
memberships = user.memberships.list()
assert isinstance(memberships[0], UserMembership)
assert memberships[0].source_type == "Project"
-@with_httmock(resp_get_user_status)
-def test_user_status(user):
+def test_user_status(user, resp_get_user_status):
status = user.status.get()
assert isinstance(status, UserStatus)
assert status.message == "test"
assert status.emoji == "thumbsup"
-@with_httmock(resp_activate, resp_deactivate)
-def test_user_activate_deactivate(user):
+def test_user_activate_deactivate(user, resp_activate):
user.activate()
user.deactivate()