Esempio n. 1
0
class TestWebElement(TestCase):
    def setUp(self):
        self.elm = WebElement("tag")
        self.c1 = WebElement()
        self.c2 = WebElement()
        self.js_mock = MagicMock()
        self.js_mock1 = MagicMock()
        self.js_mock2 = MagicMock()
        self.elm.js_exec = self.js_mock
        self.c1.js_exec = self.js_mock1
        self.c2.js_exec = self.js_mock2

    def test_id(self):
        self.assertRegex(self.elm.html, r'<tag rimo_id="\d+"></tag>')
        self.assertRegex(self.elm.rimo_id, r"\d+")

    def test_noid(self):
        self.assertEqual("<tag></tag>", self.elm.html_noid)

        self.c1.tag = "c1"
        appended_child1 = self.elm.appendChild(self.c1)
        self.assertIs(appended_child1, self.c1)
        self.assertEqual("<tag><c1></c1></tag>", self.elm.html_noid)

        self.c2.tag = "c2"
        appended_child2 = self.c1.appendChild(self.c2)
        self.assertIs(appended_child2, self.c2)
        self.assertEqual("<tag><c1><c2></c2></c1></tag>", self.elm.html_noid)

    def test_id_init(self):
        elm = WebElement("tag", rimo_id="myid")
        self.assertEqual('<tag rimo_id="myid"></tag>', elm.html)

    def test_not_connected(self):
        self.assertFalse(self.elm.connected)

    def test_parent(self):
        self.assertIsNone(self.elm.parentNode)
        self.assertIsNone(self.c1.parentNode)
        self.elm.appendChild(self.c1)
        self.assertIs(self.elm, self.c1.parentNode)
        self.js_mock1.assert_not_called()
        self.assertEqual(self.js_mock.call_count, 1)
        self.js_mock.assert_called_once_with("insertAdjacentHTML", "beforeend", self.c1.html)

        removed_child1 = self.elm.removeChild(self.c1)
        self.assertIs(removed_child1, self.c1)
        self.assertIsNone(self.c1.parentNode)
        self.assertEqual(self.js_mock.call_count, 2)
        self.js_mock1.assert_not_called()
        self.js_mock.assert_called_with("removeChildById", self.c1.rimo_id)

    def test_addremove_child(self):
        self.assertFalse(self.elm.hasChildNodes())
        self.elm.appendChild(self.c1)
        self.assertTrue(self.elm.hasChildNodes())
        self.assertIn(self.c1, self.elm)
        self.assertNotIn(self.c2, self.elm)
        self.assertEqual(self.elm.length, 1)

        self.elm.insertBefore(self.c2, self.c1)
        self.assertIn(self.c1, self.elm)
        self.assertIn(self.c2, self.elm)
        self.assertEqual(self.elm.length, 2)
        self.c2.remove()
        self.assertEqual(self.elm.length, 1)
        self.assertIn(self.c1, self.elm)
        self.assertNotIn(self.c2, self.elm)
        self.assertIsNone(self.c2.parentNode)
        self.js_mock2.assert_called_once_with("remove")

        self.elm.removeChild(self.c1)
        self.assertFalse(self.elm.hasChildNodes())
        self.assertEqual(self.elm.length, 0)
        self.assertNotIn(self.c1, self.elm)
        self.assertNotIn(self.c2, self.elm)
        self.js_mock1.assert_called_once_with("insertAdjacentHTML", "beforebegin", self.c2.html)
        self.assertEqual(self.js_mock.call_count, 3)

        with self.assertRaises(ValueError):
            self.elm.removeChild(self.c1)

    def test_addremove_attr(self):
        self.elm.setAttribute("src", "a")
        self.js_mock.assert_called_with("setAttribute", "src", "a")
        self.elm.removeAttribute("src")
        self.js_mock.assert_called_with("removeAttribute", "src")

    def test_style(self):
        self.elm.style = "color: red;"
        self.js_mock.assert_called_once_with("setAttribute", "style", "color: red;")
        self.elm.removeAttribute("style")
        self.js_mock.assert_called_with("removeAttribute", "style")
        self.elm.style.color = "black"
        self.js_mock.assert_called_with("setAttribute", "style", "color: black;")

    def test_style_init(self):
        _js_exec = WebElement.js_exec
        WebElement.js_exec = self.js_mock
        WebElement("elm", style="color: red;")
        _call = call("setAttribute", "style", "color: red;")
        _call_remove = call("removeAttribute", "style")
        self.js_mock.assert_has_calls([_call])
        count = 0
        for c in self.js_mock.call_args_list:
            if c == _call:
                count += 1
            elif c == _call_remove:
                raise AssertionError("Unexpeted remove style")
        self.assertEqual(count, 1)
        WebElement.js_exec = _js_exec

    def test_set_text_content(self):
        self.elm.textContent = "text"
        self.js_mock.assert_called_once_with("textContent", "text")

    def test_set_inner_html(self):
        self.elm.innerHTML = "html"
        self.js_mock.assert_called_once_with("innerHTML", "html")

    def test_shallow_copy(self):
        from copy import copy

        clone = copy(self.elm)
        self.assertNotEqual(clone.rimo_id, self.elm.rimo_id)

        clone = self.elm.cloneNode()
        self.assertNotEqual(clone.rimo_id, self.elm.rimo_id)

    def test_deep_copy(self):
        from copy import deepcopy

        clone = deepcopy(self.elm)
        self.assertNotEqual(clone.rimo_id, self.elm.rimo_id)

        clone = self.elm.cloneNode(deep=True)
        self.assertNotEqual(clone.rimo_id, self.elm.rimo_id)

    def test_click(self):
        mock = MagicMock(_is_coroutine=False)
        self.elm.addEventListener("click", mock)
        self.elm.click()
        self.js_mock.assert_called_once_with("addEventListener", "click")
        self.assertEqual(mock.call_count, 1)