# 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 tests for issuelistcsv module."""
from __future__ import print_function
from __future__ import division
from __future__ import absolute_import

import six
import unittest

from google.appengine.ext import testbed

import flask

from framework import permissions
from framework import sorting
from framework import xsrf
from services import service_manager
from testing import fake
from testing import testing_helpers
from features import hotlistissuescsv


class HotlistIssuesCsvTest(unittest.TestCase):

  def setUp(self):
    self.testbed = testbed.Testbed()
    self.testbed.activate()
    self.testbed.init_memcache_stub()
    self.testbed.init_datastore_v3_stub()
    self.services = service_manager.Services(
        issue_star=fake.IssueStarService(),
        config=fake.ConfigService(),
        user=fake.UserService(),
        issue=fake.IssueService(),
        project=fake.ProjectService(),
        cache_manager=fake.CacheManager(),
        features=fake.FeaturesService())
    self.servlet = hotlistissuescsv.HotlistIssuesCsv(services=self.services)
    self.servlet.response = flask.Response()
    self.user1 = self.services.user.TestAddUser('testuser@gmail.com', 111)
    self.user2 = self.services.user.TestAddUser('testuser2@gmail.com', 222)
    self.services.project.TestAddProject('project-name', project_id=1)
    self.issue1 = fake.MakeTestIssue(
        1, 1, 'issue_summary', 'New', 111, project_name='project-name')
    self.services.issue.TestAddIssue(self.issue1)
    self.issues = [self.issue1]
    self.hotlist_item_fields = [
        (issue.issue_id, rank, 111, 1205079300, '') for
        rank, issue in enumerate(self.issues)]
    self.hotlist = self.services.features.TestAddHotlist(
        'MyHotlist', hotlist_id=123, owner_ids=[222], editor_ids=[111],
        hotlist_item_fields=self.hotlist_item_fields)
    self._MakeMR('/u/222/hotlists/MyHotlist')
    sorting.InitializeArtValues(self.services)

  def _MakeMR(self, path):
    self.mr = testing_helpers.MakeMonorailRequest(
        hotlist=self.hotlist, path=path, services=self.services)
    self.mr.hotlist_id = self.hotlist.hotlist_id
    self.mr.hotlist = self.hotlist

  def testGatherPageData_AnonUsers(self):
    """Anonymous users cannot download the issue list."""
    self.mr.auth.user_id = 0
    self.assertRaises(permissions.PermissionException,
                      self.servlet.GatherPageData, self.mr)

  def testGatherPageData_NoXSRF(self):
    """Users need a valid XSRF token to download the issue list."""
    # Note no token query-string parameter is set.
    self.mr.auth.user_id = self.user2.user_id
    self.assertRaises(xsrf.TokenIncorrect,
                      self.servlet.GatherPageData, self.mr)

  def testGatherPageData_BadXSRF(self):
    """Users need a valid XSRF token to download the issue list."""
    for path in ('/u/222/hotlists/MyHotlist',
                 '/u/testuser2@gmail.com/hotlists/MyHotlist'):
      token = 'bad'
      self._MakeMR(path + '?token=%s' % six.ensure_str(token))
      self.mr.auth.user_id = self.user2.user_id
      self.assertRaises(xsrf.TokenIncorrect,
                        self.servlet.GatherPageData, self.mr)

  def testGatherPageData_Normal(self):
    """Users can get the hotlist issue list."""
    for path in ('/u/222/hotlists/MyHotlist',
                 '/u/testuser2@gmail.com/hotlists/MyHotlist'):
      form_token_path = self.servlet._FormHandlerURL(path)
      token = xsrf.GenerateToken(self.user1.user_id, form_token_path)
      self._MakeMR(path + '?token=%s' % six.ensure_str(token))
      self.mr.auth.email = self.user1.email
      self.mr.auth.user_id = self.user1.user_id
      self.servlet.GatherPageData(self.mr)
