summaryrefslogtreecommitdiffstats
path: root/testing/marionette/harness/marionette_harness/tests/unit/test_unhandled_prompt_behavior.py
blob: d68c0a84681c8bebff54d051f38762b8bec8e66f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
from marionette_driver import errors
from marionette_driver.marionette import Alert
from marionette_driver.wait import Wait
from marionette_harness import MarionetteTestCase, parameterized


class TestUnhandledPromptBehavior(MarionetteTestCase):
    def setUp(self):
        super(TestUnhandledPromptBehavior, self).setUp()

        self.marionette.delete_session()

    def tearDown(self):
        # Ensure to close a possible remaining tab modal dialog
        try:
            alert = self.marionette.switch_to_alert()
            alert.dismiss()

            Wait(self.marionette).until(lambda _: not self.alert_present)
        except errors.NoAlertPresentException:
            pass

        super(TestUnhandledPromptBehavior, self).tearDown()

    @property
    def alert_present(self):
        try:
            Alert(self.marionette).text
            return True
        except errors.NoAlertPresentException:
            return False

    def perform_user_prompt_check(
        self,
        prompt_type,
        text,
        expected_result,
        expected_close=True,
        expected_notify=True,
    ):
        if prompt_type not in ["alert", "confirm", "prompt"]:
            raise TypeError("Invalid dialog type: {}".format(prompt_type))

        # No need to call resolve() because opening a prompt stops the script
        self.marionette.execute_async_script(
            """
            window.return_value = null;
            window.return_value = window[arguments[0]](arguments[1]);
        """,
            script_args=(prompt_type, text),
        )

        if expected_notify:
            with self.assertRaises(errors.UnexpectedAlertOpen):
                self.marionette.title
            # Bug 1469752 - WebDriverError misses optional data property
            # self.assertEqual(ex.data.text, text)
        else:
            self.marionette.title

        self.assertEqual(self.alert_present, not expected_close)

        # Close an expected left-over user prompt
        if not expected_close:
            alert = self.marionette.switch_to_alert()
            alert.dismiss()

        else:
            prompt_result = self.marionette.execute_script(
                "return window.return_value", new_sandbox=False
            )
            self.assertEqual(prompt_result, expected_result)

    @parameterized("alert", "alert", None)
    @parameterized("confirm", "confirm", True)
    @parameterized("prompt", "prompt", "")
    def test_accept(self, prompt_type, result):
        self.marionette.start_session({"unhandledPromptBehavior": "accept"})
        self.perform_user_prompt_check(
            prompt_type, "foo {}".format(prompt_type), result, expected_notify=False
        )

    @parameterized("alert", "alert", None)
    @parameterized("confirm", "confirm", True)
    @parameterized("prompt", "prompt", "")
    def test_accept_and_notify(self, prompt_type, result):
        self.marionette.start_session({"unhandledPromptBehavior": "accept and notify"})
        self.perform_user_prompt_check(
            prompt_type, "foo {}".format(prompt_type), result
        )

    @parameterized("alert", "alert", None)
    @parameterized("confirm", "confirm", False)
    @parameterized("prompt", "prompt", None)
    def test_dismiss(self, prompt_type, result):
        self.marionette.start_session({"unhandledPromptBehavior": "dismiss"})
        self.perform_user_prompt_check(
            prompt_type, "foo {}".format(prompt_type), result, expected_notify=False
        )

    @parameterized("alert", "alert", None)
    @parameterized("confirm", "confirm", False)
    @parameterized("prompt", "prompt", None)
    def test_dismiss_and_notify(self, prompt_type, result):
        self.marionette.start_session({"unhandledPromptBehavior": "dismiss and notify"})
        self.perform_user_prompt_check(
            prompt_type, "foo {}".format(prompt_type), result
        )

    @parameterized("alert", "alert", None)
    @parameterized("confirm", "confirm", None)
    @parameterized("prompt", "prompt", None)
    def test_ignore(self, prompt_type, result):
        self.marionette.start_session({"unhandledPromptBehavior": "ignore"})
        self.perform_user_prompt_check(
            prompt_type, "foo {}".format(prompt_type), result, expected_close=False
        )

    @parameterized("alert", "alert", None)
    @parameterized("confirm", "confirm", False)
    @parameterized("prompt", "prompt", None)
    def test_default(self, prompt_type, result):
        self.marionette.start_session({})
        self.perform_user_prompt_check(
            prompt_type, "foo {}".format(prompt_type), result
        )