# -*- coding: utf-8 -*-
"""
(c) 2016 - Copyright Red Hat Inc
Authors:
Pierre-Yves Chibon <pingou@pingoured.fr>
"""
from __future__ import unicode_literals, absolute_import
import unittest
import shutil
import sys
import os
import mock
sys.path.insert(
0, os.path.join(os.path.dirname(os.path.abspath(__file__)), "..")
)
import pagure.lib.model
import pagure.lib.query
import tests
@mock.patch("pagure.lib.git.update_git", mock.MagicMock(return_value=True))
@mock.patch("pagure.lib.notify.send_email", mock.MagicMock(return_value=True))
class PagureLibGetWatchListtests(tests.Modeltests):
""" Tests for pagure.lib.query.get_watch_list """
def test_get_watch_list_invalid_object(self):
""" Test get_watch_list when given an invalid object """
# Create a project ns/test
item = pagure.lib.model.Project(
user_id=1, # pingou
name="test3",
namespace="ns",
description="test project #1",
hook_token="aaabbbcccdd",
)
item.close_status = ["Invalid", "Insufficient data", "Fixed"]
self.session.add(item)
self.session.commit()
self.assertRaises(
pagure.exceptions.InvalidObjectException,
pagure.lib.query.get_watch_list,
self.session,
item,
)
def test_get_watch_list_simple(self):
""" Test get_watch_list when the creator of the ticket is the
creator of the project """
# Create a project ns/test
item = pagure.lib.model.Project(
user_id=1, # pingou
name="test3",
namespace="ns",
description="test project #1",
hook_token="aaabbbcccdd",
)
item.close_status = ["Invalid", "Insufficient data", "Fixed"]
self.session.add(item)
self.session.commit()
# Create the ticket
iss = pagure.lib.query.new_issue(
issue_id=4,
session=self.session,
repo=item,
title="test issue",
content="content test issue",
user="pingou",
)
self.session.commit()
self.assertEqual(iss.id, 4)
self.assertEqual(iss.title, "test issue")
self.assertEqual(
pagure.lib.query.get_watch_list(self.session, iss), set(["pingou"])
)
def test_get_watch_list_different_creator(self):
""" Test get_watch_list when the creator of the ticket is not the
creator of the project """
# Create a project ns/test
item = pagure.lib.model.Project(
user_id=1, # pingou
name="test3",
namespace="ns",
description="test project #1",
hook_token="aaabbbcccdd",
)
item.close_status = ["Invalid", "Insufficient data", "Fixed"]
self.session.add(item)
self.session.commit()
# Create the ticket
iss = pagure.lib.query.new_issue(
issue_id=4,
session=self.session,
repo=item,
title="test issue",
content="content test issue",
user="foo",
)
self.session.commit()
self.assertEqual(iss.id, 4)
self.assertEqual(iss.title, "test issue")
self.assertEqual(
pagure.lib.query.get_watch_list(self.session, iss),
set(["pingou", "foo"]),
)
def test_get_watch_list_project_w_contributor(self):
""" Test get_watch_list when the project has more than one
contributor """
# Create a project ns/test3
item = pagure.lib.model.Project(
user_id=1, # pingou
name="test3",
namespace="ns",
description="test project #1",
hook_token="aaabbbcccdd",
)
item.close_status = ["Invalid", "Insufficient data", "Fixed"]
self.session.add(item)
self.session.commit()
# Add a contributor to the project
item = pagure.lib.model.User(
user="bar",
fullname="bar foo",
password="foo",
default_email="bar@bar.com",
)
self.session.add(item)
item = pagure.lib.model.UserEmail(user_id=3, email="bar@bar.com")
self.session.add(item)
project = pagure.lib.query._get_project(
self.session, "test3", namespace="ns"
)
msg = pagure.lib.query.add_user_to_project(
session=self.session,
project=project,
new_user="bar",
user="pingou",
)
self.session.commit()
self.assertEqual(msg, "User added")
# Create the ticket
iss = pagure.lib.query.new_issue(
issue_id=4,
session=self.session,
repo=project,
title="test issue",
content="content test issue",
user="foo",
)
self.session.commit()
self.assertEqual(iss.id, 4)
self.assertEqual(iss.title, "test issue")
self.assertEqual(
pagure.lib.query.get_watch_list(self.session, iss),
set(["pingou", "foo", "bar"]),
)
def test_get_watch_list_user_in_group(self):
""" Test get_watch_list when the project has groups of contributors
"""
# Create a project ns/test3
item = pagure.lib.model.Project(
user_id=1, # pingou
name="test3",
namespace="ns",
description="test project #1",
hook_token="aaabbbcccdd",
)
item.close_status = ["Invalid", "Insufficient data", "Fixed"]
self.session.add(item)
self.session.commit()
# Create a third user
item = pagure.lib.model.User(
user="bar",
fullname="bar foo",
password="foo",
default_email="bar@bar.com",
)
self.session.add(item)
item = pagure.lib.model.UserEmail(user_id=3, email="bar@bar.com")
self.session.add(item)
# Create a group
msg = pagure.lib.query.add_group(
self.session,
group_name="foo",
display_name="foo group",
description=None,
group_type="bar",
user="pingou",
is_admin=False,
blacklist=[],
)
self.session.commit()
self.assertEqual(msg, "User `pingou` added to the group `foo`.")
# Add user to group
group = pagure.lib.query.search_groups(self.session, group_name="foo")
msg = pagure.lib.query.add_user_to_group(
self.session,
username="bar",
group=group,
user="pingou",
is_admin=False,
)
self.session.commit()
self.assertEqual(msg, "User `bar` added to the group `foo`.")
project = pagure.lib.query._get_project(
self.session, "test3", namespace="ns"
)
# Add group to project
msg = pagure.lib.query.add_group_to_project(
session=self.session,
project=project,
new_group="foo",
user="pingou",
)
self.session.commit()
self.assertEqual(msg, "Group added")
# Create the ticket
iss = pagure.lib.query.new_issue(
issue_id=4,
session=self.session,
repo=project,
title="test issue",
content="content test issue",
user="foo",
)
self.session.commit()
self.assertEqual(iss.id, 4)
self.assertEqual(iss.title, "test issue")
self.assertEqual(
pagure.lib.query.get_watch_list(self.session, iss),
set(["pingou", "foo", "bar"]),
)
def test_get_watch_list_project_w_contributor_out(self):
""" Test get_watch_list when the project has one contributor not
watching the project """
# Create a project ns/test3
item = pagure.lib.model.Project(
user_id=1, # pingou
name="test3",
namespace="ns",
description="test project #1",
hook_token="aaabbbcccdd",
)
item.close_status = ["Invalid", "Insufficient data", "Fixed"]
self.session.add(item)
self.session.commit()
# Add a contributor to the project
item = pagure.lib.model.User(
user="bar",
fullname="bar foo",
password="foo",
default_email="bar@bar.com",
)
self.session.add(item)
item = pagure.lib.model.UserEmail(user_id=3, email="bar@bar.com")
self.session.add(item)
project = pagure.lib.query._get_project(
self.session, "test3", namespace="ns"
)
msg = pagure.lib.query.add_user_to_project(
session=self.session,
project=project,
new_user="bar",
user="pingou",
)
self.session.commit()
self.assertEqual(msg, "User added")
# Set the user `pingou` to not watch the project
msg = pagure.lib.query.update_watch_status(
session=self.session, project=project, user="pingou", watch="0"
)
self.session.commit()
self.assertEqual(msg, "You are no longer watching this project")
# Create the ticket
iss = pagure.lib.query.new_issue(
issue_id=4,
session=self.session,
repo=project,
title="test issue",
content="content test issue",
user="foo",
)
self.session.commit()
self.assertEqual(iss.id, 4)
self.assertEqual(iss.title, "test issue")
self.assertEqual(
pagure.lib.query.get_watch_list(self.session, iss),
set(["foo", "bar"]),
)
def test_get_watch_list_project_w_contributor_out_pr(self):
""" Test get_watch_list when the project has one contributor not
watching the pull-request """
# Create a project ns/test3
item = pagure.lib.model.Project(
user_id=1, # pingou
name="test3",
namespace="ns",
description="test project #1",
hook_token="aaabbbcccdd",
)
item.close_status = ["Invalid", "Insufficient data", "Fixed"]
self.session.add(item)
self.session.commit()
# Add a contributor to the project
item = pagure.lib.model.User(
user="bar",
fullname="bar foo",
password="foo",
default_email="bar@bar.com",
)
self.session.add(item)
item = pagure.lib.model.UserEmail(user_id=3, email="bar@bar.com")
self.session.add(item)
project = pagure.lib.query._get_project(
self.session, "test3", namespace="ns"
)
msg = pagure.lib.query.add_user_to_project(
session=self.session,
project=project,
new_user="bar",
user="pingou",
)
self.session.commit()
self.assertEqual(msg, "User added")
# Create the pull-request
req = pagure.lib.query.new_pull_request(
session=self.session,
repo_from=project,
branch_from="dev",
repo_to=project,
branch_to="master",
title="test pull-request",
user="foo",
)
self.session.commit()
self.assertEqual(req.id, 1)
self.assertEqual(req.title, "test pull-request")
# Set the user `pingou` to not watch the pull-request
out = pagure.lib.query.set_watch_obj(
self.session, "pingou", req, False
)
self.assertEqual(out, "You are no longer watching this pull-request")
self.assertEqual(
pagure.lib.query.get_watch_list(self.session, req),
set(["foo", "bar"]),
)
def test_get_watch_list_project_w_contributor_watching_project(self):
""" Test get_watch_list when the project has one contributor watching
the project """
# Create a project ns/test3
item = pagure.lib.model.Project(
user_id=1, # pingou
name="test3",
namespace="ns",
description="test project #1",
hook_token="aaabbbcccdd",
)
item.close_status = ["Invalid", "Insufficient data", "Fixed"]
self.session.add(item)
self.session.commit()
# Add a new user
item = pagure.lib.model.User(
user="bar",
fullname="bar foo",
password="foo",
default_email="bar@bar.com",
)
self.session.add(item)
item = pagure.lib.model.UserEmail(user_id=3, email="bar@bar.com")
self.session.add(item)
# Set the user `bar` to watch the project
project = pagure.lib.query._get_project(
self.session, "test3", namespace="ns"
)
msg = pagure.lib.query.update_watch_status(
session=self.session, project=project, user="bar", watch="1"
)
self.session.commit()
self.assertEqual(
msg, "You are now watching issues and PRs on this project"
)
# Create the pull-request
req = pagure.lib.query.new_pull_request(
session=self.session,
repo_from=project,
branch_from="dev",
repo_to=project,
branch_to="master",
title="test pull-request",
user="foo",
)
self.session.commit()
self.assertEqual(req.id, 1)
self.assertEqual(req.title, "test pull-request")
self.assertEqual(
pagure.lib.query.get_watch_list(self.session, req),
set(["foo", "bar", "pingou"]),
)
@mock.patch.dict("pagure.config.config", {"PAGURE_ADMIN_USERS": "foo"})
def test_get_watch_list_project_w_private_issue(self):
""" Test get_watch_list when the project has one contributor watching
the project and the issue is private """
# Create a project ns/test3
item = pagure.lib.model.Project(
user_id=1, # pingou
name="test3",
namespace="ns",
description="test project #1",
hook_token="aaabbbcccdd",
)
item.close_status = ["Invalid", "Insufficient data", "Fixed"]
self.session.add(item)
self.session.commit()
# Add a new user
item = pagure.lib.model.User(
user="bar",
fullname="bar foo",
password="foo",
default_email="bar@bar.com",
)
self.session.add(item)
item = pagure.lib.model.UserEmail(user_id=3, email="bar@bar.com")
self.session.add(item)
# Set the user `bar` to watch the project
project = pagure.lib.query.get_authorized_project(
self.session, "test3", namespace="ns"
)
msg = pagure.lib.query.update_watch_status(
session=self.session, project=project, user="bar", watch="1"
)
self.session.commit()
self.assertEqual(
msg, "You are now watching issues and PRs on this project"
)
# Create the ticket
iss = pagure.lib.query.new_issue(
issue_id=4,
session=self.session,
repo=project,
title="test issue",
content="content test issue",
user="pingou",
private=True,
)
self.session.commit()
self.assertEqual(iss.id, 4)
self.assertEqual(iss.title, "test issue")
self.assertEqual(
pagure.lib.query.get_watch_list(self.session, iss), set(["pingou"])
)
out = pagure.lib.query.set_watch_obj(self.session, "foo", iss, True)
self.assertEqual(out, "You are now watching this issue")
self.assertEqual(
pagure.lib.query.get_watch_list(self.session, iss),
set(["pingou", "foo"]),
)
out = pagure.lib.query.set_watch_obj(self.session, "foo", iss, False)
self.assertEqual(out, "You are no longer watching this issue")
self.assertEqual(
pagure.lib.query.get_watch_list(self.session, iss), set(["pingou"])
)
if __name__ == "__main__":
unittest.main(verbosity=2)