diff --git a/gooey/tests/test_application.py b/gooey/tests/test_application.py index c1e88f9..1498b17 100644 --- a/gooey/tests/test_application.py +++ b/gooey/tests/test_application.py @@ -1,5 +1,8 @@ import unittest from argparse import ArgumentParser +from collections import namedtuple +from unittest.mock import patch +from unittest.mock import MagicMock from tests.harness import instrumentGooey @@ -15,6 +18,45 @@ class TestGooeyApplication(unittest.TestCase): with instrumentGooey(parser, fullscreen=shouldShow) as (app, gapp): self.assertEqual(gapp.IsFullScreen(), shouldShow) + + @patch("gui.containers.application.modals.confirmForceStop") + def testGooeyRequestsConfirmationWhenShowStopWarningModalTrue(self, mockModal): + """ + When show_stop_warning=False, Gooey should immediately kill the + running program without additional user confirmation. + + Otherwise, Gooey should show a confirmation modal and, dependending on the + user's choice, either do nothing or kill the running program. + """ + Case = namedtuple('Case', ['show_warning', 'shouldSeeConfirm', 'userChooses', 'shouldHaltProgram']) + testcases = [ + Case(show_warning=True, shouldSeeConfirm=True, userChooses=True, shouldHaltProgram=True), + Case(show_warning=True, shouldSeeConfirm=True, userChooses=False, shouldHaltProgram=False), + Case(show_warning=False, shouldSeeConfirm=False, userChooses='N/A', shouldHaltProgram=True), + ] + + for case in testcases: + mockModal.reset_mock() + parser = self.basicParser() + with instrumentGooey(parser, show_stop_warning=case.show_warning) as (app, gapp): + mockClientRunner = MagicMock() + mockModal.return_value = case.userChooses + gapp.clientRunner = mockClientRunner + + gapp.onStopExecution() + + if case.shouldSeeConfirm: + mockModal.assert_called() + else: + mockModal.assert_not_called() + + if case.shouldHaltProgram: + mockClientRunner.stop.assert_called() + else: + mockClientRunner.stop.assert_not_called() + + + def basicParser(self): parser = ArgumentParser() parser.add_argument('--foo')