# Copyright 2016 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file or at
# https://developers.google.com/open-source/licenses/bsd

"""Tests for the project_svc module."""
from __future__ import print_function
from __future__ import division
from __future__ import absolute_import

import time
import unittest

try:
  from mox3 import mox
except ImportError:
  import mox
import mock

from google.appengine.ext import testbed

from framework import framework_constants
from framework import sql
from proto import project_pb2
from proto import user_pb2
from services import config_svc
from services import project_svc
from testing import fake

NOW = 12345678


def MakeProjectService(cache_manager, my_mox):
  project_service = project_svc.ProjectService(cache_manager)
  project_service.project_tbl = my_mox.CreateMock(sql.SQLTableManager)
  project_service.user2project_tbl = my_mox.CreateMock(sql.SQLTableManager)
  project_service.extraperm_tbl = my_mox.CreateMock(sql.SQLTableManager)
  project_service.membernotes_tbl = my_mox.CreateMock(sql.SQLTableManager)
  project_service.usergroupprojects_tbl = my_mox.CreateMock(
      sql.SQLTableManager)
  project_service.acexclusion_tbl = my_mox.CreateMock(
      sql.SQLTableManager)
  return project_service


class ProjectTwoLevelCacheTest(unittest.TestCase):

  def setUp(self):
    self.testbed = testbed.Testbed()
    self.testbed.activate()
    self.testbed.init_memcache_stub()

    self.mox = mox.Mox()
    self.cnxn = self.mox.CreateMock(sql.MonorailConnection)
    self.cache_manager = fake.CacheManager()
    self.project_service = MakeProjectService(self.cache_manager, self.mox)

  def tearDown(self):
    self.testbed.deactivate()

  def testDeserializeProjects(self):
    project_rows = [
        (
            123, 'proj1', 'test proj 1', 'test project', 'live', 'anyone', '',
            '', None, '', 0, 50 * 1024 * 1024, NOW, NOW, None, True, False,
            False, None, None, None, None, None, None, False),
        (
            234, 'proj2', 'test proj 2', 'test project', 'live', 'anyone', '',
            '', None, '', 0, 50 * 1024 * 1024, NOW, NOW, None, True, False,
            False, None, None, None, None, None, None, True)
    ]
    role_rows = [
        (123, 111, 'owner'), (123, 444, 'owner'),
        (123, 222, 'committer'),
        (123, 333, 'contributor'),
        (234, 111, 'owner')]
    extraperm_rows = []

    project_dict = self.project_service.project_2lc._DeserializeProjects(
        project_rows, role_rows, extraperm_rows)

    self.assertItemsEqual([123, 234], list(project_dict.keys()))
    self.assertEqual(123, project_dict[123].project_id)
    self.assertEqual('proj1', project_dict[123].project_name)
    self.assertEqual(NOW, project_dict[123].recent_activity)
    self.assertItemsEqual([111, 444], project_dict[123].owner_ids)
    self.assertItemsEqual([222], project_dict[123].committer_ids)
    self.assertItemsEqual([333], project_dict[123].contributor_ids)
    self.assertEqual(234, project_dict[234].project_id)
    self.assertItemsEqual([111], project_dict[234].owner_ids)
    self.assertEqual(False, project_dict[123].issue_notify_always_detailed)
    self.assertEqual(True, project_dict[234].issue_notify_always_detailed)


class UserToProjectIdTwoLevelCacheTest(unittest.TestCase):

  def setUp(self):
    self.testbed = testbed.Testbed()
    self.testbed.activate()
    self.testbed.init_memcache_stub()

    self.cnxn = fake.MonorailConnection()
    self.cache_manager = fake.CacheManager()
    self.mox = mox.Mox()
    self.project_service = MakeProjectService(self.cache_manager, self.mox)
    self.user_to_project_2lc = self.project_service.user_to_project_2lc

    # Set up DB query mocks.
    self.cached_user_ids = [100, 101]
    self.from_db_user_ids = [102, 103]
    test_table = [
        (900, self.cached_user_ids[0]),  # Project 900, User 100
        (900, self.cached_user_ids[1]),  # Project 900, User 101
        (901, self.cached_user_ids[0]),  # Project 901, User 101
        (902, self.from_db_user_ids[0]),  # Project 902, User 102
        (902, self.from_db_user_ids[1]),  # Project 902, User 103
        (903, self.from_db_user_ids[0]),  # Project 903, User 102
    ]
    self.project_service.user2project_tbl.Select = mock.Mock(
        return_value=test_table)

  def tearDown(self):
    # memcache.flush_all()
    self.testbed.deactivate()
    self.mox.UnsetStubs()
    self.mox.ResetAll()

  def testGetAll(self):
    # Cache user 100 and 101.
    self.user_to_project_2lc.CacheItem(self.cached_user_ids[0], set([900, 901]))
    self.user_to_project_2lc.CacheItem(self.cached_user_ids[1], set([900]))
    # Test that other project_ids and user_ids get returned by DB queries.
    first_hit, first_misses = self.user_to_project_2lc.GetAll(
        self.cnxn, self.cached_user_ids + self.from_db_user_ids)

    self.project_service.user2project_tbl.Select.assert_called_once_with(
        self.cnxn, cols=['project_id', 'user_id'])

    self.assertEqual(
        first_hit, {
            100: set([900, 901]),
            101: set([900]),
            102: set([902, 903]),
            103: set([902]),
        })
    self.assertEqual([], first_misses)

  def testGetAllRateLimit(self):
    test_now = time.time()
    # Initial request that queries table.
    self.user_to_project_2lc._GetCurrentTime = mock.Mock(
        return_value=test_now + 60)
    self.user_to_project_2lc.GetAll(
        self.cnxn, self.cached_user_ids + self.from_db_user_ids)

    # Request a user with no projects right after the last request.
    self.user_to_project_2lc._GetCurrentTime = mock.Mock(
        return_value=test_now + 61)
    second_hit, second_misses = self.user_to_project_2lc.GetAll(
        self.cnxn, [104])

    # Request one more user without project that should make a DB request
    # because the required rate limit time has passed.
    self.user_to_project_2lc._GetCurrentTime = mock.Mock(
        return_value=test_now + 121)
    third_hit, third_misses = self.user_to_project_2lc.GetAll(self.cnxn, [105])

    # Queried only twice because the second request was rate limited.
    self.assertEqual(self.project_service.user2project_tbl.Select.call_count, 2)

    # Rate limited response will not return the full table.
    self.assertEqual(second_hit, {
        104: set([]),
    })
    self.assertEqual([], second_misses)
    self.assertEqual(
        third_hit, {
            100: set([900, 901]),
            101: set([900]),
            102: set([902, 903]),
            103: set([902]),
            105: set([]),
        })
    self.assertEqual([], third_misses)


class ProjectServiceTest(unittest.TestCase):

  def setUp(self):
    self.testbed = testbed.Testbed()
    self.testbed.activate()
    self.testbed.init_memcache_stub()

    self.mox = mox.Mox()
    self.cnxn = self.mox.CreateMock(sql.MonorailConnection)
    self.cache_manager = fake.CacheManager()
    self.config_service = self.mox.CreateMock(config_svc.ConfigService)
    self.project_service = MakeProjectService(self.cache_manager, self.mox)

    self.proj1 = fake.Project(project_name='proj1', project_id=123)
    self.proj2 = fake.Project(project_name='proj2', project_id=234)

  def tearDown(self):
    self.testbed.deactivate()
    self.mox.UnsetStubs()
    self.mox.ResetAll()

  def SetUpCreateProject(self):
    # Check for existing project: there should be none.
    self.project_service.project_tbl.Select(
        self.cnxn, cols=['project_name', 'project_id'],
        project_name=['proj1']).AndReturn([])

    # Inserting the project gives the project ID.
    self.project_service.project_tbl.InsertRow(
        self.cnxn, project_name='proj1',
        summary='Test project summary', description='Test project description',
        home_page=None, docs_url=None, source_url=None,
        logo_file_name=None, logo_gcs_id=None,
        state='LIVE', access='ANYONE').AndReturn(123)

    # Insert the users.  There are none.
    self.project_service.user2project_tbl.InsertRows(
        self.cnxn, ['project_id', 'user_id', 'role_name'], [])

  def testCreateProject(self):
    self.SetUpCreateProject()
    self.mox.ReplayAll()
    self.project_service.CreateProject(
        self.cnxn, 'proj1', owner_ids=[], committer_ids=[], contributor_ids=[],
        summary='Test project summary', description='Test project description')
    self.mox.VerifyAll()

  def SetUpLookupProjectIDs(self):
    self.project_service.project_tbl.Select(
        self.cnxn, cols=['project_name', 'project_id'],
        project_name=['proj2']).AndReturn([('proj2', 234)])

  def testLookupProjectIDs(self):
    self.SetUpLookupProjectIDs()
    self.project_service.project_names_to_ids.CacheItem('proj1', 123)
    self.mox.ReplayAll()
    id_dict = self.project_service.LookupProjectIDs(
        self.cnxn, ['proj1', 'proj2'])
    self.mox.VerifyAll()
    self.assertEqual({'proj1': 123, 'proj2': 234}, id_dict)

  def testLookupProjectNames(self):
    self.SetUpGetProjects()  # Same as testGetProjects()
    self.project_service.project_2lc.CacheItem(123, self.proj1)
    self.mox.ReplayAll()
    name_dict = self.project_service.LookupProjectNames(
        self.cnxn, [123, 234])
    self.mox.VerifyAll()
    self.assertEqual({123: 'proj1', 234: 'proj2'}, name_dict)

  def SetUpGetProjects(self, roles=None, extra_perms=None):
    project_rows = [
        (
            234, 'proj2', 'test proj 2', 'test project', 'live', 'anyone', '',
            '', None, '', 0, 50 * 1024 * 1024, NOW, NOW, None, True, False,
            False, None, None, None, None, None, None, False)
    ]
    self.project_service.project_tbl.Select(
        self.cnxn, cols=project_svc.PROJECT_COLS,
        project_id=[234]).AndReturn(project_rows)
    self.project_service.user2project_tbl.Select(
        self.cnxn, cols=['project_id', 'user_id', 'role_name'],
        project_id=[234]).AndReturn(roles or [])
    self.project_service.extraperm_tbl.Select(
        self.cnxn, cols=project_svc.EXTRAPERM_COLS,
        project_id=[234]).AndReturn(extra_perms or [])

  def testGetProjects(self):
    self.project_service.project_2lc.CacheItem(123, self.proj1)
    self.SetUpGetProjects()
    self.mox.ReplayAll()
    project_dict = self.project_service.GetProjects(
        self.cnxn, [123, 234])
    self.mox.VerifyAll()
    self.assertItemsEqual([123, 234], list(project_dict.keys()))
    self.assertEqual('proj1', project_dict[123].project_name)
    self.assertEqual('proj2', project_dict[234].project_name)

  def testGetProjects_ExtraPerms(self):
    self.SetUpGetProjects(extra_perms=[(234, 222, 'BarPerm'),
                                       (234, 111, 'FooPerm')])
    self.mox.ReplayAll()
    project_dict = self.project_service.GetProjects(self.cnxn, [234])
    self.mox.VerifyAll()
    self.assertItemsEqual([234], list(project_dict.keys()))
    self.assertEqual(
        [project_pb2.Project.ExtraPerms(
             member_id=111, perms=['FooPerm']),
         project_pb2.Project.ExtraPerms(
             member_id=222, perms=['BarPerm'])],
        project_dict[234].extra_perms)


  def testGetVisibleLiveProjects_AnyoneAccessWithUser(self):
    project_rows = [
        (
            234, 'proj2', 'test proj 2', 'test project', 'live', 'anyone', '',
            '', None, '', 0, 50 * 1024 * 1024, NOW, NOW, None, True, False,
            False, None, None, None, False)
    ]

    self.project_service.project_tbl.Select(
        self.cnxn, cols=['project_id'],
        state=project_pb2.ProjectState.LIVE).AndReturn(project_rows)
    self.SetUpGetProjects()
    self.mox.ReplayAll()
    user_a = user_pb2.User(email='a@example.com')
    project_ids = self.project_service.GetVisibleLiveProjects(
        self.cnxn, user_a, set([111]))

    self.mox.VerifyAll()
    self.assertItemsEqual([234], project_ids)

  def testGetVisibleLiveProjects_AnyoneAccessWithAnon(self):
    project_rows = [
        (
            234, 'proj2', 'test proj 2', 'test project', 'live', 'anyone', '',
            '', None, '', 0, 50 * 1024 * 1024, NOW, NOW, None, True, False,
            False, None, None, None, None, None, None, False)
    ]

    self.project_service.project_tbl.Select(
        self.cnxn, cols=['project_id'],
        state=project_pb2.ProjectState.LIVE).AndReturn(project_rows)
    self.SetUpGetProjects()
    self.mox.ReplayAll()
    project_ids = self.project_service.GetVisibleLiveProjects(
        self.cnxn, None, None)

    self.mox.VerifyAll()
    self.assertItemsEqual([234], project_ids)

  def testGetVisibleLiveProjects_RestrictedAccessWithMember(self):
    project_rows = [
        (
            234, 'proj2', 'test proj 2', 'test project', 'live', 'members_only',
            '', '', None, '', 0, 50 * 1024 * 1024, NOW, NOW, None, True, False,
            False, False, None, None, None, None, None, None, False)
    ]
    self.proj2.access = project_pb2.ProjectAccess.MEMBERS_ONLY
    self.proj2.contributor_ids.append(111)
    self.project_service.project_2lc.CacheItem(234, self.proj2)

    self.project_service.project_tbl.Select(
        self.cnxn, cols=['project_id'],
        state=project_pb2.ProjectState.LIVE).AndReturn(project_rows)
    self.mox.ReplayAll()
    user_a = user_pb2.User(email='a@example.com')
    project_ids = self.project_service.GetVisibleLiveProjects(
        self.cnxn, user_a, set([111]))

    self.mox.VerifyAll()
    self.assertItemsEqual([234], project_ids)

  def testGetVisibleLiveProjects_RestrictedAccessWithNonMember(self):
    project_rows = [
        (
            234, 'proj2', 'test proj 2', 'test project', 'live', 'members_only',
            '', '', None, '', 0, 50 * 1024 * 1024, NOW, NOW, None, True, False,
            False, None, None, None, None, None, None, False)
    ]
    self.proj2.access = project_pb2.ProjectAccess.MEMBERS_ONLY
    self.project_service.project_2lc.CacheItem(234, self.proj2)

    self.project_service.project_tbl.Select(
        self.cnxn, cols=['project_id'],
        state=project_pb2.ProjectState.LIVE).AndReturn(project_rows)
    self.mox.ReplayAll()
    user_a = user_pb2.User(email='a@example.com')
    project_ids = self.project_service.GetVisibleLiveProjects(
        self.cnxn, user_a, set([111]))

    self.mox.VerifyAll()
    self.assertItemsEqual([], project_ids)

  def testGetVisibleLiveProjects_RestrictedAccessWithAnon(self):
    project_rows = [
        (
            234, 'proj2', 'test proj 2', 'test project', 'live', 'members_only',
            '', '', None, '', 0, 50 * 1024 * 1024, NOW, NOW, None, True, False,
            False, None, None, None, None, None, None, False)
    ]
    self.proj2.access = project_pb2.ProjectAccess.MEMBERS_ONLY
    self.project_service.project_2lc.CacheItem(234, self.proj2)

    self.project_service.project_tbl.Select(
        self.cnxn, cols=['project_id'],
        state=project_pb2.ProjectState.LIVE).AndReturn(project_rows)
    self.mox.ReplayAll()
    project_ids = self.project_service.GetVisibleLiveProjects(
        self.cnxn, None, None)

    self.mox.VerifyAll()
    self.assertItemsEqual([], project_ids)

  def testGetVisibleLiveProjects_RestrictedAccessWithSiteAdmin(self):
    project_rows = [
        (
            234, 'proj2', 'test proj 2', 'test project', 'live', 'members_only',
            '', '', None, '', 0, 50 * 1024 * 1024, NOW, NOW, None, True, False,
            False, None, None, None, None, None, None, False)
    ]
    self.proj2.access = project_pb2.ProjectAccess.MEMBERS_ONLY
    self.project_service.project_2lc.CacheItem(234, self.proj2)

    self.project_service.project_tbl.Select(
        self.cnxn, cols=['project_id'],
        state=project_pb2.ProjectState.LIVE).AndReturn(project_rows)
    self.mox.ReplayAll()
    user_a = user_pb2.User(email='a@example.com')
    user_a.is_site_admin = True
    project_ids = self.project_service.GetVisibleLiveProjects(
        self.cnxn, user_a, set([111]))

    self.mox.VerifyAll()
    self.assertItemsEqual([234], project_ids)

  def testGetVisibleLiveProjects_ArchivedProject(self):
    project_rows = [
        (
            234, 'proj2', 'test proj 2', 'test project', 'archived', 'anyone',
            '', '', None, '', 0, 50 * 1024 * 1024, NOW, NOW, None, True, False,
            False, None, None, None, None, None, None, False)
    ]
    self.proj2.state = project_pb2.ProjectState.ARCHIVED
    self.project_service.project_2lc.CacheItem(234, self.proj2)

    self.project_service.project_tbl.Select(
        self.cnxn, cols=['project_id'],
        state=project_pb2.ProjectState.LIVE).AndReturn(project_rows)
    self.mox.ReplayAll()
    user_a = user_pb2.User(email='a@example.com')
    project_ids = self.project_service.GetVisibleLiveProjects(
        self.cnxn, user_a, set([111]))

    self.mox.VerifyAll()
    self.assertItemsEqual([], project_ids)

  def testGetProjectsByName(self):
    self.project_service.project_names_to_ids.CacheItem('proj1', 123)
    self.project_service.project_2lc.CacheItem(123, self.proj1)
    self.SetUpLookupProjectIDs()
    self.SetUpGetProjects()
    self.mox.ReplayAll()
    project_dict = self.project_service.GetProjectsByName(
        self.cnxn, ['proj1', 'proj2'])
    self.mox.VerifyAll()
    self.assertItemsEqual(['proj1', 'proj2'], list(project_dict.keys()))
    self.assertEqual(123, project_dict['proj1'].project_id)
    self.assertEqual(234, project_dict['proj2'].project_id)

  def SetUpExpungeProject(self):
    self.project_service.user2project_tbl.Delete(
        self.cnxn, project_id=234)
    self.project_service.usergroupprojects_tbl.Delete(
        self.cnxn, project_id=234)
    self.project_service.extraperm_tbl.Delete(
        self.cnxn, project_id=234)
    self.project_service.membernotes_tbl.Delete(
        self.cnxn, project_id=234)
    self.project_service.acexclusion_tbl.Delete(
        self.cnxn, project_id=234)
    self.project_service.project_tbl.Delete(
        self.cnxn, project_id=234)

  def testExpungeProject(self):
    self.SetUpExpungeProject()
    self.mox.ReplayAll()
    self.project_service.ExpungeProject(self.cnxn, 234)
    self.mox.VerifyAll()

  def SetUpUpdateProject(self, project_id, delta):
    self.project_service.project_tbl.SelectValue(
        self.cnxn, 'project_name', project_id=project_id).AndReturn('projN')
    self.project_service.project_tbl.Update(
        self.cnxn, delta, project_id=project_id, commit=False)
    self.cnxn.Commit()

  def testUpdateProject(self):
    delta = {'summary': 'An even better one-line summary'}
    self.SetUpUpdateProject(234, delta)
    self.mox.ReplayAll()
    self.project_service.UpdateProject(
        self.cnxn, 234, summary='An even better one-line summary')
    self.mox.VerifyAll()

  def testUpdateProject_NotifyAlwaysDetailed(self):
    delta = {'issue_notify_always_detailed': True}
    self.SetUpUpdateProject(234, delta)
    self.mox.ReplayAll()
    self.project_service.UpdateProject(
        self.cnxn, 234, issue_notify_always_detailed=True)
    self.mox.VerifyAll()

  def SetUpUpdateProjectRoles(
      self, project_id, owner_ids, committer_ids, contributor_ids):
    self.project_service.project_tbl.SelectValue(
        self.cnxn, 'project_name', project_id=project_id).AndReturn('projN')
    self.project_service.project_tbl.Update(
        self.cnxn, {'cached_content_timestamp': NOW}, project_id=project_id,
        commit=False)

    self.project_service.user2project_tbl.Delete(
        self.cnxn, project_id=project_id, role_name='owner', commit=False)
    self.project_service.user2project_tbl.Delete(
        self.cnxn, project_id=project_id, role_name='committer', commit=False)
    self.project_service.user2project_tbl.Delete(
        self.cnxn, project_id=project_id, role_name='contributor',
        commit=False)

    self.project_service.user2project_tbl.InsertRows(
        self.cnxn, ['project_id', 'user_id', 'role_name'],
        [(project_id, user_id, 'owner') for user_id in owner_ids],
        commit=False)
    self.project_service.user2project_tbl.InsertRows(
        self.cnxn, ['project_id', 'user_id', 'role_name'],
        [(project_id, user_id, 'committer') for user_id in committer_ids],
        commit=False)
    self.project_service.user2project_tbl.InsertRows(
        self.cnxn, ['project_id', 'user_id', 'role_name'],
        [(project_id, user_id, 'contributor') for user_id in contributor_ids],
        commit=False)

    self.cnxn.Commit()

  def testUpdateProjectRoles(self):
    self.SetUpUpdateProjectRoles(234, [111, 222], [333], [])
    self.mox.ReplayAll()
    self.project_service.UpdateProjectRoles(
        self.cnxn, 234, [111, 222], [333], [], now=NOW)
    self.mox.VerifyAll()

  def SetUpMarkProjectDeletable(self):
    delta = {
        'project_name': 'DELETABLE_123',
        'state': 'deletable',
        }
    self.project_service.project_tbl.Update(self.cnxn, delta, project_id=123)
    self.config_service.InvalidateMemcacheForEntireProject(123)

  def testMarkProjectDeletable(self):
    self.SetUpMarkProjectDeletable()
    self.mox.ReplayAll()
    self.project_service.MarkProjectDeletable(
        self.cnxn, 123, self.config_service)
    self.mox.VerifyAll()

  def testUpdateRecentActivity_SignificantlyLaterActivity(self):
    activity_time = NOW + framework_constants.SECS_PER_HOUR * 3
    delta = {'recent_activity_timestamp': activity_time}
    self.SetUpGetProjects()
    self.SetUpUpdateProject(234, delta)
    self.mox.ReplayAll()
    self.project_service.UpdateRecentActivity(self.cnxn, 234, now=activity_time)
    self.mox.VerifyAll()

  def testUpdateRecentActivity_NotSignificant(self):
    activity_time = NOW + 123
    self.SetUpGetProjects()
    # ProjectUpdate is not called.
    self.mox.ReplayAll()
    self.project_service.UpdateRecentActivity(self.cnxn, 234, now=activity_time)
    self.mox.VerifyAll()

  def SetUpGetUserRolesInAllProjects(self):
    rows = [
        (123, 'committer'),
        (234, 'owner'),
        ]
    self.project_service.user2project_tbl.Select(
        self.cnxn, cols=['project_id', 'role_name'],
        user_id={111, 888}).AndReturn(rows)

  def testGetUserRolesInAllProjects(self):
    self.SetUpGetUserRolesInAllProjects()
    self.mox.ReplayAll()
    actual = self.project_service.GetUserRolesInAllProjects(
        self.cnxn, {111, 888})
    owned_project_ids, membered_project_ids, contrib_project_ids = actual
    self.mox.VerifyAll()
    self.assertItemsEqual([234], owned_project_ids)
    self.assertItemsEqual([123], membered_project_ids)
    self.assertItemsEqual([], contrib_project_ids)

  def testGetUserRolesInAllProjectsWithoutEffectiveIds(self):
    self.mox.ReplayAll()
    actual = self.project_service.GetUserRolesInAllProjects(self.cnxn, {})
    owned_project_ids, membered_project_ids, contrib_project_ids = actual
    self.mox.VerifyAll()
    self.assertItemsEqual([], owned_project_ids)
    self.assertItemsEqual([], membered_project_ids)
    self.assertItemsEqual([], contrib_project_ids)

  def SetUpUpdateExtraPerms(self):
    self.project_service.extraperm_tbl.Delete(
        self.cnxn, project_id=234, user_id=111, commit=False)
    self.project_service.extraperm_tbl.InsertRows(
        self.cnxn, project_svc.EXTRAPERM_COLS,
        [(234, 111, 'SecurityTeam')], commit=False)
    self.project_service.project_tbl.Update(
        self.cnxn, {'cached_content_timestamp': NOW},
        project_id=234, commit=False)
    self.cnxn.Commit()

  def testUpdateExtraPerms(self):
    self.SetUpGetProjects(roles=[(234, 111, 'owner')])
    self.SetUpUpdateExtraPerms()
    self.mox.ReplayAll()
    self.project_service.UpdateExtraPerms(
        self.cnxn, 234, 111, ['SecurityTeam'], now=NOW)
    self.mox.VerifyAll()

  def testExpungeUsersInProjects(self):
    self.project_service.extraperm_tbl.Delete = mock.Mock()
    self.project_service.acexclusion_tbl.Delete = mock.Mock()
    self.project_service.membernotes_tbl.Delete = mock.Mock()
    self.project_service.user2project_tbl.Delete = mock.Mock()

    user_ids = [111, 222]
    limit= 16
    self.project_service.ExpungeUsersInProjects(
        self.cnxn, user_ids, limit=limit)

    call = [mock.call(self.cnxn, user_id=user_ids, limit=limit, commit=False)]
    self.project_service.extraperm_tbl.Delete.assert_has_calls(call)
    self.project_service.acexclusion_tbl.Delete.assert_has_calls(call)
    self.project_service.membernotes_tbl.Delete.assert_has_calls(call)
    self.project_service.user2project_tbl.Delete.assert_has_calls(call)
