"""
GitLab API: https://docs.gitlab.com/ce/api/invitations.html
"""
import re
import pytest
import responses
from gitlab.exceptions import GitlabInvitationError
create_content = {"email": "email@example.com", "access_level": 30}
success_content = {"status": "success"}
error_content = {
"status": "error",
"message": {
"test@example.com": "Invite email has already been taken",
"test2@example.com": "User already exists in source",
"test_username": "Access level is not included in the list",
},
}
invitations_content = [
{
"id": 1,
"invite_email": "member@example.org",
"created_at": "2020-10-22T14:13:35Z",
"access_level": 30,
"expires_at": "2020-11-22T14:13:35Z",
"user_name": "Raymond Smith",
"created_by_name": "Administrator",
}
]
invitation_content = {"expires_at": "2012-10-22T14:13:35Z", "access_level": 40}
@pytest.fixture
def resp_invitations_list():
with responses.RequestsMock() as rsps:
rsps.add(
method=responses.GET,
url=re.compile(r"http://localhost/api/v4/(groups|projects)/1/invitations"),
json=invitations_content,
content_type="application/json",
status=200,
)
yield rsps
@pytest.fixture
def resp_invitation_create():
with responses.RequestsMock() as rsps:
rsps.add(
method=responses.POST,
url=re.compile(r"http://localhost/api/v4/(groups|projects)/1/invitations"),
json=success_content,
content_type="application/json",
status=200,
)
yield rsps
@pytest.fixture
def resp_invitation_create_error():
with responses.RequestsMock() as rsps:
rsps.add(
method=responses.POST,
url=re.compile(r"http://localhost/api/v4/(groups|projects)/1/invitations"),
json=error_content,
content_type="application/json",
status=200,
)
yield rsps
@pytest.fixture
def resp_invitation_update():
with responses.RequestsMock() as rsps:
pattern = re.compile(
r"http://localhost/api/v4/(groups|projects)/1/invitations/email%40example.com"
)
rsps.add(
method=responses.PUT,
url=pattern,
json=invitation_content,
content_type="application/json",
status=200,
)
yield rsps
@pytest.fixture
def resp_invitation_delete():
with responses.RequestsMock() as rsps:
pattern = re.compile(
r"http://localhost/api/v4/(groups|projects)/1/invitations/email%40example.com"
)
rsps.add(method=responses.DELETE, url=pattern, status=204)
yield rsps
def test_list_group_invitations(group, resp_invitations_list):
invitations = group.invitations.list()
assert invitations[0].invite_email == "member@example.org"
def test_create_group_invitation(group, resp_invitation_create):
invitation = group.invitations.create(create_content)
assert invitation.status == "success"
def test_update_group_invitation(group, resp_invitation_update):
invitation = group.invitations.get("email@example.com", lazy=True)
invitation.access_level = 30
invitation.save()
def test_delete_group_invitation(group, resp_invitation_delete):
invitation = group.invitations.get("email@example.com", lazy=True)
invitation.delete()
group.invitations.delete("email@example.com")
def test_list_project_invitations(project, resp_invitations_list):
invitations = project.invitations.list()
assert invitations[0].invite_email == "member@example.org"
def test_create_project_invitation(project, resp_invitation_create):
invitation = project.invitations.create(create_content)
assert invitation.status == "success"
def test_update_project_invitation(project, resp_invitation_update):
invitation = project.invitations.get("email@example.com", lazy=True)
invitation.access_level = 30
invitation.save()
def test_delete_project_invitation(project, resp_invitation_delete):
invitation = project.invitations.get("email@example.com", lazy=True)
invitation.delete()
project.invitations.delete("email@example.com")
def test_create_group_invitation_raises(group, resp_invitation_create_error):
with pytest.raises(GitlabInvitationError, match="User already exists"):
group.invitations.create(create_content)
def test_create_project_invitation_raises(project, resp_invitation_create_error):
with pytest.raises(GitlabInvitationError, match="User already exists"):
project.invitations.create(create_content)