# 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

"""Unit tests for hotlistdetails page."""
from __future__ import print_function
from __future__ import division
from __future__ import absolute_import

import logging
import mox
import unittest
import mock

import ezt

from framework import permissions
from features import features_constants
from services import service_manager
from features import hotlistdetails
from proto import features_pb2
from testing import fake
from testing import testing_helpers

class HotlistDetailsTest(unittest.TestCase):
  """Unit tests for the HotlistDetails servlet class."""

  def setUp(self):
    self.user_service = fake.UserService()
    self.user_1 = self.user_service.TestAddUser('111@test.com', 111)
    self.user_2 = self.user_service.TestAddUser('user2@test.com', 222)
    services = service_manager.Services(
        features=fake.FeaturesService(), user=self.user_service)
    self.servlet = hotlistdetails.HotlistDetails(
        'req', 'res', services=services)
    self.hotlist = self.servlet.services.features.TestAddHotlist(
        'hotlist', summary='hotlist summary', description='hotlist description',
        owner_ids=[111], editor_ids=[222])
    self.request, self.mr = testing_helpers.GetRequestObjects(
        hotlist=self.hotlist)
    self.mr.auth.user_id = 111
    self.private_hotlist = services.features.TestAddHotlist(
        'private_hotlist', owner_ids=[111], editor_ids=[222], is_private=True)
    self.mox = mox.Mox()

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

  def testAssertBasePermission(self):
    # non-members cannot view private hotlists
    mr = testing_helpers.MakeMonorailRequest(
        hotlist=self.private_hotlist, perms=permissions.EMPTY_PERMISSIONSET)
    mr.auth.effective_ids = {333}
    self.assertRaises(permissions.PermissionException,
                      self.servlet.AssertBasePermission, mr)

    # members can view private hotlists
    mr = testing_helpers.MakeMonorailRequest(
        hotlist=self.private_hotlist)
    mr.auth.effective_ids = {222, 444}
    self.servlet.AssertBasePermission(mr)

    # non-members can view public hotlists
    mr = testing_helpers.MakeMonorailRequest(
        hotlist=self.hotlist)
    mr.auth.effective_ids = {333, 444}
    self.servlet.AssertBasePermission(mr)

    # members can view public hotlists
    mr = testing_helpers.MakeMonorailRequest(
        hotlist=self.hotlist)
    mr.auth.effective_ids = {111, 333}
    self.servlet.AssertBasePermission(mr)

  def testGatherPageData(self):
    self.mr.auth.effective_ids = [222]
    self.mr.perms = permissions.EMPTY_PERMISSIONSET
    page_data = self.servlet.GatherPageData(self.mr)
    self.assertEqual('hotlist summary', page_data['initial_summary'])
    self.assertEqual('hotlist description', page_data['initial_description'])
    self.assertEqual('hotlist', page_data['initial_name'])
    self.assertEqual(features_constants.DEFAULT_COL_SPEC,
                     page_data['initial_default_col_spec'])
    self.assertEqual(ezt.boolean(False), page_data['initial_is_private'])

    # editor is viewing, so cant_administer_hotlist is True
    self.assertEqual(ezt.boolean(True), page_data['cant_administer_hotlist'])

    # owner is veiwing, so cant_administer_hotlist is False
    self.mr.auth.effective_ids = [111]
    page_data = self.servlet.GatherPageData(self.mr)
    self.assertEqual(ezt.boolean(False), page_data['cant_administer_hotlist'])

  def testProcessFormData(self):
    mr = testing_helpers.MakeMonorailRequest(
        hotlist=self.hotlist,
        path='/u/111/hotlists/%s/details' % self.hotlist.hotlist_id,
        services=service_manager.Services(user=self.user_service),
        perms=permissions.EMPTY_PERMISSIONSET)
    mr.auth.effective_ids = {111}
    mr.auth.user_id = 111
    post_data = fake.PostData(
        name=['hotlist'],
        summary = ['hotlist summary'],
        description = ['hotlist description'],
        default_col_spec = ['test default col spec'])
    url = self.servlet.ProcessFormData(mr, post_data)
    self.assertTrue((
        '/u/111/hotlists/%d/details?saved=' % self.hotlist.hotlist_id) in url)

  @mock.patch('features.hotlist_helpers.RemoveHotlist')
  def testProcessFormData_DeleteHotlist(self, fake_rh):
    mr = testing_helpers.MakeMonorailRequest(
        hotlist=self.hotlist,
        path='/u/111/hotlists/%s/details' % self.hotlist.hotlist_id,
        services=service_manager.Services(user=self.user_service),
        perms=permissions.EMPTY_PERMISSIONSET)
    mr.auth.effective_ids = {self.user_1.user_id}
    mr.auth.user_id = self.user_1.user_id
    mr.auth.email = self.user_1.email

    post_data = fake.PostData(deletestate=['true'])
    url = self.servlet.ProcessFormData(mr, post_data)
    fake_rh.assert_called_once_with(
        mr.cnxn, mr.hotlist_id, self.servlet.services)
    self.assertTrue(('/u/%s/hotlists?saved=' % self.user_1.email) in url)

  def testProcessFormData_RejectTemplate(self):
    mr = testing_helpers.MakeMonorailRequest(
        hotlist=self.hotlist,
        path='/u/111/hotlists/%s/details' % self.hotlist.hotlist_id,
        services=service_manager.Services(user=self.user_service),
        perms=permissions.EMPTY_PERMISSIONSET)
    mr.auth.user_id = 111
    mr.auth.effective_ids = {111}
    post_data = fake.PostData(
        summary = [''],
        name = [''],
        description = ['fake description'],
        default_col_spec = ['test default col spec'])
    self.mox.StubOutWithMock(self.servlet, 'PleaseCorrect')
    self.servlet.PleaseCorrect(
        mr, initial_summary='',
        initial_description='fake description', initial_name = '',
        initial_default_col_spec = 'test default col spec')
    self.mox.ReplayAll()

    url = self.servlet.ProcessFormData(mr, post_data)
    self.mox.VerifyAll()
    self.assertEqual(hotlistdetails._MSG_NAME_MISSING, mr.errors.name)
    self.assertEqual(hotlistdetails._MSG_SUMMARY_MISSING,
                     mr.errors.summary)
    self.assertIsNone(url)

  def testProcessFormData_DuplicateName(self):
    self.servlet.services.features.TestAddHotlist(
        'FirstHotlist', summary='hotlist summary', description='description',
        owner_ids=[111], editor_ids=[])
    mr = testing_helpers.MakeMonorailRequest(
        hotlist=self.hotlist,
        path='/u/111/hotlists/%s/details' % (self.hotlist.hotlist_id),
        services=service_manager.Services(user=self.user_service),
        perms=permissions.EMPTY_PERMISSIONSET)
    mr.auth.user_id = 111
    mr.auth.effective_ids = {111}
    post_data = fake.PostData(
        summary = ['hotlist summary'],
        name = ['FirstHotlist'],
        description = ['description'],
        default_col_spec = ['test default col spec'])
    self.mox.StubOutWithMock(self.servlet, 'PleaseCorrect')
    self.servlet.PleaseCorrect(
        mr, initial_summary='hotlist summary',
        initial_description='description', initial_name = 'FirstHotlist',
        initial_default_col_spec = 'test default col spec')
    self.mox.ReplayAll()

    url = self.servlet.ProcessFormData(mr, post_data)
    self.mox.VerifyAll()
    self.assertEqual(hotlistdetails._MSG_HOTLIST_NAME_NOT_AVAIL,
                     mr.errors.name)
    self.assertIsNone(url)

  def testProcessFormData_Bad(self):
    mr = testing_helpers.MakeMonorailRequest(
        hotlist=self.hotlist,
        path='/u/111/hotlists/%s/details' % (self.hotlist.hotlist_id),
        services=service_manager.Services(user=self.user_service),
         perms=permissions.EMPTY_PERMISSIONSET)
    mr.auth.user_id = 111
    mr.auth.effective_ids = {111}
    post_data = fake.PostData(
        summary = ['hotlist summary'],
        name = ['2badName'],
        description = ['fake description'],
        default_col_spec = ['test default col spec'])
    self.mox.StubOutWithMock(self.servlet, 'PleaseCorrect')
    self.servlet.PleaseCorrect(
        mr, initial_summary='hotlist summary',
        initial_description='fake description', initial_name = '2badName',
        initial_default_col_spec = 'test default col spec')
    self.mox.ReplayAll()

    url = self.servlet.ProcessFormData(mr, post_data)
    self.mox.VerifyAll()
    self.assertEqual(hotlistdetails._MSG_INVALID_HOTLIST_NAME,
                     mr.errors.name)
    self.assertIsNone(url)

  def testProcessFormData_NoPermissions(self):
    mr = testing_helpers.MakeMonorailRequest(
        hotlist=self.hotlist,
        path='/u/111/hotlists/%s/details' % (self.hotlist.hotlist_id),
        services=service_manager.Services(user=self.user_service),
        perms=permissions.EMPTY_PERMISSIONSET)
    mr.auth.user_id = self.user_2.user_id
    mr.auth.effective_ids = {self.user_2.user_id}
    post_data = fake.PostData(
        summary = ['hotlist summary'],
        name = ['hotlist'],
        description = ['fake description'],
        default_col_spec = ['test default col spec'])
    with self.assertRaises(permissions.PermissionException):
      self.servlet.ProcessFormData(mr, post_data)
