예제 #1
0
 def test_attribute_requested_returns_true_if_tracking_and_requested(self):
     stub = EmptyFake()
     stub.thing = None
     spy = MasterSpy(stub, affect_only_functions=False)
     spy.thing
     assert spy.attribute_was_requested(
         "thing"), "Spy did not report that attribute was requested"
예제 #2
0
class TestMemoryLeakProtection(TestCase):
    def setUp(self):
        self.context = open_dependency_context()
        Evidence.subscriber_ran = False
        self.fake_log = MasterSpy(EmptyFake())
        self.context.inject(logging, self.fake_log)

    def tearDown(self):
        self.context.close()

    def test_bound_subscriber_gets_garbage_collected(self):
        # When the subscriber instantiates, it subscribes to an event
        # This causes the event broker to store a reference to the subscriber.
        # The test does not create a reference to the subscriber, so the broker
        # has the only reference.
        Subscriber()
        # Because the broker has the only reference, the subscriber should
        # be eligible for garbage collection.
        gc.collect()
        EventBroker.publish(event=EVENT)
        assert not Evidence.subscriber_ran, "Subscriber ran after it should have been garbage collected"

    def test_unbound_subscriber_gets_garbage_collected(self):
        def subscriber():
            Evidence.subscriber_ran = True

        EventBroker.subscribe(event=EVENT, func=subscriber)
        subscriber = None
        gc.collect()
        EventBroker.publish(event=EVENT)
        assert not Evidence.subscriber_ran, "Subscriber ran after it should have been garbage collected"

    def errors_logged(self):
        if self.fake_log.attribute_was_requested("error"):
            spy = self.fake_log.attribute_spies["error"]
            return [args[0] for args, kwargs in spy.call_history]

    def test_does_not_attempt_to_run_garbage_collected_subscriber(self):
        def subscriber():
            pass

        EventBroker.subscribe(event=EVENT, func=subscriber)
        subscriber = None
        gc.collect()
        EventBroker.publish(event=EVENT)
        assert not self.errors_logged(
        ), 'Unexpected errors in the log: "%s"' % (self.errors_logged())
예제 #3
0
 def test_attribute_requested_returns_false_if_tracking_and_not_req(self):
     stub = EmptyFake()
     stub.thing = None
     spy = MasterSpy(stub, affect_only_functions=False)
     assert not spy.attribute_was_requested('thing'), \
         'Spy reported that attribute was requested'
예제 #4
0
class TestQuitOnSuiteEnd(TestCase):
    def setUp(self):
        EventBroker.reset()
        self.context = open_dependency_context(supply_env=True)
        self.webdriver_spy = MasterSpy(EndlessFake())
        self.context.inject(webdriver, self.webdriver_spy)

    def tearDown(self):
        self.context.close()

    def quit_was_called(self):
        assert self.webdriver_spy.attribute_was_requested(
            USE_BROWSER), "%s was not invoked" % USE_BROWSER
        launcher_spy = self.webdriver_spy.attribute_spies[USE_BROWSER]
        expect(launcher_spy.return_value_spies).to(have_length(1))
        driver_spy = launcher_spy.return_value_spies[0]
        if "quit" in driver_spy.attribute_spies.keys():
            quit_spy = driver_spy.attribute_spies["quit"]
            return bool(quit_spy.return_value_spies)
        return False

    def test_quits_browser_on_suite_end(self):
        sut = Browser()
        sut  # silence a warning about an unused variable
        assert not self.quit_was_called(), "quit() was called prematurely"
        EventBroker.publish(event=TestEvent.suite_ended)
        assert self.quit_was_called(), "quit() was not called"

    def set_debug_flag(self):
        self.context.set_env(SUPPRESS_BROWSER_EXIT_ON_FAILURE="tRuE")

    def test_does_not_quit_when_debugging_and_suite_erred(self):
        self.set_debug_flag()
        sut = Browser()
        sut
        EventBroker.publish(event=TestEvent.suite_erred)
        EventBroker.publish(event=TestEvent.suite_ended)
        assert not self.quit_was_called(), "quit() was called"

    def test_does_not_quit_when_debugging_and_test_erred(self):
        self.set_debug_flag()
        sut = Browser()
        sut
        EventBroker.publish(event=TestEvent.test_erred)
        EventBroker.publish(event=TestEvent.suite_ended)
        assert not self.quit_was_called(), "quit() was called"

    def test_does_not_quit_when_debugging_and_test_failed(self):
        self.set_debug_flag()
        sut = Browser()
        sut
        EventBroker.publish(event=TestEvent.test_failed)
        EventBroker.publish(event=TestEvent.suite_ended)
        assert not self.quit_was_called(), "quit() was called"

    def test_quits_when_debugging_and_nothing_failed(self):
        self.set_debug_flag()
        sut = Browser()
        sut
        EventBroker.publish(event=TestEvent.suite_ended)
        assert self.quit_was_called(), "quit() was not called"