# Copyright 2020 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Tests for converting permission strings to API permissions enums."""

from __future__ import print_function
from __future__ import division
from __future__ import absolute_import

import unittest

from api.v3 import permission_converters as pc
from api.v3.api_proto import permission_objects_pb2
from framework import exceptions
from framework import permissions


class ConverterFunctionsTest(unittest.TestCase):

  def testConvertHotlistPermissions(self):
    api_perms = pc.ConvertHotlistPermissions(
        [permissions.ADMINISTER_HOTLIST, permissions.EDIT_HOTLIST])
    expected_perms = [
        permission_objects_pb2.Permission.Value('HOTLIST_ADMINISTER'),
        permission_objects_pb2.Permission.Value('HOTLIST_EDIT')
    ]
    self.assertEqual(api_perms, expected_perms)

  def testConvertHotlistPermissions_InvalidPermission(self):
    with self.assertRaises(exceptions.InputException):
      pc.ConvertHotlistPermissions(['EatHotlist'])

  def testConvertFieldDefPermissions(self):
    api_perms = pc.ConvertFieldDefPermissions(
        [permissions.EDIT_FIELD_DEF_VALUE, permissions.EDIT_FIELD_DEF])
    expected_perms = [
        permission_objects_pb2.Permission.Value('FIELD_DEF_VALUE_EDIT'),
        permission_objects_pb2.Permission.Value('FIELD_DEF_EDIT')
    ]
    self.assertEqual(api_perms, expected_perms)

  def testConvertFieldDefPermissions_InvalidPermission(self):
    with self.assertRaises(exceptions.InputException):
      pc.ConvertFieldDefPermissions(['EatFieldDef'])
