Skip to content

Commit

Permalink
labhub: Modify invite permissions
Browse files Browse the repository at this point in the history
- Removed invite using `invite me`
- Developers have right to invite newcomers
- Invite only if invitee is a member of the room

Closes coala#534
Closes coala#535
  • Loading branch information
nvzard authored and gitmate-bot committed Jun 12, 2018
1 parent 4bb5d55 commit ef885b0
Show file tree
Hide file tree
Showing 4 changed files with 100 additions and 53 deletions.
66 changes: 44 additions & 22 deletions plugins/labhub.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,12 @@ def TEAMS(self):
def TEAMS(self, new):
self._teams = new

@staticmethod
def is_room_member(invitee, msg):
return invitee in msg.frm.room.occupants

# Ignore LineLengthBear, PycodestyleBear
@re_botcmd(pattern=r'^(?:(?:welcome)|(?:inv)|(?:invite))\s+(?:(?:@?([\w-]+)(?:\s+(?:to)\s+(\w+))?)|(me))$',
@re_botcmd(pattern=r'^(?:(?:welcome)|(?:inv)|(?:invite))\s+@?([\w-]+)(?:\s+(?:to)\s+(\w+))?$',
re_cmd_name_help='invite ([@]<username> [to <team>]|me)')
def invite_cmd(self, msg, match):
"""
Expand All @@ -82,45 +86,63 @@ def invite_cmd(self, msg, match):
invitee = match.group(1)
inviter = msg.frm.nick

if invitee == 'me':
user = msg.frm.nick
response = tenv().get_template(
'labhub/promotions/newcomers.jinja2.md'
).render(
username=user,
)
self.send(msg.frm, response)
self.TEAMS[self.GH_ORG_NAME + ' newcomers'].invite(user)
self.invited_users.add(user)
return

team = 'newcomers' if match.group(2) is None else match.group(2)
team = team.lower()

is_developer = self.TEAMS[self.GH_ORG_NAME +
' developers'].is_member(inviter)
is_maintainer = self.TEAMS[self.GH_ORG_NAME +
' maintainers'].is_member(inviter)

self.log.info('{} invited {} to {}'.format(inviter, invitee, team))

if self.TEAMS[self.GH_ORG_NAME + ' maintainers'].is_member(inviter):
valid_teams = ['newcomers', 'developers', 'maintainers']
if team.lower() not in valid_teams:
return 'Please select from one of the ' + ', '.join(valid_teams)
valid_teams = ['newcomers', 'developers', 'maintainers']
if team not in valid_teams:
return 'Please select from one of the valid teams: ' + ', '.join(
valid_teams)

def invite(invitee, team):
team_mapping = {
'newcomers': self.GH_ORG_NAME + ' newcomers',
'developers': self.GH_ORG_NAME + ' developers',
'maintainers': self.GH_ORG_NAME + ' maintainers'
}

# send the invite
self.TEAMS[team_mapping[team.lower()]].invite(invitee)
self.TEAMS[team_mapping[team]].invite(invitee)

if not self.is_room_member(invitee, msg):
return '@{} is not a member of this room.'.format(invitee)

if is_maintainer:
invite(invitee, team)
return tenv().get_template(
'labhub/promotions/{}.jinja2.md'.format(team.lower())
'labhub/promotions/{}.jinja2.md'.format(team)
).render(
target=invitee,
)
elif is_developer:
if team == 'newcomers':
invite(invitee, team)
return tenv().get_template(
'labhub/promotions/{}.jinja2.md'.format(team)
).render(
target=invitee,
)
else:
return tenv().get_template(
'labhub/errors/not-eligible-invite.jinja2.md'
).render(
action='invite someone to developers or maintainers',
designation='maintainer',
target=inviter,
)
else:
return tenv().get_template(
'labhub/errors/not-maintainer.jinja2.md'
'labhub/errors/not-eligible-invite.jinja2.md'
).render(
action='invite other people',
target=invitee,
designation='developer/maintainer',
target=inviter,
)

def callback_message(self, msg):
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
@{{ target }}, you are not a {{ designation }}! Only a {{ designation }} can {{ action }}. Nice try :poop:
1 change: 0 additions & 1 deletion plugins/templates/labhub/errors/not-maintainer.jinja2.md

This file was deleted.

85 changes: 55 additions & 30 deletions tests/labhub_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
from IGitt.GitHub.GitHubIssue import GitHubIssue

from errbot.backends.test import TestBot
from errbot.backends.base import Message

import plugins.labhub
from plugins.labhub import LabHub
Expand All @@ -36,31 +37,77 @@ def setUp(self):
plugins.labhub.github3.organization.return_value = self.mock_org

def test_invite_cmd(self):
mock_team_newcomers = create_autospec(github3.orgs.Team)
mock_team_developers = create_autospec(github3.orgs.Team)
mock_team_maintainers = create_autospec(github3.orgs.Team)

teams = {
'coala maintainers': self.mock_team,
'coala newcomers': self.mock_team,
'coala developers': self.mock_team
'coala maintainers': mock_team_maintainers,
'coala newcomers': mock_team_newcomers,
'coala developers': mock_team_developers
}

labhub, testbot = plugin_testbot(plugins.labhub.LabHub, logging.ERROR)
labhub.activate()
labhub._teams = teams

self.mock_team.is_member.return_value = True
plugins.labhub.os.environ['GH_TOKEN'] = 'patched?'

self.assertEqual(labhub.TEAMS, teams)

labhub.is_room_member = MagicMock(return_value=False)
testbot.assertCommand('!invite meet to newcomers',
'@meet is not a member of this room.')

labhub.is_room_member = MagicMock(return_value=True)

# invite by maintainer
mock_team_newcomers.is_member.return_value = True
mock_team_developers.is_member.return_value = True
mock_team_maintainers.is_member.return_value = True

testbot.assertCommand('!invite meet to newcomers',
'To get started, please follow our [newcomers guide]')
testbot.assertCommand('!invite meet to developers',
'@meet, you are a part of developers')
self.assertEqual(labhub.TEAMS, teams)
testbot.assertCommand('!invite meet to something',
'select from one of the')
testbot.assertCommand('!invite meet to maintainers',
'@meet you seem to be awesome!')

self.mock_team.is_member.return_value = False
# invite by developer
mock_team_maintainers.is_member.return_value = False
labhub.is_room_member = MagicMock(return_value = True)

testbot.assertCommand('!invite meet to newcomers',
'To get started, please follow our [newcomers guide]')
testbot.assertCommand('!invite meet to developers',
':poop:')
testbot.assertCommand('!invite meet to maintainers',
':poop:')

# invite by newcomer
mock_team_developers.is_member.return_value = False

testbot.assertCommand('!invite meet to newcomers',
':poop')
testbot.assertCommand('!invite meet to developers',
':poop:')
testbot.assertCommand('!invite meet to maintainers',
':poop:')

# invalid team
testbot.assertCommand('!invite meet to something',
'select from one of the valid')

#invalid command
testbot.assertCommand('!invite meetto newcomers',
'Command "invite" / "invite meetto" not found.')

def test_is_room_member(self):
msg = create_autospec(Message)
msg.frm.room.occupants = PropertyMock()
msg.frm.room.occupants = ['batman', 'superman']
self.assertTrue(LabHub.is_room_member('batman', msg))

def test_hello_world_callback(self):
teams = {
'coala newcomers': self.mock_team,
Expand Down Expand Up @@ -324,25 +371,3 @@ def test_alive(self):
testbot.assertCommand('!pr stats 3hours',
'10 PRs opened in last 3 hours\n'
'The community is on fire')

def test_invite_me(self):
teams = {
'coala maintainers': self.mock_team,
'coala newcomers': self.mock_team,
'coala developers': self.mock_team
}

labhub, testbot = plugin_testbot(plugins.labhub.LabHub, logging.ERROR)
labhub.activate()
labhub._teams = teams

plugins.labhub.os.environ['GH_TOKEN'] = 'patched?'
testbot.assertCommand('!invite me',
'We\'ve just sent you an invite')
with self.assertRaises(queue.Empty):
testbot.pop_message()

testbot.assertCommand('!hey there invite me',
'Command \"hey\" / \"hey there\" not found.')
with self.assertRaises(queue.Empty):
testbot.pop_message()

0 comments on commit ef885b0

Please sign in to comment.