Home | History | Annotate | Download | only in test
      1 from cStringIO import StringIO
      2 
      3 import os
      4 import sys
      5 import unittest
      6 import unittest.test
      7 
      8 
      9 class Test_TestProgram(unittest.TestCase):
     10 
     11     def test_discovery_from_dotted_path(self):
     12         loader = unittest.TestLoader()
     13 
     14         tests = [self]
     15         expectedPath = os.path.abspath(os.path.dirname(unittest.test.__file__))
     16 
     17         self.wasRun = False
     18         def _find_tests(start_dir, pattern):
     19             self.wasRun = True
     20             self.assertEqual(start_dir, expectedPath)
     21             return tests
     22         loader._find_tests = _find_tests
     23         suite = loader.discover('unittest.test')
     24         self.assertTrue(self.wasRun)
     25         self.assertEqual(suite._tests, tests)
     26 
     27     # Horrible white box test
     28     def testNoExit(self):
     29         result = object()
     30         test = object()
     31 
     32         class FakeRunner(object):
     33             def run(self, test):
     34                 self.test = test
     35                 return result
     36 
     37         runner = FakeRunner()
     38 
     39         oldParseArgs = unittest.TestProgram.parseArgs
     40         def restoreParseArgs():
     41             unittest.TestProgram.parseArgs = oldParseArgs
     42         unittest.TestProgram.parseArgs = lambda *args: None
     43         self.addCleanup(restoreParseArgs)
     44 
     45         def removeTest():
     46             del unittest.TestProgram.test
     47         unittest.TestProgram.test = test
     48         self.addCleanup(removeTest)
     49 
     50         program = unittest.TestProgram(testRunner=runner, exit=False, verbosity=2)
     51 
     52         self.assertEqual(program.result, result)
     53         self.assertEqual(runner.test, test)
     54         self.assertEqual(program.verbosity, 2)
     55 
     56     class FooBar(unittest.TestCase):
     57         def testPass(self):
     58             assert True
     59         def testFail(self):
     60             assert False
     61 
     62     class FooBarLoader(unittest.TestLoader):
     63         """Test loader that returns a suite containing FooBar."""
     64         def loadTestsFromModule(self, module):
     65             return self.suiteClass(
     66                 [self.loadTestsFromTestCase(Test_TestProgram.FooBar)])
     67 
     68 
     69     def test_NonExit(self):
     70         program = unittest.main(exit=False,
     71                                 argv=["foobar"],
     72                                 testRunner=unittest.TextTestRunner(stream=StringIO()),
     73                                 testLoader=self.FooBarLoader())
     74         self.assertTrue(hasattr(program, 'result'))
     75 
     76 
     77     def test_Exit(self):
     78         self.assertRaises(
     79             SystemExit,
     80             unittest.main,
     81             argv=["foobar"],
     82             testRunner=unittest.TextTestRunner(stream=StringIO()),
     83             exit=True,
     84             testLoader=self.FooBarLoader())
     85 
     86 
     87     def test_ExitAsDefault(self):
     88         self.assertRaises(
     89             SystemExit,
     90             unittest.main,
     91             argv=["foobar"],
     92             testRunner=unittest.TextTestRunner(stream=StringIO()),
     93             testLoader=self.FooBarLoader())
     94 
     95 
     96 class InitialisableProgram(unittest.TestProgram):
     97     exit = False
     98     result = None
     99     verbosity = 1
    100     defaultTest = None
    101     testRunner = None
    102     testLoader = unittest.defaultTestLoader
    103     progName = 'test'
    104     test = 'test'
    105     def __init__(self, *args):
    106         pass
    107 
    108 RESULT = object()
    109 
    110 class FakeRunner(object):
    111     initArgs = None
    112     test = None
    113     raiseError = False
    114 
    115     def __init__(self, **kwargs):
    116         FakeRunner.initArgs = kwargs
    117         if FakeRunner.raiseError:
    118             FakeRunner.raiseError = False
    119             raise TypeError
    120 
    121     def run(self, test):
    122         FakeRunner.test = test
    123         return RESULT
    124 
    125 class TestCommandLineArgs(unittest.TestCase):
    126 
    127     def setUp(self):
    128         self.program = InitialisableProgram()
    129         self.program.createTests = lambda: None
    130         FakeRunner.initArgs = None
    131         FakeRunner.test = None
    132         FakeRunner.raiseError = False
    133 
    134     def testHelpAndUnknown(self):
    135         program = self.program
    136         def usageExit(msg=None):
    137             program.msg = msg
    138             program.exit = True
    139         program.usageExit = usageExit
    140 
    141         for opt in '-h', '-H', '--help':
    142             program.exit = False
    143             program.parseArgs([None, opt])
    144             self.assertTrue(program.exit)
    145             self.assertIsNone(program.msg)
    146 
    147         program.parseArgs([None, '-$'])
    148         self.assertTrue(program.exit)
    149         self.assertIsNotNone(program.msg)
    150 
    151     def testVerbosity(self):
    152         program = self.program
    153 
    154         for opt in '-q', '--quiet':
    155             program.verbosity = 1
    156             program.parseArgs([None, opt])
    157             self.assertEqual(program.verbosity, 0)
    158 
    159         for opt in '-v', '--verbose':
    160             program.verbosity = 1
    161             program.parseArgs([None, opt])
    162             self.assertEqual(program.verbosity, 2)
    163 
    164     def testBufferCatchFailfast(self):
    165         program = self.program
    166         for arg, attr in (('buffer', 'buffer'), ('failfast', 'failfast'),
    167                       ('catch', 'catchbreak')):
    168             if attr == 'catch' and not hasInstallHandler:
    169                 continue
    170 
    171             short_opt = '-%s' % arg[0]
    172             long_opt = '--%s' % arg
    173             for opt in short_opt, long_opt:
    174                 setattr(program, attr, None)
    175 
    176                 program.parseArgs([None, opt])
    177                 self.assertTrue(getattr(program, attr))
    178 
    179             for opt in short_opt, long_opt:
    180                 not_none = object()
    181                 setattr(program, attr, not_none)
    182 
    183                 program.parseArgs([None, opt])
    184                 self.assertEqual(getattr(program, attr), not_none)
    185 
    186     def testRunTestsRunnerClass(self):
    187         program = self.program
    188 
    189         program.testRunner = FakeRunner
    190         program.verbosity = 'verbosity'
    191         program.failfast = 'failfast'
    192         program.buffer = 'buffer'
    193 
    194         program.runTests()
    195 
    196         self.assertEqual(FakeRunner.initArgs, {'verbosity': 'verbosity',
    197                                                 'failfast': 'failfast',
    198                                                 'buffer': 'buffer'})
    199         self.assertEqual(FakeRunner.test, 'test')
    200         self.assertIs(program.result, RESULT)
    201 
    202     def testRunTestsRunnerInstance(self):
    203         program = self.program
    204 
    205         program.testRunner = FakeRunner()
    206         FakeRunner.initArgs = None
    207 
    208         program.runTests()
    209 
    210         # A new FakeRunner should not have been instantiated
    211         self.assertIsNone(FakeRunner.initArgs)
    212 
    213         self.assertEqual(FakeRunner.test, 'test')
    214         self.assertIs(program.result, RESULT)
    215 
    216     def testRunTestsOldRunnerClass(self):
    217         program = self.program
    218 
    219         FakeRunner.raiseError = True
    220         program.testRunner = FakeRunner
    221         program.verbosity = 'verbosity'
    222         program.failfast = 'failfast'
    223         program.buffer = 'buffer'
    224         program.test = 'test'
    225 
    226         program.runTests()
    227 
    228         # If initializing raises a type error it should be retried
    229         # without the new keyword arguments
    230         self.assertEqual(FakeRunner.initArgs, {})
    231         self.assertEqual(FakeRunner.test, 'test')
    232         self.assertIs(program.result, RESULT)
    233 
    234     def testCatchBreakInstallsHandler(self):
    235         module = sys.modules['unittest.main']
    236         original = module.installHandler
    237         def restore():
    238             module.installHandler = original
    239         self.addCleanup(restore)
    240 
    241         self.installed = False
    242         def fakeInstallHandler():
    243             self.installed = True
    244         module.installHandler = fakeInstallHandler
    245 
    246         program = self.program
    247         program.catchbreak = True
    248 
    249         program.testRunner = FakeRunner
    250 
    251         program.runTests()
    252         self.assertTrue(self.installed)
    253 
    254 
    255 if __name__ == '__main__':
    256     unittest.main()
    257