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

import os
import sys
import imp
import tempfile
import unittest
import PRESUBMIT

sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(
    os.path.abspath(__file__))))))
from PRESUBMIT_test_mocks import MockInputApi, MockOutputApi
from PRESUBMIT_test_mocks import MockFile, MockChange

class HTMLActionAdditionTest(unittest.TestCase):

  def testActionXMLChanged(self):
    mock_input_api = MockInputApi()
    lines = ['<input id="testinput" pref="testpref"',
             'metric="validaction" type="checkbox" dialog-pref>']
    mock_input_api.files = [MockFile('path/valid.html', lines)]
    mock_input_api.change = MockChange(['path/valid.html','actions.xml'])
    action_xml_path = self._createActionXMLFile()
    self.assertEqual([], PRESUBMIT.CheckUserActionUpdate(mock_input_api,
                                                         MockOutputApi(),
                                                         action_xml_path))

  def testValidChange_StartOfLine(self):
    lines = ['<input id="testinput" pref="testpref"',
             'metric="validaction" type="checkbox" dialog-pref>']
    self.assertEqual([], self._testChange(lines))

  def testValidChange_StartsWithSpace(self):
    lines = ['<input id="testinput" pref="testpref"',
             '  metric="validaction" type="checkbox" dialog-pref>']
    self.assertEqual([], self._testChange(lines))

  def testValidChange_Radio(self):
    lines = ['<input id="testinput" pref="testpref"',
             '  metric="validaction" type="radio" dialog-pref value="true">']
    self.assertEqual([], self._testChange(lines))

  def testValidChange_UsingDatatype(self):
    lines = ['<input id="testinput" pref="testpref"',
             '  metric="validaction" datatype="boolean" dialog-pref>']
    self.assertEqual([], self._testChange(lines))

  def testValidChange_NotBoolean(self):
    lines = ['<input id="testinput" pref="testpref"',
             '  metric="notboolean_validaction" dialog-pref>']
    self.assertEqual([], self._testChange(lines))

  def testInvalidChange(self):
    lines = ['<input id="testinput" pref="testpref"',
             'metric="invalidaction" type="checkbox" dialog-pref>']
    warnings = self._testChange(lines)
    self.assertEqual(1, len(warnings), warnings)

  def testInValidChange_Radio(self):
    lines = ['<input id="testinput" pref="testpref"',
             '  metric="validaction" type="radio" dialog-pref value="string">']
    warnings = self._testChange(lines)
    self.assertEqual(1, len(warnings), warnings)

  def testValidChange_MultilineType(self):
    lines = ['<input id="testinput" pref="testpref"\n'
             ' metric="validaction" type=\n'
             ' "radio" dialog-pref value=\n'
             ' "false">']
    warnings = self._testChange(lines)
    self.assertEqual([], self._testChange(lines))

  def _testChange(self, lines):
    mock_input_api = MockInputApi()
    mock_input_api.files = [MockFile('path/test.html', lines)]

    action_xml_path = self._createActionXMLFile()
    return PRESUBMIT.CheckUserActionUpdate(mock_input_api,
                                           MockOutputApi(),
                                           action_xml_path)

  def _createActionXMLFile(self):
    content = ('<actions>'
        '<action name="validaction_Disable">'
        ' <owner>Please list the metric\'s owners.</owner>'
        ' <description>Enter the description of this user action.</description>'
        '</action>'
        '<action name="validaction_Enable">'
        ' <owner>Please list the metric\'s owners. </owner>'
        ' <description>Enter the description of this user action.</description>'
        '</action>'
        '<action name="notboolean_validaction">'
        ' <owner>Please list the metric\'s owners.</owner>'
        ' <description>Enter the description of this user action.</description>'
        '</action>'
        '</actions>')
    sys_temp = tempfile.gettempdir()
    action_xml_path = os.path.join(sys_temp, 'actions_test.xml')
    if not os.path.exists(action_xml_path):
      with open(action_xml_path, 'w+') as action_file:
        action_file.write(content)

    return action_xml_path


if __name__ == '__main__':
  unittest.main()
