# 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 features_pb2 functions."""

from __future__ import print_function
from __future__ import division
from __future__ import absolute_import

import unittest

from mrproto import features_pb2


class FeaturesPb2Test(unittest.TestCase):

  def testMakeHotlist_Defaults(self):
    hotlist = features_pb2.MakeHotlist('summer-issues')
    self.assertEqual('summer-issues', hotlist.name)
    self.assertEqual([], hotlist.items)

  def testMakeHotlist_Everything(self):
    ts = 20011111111111
    hotlist = features_pb2.MakeHotlist(
        'summer-issues', [(1000, 1, 444, ts, ''), (1001, 2, 333, ts, ''),
                          (1009, None, None, ts, '')],
        description='desc')
    self.assertEqual('summer-issues', hotlist.name)
    self.assertEqual(
        [features_pb2.MakeHotlistItem(
            1000, rank=1, adder_id=444, date_added=ts, note=''),
         features_pb2.MakeHotlistItem(
             1001, rank=2, adder_id=333, date_added=ts, note=''),
         features_pb2.MakeHotlistItem(1009, date_added=ts, note=''),
         ],
        hotlist.items)
    self.assertEqual('desc', hotlist.description)

  def testMakeHotlistItem(self):
    ts = 20011111111111
    item_1 = features_pb2.MakeHotlistItem(
        1000, rank=1, adder_id=111, date_added=ts, note='short note')
    self.assertEqual(1000, item_1.issue_id)
    self.assertEqual(1, item_1.rank)
    self.assertEqual(111, item_1.adder_id)
    self.assertEqual(ts, item_1.date_added)
    self.assertEqual('short note', item_1.note)

    item_2 = features_pb2.MakeHotlistItem(1001)
    self.assertEqual(1001, item_2.issue_id)
    self.assertEqual(None, item_2.rank)
    self.assertEqual(None, item_2.adder_id)
    self.assertEqual('', item_2.note)
    self.assertEqual(features_pb2.ADDED_TS_FEATURE_LAUNCH_TS, item_2.date_added)
