| |
@@ -0,0 +1,145 @@
|
| |
+ import json
|
| |
+ import os
|
| |
+ from unittest.mock import call, patch
|
| |
+
|
| |
+ import pagure.lib.query
|
| |
+ import pagure.lib.model
|
| |
+
|
| |
+ from pagure_distgit import plugin
|
| |
+
|
| |
+ import tests
|
| |
+
|
| |
+
|
| |
+ class PagureFlaskApiOrphanEndpointTests(tests.Modeltests):
|
| |
+ """ Tests the orphan endpoints added in pagure-dist-git. """
|
| |
+
|
| |
+ def setUp(self):
|
| |
+ """ Set up the environnment, ran before every tests. """
|
| |
+ super(PagureFlaskApiOrphanEndpointTests, self).setUp()
|
| |
+ self.session.flush()
|
| |
+ tests.create_projects(self.session)
|
| |
+ tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
|
| |
+ tests.create_tokens(self.session)
|
| |
+ tests.create_tokens_acl(self.session)
|
| |
+ tests.create_user(
|
| |
+ self.session, "orphan", "orphan", ["orphan@fedoraproject.org"]
|
| |
+ )
|
| |
+ repo = pagure.lib.query.get_authorized_project(
|
| |
+ self.session, "test3", namespace="somenamespace",
|
| |
+ )
|
| |
+ token = pagure.lib.query.get_api_token(self.session, "aaabbbcccddd")
|
| |
+ token.project = repo
|
| |
+ self.session.add(token)
|
| |
+ self.session.commit()
|
| |
+ self._app.register_blueprint(plugin.DISTGIT_NS)
|
| |
+
|
| |
+ def test_token_missing_ACL(self):
|
| |
+ """Test the orphan endpoint with an API token missing the `modify_project` ACL.
|
| |
+ """
|
| |
+ headers = {"Authorization": "token foo_token"}
|
| |
+ output = self.app.post(
|
| |
+ "/_dg/orphan/somenamespace/test3", headers=headers
|
| |
+ )
|
| |
+ # invalid token
|
| |
+ assert output.status_code == 401
|
| |
+
|
| |
+ def test_invalid_token(self):
|
| |
+ """Test the orphan endpoint with an invalid API token. """
|
| |
+ headers = {"Authorization": "token BBBZZZOOO"}
|
| |
+ datainput = {}
|
| |
+ output = self.app.post(
|
| |
+ "/_dg/orphan/somenamespace/test3", data=datainput, headers=headers,
|
| |
+ )
|
| |
+ assert output.status_code == 401
|
| |
+
|
| |
+ def test_already_orphaned_package(self):
|
| |
+ """Assert that already orphaned package can't be orphaned again.
|
| |
+ """
|
| |
+ headers = {"Authorization": "token aaabbbcccddd"}
|
| |
+ datainput = {}
|
| |
+ orphan_user_obj = pagure.lib.query.get_user(self.session, "orphan")
|
| |
+ repo = pagure.lib.query.get_authorized_project(
|
| |
+ self.session, "test3", namespace="somenamespace",
|
| |
+ )
|
| |
+ repo.user = orphan_user_obj
|
| |
+ self.session.add(repo)
|
| |
+ self.session.commit()
|
| |
+ output = self.app.post(
|
| |
+ "/_dg/orphan/somenamespace/test3", data=datainput, headers=headers,
|
| |
+ )
|
| |
+ assert output.status_code == 401
|
| |
+
|
| |
+ @patch("pagure_distgit.plugin.pagure.lib.notify.log")
|
| |
+ def test_orphan_package(self, mock_log):
|
| |
+ """Assert that package is correctly orphaned.
|
| |
+ """
|
| |
+ headers = {"Authorization": "token aaabbbcccddd"}
|
| |
+ datainput = {}
|
| |
+ repo = pagure.lib.query.get_authorized_project(
|
| |
+ self.session, "test3", namespace="somenamespace",
|
| |
+ )
|
| |
+ user = repo.user
|
| |
+ project_user = pagure.lib.model.ProjectUser(
|
| |
+ project_id=repo.id, user_id=repo.user.id, access="admin",
|
| |
+ )
|
| |
+ self.session.add(project_user)
|
| |
+ self.session.commit()
|
| |
+ output = self.app.post(
|
| |
+ "/_dg/orphan/somenamespace/test3", data=datainput, headers=headers,
|
| |
+ )
|
| |
+ assert output.status_code == 200
|
| |
+ data = json.loads(output.get_data(as_text=True))
|
| |
+ self.assertDictEqual(data, {"point_of_contact": "orphan"})
|
| |
+
|
| |
+ assert repo.user.user == "orphan"
|
| |
+
|
| |
+ watch_level = pagure.lib.query.get_watch_level_on_repo(
|
| |
+ self.session, user, "test3"
|
| |
+ )
|
| |
+ assert watch_level == []
|
| |
+
|
| |
+ assert user not in repo.users
|
| |
+
|
| |
+ assert mock_log.call_count == 2
|
| |
+
|
| |
+ @patch("pagure_distgit.plugin.pagure.lib.notify.log")
|
| |
+ def test_orphan_package_repo_users_empty(self, mock_log):
|
| |
+ """Assert that package is correctly orphaned.
|
| |
+ """
|
| |
+ headers = {"Authorization": "token aaabbbcccddd"}
|
| |
+ datainput = {}
|
| |
+ repo = pagure.lib.query.get_authorized_project(
|
| |
+ self.session, "test3", namespace="somenamespace",
|
| |
+ )
|
| |
+ user = repo.user
|
| |
+ output = self.app.post(
|
| |
+ "/_dg/orphan/somenamespace/test3", data=datainput, headers=headers,
|
| |
+ )
|
| |
+ assert output.status_code == 200
|
| |
+ data = json.loads(output.get_data(as_text=True))
|
| |
+ self.assertDictEqual(data, {"point_of_contact": "orphan"})
|
| |
+ # refresh the repo object, so we have the current state
|
| |
+ self.session.refresh(repo)
|
| |
+
|
| |
+ assert repo.user.user == "orphan"
|
| |
+
|
| |
+ watch_level = pagure.lib.query.get_watch_level_on_repo(
|
| |
+ self.session, user, "test3"
|
| |
+ )
|
| |
+ assert watch_level == []
|
| |
+
|
| |
+ assert mock_log.call_count == 1
|
| |
+
|
| |
+ def test_orphan_package_repo_no_orphan_user(self):
|
| |
+ """Assert that missing orphan user is correctly handled.
|
| |
+ """
|
| |
+ headers = {"Authorization": "token aaabbbcccddd"}
|
| |
+ datainput = {}
|
| |
+ orphan_user_obj = pagure.lib.query.get_user(self.session, "orphan")
|
| |
+ self.session.delete(orphan_user_obj)
|
| |
+ self.session.commit()
|
| |
+
|
| |
+ output = self.app.post(
|
| |
+ "/_dg/orphan/somenamespace/test3", data=datainput, headers=headers,
|
| |
+ )
|
| |
+ assert output.status_code == 400
|
| |
This PR implements https://pagure.io/pagure-dist-git/issue/110
Signed-off-by: Michal Konečný mkonecny@redhat.com