tdf#95217, tdf#142600: sc: Add UItest

for that, launch an http server in a separate thread

Change-Id: I9d78c9a4349620a9de31b3963f2a31ff1d354f86
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/127592
Tested-by: Jenkins
Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
diff --git a/sc/qa/uitest/calc_tests3/tdf95217.py b/sc/qa/uitest/calc_tests3/tdf95217.py
new file mode 100644
index 0000000..98f79e5
--- /dev/null
+++ b/sc/qa/uitest/calc_tests3/tdf95217.py
@@ -0,0 +1,54 @@
# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*-
#
# This file is part of the LibreOffice project.
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#

from uitest.framework import UITestCase
from uitest.uihelper.common import get_state_as_dict
from uitest.uihelper.common import select_pos
from libreoffice.uno.propertyvalue import mkPropertyValues
from uitest.uihelper.common import get_url_for_data_file
from libreoffice.calc.document import get_cell_by_position

class tdf95217(UITestCase):

    def test_tdf95217(self):

        with self.ui_test.launch_HTTP_server("tdf95217.html") as url:

            with self.ui_test.create_doc_in_start_center("calc") as calc_doc:

                with self.ui_test.execute_dialog_through_command(".uno:InsertExternalDataSource", close_button="") as xDialog:
                    xUrl = xDialog.getChild("url")
                    xUrl.executeAction("TYPE", mkPropertyValues({"TEXT": url}))

                    with self.ui_test.execute_blocking_action(xUrl.executeAction, args=("TYPE", mkPropertyValues({"KEYCODE": "RETURN"}))):
                        pass

                    xRanges = xDialog.getChild("ranges")
                    self.assertEqual("3", get_state_as_dict(xRanges)["Children"])

                    # tdf#142600: Without the fix in place, this test would have failed with
                    # AssertionError: 'HTML_all' != 'HTML_1'
                    self.assertEqual("HTML_all", get_state_as_dict(xRanges.getChild("0"))["Text"])
                    self.assertEqual("HTML_tables", get_state_as_dict(xRanges.getChild("1"))["Text"])
                    self.assertEqual("HTML_1", get_state_as_dict(xRanges.getChild("2"))["Text"])

                    # FIXME: close_dialog_through_button fails here
                    xOkBtn = xDialog.getChild("ok")
                    xOkBtn.executeAction("CLICK", tuple())

                # Without the fix in place, this test would have failed with
                # AssertionError: 'وضعیت بازار' != 'وضعیت بازار'
                self.assertEqual("وضعیت بازار", get_cell_by_position(calc_doc, 0, 0, 0).getString())
                self.assertEqual("شاخص کل", get_cell_by_position(calc_doc, 0, 0, 1).getString())
                self.assertEqual("شاخص كل (هم وزن)", get_cell_by_position(calc_doc, 0, 0, 2).getString())
                self.assertEqual("بسته", get_cell_by_position(calc_doc, 0, 1, 0).getString())
                self.assertEqual("63175", get_cell_by_position(calc_doc, 0, 1, 1).getString())
                self.assertEqual("9,690.30 (22.80)", get_cell_by_position(calc_doc, 0, 1, 2).getString())

# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/sc/qa/uitest/data/tdf95217.html b/sc/qa/uitest/data/tdf95217.html
new file mode 100644
index 0000000..0d03633
--- /dev/null
+++ b/sc/qa/uitest/data/tdf95217.html
@@ -0,0 +1,49 @@
<!doctype html>
<html>
	<head><title>.:TSETMC:. :: شرکت مدیریت فناوری بورس تهران</title></head>
	<body>
                    <table class="table1">
                        <tbody>
				<tr>
					<td>وضعیت بازار</td>
					<td>بسته&nbsp;</td>
				</tr>

				<tr>
					<td>شاخص کل</td>
					<td>63,175</td>
				</tr>

				<tr>
					<td>شاخص كل (هم وزن)</td>
					<td>9,690.30 (22.80)</td>
				</tr>

				<tr>
					<td>ارزش بازار</td>
					<td>2,733,260.531 B</td>
				</tr>

				<tr>
					<td>اطلاعات قیمت</td>
					<td>94/7/29 12:34:44</td>
				</tr>

				<tr>
					<td>تعداد معاملات</td>
					<td>25,211</td>
				</tr>

				<tr>
					<td>ارزش معاملات</td>
					<td>732.587 B</td>
				</tr>

				<tr>
					<td>حجم معاملات</td>
					<td>312.439 M</td>
				</tr>
                        </tbody>
                    </table>
	</body>
</html>
diff --git a/uitest/uitest/test.py b/uitest/uitest/test.py
index 3beee0d..c798e76 100644
--- a/uitest/uitest/test.py
+++ b/uitest/uitest/test.py
@@ -6,11 +6,14 @@
#

import time
import functools
import threading
from contextlib import contextmanager
from uitest.config import DEFAULT_SLEEP
from uitest.config import MAX_WAIT
from uitest.uihelper.common import get_state_as_dict
from http.server import HTTPServer, SimpleHTTPRequestHandler
import os

from com.sun.star.uno import RuntimeException

@@ -268,4 +271,27 @@ class UITest(object):
                time.sleep(DEFAULT_SLEEP)
        raise Exception("Did not execute a dialog for a blocking action")

    @contextmanager
    def launch_HTTP_server(self, file_name):
        # Spawns an http.server.HTTPServer in a separate thread

        tdoc = os.getenv("TDOC")

        if not os.path.exists(os.path.join(tdoc, file_name)):
            raise Exception("File doesn't exists: " + file_name)

        # Serve in TDOC directory
        handler = functools.partial(SimpleHTTPRequestHandler, directory=tdoc)

        with HTTPServer(("localhost", 0), handler) as httpd:
            try:
                thread = threading.Thread(target=httpd.serve_forever)
                thread.start()
                url = "http://%s:%d/%s" % (httpd.server_name, httpd.server_port, file_name)
                yield url
            finally:
                # Call shutdown in case the testcase fails
                httpd.shutdown()
                thread.join()

# vim: set shiftwidth=4 softtabstop=4 expandtab: