# Copyright (c) 2010-2011 testtools developers. See LICENSE for details. import unittest from extras import try_import from testtools import ( TestCase, content, content_type, ) from testtools.compat import _b, _u from testtools.testresult.doubles import ( ExtendedTestResult, ) fixtures = try_import('fixtures') LoggingFixture = try_import('fixtures.tests.helpers.LoggingFixture') class TestFixtureSupport(TestCase): def setUp(self): super(TestFixtureSupport, self).setUp() if fixtures is None or LoggingFixture is None: self.skipTest("Need fixtures") def test_useFixture(self): fixture = LoggingFixture() class SimpleTest(TestCase): def test_foo(self): self.useFixture(fixture) result = unittest.TestResult() SimpleTest('test_foo').run(result) self.assertTrue(result.wasSuccessful()) self.assertEqual(['setUp', 'cleanUp'], fixture.calls) def test_useFixture_cleanups_raise_caught(self): calls = [] def raiser(ignored): calls.append('called') raise Exception('foo') fixture = fixtures.FunctionFixture(lambda:None, raiser) class SimpleTest(TestCase): def test_foo(self): self.useFixture(fixture) result = unittest.TestResult() SimpleTest('test_foo').run(result) self.assertFalse(result.wasSuccessful()) self.assertEqual(['called'], calls) def test_useFixture_details_captured(self): class DetailsFixture(fixtures.Fixture): def setUp(self): fixtures.Fixture.setUp(self) self.addCleanup(delattr, self, 'content') self.content = [_b('content available until cleanUp')] self.addDetail('content', content.Content(content_type.UTF8_TEXT, self.get_content)) def get_content(self): return self.content fixture = DetailsFixture() class SimpleTest(TestCase): def test_foo(self): self.useFixture(fixture) # Add a colliding detail (both should show up) self.addDetail('content', content.Content(content_type.UTF8_TEXT, lambda:[_b('foo')])) result = ExtendedTestResult() SimpleTest('test_foo').run(result) self.assertEqual('addSuccess', result._events[-2][0]) details = result._events[-2][2] self.assertEqual(['content', 'content-1'], sorted(details.keys())) self.assertEqual('foo', details['content'].as_text()) self.assertEqual('content available until cleanUp', details['content-1'].as_text()) def test_useFixture_multiple_details_captured(self): class DetailsFixture(fixtures.Fixture): def setUp(self): fixtures.Fixture.setUp(self) self.addDetail('aaa', content.text_content("foo")) self.addDetail('bbb', content.text_content("bar")) fixture = DetailsFixture() class SimpleTest(TestCase): def test_foo(self): self.useFixture(fixture) result = ExtendedTestResult() SimpleTest('test_foo').run(result) self.assertEqual('addSuccess', result._events[-2][0]) details = result._events[-2][2] self.assertEqual(['aaa', 'bbb'], sorted(details)) self.assertEqual(_u('foo'), details['aaa'].as_text()) self.assertEqual(_u('bar'), details['bbb'].as_text()) def test_useFixture_details_captured_from_setUp(self): # Details added during fixture set-up are gathered even if setUp() # fails with an exception. class BrokenFixture(fixtures.Fixture): def setUp(self): fixtures.Fixture.setUp(self) self.addDetail('content', content.text_content("foobar")) raise Exception() fixture = BrokenFixture() class SimpleTest(TestCase): def test_foo(self): self.useFixture(fixture) result = ExtendedTestResult() SimpleTest('test_foo').run(result) self.assertEqual('addError', result._events[-2][0]) details = result._events[-2][2] self.assertEqual(['content', 'traceback'], sorted(details)) self.assertEqual('foobar', ''.join(details['content'].iter_text())) def test_suite(): from unittest import TestLoader return TestLoader().loadTestsFromName(__name__)