class TestlXMLLibrary(unittest.TestCase):
    """Test cases to test lXMLLibrary"""

    xml = """
        <example>
            <first id="1">text</first>
            <second id="2">
                <child/>
            </second>
            <third>
                <child>more text</child>
                <second id="child"/>
                <child><grandchild/></child>
                <another>ok</another>
                <another>SUCCESS</another>
                <another>200</another>
                <another>0000</another>
            </third>
            <html>
                <p>
                    Text with <b>bold</b> and <i>italics</i>
                </p>
            </html>
        </example>
		"""

    def setUp(self):
        self.lib = XML()
        self.xml_obj = self.lib.parse_xml(self.xml)

    def test_load_xml_from_string(self):
        self.assertIsInstance(self.xml_obj, lxml.etree._Element)
        self.assertEqual(
            self.lib.get_element_text(
                self.xml_obj,
                "//child[following::*[contains(@id, 'child')] and ancestor::third]"
            ), "more text")

    def test_load_xml_from_file(self):
        temp = tempfile.NamedTemporaryFile(delete=False)
        temp.write(self.xml)
        temp.close()
        self.xml_obj = self.lib.parse_xml(temp.name)
        self.assertIsInstance(self.xml_obj, lxml.etree._Element)
        self.assertEqual(
            self.lib.get_element_text(
                self.xml_obj,
                "//child[following::*[contains(@id, 'child')] and ancestor::third]"
            ), "more text")
        os.unlink(temp.name)

    def test_set_element_text(self):
        xml = self.lib.set_element_text(
            self.xml_obj,
            "new_tag_name",
            xpath="//*[@id='1' and contains(text(),'text')]")
        self.assertEqual(
            self.lib.get_element(
                xml, "//*[@id='1' and contains(text(),'new_tag_name')]").text,
            "new_tag_name")

    def test_set_element_tag(self):
        xml = self.lib.set_element_tag(
            self.xml_obj, "new_tag_name",
            "//*[@id='1' and contains(text(),'text')]")
        self.assertEqual(
            self.lib.get_element(xml, "//new_tag_name").text, 'text')

    def test_set_elements_text(self):
        xml = self.lib.set_elements_text(self.xml_obj, "new_text", xpath="//*")
        for element in self.lib.get_elements(xml, "//*"):
            self.assertEquals(element.text, "new_text")

    def test_set_elements_tag(self):
        xml = self.lib.set_elements_tag(
            self.xml_obj,
            "new_tag",
            xpath="//*[contains(local-name(.), 'child')]")
        for element in self.lib.get_elements(
                xml, "//*[contains(local-name(.), 'child')]"):
            self.assertEquals(element.tag, "new_tag1")

    def test_set_elements_attribute(self):
        xml = self.lib.set_elements_attribute(
            self.xml_obj,
            "new_attribute",
            "new_value",
            xpath="//*[contains(local-name(.), 'child')]")
        for element in self.lib.get_elements(
                xml, "//*[contains(local-name(.), 'child')]"):
            self.assertIn("new_attribute", element.attrib)

    def test_set_elements_text_from_file(self):
        pass

    def test_set_elements_text_from_dictionary(self):
        pass

    def test_get_element(self):
        element = self.lib.get_element(
            self.xml_obj, "//*[@id='1']/following::i[preceding-sibling::b]")
        self.assertIsInstance(element, lxml.etree._Element)
        self.assertEqual(element.text, "italics")

    def test_get_element_with_xpath_on_multiple_nodes(self):
        with self.assertRaises(AssertionError):
            element = self.lib.get_element(
                self.xml_obj, "//*[contains(local-name(.), 'child')]")

    def test_get_element_text(self):
        self.assertEqual(
            self.lib.get_element_text(
                self.xml_obj,
                "//child[following::*[contains(@id, 'child')] and ancestor::third]"
            ), "more text")

    def test_get_elements(self):
        elements = self.lib.get_elements(
            self.xml_obj, "//*[contains(local-name(.), 'child')]")
        self.assertSequenceEqual([i.tag for i in elements],
                                 ['child', 'child', 'child', 'grandchild'])

    def test_parse_xml(self):
        path = r'd:\workspace\misha\work\projects\tele2\projects\solution test\test automation\dev\solution_test_automation\sweden\testcases\prototype\new_order_1\brightpoint\brightpoint_delivery_request.xml'
        xml = self.lib.parse_xml(path)
        #print self.lib.get_elements(xml, r'.//*')

    def test_element_text_should_match_regexp(self):
        self.lib.elements_text_should_match_regexp(
            self.xml_obj, r"(?i)^(success|ok|0|200|0000)$", r".//another")

    def test_elements_count_should_be_equal_ok(self):
        self.lib.elements_count_should_be_equal(self.xml_obj, 4, r".//another")

    def test_elements_count_should_be_equal_failed(self):
        with self.assertRaises(AssertionError):
            self.lib.elements_count_should_be_equal(self.xml_obj, 5,
                                                    r".//another")

    def test_exception_raises_if_no_elements_found(self):
        with self.assertRaises(AssertionError):
            self.lib.get_elements_texts(self.xml_obj, r".//get_elements_texts")
        with self.assertRaises(AssertionError):
            self.lib.elements_text_should_be(self.xml_obj, "something",
                                             r".//elements_text_should_be")
        with self.assertRaises(AssertionError):
            self.lib.elements_text_should_match(
                self.xml_obj, "something", r".//elements_text_should_match")
        with self.assertRaises(AssertionError):
            self.lib.elements_text_should_match_regexp(self.xml_obj,
                                                       "something",
                                                       r".//regexp")

        self.lib.get_elements_texts(self.xml_obj,
                                    r".//get_elements_texts",
                                    raise_exception=False)
        self.lib.elements_text_should_be(self.xml_obj,
                                         "something",
                                         r".//elements_text_should_be",
                                         raise_exception=False)
        self.lib.elements_text_should_match(self.xml_obj,
                                            "something",
                                            r".//elements_text_should_match",
                                            raise_exception=False)
        self.lib.elements_text_should_match_regexp(self.xml_obj,
                                                   "something",
                                                   r".//regexp",
                                                   raise_exception=False)
class TestlXMLLibrary(unittest.TestCase):
    """Test cases to test lXMLLibrary"""

    xml = """
        <example>
            <first id="1">text</first>
            <second id="2">
                <child/>
            </second>
            <third>
                <child>more text</child>
                <second id="child"/>
                <child><grandchild/></child>
                <another>ok</another>
                <another>SUCCESS</another>
                <another>200</another>
                <another>0000</another>
            </third>
            <html>
                <p>
                    Text with <b>bold</b> and <i>italics</i>
                </p>
            </html>
        </example>
		"""

    def setUp(self):
        self.lib = XML()
        self.xml_obj = self.lib.parse_xml(self.xml)

    def test_load_xml_from_string(self):
        self.assertIsInstance(self.xml_obj, lxml.etree._Element)
        self.assertEqual(self.lib.get_element_text(self.xml_obj,
                                                   "//child[following::*[contains(@id, 'child')] and ancestor::third]"),
                         "more text")

    def test_load_xml_from_file(self):
        temp = tempfile.NamedTemporaryFile(delete=False)
        temp.write(self.xml)
        temp.close()
        self.xml_obj = self.lib.parse_xml(temp.name)
        self.assertIsInstance(self.xml_obj, lxml.etree._Element)
        self.assertEqual(self.lib.get_element_text(self.xml_obj,
                                                   "//child[following::*[contains(@id, 'child')] and ancestor::third]"),
                         "more text")
        os.unlink(temp.name)

    def test_set_element_text(self):
        xml = self.lib.set_element_text(self.xml_obj,
                                        "new_tag_name",
                                        xpath="//*[@id='1' and contains(text(),'text')]")
        self.assertEqual(self.lib.get_element(xml,
                                              "//*[@id='1' and contains(text(),'new_tag_name')]").text,
                         "new_tag_name")

    def test_set_element_tag(self):
        xml = self.lib.set_element_tag(self.xml_obj,
                                       "new_tag_name",
                                       "//*[@id='1' and contains(text(),'text')]")
        self.assertEqual(self.lib.get_element(xml, "//new_tag_name").text, 'text')

    def test_set_elements_text(self):
        xml = self.lib.set_elements_text(self.xml_obj,
                                         "new_text",
                                         xpath="//*")
        for element in self.lib.get_elements(xml, "//*"):
            self.assertEquals(element.text, "new_text")

    def test_set_elements_tag(self):
        xml = self.lib.set_elements_tag(self.xml_obj,
                                        "new_tag",
                                        xpath="//*[contains(local-name(.), 'child')]")
        for element in self.lib.get_elements(xml, "//*[contains(local-name(.), 'child')]"):
            self.assertEquals(element.tag, "new_tag1")

    def test_set_elements_attribute(self):
        xml = self.lib.set_elements_attribute(self.xml_obj,
                                              "new_attribute", "new_value",
                                              xpath="//*[contains(local-name(.), 'child')]")
        for element in self.lib.get_elements(xml, "//*[contains(local-name(.), 'child')]"):
            self.assertIn("new_attribute", element.attrib)

    def test_set_elements_text_from_file(self):
        pass

    def test_set_elements_text_from_dictionary(self):
        pass

    def test_get_element(self):
        element = self.lib.get_element(self.xml_obj,
                                       "//*[@id='1']/following::i[preceding-sibling::b]")
        self.assertIsInstance(element, lxml.etree._Element)
        self.assertEqual(element.text, "italics")

    def test_get_element_with_xpath_on_multiple_nodes(self):
        with self.assertRaises(AssertionError):
            element = self.lib.get_element(self.xml_obj,
                                           "//*[contains(local-name(.), 'child')]")

    def test_get_element_text(self):
        self.assertEqual(self.lib.get_element_text(self.xml_obj,
                                                   "//child[following::*[contains(@id, 'child')] and ancestor::third]"),
                         "more text")

    def test_get_elements(self):
        elements = self.lib.get_elements(self.xml_obj,
                                         "//*[contains(local-name(.), 'child')]")
        self.assertSequenceEqual([i.tag for i in elements],
                                 ['child', 'child', 'child', 'grandchild'])

    def test_parse_xml(self):
        path = r'd:\workspace\misha\work\projects\tele2\projects\solution test\test automation\dev\solution_test_automation\sweden\testcases\prototype\new_order_1\brightpoint\brightpoint_delivery_request.xml'
        xml = self.lib.parse_xml(path)
        #print self.lib.get_elements(xml, r'.//*')

    def test_element_text_should_match_regexp(self):
        self.lib.elements_text_should_match_regexp(self.xml_obj,
                                                   r"(?i)^(success|ok|0|200|0000)$",
                                                   r".//another")

    def test_elements_count_should_be_equal_ok(self):
        self.lib.elements_count_should_be_equal(self.xml_obj, 4, r".//another")

    def test_elements_count_should_be_equal_failed(self):
        with self.assertRaises(AssertionError):
            self.lib.elements_count_should_be_equal(self.xml_obj, 5, r".//another")

    def test_exception_raises_if_no_elements_found(self):
        with self.assertRaises(AssertionError):
            self.lib.get_elements_texts(self.xml_obj, r".//get_elements_texts")
        with self.assertRaises(AssertionError):
            self.lib.elements_text_should_be(self.xml_obj, "something", r".//elements_text_should_be")
        with self.assertRaises(AssertionError):
            self.lib.elements_text_should_match(self.xml_obj, "something", r".//elements_text_should_match")
        with self.assertRaises(AssertionError):
            self.lib.elements_text_should_match_regexp(self.xml_obj, "something", r".//regexp")

        self.lib.get_elements_texts(self.xml_obj, r".//get_elements_texts",
                                    raise_exception=False)
        self.lib.elements_text_should_be(self.xml_obj, "something", r".//elements_text_should_be",
                                         raise_exception=False)
        self.lib.elements_text_should_match(self.xml_obj, "something", r".//elements_text_should_match",
                                            raise_exception=False)
        self.lib.elements_text_should_match_regexp(self.xml_obj, "something", r".//regexp",
                                                   raise_exception=False)
 def setUp(self):
     self.lib = XML()
     self.xml_obj = self.lib.parse_xml(self.xml)
 def setUp(self):
     self.lib = XML()
     self.xml_obj = self.lib.parse_xml(self.xml)