# 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.

"""Unittests for the issueimport servlet."""
from __future__ import print_function
from __future__ import division
from __future__ import absolute_import

import unittest

from framework import permissions
from services import service_manager
from testing import testing_helpers
from tracker import issueimport
from mrproto import tracker_pb2


class IssueExportTest(unittest.TestCase):

  def setUp(self):
    self.services = service_manager.Services()
    self.servlet = issueimport.IssueImport(services=self.services)
    self.event_log = None

  def testAssertBasePermission(self):
    """Only site admins can import issues."""
    mr = testing_helpers.MakeMonorailRequest(
        perms=permissions.OWNER_ACTIVE_PERMISSIONSET)
    self.assertRaises(permissions.PermissionException,
                      self.servlet.AssertBasePermission, mr)
    mr.auth.user_pb.is_site_admin = True
    self.servlet.AssertBasePermission(mr)

  def testParseComment(self):
    """Test a Comment JSON is correctly parsed."""
    users_id_dict = {'adam@test.com': 111}
    config = {
        'component_defs': [{
            'path': 'comp1',
            'component_id': 1,
        }],
    }
    json = {
        'timestamp': 123,
        'commenter': 'adam@test.com',
        'content': 'so basically, what I was thinkig of',
        'amendments': [],
        'attachments': [],
        'description_num': None,
        }
    comment = self.servlet._ParseComment(
        12,
        users_id_dict,
        json,
        self.event_log,
        config,
    )
    self.assertEqual(
        comment, tracker_pb2.IssueComment(
            project_id=12, timestamp=123, user_id=111,
            content='so basically, what I was thinkig of'))

    json_desc = {
        'timestamp': 223,
        'commenter': 'adam@test.com',
        'content': 'I cant believe youve done this',
        'description_num': '2',
        'amendments': [],
        'attachments': [],
    }
    desc_comment = self.servlet._ParseComment(
        12, users_id_dict, json_desc, self.event_log, config)
    self.assertEqual(
        desc_comment, tracker_pb2.IssueComment(
            project_id=12, timestamp=223, user_id=111,
            content='I cant believe youve done this',
            is_description=True))
