# Copyright 2016 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Unit test for User Group helpers."""
from __future__ import print_function
from __future__ import division
from __future__ import absolute_import

import unittest

from mrproto import user_pb2
from mrproto import usergroup_pb2
from sitewide import group_helpers


class GroupHelpersTest(unittest.TestCase):

  def testGroupVisibilityView(self):
    gvv_anyone = group_helpers.GroupVisibilityView(
        usergroup_pb2.MemberVisibility.ANYONE)
    gvv_members = group_helpers.GroupVisibilityView(
        usergroup_pb2.MemberVisibility.MEMBERS)
    gvv_owners = group_helpers.GroupVisibilityView(
        usergroup_pb2.MemberVisibility.OWNERS)
    self.assertEqual('Anyone on the Internet', gvv_anyone.name)
    self.assertEqual('Group Members', gvv_members.name)
    self.assertEqual('Group Owners', gvv_owners.name)

  def testGroupMemberView(self):
    user = user_pb2.MakeUser(1, email='test@example.com')
    gmv = group_helpers.GroupMemberView(user, 888, 'member')
    self.assertEqual(888, gmv.group_id)
    self.assertEqual('member', gmv.role)

  def testBuildUserGroupVisibilityOptions(self):
    vis_views = group_helpers.BuildUserGroupVisibilityOptions()
    self.assertEqual(3, len(vis_views))

  def testGroupTypeView(self):
    gt_cia = group_helpers.GroupTypeView(
        usergroup_pb2.GroupType.CHROME_INFRA_AUTH)
    gt_mdb = group_helpers.GroupTypeView(
        usergroup_pb2.GroupType.MDB)
    self.assertEqual('Chrome-infra-auth', gt_cia.name)
    self.assertEqual('MDB', gt_mdb.name)

  def testBuildUserGroupTypeOptions(self):
    group_types = group_helpers.BuildUserGroupTypeOptions()
    self.assertEqual(4, len(group_types))
