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

"""Tests for the user settings page."""
from __future__ import print_function
from __future__ import division
from __future__ import absolute_import

import six
import unittest

try:
  from mox3 import mox
except ImportError:
  import mox

from framework import framework_helpers
from framework import permissions
from framework import template_helpers
from mrproto import user_pb2
from services import service_manager
from sitewide import usersettings
from testing import fake
from testing import testing_helpers


class UserSettingsTest(unittest.TestCase):

  def setUp(self):
    self.mox = mox.Mox()
    self.services = service_manager.Services(user=fake.UserService())
    self.servlet = usersettings.UserSettings(services=self.services)

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

  def testAssertBasePermission(self):
    mr = testing_helpers.MakeMonorailRequest()
    mr.auth.user_id = 111

    # The following should return without exception.
    self.servlet.AssertBasePermission(mr)

    # No logged in user means anonymous access, should raise error.
    mr.auth.user_id = 0
    self.assertRaises(permissions.PermissionException,
                      self.servlet.AssertBasePermission, mr)

  def testGatherPageData(self):
    self.mox.StubOutWithMock(
        framework_helpers.UserSettings, 'GatherUnifiedSettingsPageData')
    framework_helpers.UserSettings.GatherUnifiedSettingsPageData(
        0, None, mox.IsA(user_pb2.User), mox.IsA(user_pb2.UserPrefs)
        ).AndReturn({'unified': None})
    self.mox.ReplayAll()

    mr = testing_helpers.MakeMonorailRequest()
    page_data = self.servlet.GatherPageData(mr)

    six.assertCountEqual(
        self, [
            'logged_in_user_pb', 'unified', 'user_tab_mode', 'viewed_user',
            'offer_saved_queries_subtab', 'viewing_self'
        ], list(page_data.keys()))
    self.assertEqual(template_helpers.PBProxy(mr.auth.user_pb),
                     page_data['logged_in_user_pb'])

    self.mox.VerifyAll()
