try:
    from unittest import mock
except ImportError:
    # Python versions older than 3.3 don't have mock by default
    import mock

from nose2.tests._common import TestCase, RedirectStdStreams
from nose2 import collector
from textwrap import dedent
import re


class TestCollector(TestCase):
    _RUN_IN_TEMP = True
    tags = ['unit']

    def test_collector_completes_with_no_tests(self):
        with open("unittest.cfg", "w") as ut_file:
            ut_file.write(dedent("""
                [unittest]
                quiet = true
            """))
        test = collector.collector()
        with RedirectStdStreams() as redir:
            self.assertRaises(SystemExit, test.run, None)
        self.assertEqual("", redir.stdout.getvalue())
        self.assertTrue(re.match(r'\n-+\nRan 0 tests in \d.\d\d\ds\n\nOK\n',
                                 redir.stderr.getvalue()))

    def test_collector_sets_testLoader_in_session(self):
        """
        session.testLoader needs to be set so that plugins that use this
        field (like Layers) dont break.
        """
        test = collector.collector()
        mock_session = mock.MagicMock()
        mock_loader = mock.MagicMock()
        mock_runner = mock.MagicMock()
        test._get_objects = mock.Mock(return_value=(mock_session,
                                                    mock_loader,
                                                    mock_runner))
        test._collector(None)
        self.assertTrue(mock_session.testLoader is mock_loader)