# 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

"""Tests for the testing_helpers module."""
from __future__ import print_function
from __future__ import division
from __future__ import absolute_import

import unittest

from testing import testing_helpers


class TestingHelpersTest(unittest.TestCase):

  def testMakeMonorailRequest(self):
    mr = testing_helpers.MakeMonorailRequest(
        path='/foo?key1=2&key2=&key3')

    self.assertEqual(None, mr.GetIntParam('foo'))
    self.assertEqual(2, mr.GetIntParam('key1'))
    self.assertEqual(None, mr.GetIntParam('key2'))
    self.assertEqual(None, mr.GetIntParam('key3'))
    self.assertEqual(3, mr.GetIntParam('key2', default_value=3))
    self.assertEqual(3, mr.GetIntParam('foo', default_value=3))

  def testGetRequestObjectsBasics(self):
    request, mr = testing_helpers.GetRequestObjects(
        path='/foo/bar/wee?sna=foo',
        params={'ya': 'hoo'}, method='POST')

    # supplied as part of the url
    self.assertEqual('foo', mr.GetParam('sna'))

    # supplied as a param
    self.assertEqual('hoo', mr.GetParam('ya'))

    # default Host header
    self.assertEqual('127.0.0.1', request.host)

  def testGetRequestObjectsHeaders(self):
    # with some headers
    request, _mr = testing_helpers.GetRequestObjects(
        headers={'Accept-Language': 'en', 'Host': 'pickledsheep.com'},
        path='/foo/bar/wee?sna=foo')

    # default Host header
    self.assertEqual('pickledsheep.com', request.host)

    # user specified headers
    self.assertEqual('en', request.headers['Accept-Language'])

  def testGetRequestObjectsUserInfo(self):
    user_id = '123'

    _request, mr = testing_helpers.GetRequestObjects(
        user_info={'user_id': user_id})

    self.assertEqual(user_id, mr.auth.user_id)


class BlankTest(unittest.TestCase):

  def testBlank(self):
    blank = testing_helpers.Blank(
        foo='foo',
        bar=123,
        inc=lambda x: x + 1)

    self.assertEqual('foo', blank.foo)
    self.assertEqual(123, blank.bar)
    self.assertEqual(5, blank.inc(4))
