"""
Tests for paver quality tasks
"""
import unittest
from mock import patch

import pavelib.quality
from paver.easy import BuildFailure


class TestPaverJsHint(unittest.TestCase):
    """
    For testing run_jshint
    """

    def setUp(self):
        super(TestPaverJsHint, self).setUp()

        # Mock the paver @needs decorator
        self._mock_paver_needs = patch.object(pavelib.quality.run_jshint, 'needs').start()
        self._mock_paver_needs.return_value = 0

        # Mock shell commands
        patcher = patch('pavelib.quality.sh')
        self._mock_paver_sh = patcher.start()

        # Cleanup mocks
        self.addCleanup(patcher.stop)
        self.addCleanup(self._mock_paver_needs.stop)

    @patch.object(pavelib.quality, '_write_metric')
    @patch.object(pavelib.quality, '_prepare_report_dir')
    @patch.object(pavelib.quality, '_get_count_from_last_line')
    def test_jshint_violation_number_not_found(self, mock_count, mock_report_dir, mock_write_metric):  # pylint: disable=unused-argument
        """
        run_jshint encounters an error parsing the jshint output log
        """
        mock_count.return_value = None
        with self.assertRaises(BuildFailure):
            pavelib.quality.run_jshint("")

    @patch.object(pavelib.quality, '_write_metric')
    @patch.object(pavelib.quality, '_prepare_report_dir')
    @patch.object(pavelib.quality, '_get_count_from_last_line')
    def test_jshint_vanilla(self, mock_count, mock_report_dir, mock_write_metric):  # pylint: disable=unused-argument
        """
        jshint finds violations, but a limit was not set
        """
        mock_count.return_value = 1
        pavelib.quality.run_jshint("")