diff options
author | Nejc Habjan <hab.nejc@gmail.com> | 2021-12-01 01:04:53 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-12-01 01:04:53 +0100 |
commit | 8d76826fa64460e504acc5924f859f8dbc246b42 (patch) | |
tree | 083fefada982c795e2415092794db429abb0c184 /tests/functional/api | |
parent | 5a1678f43184bd459132102cc13cf8426fe0449d (diff) | |
parent | 86ab04e54ea4175f10053decfad5086cda7aa024 (diff) | |
download | gitlab-master.tar.gz |
Merge pull request #1723 from python-gitlab/jlvillal/dead_mastermaster
Close-out `master` branch
Diffstat (limited to 'tests/functional/api')
-rw-r--r-- | tests/functional/api/__init__.py | 0 | ||||
-rw-r--r-- | tests/functional/api/test_clusters.py | 46 | ||||
-rw-r--r-- | tests/functional/api/test_current_user.py | 42 | ||||
-rw-r--r-- | tests/functional/api/test_deploy_keys.py | 12 | ||||
-rw-r--r-- | tests/functional/api/test_deploy_tokens.py | 36 | ||||
-rw-r--r-- | tests/functional/api/test_gitlab.py | 183 | ||||
-rw-r--r-- | tests/functional/api/test_groups.py | 223 | ||||
-rw-r--r-- | tests/functional/api/test_import_export.py | 66 | ||||
-rw-r--r-- | tests/functional/api/test_issues.py | 93 | ||||
-rw-r--r-- | tests/functional/api/test_keys.py | 42 | ||||
-rw-r--r-- | tests/functional/api/test_merge_requests.py | 205 | ||||
-rw-r--r-- | tests/functional/api/test_packages.py | 62 | ||||
-rw-r--r-- | tests/functional/api/test_projects.py | 268 | ||||
-rw-r--r-- | tests/functional/api/test_releases.py | 63 | ||||
-rw-r--r-- | tests/functional/api/test_repository.py | 126 | ||||
-rw-r--r-- | tests/functional/api/test_snippets.py | 74 | ||||
-rw-r--r-- | tests/functional/api/test_users.py | 170 | ||||
-rw-r--r-- | tests/functional/api/test_variables.py | 48 |
18 files changed, 0 insertions, 1759 deletions
diff --git a/tests/functional/api/__init__.py b/tests/functional/api/__init__.py deleted file mode 100644 index e69de29..0000000 --- a/tests/functional/api/__init__.py +++ /dev/null diff --git a/tests/functional/api/test_clusters.py b/tests/functional/api/test_clusters.py deleted file mode 100644 index 8930aad..0000000 --- a/tests/functional/api/test_clusters.py +++ /dev/null @@ -1,46 +0,0 @@ -def test_project_clusters(project): - project.clusters.create( - { - "name": "cluster1", - "platform_kubernetes_attributes": { - "api_url": "http://url", - "token": "tokenval", - }, - } - ) - clusters = project.clusters.list() - assert len(clusters) == 1 - - cluster = clusters[0] - cluster.platform_kubernetes_attributes = {"api_url": "http://newurl"} - cluster.save() - - cluster = project.clusters.list()[0] - assert cluster.platform_kubernetes["api_url"] == "http://newurl" - - cluster.delete() - assert len(project.clusters.list()) == 0 - - -def test_group_clusters(group): - group.clusters.create( - { - "name": "cluster1", - "platform_kubernetes_attributes": { - "api_url": "http://url", - "token": "tokenval", - }, - } - ) - clusters = group.clusters.list() - assert len(clusters) == 1 - - cluster = clusters[0] - cluster.platform_kubernetes_attributes = {"api_url": "http://newurl"} - cluster.save() - - cluster = group.clusters.list()[0] - assert cluster.platform_kubernetes["api_url"] == "http://newurl" - - cluster.delete() - assert len(group.clusters.list()) == 0 diff --git a/tests/functional/api/test_current_user.py b/tests/functional/api/test_current_user.py deleted file mode 100644 index 5802457..0000000 --- a/tests/functional/api/test_current_user.py +++ /dev/null @@ -1,42 +0,0 @@ -def test_current_user_email(gl): - gl.auth() - mail = gl.user.emails.create({"email": "current@user.com"}) - assert len(gl.user.emails.list()) == 1 - - mail.delete() - assert len(gl.user.emails.list()) == 0 - - -def test_current_user_gpg_keys(gl, GPG_KEY): - gl.auth() - gkey = gl.user.gpgkeys.create({"key": GPG_KEY}) - assert len(gl.user.gpgkeys.list()) == 1 - - # Seems broken on the gitlab side - gkey = gl.user.gpgkeys.get(gkey.id) - gkey.delete() - assert len(gl.user.gpgkeys.list()) == 0 - - -def test_current_user_ssh_keys(gl, SSH_KEY): - gl.auth() - key = gl.user.keys.create({"title": "testkey", "key": SSH_KEY}) - assert len(gl.user.keys.list()) == 1 - - key.delete() - assert len(gl.user.keys.list()) == 0 - - -def test_current_user_status(gl): - gl.auth() - message = "Test" - emoji = "thumbsup" - status = gl.user.status.get() - - status.message = message - status.emoji = emoji - status.save() - - new_status = gl.user.status.get() - assert new_status.message == message - assert new_status.emoji == emoji diff --git a/tests/functional/api/test_deploy_keys.py b/tests/functional/api/test_deploy_keys.py deleted file mode 100644 index 18828a2..0000000 --- a/tests/functional/api/test_deploy_keys.py +++ /dev/null @@ -1,12 +0,0 @@ -def test_project_deploy_keys(gl, project, DEPLOY_KEY): - deploy_key = project.keys.create({"title": "foo@bar", "key": DEPLOY_KEY}) - project_keys = list(project.keys.list()) - assert len(project_keys) == 1 - - project2 = gl.projects.create({"name": "deploy-key-project"}) - project2.keys.enable(deploy_key.id) - assert len(project2.keys.list()) == 1 - - project2.keys.delete(deploy_key.id) - assert len(project2.keys.list()) == 0 - project2.delete() diff --git a/tests/functional/api/test_deploy_tokens.py b/tests/functional/api/test_deploy_tokens.py deleted file mode 100644 index efcf8b1..0000000 --- a/tests/functional/api/test_deploy_tokens.py +++ /dev/null @@ -1,36 +0,0 @@ -def test_project_deploy_tokens(gl, project): - deploy_token = project.deploytokens.create( - { - "name": "foo", - "username": "bar", - "expires_at": "2022-01-01", - "scopes": ["read_registry"], - } - ) - assert len(project.deploytokens.list()) == 1 - assert gl.deploytokens.list() == project.deploytokens.list() - - assert project.deploytokens.list()[0].name == "foo" - assert project.deploytokens.list()[0].expires_at == "2022-01-01T00:00:00.000Z" - assert project.deploytokens.list()[0].scopes == ["read_registry"] - assert project.deploytokens.list()[0].username == "bar" - - deploy_token.delete() - assert len(project.deploytokens.list()) == 0 - assert len(gl.deploytokens.list()) == 0 - - -def test_group_deploy_tokens(gl, group): - deploy_token = group.deploytokens.create( - { - "name": "foo", - "scopes": ["read_registry"], - } - ) - - assert len(group.deploytokens.list()) == 1 - assert gl.deploytokens.list() == group.deploytokens.list() - - deploy_token.delete() - assert len(group.deploytokens.list()) == 0 - assert len(gl.deploytokens.list()) == 0 diff --git a/tests/functional/api/test_gitlab.py b/tests/functional/api/test_gitlab.py deleted file mode 100644 index 7a70a56..0000000 --- a/tests/functional/api/test_gitlab.py +++ /dev/null @@ -1,183 +0,0 @@ -import pytest - -import gitlab - - -def test_auth_from_config(gl, temp_dir): - """Test token authentication from config file""" - test_gitlab = gitlab.Gitlab.from_config( - config_files=[temp_dir / "python-gitlab.cfg"] - ) - test_gitlab.auth() - assert isinstance(test_gitlab.user, gitlab.v4.objects.CurrentUser) - - -def test_broadcast_messages(gl): - msg = gl.broadcastmessages.create({"message": "this is the message"}) - msg.color = "#444444" - msg.save() - msg_id = msg.id - - msg = gl.broadcastmessages.list(all=True)[0] - assert msg.color == "#444444" - - msg = gl.broadcastmessages.get(msg_id) - assert msg.color == "#444444" - - msg.delete() - assert len(gl.broadcastmessages.list()) == 0 - - -def test_markdown(gl): - html = gl.markdown("foo") - assert "foo" in html - - -def test_lint(gl): - success, errors = gl.lint("Invalid") - assert success is False - assert errors - - -def test_sidekiq_queue_metrics(gl): - out = gl.sidekiq.queue_metrics() - assert isinstance(out, dict) - assert "pages" in out["queues"] - - -def test_sidekiq_process_metrics(gl): - out = gl.sidekiq.process_metrics() - assert isinstance(out, dict) - assert "hostname" in out["processes"][0] - - -def test_sidekiq_job_stats(gl): - out = gl.sidekiq.job_stats() - assert isinstance(out, dict) - assert "processed" in out["jobs"] - - -def test_sidekiq_compound_metrics(gl): - out = gl.sidekiq.compound_metrics() - assert isinstance(out, dict) - assert "jobs" in out - assert "processes" in out - assert "queues" in out - - -def test_gitlab_settings(gl): - settings = gl.settings.get() - settings.default_projects_limit = 42 - settings.save() - settings = gl.settings.get() - assert settings.default_projects_limit == 42 - - -def test_template_dockerfile(gl): - assert gl.dockerfiles.list() - - dockerfile = gl.dockerfiles.get("Node") - assert dockerfile.content is not None - - -def test_template_gitignore(gl): - assert gl.gitignores.list() - gitignore = gl.gitignores.get("Node") - assert gitignore.content is not None - - -def test_template_gitlabciyml(gl): - assert gl.gitlabciymls.list() - gitlabciyml = gl.gitlabciymls.get("Nodejs") - assert gitlabciyml.content is not None - - -def test_template_license(gl): - assert gl.licenses.list() - license = gl.licenses.get( - "bsd-2-clause", project="mytestproject", fullname="mytestfullname" - ) - assert "mytestfullname" in license.content - - -def test_hooks(gl): - hook = gl.hooks.create({"url": "http://whatever.com"}) - assert len(gl.hooks.list()) == 1 - - hook.delete() - assert len(gl.hooks.list()) == 0 - - -def test_namespaces(gl): - namespace = gl.namespaces.list(all=True) - assert namespace - - namespace = gl.namespaces.list(search="root", all=True)[0] - assert namespace.kind == "user" - - -def test_notification_settings(gl): - settings = gl.notificationsettings.get() - settings.level = gitlab.NOTIFICATION_LEVEL_WATCH - settings.save() - - settings = gl.notificationsettings.get() - assert settings.level == gitlab.NOTIFICATION_LEVEL_WATCH - - -def test_user_activities(gl): - activities = gl.user_activities.list(query_parameters={"from": "2019-01-01"}) - assert isinstance(activities, list) - - -def test_events(gl): - events = gl.events.list() - assert isinstance(events, list) - - -@pytest.mark.skip -def test_features(gl): - feat = gl.features.set("foo", 30) - assert feat.name == "foo" - assert len(gl.features.list()) == 1 - - feat.delete() - assert len(gl.features.list()) == 0 - - -def test_pagination(gl, project): - project2 = gl.projects.create({"name": "project-page-2"}) - - list1 = gl.projects.list(per_page=1, page=1) - list2 = gl.projects.list(per_page=1, page=2) - assert len(list1) == 1 - assert len(list2) == 1 - assert list1[0].id != list2[0].id - - project2.delete() - - -def test_rate_limits(gl): - settings = gl.settings.get() - settings.throttle_authenticated_api_enabled = True - settings.throttle_authenticated_api_requests_per_period = 1 - settings.throttle_authenticated_api_period_in_seconds = 3 - settings.save() - - projects = list() - for i in range(0, 20): - projects.append(gl.projects.create({"name": str(i) + "ok"})) - - with pytest.raises(gitlab.GitlabCreateError) as e: - for i in range(20, 40): - projects.append( - gl.projects.create( - {"name": str(i) + "shouldfail"}, obey_rate_limit=False - ) - ) - - assert "Retry later" in str(e.value) - - settings.throttle_authenticated_api_enabled = False - settings.save() - [project.delete() for project in projects] diff --git a/tests/functional/api/test_groups.py b/tests/functional/api/test_groups.py deleted file mode 100644 index 665c933..0000000 --- a/tests/functional/api/test_groups.py +++ /dev/null @@ -1,223 +0,0 @@ -import pytest - -import gitlab - - -def test_groups(gl): - # TODO: This one still needs lots of work - user = gl.users.create( - { - "email": "user@test.com", - "username": "user", - "name": "user", - "password": "user_pass", - } - ) - user2 = gl.users.create( - { - "email": "user2@test.com", - "username": "user2", - "name": "user2", - "password": "user2_pass", - } - ) - group1 = gl.groups.create({"name": "group1", "path": "group1"}) - group2 = gl.groups.create({"name": "group2", "path": "group2"}) - - p_id = gl.groups.list(search="group2")[0].id - group3 = gl.groups.create({"name": "group3", "path": "group3", "parent_id": p_id}) - group4 = gl.groups.create({"name": "group4", "path": "group4"}) - - assert len(gl.groups.list()) == 4 - assert len(gl.groups.list(search="oup1")) == 1 - assert group3.parent_id == p_id - assert group2.subgroups.list()[0].id == group3.id - assert group2.descendant_groups.list()[0].id == group3.id - - filtered_groups = gl.groups.list(skip_groups=[group3.id, group4.id]) - assert group3 not in filtered_groups - assert group3 not in filtered_groups - - group1.members.create( - {"access_level": gitlab.const.OWNER_ACCESS, "user_id": user.id} - ) - group1.members.create( - {"access_level": gitlab.const.GUEST_ACCESS, "user_id": user2.id} - ) - group2.members.create( - {"access_level": gitlab.const.OWNER_ACCESS, "user_id": user2.id} - ) - - group4.share(group1.id, gitlab.const.DEVELOPER_ACCESS) - group4.share(group2.id, gitlab.const.MAINTAINER_ACCESS) - # Reload group4 to have updated shared_with_groups - group4 = gl.groups.get(group4.id) - assert len(group4.shared_with_groups) == 2 - group4.unshare(group1.id) - # Reload group4 to have updated shared_with_groups - group4 = gl.groups.get(group4.id) - assert len(group4.shared_with_groups) == 1 - - # User memberships (admin only) - memberships1 = user.memberships.list() - assert len(memberships1) == 1 - - memberships2 = user2.memberships.list() - assert len(memberships2) == 2 - - membership = memberships1[0] - assert membership.source_type == "Namespace" - assert membership.access_level == gitlab.const.OWNER_ACCESS - - project_memberships = user.memberships.list(type="Project") - assert len(project_memberships) == 0 - - group_memberships = user.memberships.list(type="Namespace") - assert len(group_memberships) == 1 - - with pytest.raises(gitlab.GitlabListError) as e: - membership = user.memberships.list(type="Invalid") - assert "type does not have a valid value" in str(e.value) - - with pytest.raises(gitlab.GitlabListError) as e: - user.memberships.list(sudo=user.name) - assert "403 Forbidden" in str(e.value) - - # Administrator belongs to the groups - assert len(group1.members.list()) == 3 - assert len(group2.members.list()) == 2 - - group1.members.delete(user.id) - assert len(group1.members.list()) == 2 - assert len(group1.members_all.list()) - member = group1.members.get(user2.id) - member.access_level = gitlab.const.OWNER_ACCESS - member.save() - member = group1.members.get(user2.id) - assert member.access_level == gitlab.const.OWNER_ACCESS - - group2.members.delete(gl.user.id) - - -@pytest.mark.skip(reason="Commented out in legacy test") -def test_group_labels(group): - group.labels.create({"name": "foo", "description": "bar", "color": "#112233"}) - label = group.labels.get("foo") - assert label.description == "bar" - - label.description = "baz" - label.save() - label = group.labels.get("foo") - assert label.description == "baz" - assert len(group.labels.list()) == 1 - - label.delete() - assert len(group.labels.list()) == 0 - - -def test_group_notification_settings(group): - settings = group.notificationsettings.get() - settings.level = "disabled" - settings.save() - - settings = group.notificationsettings.get() - assert settings.level == "disabled" - - -def test_group_badges(group): - badge_image = "http://example.com" - badge_link = "http://example/img.svg" - badge = group.badges.create({"link_url": badge_link, "image_url": badge_image}) - assert len(group.badges.list()) == 1 - - badge.image_url = "http://another.example.com" - badge.save() - - badge = group.badges.get(badge.id) - assert badge.image_url == "http://another.example.com" - - badge.delete() - assert len(group.badges.list()) == 0 - - -def test_group_milestones(group): - milestone = group.milestones.create({"title": "groupmilestone1"}) - assert len(group.milestones.list()) == 1 - - milestone.due_date = "2020-01-01T00:00:00Z" - milestone.save() - milestone.state_event = "close" - milestone.save() - - milestone = group.milestones.get(milestone.id) - assert milestone.state == "closed" - assert len(milestone.issues()) == 0 - assert len(milestone.merge_requests()) == 0 - - -def test_group_custom_attributes(gl, group): - attrs = group.customattributes.list() - assert len(attrs) == 0 - - attr = group.customattributes.set("key", "value1") - assert len(gl.groups.list(custom_attributes={"key": "value1"})) == 1 - assert attr.key == "key" - assert attr.value == "value1" - assert len(group.customattributes.list()) == 1 - - attr = group.customattributes.set("key", "value2") - attr = group.customattributes.get("key") - assert attr.value == "value2" - assert len(group.customattributes.list()) == 1 - - attr.delete() - assert len(group.customattributes.list()) == 0 - - -def test_group_subgroups_projects(gl, user): - # TODO: fixture factories - group1 = gl.groups.list(search="group1")[0] - group2 = gl.groups.list(search="group2")[0] - - group3 = gl.groups.create( - {"name": "subgroup1", "path": "subgroup1", "parent_id": group1.id} - ) - group4 = gl.groups.create( - {"name": "subgroup2", "path": "subgroup2", "parent_id": group2.id} - ) - - gr1_project = gl.projects.create({"name": "gr1_project", "namespace_id": group1.id}) - gr2_project = gl.projects.create({"name": "gr2_project", "namespace_id": group3.id}) - - assert group3.parent_id == group1.id - assert group4.parent_id == group2.id - assert gr1_project.namespace["id"] == group1.id - assert gr2_project.namespace["parent_id"] == group1.id - - -@pytest.mark.skip -def test_group_wiki(group): - content = "Group Wiki page content" - wiki = group.wikis.create({"title": "groupwikipage", "content": content}) - assert len(group.wikis.list()) == 1 - - wiki = group.wikis.get(wiki.slug) - assert wiki.content == content - - wiki.content = "new content" - wiki.save() - wiki.delete() - assert len(group.wikis.list()) == 0 - - -@pytest.mark.skip(reason="EE feature") -def test_group_hooks(group): - hook = group.hooks.create({"url": "http://hook.url"}) - assert len(group.hooks.list()) == 1 - - hook.note_events = True - hook.save() - - hook = group.hooks.get(hook.id) - assert hook.note_events is True - hook.delete() diff --git a/tests/functional/api/test_import_export.py b/tests/functional/api/test_import_export.py deleted file mode 100644 index d4bdd19..0000000 --- a/tests/functional/api/test_import_export.py +++ /dev/null @@ -1,66 +0,0 @@ -import time - -import gitlab - - -def test_group_import_export(gl, group, temp_dir): - export = group.exports.create() - assert export.message == "202 Accepted" - - # We cannot check for export_status with group export API - time.sleep(10) - - import_archive = temp_dir / "gitlab-group-export.tgz" - import_path = "imported_group" - import_name = "Imported Group" - - with open(import_archive, "wb") as f: - export.download(streamed=True, action=f.write) - - with open(import_archive, "rb") as f: - output = gl.groups.import_group(f, import_path, import_name) - assert output["message"] == "202 Accepted" - - # We cannot check for returned ID with group import API - time.sleep(10) - group_import = gl.groups.get(import_path) - - assert group_import.path == import_path - assert group_import.name == import_name - - -def test_project_import_export(gl, project, temp_dir): - export = project.exports.create() - assert export.message == "202 Accepted" - - export = project.exports.get() - assert isinstance(export, gitlab.v4.objects.ProjectExport) - - count = 0 - while export.export_status != "finished": - time.sleep(1) - export.refresh() - count += 1 - if count == 15: - raise Exception("Project export taking too much time") - - with open(temp_dir / "gitlab-export.tgz", "wb") as f: - export.download(streamed=True, action=f.write) - - output = gl.projects.import_project( - open(temp_dir / "gitlab-export.tgz", "rb"), - "imported_project", - name="Imported Project", - ) - project_import = gl.projects.get(output["id"], lazy=True).imports.get() - - assert project_import.path == "imported_project" - assert project_import.name == "Imported Project" - - count = 0 - while project_import.import_status != "finished": - time.sleep(1) - project_import.refresh() - count += 1 - if count == 15: - raise Exception("Project import taking too much time") diff --git a/tests/functional/api/test_issues.py b/tests/functional/api/test_issues.py deleted file mode 100644 index 64db46e..0000000 --- a/tests/functional/api/test_issues.py +++ /dev/null @@ -1,93 +0,0 @@ -import gitlab - - -def test_create_issue(project): - issue = project.issues.create({"title": "my issue 1"}) - issue2 = project.issues.create({"title": "my issue 2"}) - issue_iids = [issue.iid for issue in project.issues.list()] - assert len(issue_iids) == 2 - - # Test 'iids' as a list - assert len(project.issues.list(iids=issue_iids)) == 2 - - issue2.state_event = "close" - issue2.save() - assert len(project.issues.list(state="closed")) == 1 - assert len(project.issues.list(state="opened")) == 1 - - assert isinstance(issue.user_agent_detail(), dict) - assert issue.user_agent_detail()["user_agent"] - assert issue.participants() - assert type(issue.closed_by()) == list - assert type(issue.related_merge_requests()) == list - - -def test_issue_notes(issue): - size = len(issue.notes.list()) - - note = issue.notes.create({"body": "This is an issue note"}) - assert len(issue.notes.list()) == size + 1 - - emoji = note.awardemojis.create({"name": "tractor"}) - assert len(note.awardemojis.list()) == 1 - - emoji.delete() - assert len(note.awardemojis.list()) == 0 - - note.delete() - assert len(issue.notes.list()) == size - - -def test_issue_labels(project, issue): - project.labels.create({"name": "label2", "color": "#aabbcc"}) - issue.labels = ["label2"] - issue.save() - - assert issue in project.issues.list(labels=["label2"]) - assert issue in project.issues.list(labels="label2") - assert issue in project.issues.list(labels="Any") - assert issue not in project.issues.list(labels="None") - - -def test_issue_events(issue): - events = issue.resourcelabelevents.list() - assert isinstance(events, list) - - event = issue.resourcelabelevents.get(events[0].id) - assert isinstance(event, gitlab.v4.objects.ProjectIssueResourceLabelEvent) - - -def test_issue_milestones(project, milestone): - data = {"title": "my issue 1", "milestone_id": milestone.id} - issue = project.issues.create(data) - assert milestone.issues().next().title == "my issue 1" - - milestone_events = issue.resourcemilestoneevents.list() - assert isinstance(milestone_events, list) - - milestone_event = issue.resourcemilestoneevents.get(milestone_events[0].id) - assert isinstance( - milestone_event, gitlab.v4.objects.ProjectIssueResourceMilestoneEvent - ) - - milestone_issues = project.issues.list(milestone=milestone.title) - assert len(milestone_issues) == 1 - - -def test_issue_discussions(issue): - size = len(issue.discussions.list()) - - discussion = issue.discussions.create({"body": "Discussion body"}) - assert len(issue.discussions.list()) == size + 1 - - d_note = discussion.notes.create({"body": "first note"}) - d_note_from_get = discussion.notes.get(d_note.id) - d_note_from_get.body = "updated body" - d_note_from_get.save() - - discussion = issue.discussions.get(discussion.id) - assert discussion.attributes["notes"][-1]["body"] == "updated body" - - d_note_from_get.delete() - discussion = issue.discussions.get(discussion.id) - assert len(discussion.attributes["notes"]) == 1 diff --git a/tests/functional/api/test_keys.py b/tests/functional/api/test_keys.py deleted file mode 100644 index 82a75e5..0000000 --- a/tests/functional/api/test_keys.py +++ /dev/null @@ -1,42 +0,0 @@ -""" -GitLab API: -https://docs.gitlab.com/ce/api/keys.html -""" -import base64 -import hashlib - - -def key_fingerprint(key): - key_part = key.split()[1] - decoded = base64.b64decode(key_part.encode("ascii")) - digest = hashlib.sha256(decoded).digest() - return "SHA256:" + base64.b64encode(digest).rstrip(b"=").decode("utf-8") - - -def test_keys_ssh(gl, user, SSH_KEY): - key = user.keys.create({"title": "foo@bar", "key": SSH_KEY}) - - # Get key by ID (admin only). - key_by_id = gl.keys.get(key.id) - assert key_by_id.title == key.title - assert key_by_id.key == key.key - - fingerprint = key_fingerprint(SSH_KEY) - # Get key by fingerprint (admin only). - key_by_fingerprint = gl.keys.get(fingerprint=fingerprint) - assert key_by_fingerprint.title == key.title - assert key_by_fingerprint.key == key.key - - key.delete() - - -def test_keys_deploy(gl, project, DEPLOY_KEY): - key = project.keys.create({"title": "foo@bar", "key": DEPLOY_KEY}) - - fingerprint = key_fingerprint(DEPLOY_KEY) - key_by_fingerprint = gl.keys.get(fingerprint=fingerprint) - assert key_by_fingerprint.title == key.title - assert key_by_fingerprint.key == key.key - assert len(key_by_fingerprint.deploy_keys_projects) == 1 - - key.delete() diff --git a/tests/functional/api/test_merge_requests.py b/tests/functional/api/test_merge_requests.py deleted file mode 100644 index b20b66a..0000000 --- a/tests/functional/api/test_merge_requests.py +++ /dev/null @@ -1,205 +0,0 @@ -import time - -import pytest - -import gitlab -import gitlab.v4.objects - - -def test_merge_requests(project): - project.files.create( - { - "file_path": "README.rst", - "branch": "master", - "content": "Initial content", - "commit_message": "Initial commit", - } - ) - - source_branch = "branch1" - project.branches.create({"branch": source_branch, "ref": "master"}) - - project.files.create( - { - "file_path": "README2.rst", - "branch": source_branch, - "content": "Initial content", - "commit_message": "New commit in new branch", - } - ) - project.mergerequests.create( - {"source_branch": "branch1", "target_branch": "master", "title": "MR readme2"} - ) - - -def test_merge_request_discussion(project): - mr = project.mergerequests.list()[0] - size = len(mr.discussions.list()) - - discussion = mr.discussions.create({"body": "Discussion body"}) - assert len(mr.discussions.list()) == size + 1 - - note = discussion.notes.create({"body": "first note"}) - note_from_get = discussion.notes.get(note.id) - note_from_get.body = "updated body" - note_from_get.save() - - discussion = mr.discussions.get(discussion.id) - assert discussion.attributes["notes"][-1]["body"] == "updated body" - - note_from_get.delete() - discussion = mr.discussions.get(discussion.id) - assert len(discussion.attributes["notes"]) == 1 - - -def test_merge_request_labels(project): - mr = project.mergerequests.list()[0] - mr.labels = ["label2"] - mr.save() - - events = mr.resourcelabelevents.list() - assert events - - event = mr.resourcelabelevents.get(events[0].id) - assert event - - -def test_merge_request_milestone_events(project, milestone): - mr = project.mergerequests.list()[0] - mr.milestone_id = milestone.id - mr.save() - - milestones = mr.resourcemilestoneevents.list() - assert milestones - - milestone = mr.resourcemilestoneevents.get(milestones[0].id) - assert milestone - - -def test_merge_request_basic(project): - mr = project.mergerequests.list()[0] - # basic testing: only make sure that the methods exist - mr.commits() - mr.changes() - assert mr.participants() - - -def test_merge_request_rebase(project): - mr = project.mergerequests.list()[0] - assert mr.rebase() - - -@pytest.mark.skip(reason="flaky test") -def test_merge_request_merge(project): - mr = project.mergerequests.list()[0] - mr.merge() - project.branches.delete(mr.source_branch) - - with pytest.raises(gitlab.GitlabMRClosedError): - # Two merge attempts should raise GitlabMRClosedError - mr.merge() - - -def test_merge_request_should_remove_source_branch( - project, merge_request, wait_for_sidekiq -) -> None: - """Test to ensure - https://github.com/python-gitlab/python-gitlab/issues/1120 is fixed. - Bug reported that they could not use 'should_remove_source_branch' in - mr.merge() call""" - - source_branch = "remove_source_branch" - mr = merge_request(source_branch=source_branch) - - mr.merge(should_remove_source_branch=True) - - result = wait_for_sidekiq(timeout=60) - assert result is True, "sidekiq process should have terminated but did not" - - # Wait until it is merged - mr_iid = mr.iid - for _ in range(60): - mr = project.mergerequests.get(mr_iid) - if mr.merged_at is not None: - break - time.sleep(0.5) - assert mr.merged_at is not None - time.sleep(0.5) - result = wait_for_sidekiq(timeout=60) - assert result is True, "sidekiq process should have terminated but did not" - - # Ensure we can NOT get the MR branch - with pytest.raises(gitlab.exceptions.GitlabGetError): - result = project.branches.get(source_branch) - # Help to debug in case the expected exception doesn't happen. - import pprint - - print("mr:", pprint.pformat(mr)) - print("mr.merged_at:", pprint.pformat(mr.merged_at)) - print("result:", pprint.pformat(result)) - - -def test_merge_request_large_commit_message( - project, merge_request, wait_for_sidekiq -) -> None: - """Test to ensure https://github.com/python-gitlab/python-gitlab/issues/1452 - is fixed. - Bug reported that very long 'merge_commit_message' in mr.merge() would - cause an error: 414 Request too large - """ - - source_branch = "large_commit_message" - mr = merge_request(source_branch=source_branch) - - merge_commit_message = "large_message\r\n" * 1_000 - assert len(merge_commit_message) > 10_000 - - mr.merge(merge_commit_message=merge_commit_message) - - result = wait_for_sidekiq(timeout=60) - assert result is True, "sidekiq process should have terminated but did not" - - # Wait until it is merged - mr_iid = mr.iid - for _ in range(60): - mr = project.mergerequests.get(mr_iid) - if mr.merged_at is not None: - break - time.sleep(0.5) - assert mr.merged_at is not None - time.sleep(0.5) - - # Ensure we can get the MR branch - project.branches.get(source_branch) - - -def test_merge_request_merge_ref(merge_request) -> None: - source_branch = "merge_ref_test" - mr = merge_request(source_branch=source_branch) - - response = mr.merge_ref() - assert response and "commit_id" in response - - -def test_merge_request_merge_ref_should_fail( - project, merge_request, wait_for_sidekiq -) -> None: - source_branch = "merge_ref_test2" - mr = merge_request(source_branch=source_branch) - - # Create conflict - project.files.create( - { - "file_path": f"README.{source_branch}", - "branch": project.default_branch, - "content": "Different initial content", - "commit_message": "Another commit in main branch", - } - ) - result = wait_for_sidekiq(timeout=60) - assert result is True, "sidekiq process should have terminated but did not" - - # Check for non-existing merge_ref for MR with conflicts - with pytest.raises(gitlab.exceptions.GitlabGetError): - response = mr.merge_ref() - assert "commit_id" not in response diff --git a/tests/functional/api/test_packages.py b/tests/functional/api/test_packages.py deleted file mode 100644 index 64b57b8..0000000 --- a/tests/functional/api/test_packages.py +++ /dev/null @@ -1,62 +0,0 @@ -""" -GitLab API: -https://docs.gitlab.com/ce/api/packages.html -https://docs.gitlab.com/ee/user/packages/generic_packages -""" -from gitlab.v4.objects import GenericPackage - -package_name = "hello-world" -package_version = "v1.0.0" -file_name = "hello.tar.gz" -file_content = "package content" - - -def test_list_project_packages(project): - packages = project.packages.list() - assert isinstance(packages, list) - - -def test_list_group_packages(group): - packages = group.packages.list() - assert isinstance(packages, list) - - -def test_upload_generic_package(tmp_path, project): - path = tmp_path / file_name - path.write_text(file_content) - package = project.generic_packages.upload( - package_name=package_name, - package_version=package_version, - file_name=file_name, - path=path, - ) - - assert isinstance(package, GenericPackage) - assert package.message == "201 Created" - - -def test_download_generic_package(project): - package = project.generic_packages.download( - package_name=package_name, - package_version=package_version, - file_name=file_name, - ) - - assert isinstance(package, bytes) - assert package.decode("utf-8") == file_content - - -def test_download_generic_package_to_file(tmp_path, project): - path = tmp_path / file_name - - with open(path, "wb") as f: - project.generic_packages.download( - package_name=package_name, - package_version=package_version, - file_name=file_name, - streamed=True, - action=f.write, - ) - - with open(path, "r") as f: - assert f.read() == file_content diff --git a/tests/functional/api/test_projects.py b/tests/functional/api/test_projects.py deleted file mode 100644 index 88b274c..0000000 --- a/tests/functional/api/test_projects.py +++ /dev/null @@ -1,268 +0,0 @@ -import pytest - -import gitlab - - -def test_create_project(gl, user): - # Moved from group tests chunk in legacy tests, TODO cleanup - admin_project = gl.projects.create({"name": "admin_project"}) - assert isinstance(admin_project, gitlab.v4.objects.Project) - assert len(gl.projects.list(search="admin")) == 1 - - sudo_project = gl.projects.create({"name": "sudo_project"}, sudo=user.id) - - created = gl.projects.list() - created_gen = gl.projects.list(as_list=False) - owned = gl.projects.list(owned=True) - - assert admin_project in created and sudo_project in created - assert admin_project in owned and sudo_project not in owned - assert len(created) == len(list(created_gen)) - - admin_project.delete() - sudo_project.delete() - - -def test_project_badges(project): - badge_image = "http://example.com" - badge_link = "http://example/img.svg" - - badge = project.badges.create({"link_url": badge_link, "image_url": badge_image}) - assert len(project.badges.list()) == 1 - - badge.image_url = "http://another.example.com" - badge.save() - - badge = project.badges.get(badge.id) - assert badge.image_url == "http://another.example.com" - - badge.delete() - assert len(project.badges.list()) == 0 - - -@pytest.mark.skip(reason="Commented out in legacy test") -def test_project_boards(project): - boards = project.boards.list() - assert len(boards) - - board = boards[0] - lists = board.lists.list() - begin_size = len(lists) - last_list = lists[-1] - last_list.position = 0 - last_list.save() - last_list.delete() - lists = board.lists.list() - assert len(lists) == begin_size - 1 - - -def test_project_custom_attributes(gl, project): - attrs = project.customattributes.list() - assert len(attrs) == 0 - - attr = project.customattributes.set("key", "value1") - assert attr.key == "key" - assert attr.value == "value1" - assert len(project.customattributes.list()) == 1 - assert len(gl.projects.list(custom_attributes={"key": "value1"})) == 1 - - attr = project.customattributes.set("key", "value2") - attr = project.customattributes.get("key") - assert attr.value == "value2" - assert len(project.customattributes.list()) == 1 - - attr.delete() - assert len(project.customattributes.list()) == 0 - - -def test_project_environments(project): - project.environments.create( - {"name": "env1", "external_url": "http://fake.env/whatever"} - ) - environments = project.environments.list() - assert len(environments) == 1 - - environment = environments[0] - environment.external_url = "http://new.env/whatever" - environment.save() - - environment = project.environments.list()[0] - assert environment.external_url == "http://new.env/whatever" - - environment.stop() - environment.delete() - assert len(project.environments.list()) == 0 - - -def test_project_events(project): - events = project.events.list() - assert isinstance(events, list) - - -def test_project_file_uploads(project): - filename = "test.txt" - file_contents = "testing contents" - - uploaded_file = project.upload(filename, file_contents) - assert uploaded_file["alt"] == filename - assert uploaded_file["url"].startswith("/uploads/") - assert uploaded_file["url"].endswith("/" + filename) - assert uploaded_file["markdown"] == "[{}]({})".format( - uploaded_file["alt"], uploaded_file["url"] - ) - - -def test_project_forks(gl, project, user): - fork = project.forks.create({"namespace": user.username}) - fork_project = gl.projects.get(fork.id) - assert fork_project.forked_from_project["id"] == project.id - - forks = project.forks.list() - assert fork.id in map(lambda fork_project: fork_project.id, forks) - - -def test_project_hooks(project): - hook = project.hooks.create({"url": "http://hook.url"}) - assert len(project.hooks.list()) == 1 - - hook.note_events = True - hook.save() - - hook = project.hooks.get(hook.id) - assert hook.note_events is True - hook.delete() - - -def test_project_housekeeping(project): - project.housekeeping() - - -def test_project_labels(project): - label = project.labels.create({"name": "label", "color": "#778899"}) - labels = project.labels.list() - assert len(labels) == 1 - - label = project.labels.get("label") - assert label == labels[0] - - label.new_name = "labelupdated" - label.save() - assert label.name == "labelupdated" - - label.subscribe() - assert label.subscribed is True - - label.unsubscribe() - assert label.subscribed is False - - label.delete() - assert len(project.labels.list()) == 0 - - -def test_project_milestones(project): - milestone = project.milestones.create({"title": "milestone1"}) - assert len(project.milestones.list()) == 1 - - milestone.due_date = "2020-01-01T00:00:00Z" - milestone.save() - - milestone.state_event = "close" - milestone.save() - - milestone = project.milestones.get(milestone.id) - assert milestone.state == "closed" - assert len(milestone.issues()) == 0 - assert len(milestone.merge_requests()) == 0 - - -def test_project_pages_domains(gl, project): - domain = project.pagesdomains.create({"domain": "foo.domain.com"}) - assert len(project.pagesdomains.list()) == 1 - assert len(gl.pagesdomains.list()) == 1 - - domain = project.pagesdomains.get("foo.domain.com") - assert domain.domain == "foo.domain.com" - - domain.delete() - assert len(project.pagesdomains.list()) == 0 - - -def test_project_protected_branches(project): - p_b = project.protectedbranches.create({"name": "*-stable"}) - assert p_b.name == "*-stable" - assert len(project.protectedbranches.list()) == 1 - - p_b = project.protectedbranches.get("*-stable") - p_b.delete() - assert len(project.protectedbranches.list()) == 0 - - -def test_project_remote_mirrors(project): - mirror_url = "http://gitlab.test/root/mirror.git" - - mirror = project.remote_mirrors.create({"url": mirror_url}) - assert mirror.url == mirror_url - - mirror.enabled = True - mirror.save() - - mirror = project.remote_mirrors.list()[0] - assert isinstance(mirror, gitlab.v4.objects.ProjectRemoteMirror) - assert mirror.url == mirror_url - assert mirror.enabled is True - - -def test_project_services(project): - # Use 'update' to create a service as we don't have a 'create' method and - # to add one is somewhat complicated so it hasn't been done yet. - project.services.update("asana", api_key="foo") - - service = project.services.get("asana") - assert service.active is True - service.api_key = "whatever" - service.save() - - service = project.services.get("asana") - assert service.active is True - - service.delete() - - service = project.services.get("asana") - assert service.active is False - - -def test_project_stars(project): - project.star() - assert project.star_count == 1 - - project.unstar() - assert project.star_count == 0 - - -def test_project_tags(project, project_file): - tag = project.tags.create({"tag_name": "v1.0", "ref": "master"}) - assert len(project.tags.list()) == 1 - - tag.delete() - assert len(project.tags.list()) == 0 - - -def test_project_triggers(project): - trigger = project.triggers.create({"description": "trigger1"}) - assert len(project.triggers.list()) == 1 - trigger.delete() - - -def test_project_wiki(project): - content = "Wiki page content" - wiki = project.wikis.create({"title": "wikipage", "content": content}) - assert len(project.wikis.list()) == 1 - - wiki = project.wikis.get(wiki.slug) - assert wiki.content == content - - # update and delete seem broken - wiki.content = "new content" - wiki.save() - wiki.delete() - assert len(project.wikis.list()) == 0 diff --git a/tests/functional/api/test_releases.py b/tests/functional/api/test_releases.py deleted file mode 100644 index f409c23..0000000 --- a/tests/functional/api/test_releases.py +++ /dev/null @@ -1,63 +0,0 @@ -release_name = "Demo Release" -release_tag_name = "v1.2.3" -release_description = "release notes go here" - -link_data = {"url": "https://example.com", "name": "link_name"} - - -def test_create_project_release(project, project_file): - project.refresh() # Gets us the current default branch - release = project.releases.create( - { - "name": release_name, - "tag_name": release_tag_name, - "description": release_description, - "ref": project.default_branch, - } - ) - - assert len(project.releases.list()) == 1 - assert project.releases.get(release_tag_name) - assert release.name == release_name - assert release.tag_name == release_tag_name - assert release.description == release_description - - -def test_create_project_release_no_name(project, project_file): - unnamed_release_tag_name = "v2.3.4" - - project.refresh() # Gets us the current default branch - release = project.releases.create( - { - "tag_name": unnamed_release_tag_name, - "description": release_description, - "ref": project.default_branch, - } - ) - - assert len(project.releases.list()) >= 1 - assert project.releases.get(unnamed_release_tag_name) - assert release.tag_name == unnamed_release_tag_name - assert release.description == release_description - - -def test_update_save_project_release(project, release): - updated_description = f"{release.description} updated" - release.description = updated_description - release.save() - - release = project.releases.get(release.tag_name) - assert release.description == updated_description - - -def test_delete_project_release(project, release): - project.releases.delete(release.tag_name) - assert release not in project.releases.list() - - -def test_create_project_release_links(project, release): - release.links.create(link_data) - - release = project.releases.get(release.tag_name) - assert release.assets["links"][0]["url"] == link_data["url"] - assert release.assets["links"][0]["name"] == link_data["name"] diff --git a/tests/functional/api/test_repository.py b/tests/functional/api/test_repository.py deleted file mode 100644 index 7ba84ea..0000000 --- a/tests/functional/api/test_repository.py +++ /dev/null @@ -1,126 +0,0 @@ -import base64 -import time - -import pytest - -import gitlab - - -def test_repository_files(project): - project.files.create( - { - "file_path": "README", - "branch": "master", - "content": "Initial content", - "commit_message": "Initial commit", - } - ) - readme = project.files.get(file_path="README", ref="master") - readme.content = base64.b64encode(b"Improved README").decode() - - time.sleep(2) - readme.save(branch="master", commit_message="new commit") - readme.delete(commit_message="Removing README", branch="master") - - project.files.create( - { - "file_path": "README.rst", - "branch": "master", - "content": "Initial content", - "commit_message": "New commit", - } - ) - readme = project.files.get(file_path="README.rst", ref="master") - # The first decode() is the ProjectFile method, the second one is the bytes - # object method - assert readme.decode().decode() == "Initial content" - - blame = project.files.blame(file_path="README.rst", ref="master") - assert blame - - -def test_repository_tree(project): - tree = project.repository_tree() - assert tree - assert tree[0]["name"] == "README.rst" - - blob_id = tree[0]["id"] - blob = project.repository_raw_blob(blob_id) - assert blob.decode() == "Initial content" - - archive = project.repository_archive() - assert isinstance(archive, bytes) - - archive2 = project.repository_archive("master") - assert archive == archive2 - - snapshot = project.snapshot() - assert isinstance(snapshot, bytes) - - -def test_create_commit(project): - data = { - "branch": "master", - "commit_message": "blah blah blah", - "actions": [{"action": "create", "file_path": "blah", "content": "blah"}], - } - commit = project.commits.create(data) - - assert "@@" in project.commits.list()[0].diff()[0]["diff"] - assert isinstance(commit.refs(), list) - assert isinstance(commit.merge_requests(), list) - - -def test_create_commit_status(project): - commit = project.commits.list()[0] - size = len(commit.statuses.list()) - commit.statuses.create({"state": "success", "sha": commit.id}) - assert len(commit.statuses.list()) == size + 1 - - -def test_commit_signature(project): - commit = project.commits.list()[0] - - with pytest.raises(gitlab.GitlabGetError) as e: - commit.signature() - - assert "404 Signature Not Found" in str(e.value) - - -def test_commit_comment(project): - commit = project.commits.list()[0] - - commit.comments.create({"note": "This is a commit comment"}) - assert len(commit.comments.list()) == 1 - - -def test_commit_discussion(project): - commit = project.commits.list()[0] - count = len(commit.discussions.list()) - - discussion = commit.discussions.create({"body": "Discussion body"}) - assert len(commit.discussions.list()) == (count + 1) - - note = discussion.notes.create({"body": "first note"}) - note_from_get = discussion.notes.get(note.id) - note_from_get.body = "updated body" - note_from_get.save() - discussion = commit.discussions.get(discussion.id) - # assert discussion.attributes["notes"][-1]["body"] == "updated body" - note_from_get.delete() - discussion = commit.discussions.get(discussion.id) - # assert len(discussion.attributes["notes"]) == 1 - - -def test_revert_commit(project): - commit = project.commits.list()[0] - revert_commit = commit.revert(branch="master") - - expected_message = 'Revert "{}"\n\nThis reverts commit {}'.format( - commit.message, commit.id - ) - assert revert_commit["message"] == expected_message - - with pytest.raises(gitlab.GitlabRevertError): - # Two revert attempts should raise GitlabRevertError - commit.revert(branch="master") diff --git a/tests/functional/api/test_snippets.py b/tests/functional/api/test_snippets.py deleted file mode 100644 index 9e0f833..0000000 --- a/tests/functional/api/test_snippets.py +++ /dev/null @@ -1,74 +0,0 @@ -import gitlab - - -def test_snippets(gl): - snippets = gl.snippets.list(all=True) - assert len(snippets) == 0 - - snippet = gl.snippets.create( - {"title": "snippet1", "file_name": "snippet1.py", "content": "import gitlab"} - ) - snippet = gl.snippets.get(snippet.id) - snippet.title = "updated_title" - snippet.save() - - snippet = gl.snippets.get(snippet.id) - assert snippet.title == "updated_title" - - content = snippet.content() - assert content.decode() == "import gitlab" - assert snippet.user_agent_detail()["user_agent"] - - snippet.delete() - snippets = gl.snippets.list(all=True) - assert len(snippets) == 0 - - -def test_project_snippets(project): - project.snippets_enabled = True - project.save() - - snippet = project.snippets.create( - { - "title": "snip1", - "file_name": "foo.py", - "content": "initial content", - "visibility": gitlab.VISIBILITY_PRIVATE, - } - ) - - assert snippet.user_agent_detail()["user_agent"] - - -def test_project_snippet_discussion(project): - snippet = project.snippets.list()[0] - size = len(snippet.discussions.list()) - - discussion = snippet.discussions.create({"body": "Discussion body"}) - assert len(snippet.discussions.list()) == size + 1 - - note = discussion.notes.create({"body": "first note"}) - note_from_get = discussion.notes.get(note.id) - note_from_get.body = "updated body" - note_from_get.save() - - discussion = snippet.discussions.get(discussion.id) - assert discussion.attributes["notes"][-1]["body"] == "updated body" - - note_from_get.delete() - discussion = snippet.discussions.get(discussion.id) - assert len(discussion.attributes["notes"]) == 1 - - -def test_project_snippet_file(project): - snippet = project.snippets.list()[0] - snippet.file_name = "bar.py" - snippet.save() - - snippet = project.snippets.get(snippet.id) - assert snippet.content().decode() == "initial content" - assert snippet.file_name == "bar.py" - - size = len(project.snippets.list()) - snippet.delete() - assert len(project.snippets.list()) == (size - 1) diff --git a/tests/functional/api/test_users.py b/tests/functional/api/test_users.py deleted file mode 100644 index 1ef237c..0000000 --- a/tests/functional/api/test_users.py +++ /dev/null @@ -1,170 +0,0 @@ -""" -GitLab API: -https://docs.gitlab.com/ee/api/users.html -https://docs.gitlab.com/ee/api/users.html#delete-authentication-identity-from-user -""" -import pytest -import requests - - -@pytest.fixture(scope="session") -def avatar_path(test_dir): - return test_dir / "fixtures" / "avatar.png" - - -def test_create_user(gl, avatar_path): - user = gl.users.create( - { - "email": "foo@bar.com", - "username": "foo", - "name": "foo", - "password": "foo_password", - "avatar": open(avatar_path, "rb"), - } - ) - - created_user = gl.users.list(username="foo")[0] - assert created_user.username == user.username - assert created_user.email == user.email - - avatar_url = user.avatar_url.replace("gitlab.test", "localhost:8080") - uploaded_avatar = requests.get(avatar_url).content - assert uploaded_avatar == open(avatar_path, "rb").read() - - -def test_block_user(gl, user): - user.block() - users = gl.users.list(blocked=True) - assert user in users - - user.unblock() - users = gl.users.list(blocked=False) - assert user in users - - -def test_delete_user(gl, wait_for_sidekiq): - new_user = gl.users.create( - { - "email": "delete-user@test.com", - "username": "delete-user", - "name": "delete-user", - "password": "delete-user-pass", - } - ) - - new_user.delete() - result = wait_for_sidekiq(timeout=60) - assert result is True, "sidekiq process should have terminated but did not" - - assert new_user.id not in [user.id for user in gl.users.list()] - - -def test_user_projects_list(gl, user): - projects = user.projects.list() - assert isinstance(projects, list) - assert not projects - - -def test_user_events_list(gl, user): - events = user.events.list() - assert isinstance(events, list) - assert not events - - -def test_user_bio(gl, user): - user.bio = "This is the user bio" - user.save() - - -def test_list_multiple_users(gl, user): - second_email = f"{user.email}.2" - second_username = f"{user.username}_2" - second_user = gl.users.create( - { - "email": second_email, - "username": second_username, - "name": "Foo Bar", - "password": "foobar_password", - } - ) - assert gl.users.list(search=second_user.username)[0].id == second_user.id - - expected = [user, second_user] - actual = list(gl.users.list(search=user.username)) - - assert len(expected) == len(actual) - assert len(gl.users.list(search="asdf")) == 0 - - -def test_user_gpg_keys(gl, user, GPG_KEY): - gkey = user.gpgkeys.create({"key": GPG_KEY}) - assert len(user.gpgkeys.list()) == 1 - - # Seems broken on the gitlab side - # gkey = user.gpgkeys.get(gkey.id) - - gkey.delete() - assert len(user.gpgkeys.list()) == 0 - - -def test_user_ssh_keys(gl, user, SSH_KEY): - key = user.keys.create({"title": "testkey", "key": SSH_KEY}) - assert len(user.keys.list()) == 1 - - key.delete() - assert len(user.keys.list()) == 0 - - -def test_user_email(gl, user): - email = user.emails.create({"email": "foo2@bar.com"}) - assert len(user.emails.list()) == 1 - - email.delete() - assert len(user.emails.list()) == 0 - - -def test_user_custom_attributes(gl, user): - attrs = user.customattributes.list() - assert len(attrs) == 0 - - attr = user.customattributes.set("key", "value1") - assert len(gl.users.list(custom_attributes={"key": "value1"})) == 1 - assert attr.key == "key" - assert attr.value == "value1" - assert len(user.customattributes.list()) == 1 - - attr = user.customattributes.set("key", "value2") - attr = user.customattributes.get("key") - assert attr.value == "value2" - assert len(user.customattributes.list()) == 1 - - attr.delete() - assert len(user.customattributes.list()) == 0 - - -def test_user_impersonation_tokens(gl, user): - token = user.impersonationtokens.create( - {"name": "token1", "scopes": ["api", "read_user"]} - ) - - tokens = user.impersonationtokens.list(state="active") - assert len(tokens) == 1 - - token.delete() - tokens = user.impersonationtokens.list(state="active") - assert len(tokens) == 0 - tokens = user.impersonationtokens.list(state="inactive") - assert len(tokens) == 1 - - -def test_user_identities(gl, user): - provider = "test_provider" - - user.provider = provider - user.extern_uid = "1" - user.save() - assert provider in [item["provider"] for item in user.identities] - - user.identityproviders.delete(provider) - user = gl.users.get(user.id) - assert provider not in [item["provider"] for item in user.identities] diff --git a/tests/functional/api/test_variables.py b/tests/functional/api/test_variables.py deleted file mode 100644 index d20ebba..0000000 --- a/tests/functional/api/test_variables.py +++ /dev/null @@ -1,48 +0,0 @@ -""" -GitLab API: -https://docs.gitlab.com/ee/api/instance_level_ci_variables.html -https://docs.gitlab.com/ee/api/project_level_variables.html -https://docs.gitlab.com/ee/api/group_level_variables.html -""" - - -def test_instance_variables(gl): - variable = gl.variables.create({"key": "key1", "value": "value1"}) - assert variable.value == "value1" - assert len(gl.variables.list()) == 1 - - variable.value = "new_value1" - variable.save() - variable = gl.variables.get(variable.key) - assert variable.value == "new_value1" - - variable.delete() - assert len(gl.variables.list()) == 0 - - -def test_group_variables(group): - variable = group.variables.create({"key": "key1", "value": "value1"}) - assert variable.value == "value1" - assert len(group.variables.list()) == 1 - - variable.value = "new_value1" - variable.save() - variable = group.variables.get(variable.key) - assert variable.value == "new_value1" - - variable.delete() - assert len(group.variables.list()) == 0 - - -def test_project_variables(project): - variable = project.variables.create({"key": "key1", "value": "value1"}) - assert variable.value == "value1" - assert len(project.variables.list()) == 1 - - variable.value = "new_value1" - variable.save() - variable = project.variables.get(variable.key) - assert variable.value == "new_value1" - - variable.delete() - assert len(project.variables.list()) == 0 |