From 16e2f65c847f23b640346b2e208da89462abc6f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20K=C3=B6rber?= Date: Mon, 11 Jul 2022 16:39:46 +0200 Subject: [PATCH] more selenium tests --- .../packager/components/NewPackageList.py | 41 ++--- .../packager/components/PackageListTable.py | 43 +++--- python_flask/packager/views.py | 9 ++ python_flask/selenium/test.py | 146 +++++++++++++----- 4 files changed, 164 insertions(+), 75 deletions(-) diff --git a/python_flask/packager/components/NewPackageList.py b/python_flask/packager/components/NewPackageList.py index 660cfac..64a7257 100644 --- a/python_flask/packager/components/NewPackageList.py +++ b/python_flask/packager/components/NewPackageList.py @@ -42,7 +42,7 @@ def NewPackageList(name=None, description=None, error=False, errormsg=None): _for="listname", _class=cls("font-bold", "w-1/2", "p-2", "text-center"), ) - with t.div(_class=cls("w-1/2")): + with t.span(_class=cls("w-1/2")): t._input( type="text", id="listname", @@ -80,25 +80,26 @@ def NewPackageList(name=None, description=None, error=False, errormsg=None): _for="listdesc", _class=cls("font-bold", "w-1/2", "text-center"), ) - t._input( - type="text", - id="listdesc", - name="description", - **{"value": description} if description is not None else {}, - _class=cls( - "block", - "w-1/2", - "p-2", - "bg-gray-50", - "appearance-none", - "border-2", - "border-gray-300", - "rounded", - "focus:outline-none", - "focus:bg-white", - "focus:border-purple-500", - ), - ) + with t.span(_class=cls("w-1/2")): + t._input( + type="text", + id="listdesc", + name="description", + **{"value": description} if description is not None else {}, + _class=cls( + "block", + "w-full", + "p-2", + "bg-gray-50", + "appearance-none", + "border-2", + "border-gray-300", + "rounded", + "focus:outline-none", + "focus:bg-white", + "focus:border-purple-500", + ), + ) t._input( type="submit", value="Add", diff --git a/python_flask/packager/components/PackageListTable.py b/python_flask/packager/components/PackageListTable.py index 1bbecbc..ad8a309 100644 --- a/python_flask/packager/components/PackageListTable.py +++ b/python_flask/packager/components/PackageListTable.py @@ -30,7 +30,7 @@ class PackageListTableRowEdit: if error: t.p(errormsg, _class=cls("text-red-400", "text-sm")) with t.div(_class=cls("flex", "flex-row", "h-full")): - with t.div( + with t.span( _class=cls( "border", "border-1", @@ -50,7 +50,7 @@ class PackageListTableRowEdit: "x-on:input": "edit_submit_enabled = $event.srcElement.value.trim().length !== 0;" }, ) - with t.div( + with t.span( _class=cls( "border", "border-1", "border-purple-500", "bg-purple-100" ) @@ -79,7 +79,8 @@ class PackageListTableRowEdit: data_hx_target="closest tr", data_hx_swap="outerHTML", ): - t.span(_class=cls("mdi", "mdi-cancel", "text-xl")), + with t.button(): + t.span(_class=cls("mdi", "mdi-cancel", "text-xl")), with t.td( id="edit-packagelist-save", _class=cls( @@ -105,12 +106,7 @@ class PackageListTableRowNormal: with t.tr(_class=cls("h-10", "even:bg-gray-100", "hover:bg-purple-200")) as doc: t.td(pkglist.name, _class=cls("border", "px-2")), t.td(str(pkglist.description), _class=cls("border", "px-2")), - t.td( - t.span(_class=cls("mdi", "mdi-delete", "text-xl")), - id="delete-packagelist", - data_hx_delete=f"/list/{pkglist.id}", - data_hx_target="closest tr", - data_hx_swap="outerHTML", + with t.td( _class=cls( "border", "bg-red-200", @@ -118,8 +114,16 @@ class PackageListTableRowNormal: "cursor-pointer", "w-8", "text-center", - ), - ), + ) + ): + with t.a( + data_hx_delete=f"/list/{pkglist.id}", + data_hx_target="closest tr", + data_hx_swap="outerHTML", + href=f"/list/{pkglist.id}/delete", + ): + with t.button(): + t.span(_class=cls("mdi", "mdi-delete", "text-xl")) with t.td( _class=cls( "border", @@ -131,17 +135,15 @@ class PackageListTableRowNormal: ) ): with t.a( - id="edit-packagelist", data_hx_post=f"/list/{pkglist.id}/edit", href=f"/?edit={pkglist.id}", data_hx_target="closest tr", data_hx_swap="outerHTML", + id="edit-packagelist", ): - t.span(_class=cls("mdi", "mdi-pencil", "text-xl")), - t.td( - t.span(_class=cls("mdi", "mdi-arrow-right", "text-xl")), - id="edit-packagelist", - # data_hx_post=f"/list/{pkglist.id}/show", + with t.button(): + t.span(_class=cls("mdi", "mdi-pencil", "text-xl")), + with t.td( _class=cls( "border", "bg-green-200", @@ -149,8 +151,11 @@ class PackageListTableRowNormal: "cursor-pointer", "w-8", "text-center", - ), - ), + ) + ): + with t.button(): + t.span(_class=cls("mdi", "mdi-arrow-right", "text-xl")) + # data_hx_post=f"/list/{pkglist.id}/show", self.doc = doc diff --git a/python_flask/packager/views.py b/python_flask/packager/views.py index c77a885..c399055 100644 --- a/python_flask/packager/views.py +++ b/python_flask/packager/views.py @@ -245,6 +245,15 @@ def edit_list(id): return make_response(out.render(), 200) +@app.route("/list//delete", methods=["GET"]) +def delete_list_via_get(id): + if not delete_packagelist(id=id): + return make_response("", 404) + r = make_response("", 303) + r.headers["Location"] = "/" + return r + + @app.route("/list/", methods=["DELETE"]) def delete_list(id): if not delete_packagelist(id=id): diff --git a/python_flask/selenium/test.py b/python_flask/selenium/test.py index ab21ef5..2ff6d42 100755 --- a/python_flask/selenium/test.py +++ b/python_flask/selenium/test.py @@ -1,6 +1,9 @@ #!/usr/bin/env python3 import time +import argparse +import code +import readline from helium import * import selenium @@ -8,59 +11,130 @@ import selenium from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By +parser = argparse.ArgumentParser() +parser.add_argument("--repl", action="store_true") +args = parser.parse_args() + opts = selenium.webdriver.firefox.options.Options() -profile = selenium.webdriver.FirefoxProfile() -profile.set_preference("javascript.enabled", "false") -profile.DEFAULT_PREFERENCES['frozen']['javascript.enabled'] = False -opts.profile = profile +for has_javascript in [True, False]: + profile = selenium.webdriver.FirefoxProfile() + profile.DEFAULT_PREFERENCES["frozen"]["javascript.enabled"] = has_javascript + opts.profile = profile -driver = selenium.webdriver.Remote( - command_executor="http://localhost:4444/wd/hub", - options=opts, -) -driver.implicitly_wait(0) -Config.implicit_wait_secs = 1 + driver = selenium.webdriver.Remote( + command_executor="http://localhost:4444/wd/hub", options=opts + ) + driver.implicitly_wait(0) + Config.implicit_wait_secs = 1 -try: - helium.set_driver(driver) - helium.go_to("http://localhost:5000") + try: + helium.set_driver(driver) + helium.go_to("http://localhost:5000") - assert driver.title == "Packager" + assert driver.title == "Packager" - new_entry = Text("Add new package list") + new_entry = Text("Add new package list") - lists_before = find_all(S("table > tbody > tr", below=Text("Package Lists"))) + lists_before = find_all(S("table > tbody > tr", below=Text("Package Lists"))) - write("newlist", into=TextField(to_right_of="Name")) - write("newlistdesc", into=TextField(to_right_of="Description")) - click(Button("Add")) + write("newlist", into=TextField(to_right_of="Name")) + write("newlistdesc", into=TextField(to_right_of="Description")) + click(Button("Add")) - lists_after = find_all(S("table > tbody > tr", below=Text("Package Lists"))) + lists_after = find_all(S("table > tbody > tr", below=Text("Package Lists"))) - assert len(lists_before) == len(lists_after) - 1 + assert len(lists_before) == len(lists_after) - 1 - nameidx = next(i for i,v in enumerate(find_all(S("table > thead > tr > th"))) if v.web_element.text == "Name") - descidx = next(i for i,v in enumerate(find_all(S("table > thead > tr > th"))) if v.web_element.text == "Description") + nameidx = next( + i + for i, v in enumerate(find_all(S("table > thead > tr > th"))) + if v.web_element.text == "Name" + ) + descidx = next( + i + for i, v in enumerate(find_all(S("table > thead > tr > th"))) + if v.web_element.text == "Description" + ) - new_entry = lists_after[-1] + write("newlist2", into=TextField(to_right_of="Name")) + write("newlistdesc2", into=TextField(to_right_of="Description")) + click(Button("Add")) - cells = new_entry.web_element.find_elements_by_tag_name("td") + lists_after = find_all(S("table > tbody > tr", below=Text("Package Lists"))) + assert len(lists_before) == len(lists_after) - 2 - assert cells[nameidx].text == "newlist" - assert cells[descidx].text == "newlistdesc" + new_entry1 = lists_after[-2] + cells = new_entry1.web_element.find_elements_by_tag_name("td") + assert cells[nameidx].text == "newlist" + assert cells[descidx].text == "newlistdesc" - lists_before = lists_after + new_entry2 = lists_after[-1] + cells = new_entry2.web_element.find_elements_by_tag_name("td") + assert cells[nameidx].text == "newlist2" + assert cells[descidx].text == "newlistdesc2" - deletebtn = new_entry.web_element.find_element_by_class_name("mdi-delete") + editbtn = new_entry1.web_element.find_element_by_class_name("mdi-pencil") + click(editbtn) - click(deletebtn) + lists_after = find_all(S("table > tbody > tr", below=Text("Package Lists"))) + editrow = find_all(S("table > tbody > tr"))[-2] - lists_after = find_all(S("table > tbody > tr", below=Text("Package Lists"))) + inputs = editrow.web_element.find_elements_by_xpath("//input") + write("editedname", into=inputs[0]) + write("editeddesc", into=inputs[1]) - assert len(lists_before) - 1 == len(lists_after) + savebtn = editrow.web_element.find_element_by_class_name("mdi-content-save") + click(savebtn) - import code; code.interact(local=locals()) - time.sleep(5) -finally: - driver.quit() + lists_after = find_all(S("table > tbody > tr", below=Text("Package Lists"))) + new_entry1 = lists_after[-2] + + cells = new_entry1.web_element.find_elements_by_tag_name("td") + assert cells[nameidx].text == "editedname" + assert cells[descidx].text == "editeddesc" + + editbtn = new_entry1.web_element.find_element_by_class_name("mdi-pencil") + click(editbtn) + + lists_after = find_all(S("table > tbody > tr", below=Text("Package Lists"))) + editrow = find_all(S("table > tbody > tr"))[-2] + + inputs = editrow.web_element.find_elements_by_xpath("//input") + write("editedname_again", into=inputs[0]) + write("editeddesc_again", into=inputs[1]) + + cancelbtn = editrow.web_element.find_element_by_class_name("mdi-cancel") + click(cancelbtn) + lists_after = find_all(S("table > tbody > tr", below=Text("Package Lists"))) + new_entry1 = lists_after[-2] + + cells = new_entry1.web_element.find_elements_by_tag_name("td") + assert cells[nameidx].text == "editedname" + assert cells[descidx].text == "editeddesc" + + lists_after = find_all(S("table > tbody > tr", below=Text("Package Lists"))) + + new_entry1 = lists_after[-2] + deletebtn = new_entry1.web_element.find_element_by_class_name("mdi-delete") + click(deletebtn) + + lists_after = find_all(S("table > tbody > tr", below=Text("Package Lists"))) + + assert len(lists_before) + 1 == len(lists_after) + + new_entry2 = lists_after[-1] + deletebtn = new_entry2.web_element.find_element_by_class_name("mdi-delete") + click(deletebtn) + lists_after = find_all(S("table > tbody > tr", below=Text("Package Lists"))) + + assert len(lists_before) == len(lists_after) + + if args.repl: + code.InteractiveConsole(locals=globals()).interact() + + finally: + driver.quit() + + +time.sleep(5)