From b612c967d16a4ce11bfeef4e9c225f664f78f22b Mon Sep 17 00:00:00 2001 From: Eduardo Oliveira Date: Mon, 23 Dec 2024 07:49:55 -0300 Subject: [PATCH 1/4] refactor: rewriting some e2e tests --- .../js/image-uploader-inline.js | 2 +- tests/helpers/__init__.py | 0 tests/helpers/drag_drop_label_test_helper.py | 101 +++ tests/helpers/reorder_test_helper.py | 349 +++++++++ tests/mixins/__init__.py | 0 tests/mixins/image_mock_mixin.py | 23 + tests/models.py | 2 +- .../tests_functional_array_field.py | 418 +---------- tests/tests_functional/htmx/__init__.py | 28 + .../htmx/tests_htmx_array_field.py | 688 +++--------------- .../htmx/tests_htmx_widget_optional.py | 273 ++----- .../htmx/tests_htmx_widget_required.py | 247 ++----- .../inlines/tests_functional_inline.py | 65 +- .../tests_functional_inline_with_order.py | 440 +---------- .../inlines/tests_ui_regression_inlines.py | 287 ++++---- .../tests_ui_regression_widget_force_theme.py | 2 + .../tests_ui_regression_widget_optional.py | 2 + .../tests_ui_regression_widget_required.py | 2 + 18 files changed, 947 insertions(+), 1982 deletions(-) create mode 100644 tests/helpers/__init__.py create mode 100644 tests/helpers/drag_drop_label_test_helper.py create mode 100644 tests/helpers/reorder_test_helper.py create mode 100644 tests/mixins/__init__.py create mode 100644 tests/mixins/image_mock_mixin.py diff --git a/image_uploader_widget/static/image_uploader_widget/js/image-uploader-inline.js b/image_uploader_widget/static/image_uploader_widget/js/image-uploader-inline.js index bca8568f..8af81d70 100644 --- a/image_uploader_widget/static/image_uploader_widget/js/image-uploader-inline.js +++ b/image_uploader_widget/static/image_uploader_widget/js/image-uploader-inline.js @@ -308,7 +308,7 @@ document.addEventListener('dragend', function(evt) { const root = window.draggingEditor; if (root.classList.contains('dragging')) { return; } - root.remove('drop-zone'); + root.classList.remove('drop-zone'); }); document.addEventListener('drop', function(evt) { diff --git a/tests/helpers/__init__.py b/tests/helpers/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/helpers/drag_drop_label_test_helper.py b/tests/helpers/drag_drop_label_test_helper.py new file mode 100644 index 00000000..95b2a6e0 --- /dev/null +++ b/tests/helpers/drag_drop_label_test_helper.py @@ -0,0 +1,101 @@ +import time + +from playwright.sync_api import Page + + +class DragDropLabelTestHelper: + root_selector = ".iuw-root" + drop_label_selector = ".iuw-drop-label" + + @property + def root(self): + """The widget root element.""" + return self.page.query_selector(self.root_selector) + + @property + def data_transfer(self): + """A empty DataTransfer created using using evaluate_handle().""" + return self.page.evaluate_handle("() => new DataTransfer()") + + @property + def drop_label(self): + """The drop label of the widget.""" + return self.page.query_selector(self.drop_label_selector) + + def __init__(self, page: Page, root_selector: str): + """Creates a new instance of DragDropLabelTestHelper. + + Args: + page: a playwright `Page`. + root_selector: a css selector of the widget root. + """ + self.page = page + self.root_selector = root_selector + + def execute_drag_leave_event(self): + """Executes a partial test-case of drop label using drag leave event. + + Assert if drop_label is hidden, then dispatch a dragenter event, assert if drop_label + is visible, and, for last, dispatch dragleave and assert if drop_label is hidden. + """ + # is hidden + assert not self.drop_label.is_visible() + # enter + self.root.dispatch_event("dragenter", {"dataTransfer": self.data_transfer}) + time.sleep(0.5) + # goes to visible + assert self.drop_label.is_visible() + # leave + self.root.dispatch_event("dragleave", {"dataTransfer": self.data_transfer}) + time.sleep(0.5) + # goes to hidden + assert not self.drop_label.is_visible() + + def execute_drag_end_event(self): + """Executes a partial test-case of drop label using drag end event. + + Assert if drop_label is hidden, then dispatch a dragenter event, assert if drop_label + is visible, and, for last, dispatch dragend and assert if drop_label is hidden. + """ + # is hidden + assert not self.drop_label.is_visible() + # enter + self.root.dispatch_event("dragenter", {"dataTransfer": self.data_transfer}) + time.sleep(0.5) + # goes to visible + assert self.drop_label.is_visible() + # end + self.root.dispatch_event("dragend", {"dataTransfer": self.data_transfer}) + time.sleep(0.5) + # goes to hidden + assert not self.drop_label.is_visible() + + def execute_drop_event(self): + """Executes a partial test-case of drop label using drop event. + + Assert if drop_label is hidden, then dispatch a dragenter event, assert if drop_label + is visible, and, for last, dispatch drop and assert if drop_label is hidden. + """ + # is hidden + assert not self.drop_label.is_visible() + # enter + self.root.dispatch_event("dragenter", {"dataTransfer": self.data_transfer}) + time.sleep(0.5) + # goes to visible + assert self.drop_label.is_visible() + # drop + self.root.dispatch_event("drop", {"dataTransfer": self.data_transfer}) + time.sleep(0.5) + # goes to hidden + assert not self.drop_label.is_visible() + + +class DragDropLabelTestCaseMixin: + def test_drag_drop_label_flow(self): + """Test full drag and drop label flow.""" + helper = DragDropLabelTestHelper(self.page, self.root_selector) + + self.goto_add_page() + helper.execute_drag_leave_event() + helper.execute_drag_end_event() + helper.execute_drop_event() diff --git a/tests/helpers/reorder_test_helper.py b/tests/helpers/reorder_test_helper.py new file mode 100644 index 00000000..969edeb2 --- /dev/null +++ b/tests/helpers/reorder_test_helper.py @@ -0,0 +1,349 @@ +from typing import Callable, List + +from playwright.sync_api import ElementHandle, Page + +from tests.mixins.image_mock_mixin import ImageMockMixin + + +class ReorderTestHelper(ImageMockMixin): + root_selector = ".iuw-inline-root" + temp_input_selector = ".temp_file" + previews_selector = ".inline-related:not(.empty-form):not(.deleted)" + order_input_selector = 'input[name$="order"]' + preview_icon_selector = ".iuw-preview-icon" + delete_icon_selector = ".iuw-delete-icon" + form_selector = 'form[enctype="multipart/form-data"]' + drop_label_selector = ".iuw-drop-label" + + get_images_to_validate: Callable[[], list[str]] = None + + @property + def root(self): + """The widget root element.""" + return self.page.query_selector(self.root_selector) + + @property + def temp_input(self): + """The temporary file input, used to upload new images.""" + return self.root.query_selector(self.temp_input_selector) + + @property + def drop_label(self): + """The drop label of the widget.""" + return self.root.query_selector(self.drop_label_selector) + + @property + def previews(self): + """The widget preview elements.""" + return self.root.query_selector_all(self.previews_selector) + + def __init__( + self, + page: Page, + root_selector: str, + get_images_to_validate: Callable[[], list[str]], + ): + """Creates a new instance of ReorderTestHelper. + + Args: + page: a playwright `Page`. + root_selector: a css selector of the widget root. + get_images_to_validate: a callable function to return the + images ordered to made assertions. + """ + self.page = page + self.root_selector = root_selector + self.get_images_to_validate = get_images_to_validate + + def upload_file(self, file: str): + """Upload a file to temp file input.""" + self.temp_input.set_input_files(file) + + def wait_for_success_message(self): + """Wait and assert for the success message on the django-admin.""" + self.page.wait_for_selector(".messagelist .success", timeout=3000) + + def submit_form(self): + """Submit the form by clicking on an button or input with type=submit.""" + submit = self.page.query_selector(f'{self.form_selector} [type="submit"]') + submit.click() + self.wait_for_success_message() + + def get_order_input(self, preview: ElementHandle): + """Get the order input of the preview item. + + Args: + preview: The preview item element. + + Returns: + a `ElementHandle` that represents the order input, or None if it + was not found. + """ + return preview.query_selector(self.order_input_selector) + + def get_preview_icon(self, preview: ElementHandle): + """Get the preview icon (to open modal) of the preview item. + + Args: + preview: The preview item element. + + Returns: + a `ElementHandle` that represents the preview icon, or None if it + was not found. + """ + return preview.query_selector(self.preview_icon_selector) + + def get_delete_icon(self, preview: ElementHandle): + """Get the delete icon of the preview item. + + Args: + preview: The preview item element. + + Returns: + a `ElementHandle` that represents the delete icon, or None if it + was not found. + """ + return preview.query_selector(self.delete_icon_selector) + + def execute_upload_two_items_and_not_reorder(self): + """Execute a partial test-case of upload two images and not reorder it. + + Upload the `image1` and `image2` properties and, then, assert if length of + preview elements is two. Assert if image, preview button, remove button and + order input is ok. Then, submit the form and validate the saved images and + the order. + """ + self.upload_file(self.image1) + self.upload_file(self.image2) + assert len(self.previews) == 2 + + for index, preview in enumerate(self.previews): + img = preview.query_selector("img") + preview_button = self.get_preview_icon(preview) + remove_button = self.get_delete_icon(preview) + order_input = self.get_order_input(preview) + assert order_input.is_visible() == False + assert order_input.input_value() == str(index + 1) + assert img is not None + assert preview_button is not None + assert remove_button is not None + + self.submit_form() + + images = self.get_images_to_validate() + assert len(images) == 2 + assert "admin_test/image2" not in images[0] + assert "admin_test/image2" in images[1] + + def execute_reorder_two_items_from_first_to_last(self): + """Execute a partial test-case of upload two images and reorder it from first to last. + + Upload the `image1` and `image2` properties and, then, drag the first to the right side + of the second and assert is the reordering is ok. Then, submit the form and validate the + saved images and the order. + """ + self.upload_file(self.image1) + self.upload_file(self.image2) + + preview1, preview2 = self.previews + preview1.hover() + self.page.mouse.down() + preview2.hover(position={"x": 100, "y": 10}) + self.page.mouse.up() + + preview1_order = self.get_order_input(preview1).input_value() + preview2_order = self.get_order_input(preview2).input_value() + assert preview1_order == "2" + assert preview2_order == "1" + + self.submit_form() + + images = self.get_images_to_validate() + assert len(images) == 2 + assert "admin_test/image2" in images[0] + assert "admin_test/image2" not in images[1] + + def execute_reorder_two_items_from_last_to_first(self): + """Execute a partial test-case of upload two images and reorder it from last to first. + + Upload the `image1` and `image2` properties and, then, drag the second to the left side + of the first and assert is the reordering is ok. Then, submit the form and validate the + saved images and the order. + """ + self.upload_file(self.image1) + self.upload_file(self.image2) + + preview1, preview2 = self.previews + preview2.hover() + self.page.mouse.down() + preview1.hover(position={"x": 40, "y": 10}) + self.page.mouse.up() + + preview1_order = self.get_order_input(preview1).input_value() + preview2_order = self.get_order_input(preview2).input_value() + assert preview1_order == "2" + assert preview2_order == "1" + + self.submit_form() + + images = self.get_images_to_validate() + assert len(images) == 2 + assert "admin_test/image2" in images[0] + assert "admin_test/image2" not in images[1] + + def execute_reorder_three_items(self): + """Execute a partial test-case of upload three images and reorder it. + + Upload `image1`, `image2` and `image1` properties, then reorder first to second + and, then, reorder three to first. The last ordering status is: 3, 2, 1. Then + assert if the reordering is ok. For last, submit the form and validate the + saved images and the order. + """ + self.upload_file(self.image1) + self.upload_file(self.image2) + self.upload_file(self.image1) + + # Reorder 1 to 2 + preview1, preview2, preview3 = self.previews + preview1.hover() + self.page.mouse.down() + preview2.hover(position={"x": 100, "y": 10}) + self.page.mouse.up() + # Reorder 3 to 1 (now 2) + preview3.hover() + self.page.mouse.down() + preview2.hover(position={"x": 40, "y": 10}) + self.page.mouse.up() + + # The currently order is 3, 2, 1 + + preview1_order = self.get_order_input(preview1).input_value() + preview2_order = self.get_order_input(preview2).input_value() + preview3_order = self.get_order_input(preview3).input_value() + assert preview3_order == "1" + assert preview2_order == "2" + assert preview1_order == "3" + + self.submit_form() + + images = self.get_images_to_validate() + assert len(images) == 3 + assert "admin_test/image2" not in images[0] + assert "admin_test/image2" in images[1] + assert "admin_test/image2" not in images[2] + + def execute_reorder_with_deleted_item(self): + """Execute a partial test-case of reorder with deleted image. + + Upload `image1`, `image2` and `image1` properties, then reorder first to second + and. Then, delete the second image. Reorder three to first. The last ordering + status is: 3, 1 (2 is deleted). Then assert if the reordering is ok. For last, + submit the form and validate the saved images and the order. + """ + self.upload_file(self.image1) + self.upload_file(self.image2) + self.upload_file(self.image1) + + # Reorder 1 to 2 + preview1, preview2, preview3 = self.previews + preview1.hover() + self.page.mouse.down() + assert not self.drop_label.is_visible() + preview2.hover(position={"x": 100, "y": 10}) + self.page.mouse.up() + # Currently Order Is: 2 1 3 + delete_button = self.get_delete_icon(preview2) + delete_button.click() + # Reorder 3 to 1 + preview3.hover() + self.page.mouse.down() + assert not self.drop_label.is_visible() + preview1.hover(position={"x": 40, "y": 10}) + self.page.mouse.up() + + # The currently order is 3, 1 (2 is deleted) + + preview3_order = self.get_order_input(preview3).input_value() + preview1_order = self.get_order_input(preview1).input_value() + assert preview3_order == "1" + assert preview1_order == "2" + + self.submit_form() + + images = self.get_images_to_validate() + assert len(images), 2 + assert "admin_test/image2" not in images[0] + assert "admin_test/image2" not in images[1] + + def execute_reorder_and_delete_item(self): + """Execute a partial test-case of reorder and, then, delete image. + + Upload `image1`, `image2` and `image1` properties, then reorder first to second + and. Reorder three to first. The last ordering status is: 3, 2, 1. Delete the + second image. Then assert if the reordering is ok. For last, submit the form + and validate the saved images and the order. + """ + self.upload_file(self.image1) + self.upload_file(self.image2) + self.upload_file(self.image1) + + # Reorder 1 to 2 + preview1, preview2, preview3 = self.previews + preview1.hover() + self.page.mouse.down() + assert not self.drop_label.is_visible() + preview2.hover(position={"x": 100, "y": 10}) + self.page.mouse.up() + # Reorder 3 to 1 (now 2) + preview3.hover() + self.page.mouse.down() + assert not self.drop_label.is_visible() + preview2.hover(position={"x": 40, "y": 10}) + self.page.mouse.up() + + # The currently order is 3, 2, 1 + delete = self.get_delete_icon(preview2) + delete.click() + + preview3_order = self.get_order_input(preview3).input_value() + preview1_order = self.get_order_input(preview1).input_value() + assert preview3_order == "1" + assert preview1_order == "2" + + self.submit_form() + + images = self.get_images_to_validate() + assert len(images) == 2 + assert "admin_test/image2" not in images[0] + assert "admin_test/image2" not in images[1] + + def execute_initialized_item(self): + """Execute a partial test of initialized fields of a change form.""" + assert len(self.previews) == 2 + for index, preview in enumerate(self.previews): + order_input = self.get_order_input(preview) + assert not order_input.is_visible() + assert order_input.input_value() == str(index + 1) + + +class ReorderTestCaseMixin: + def get_images(self) -> List[str]: + return [] + + def test_reorder_flow(self): + """Test full reorder flow with various add pages.""" + helper = ReorderTestHelper(self.page, ".iuw-inline-root", self.get_images) + self.goto_add_page() + helper.execute_upload_two_items_and_not_reorder() + self.goto_add_page() + helper.execute_reorder_two_items_from_first_to_last() + self.goto_add_page() + helper.execute_reorder_two_items_from_last_to_first() + self.goto_add_page() + helper.execute_reorder_three_items() + self.goto_add_page() + helper.execute_reorder_with_deleted_item() + self.goto_add_page() + helper.execute_reorder_and_delete_item() + self.goto_change_page() + helper.execute_initialized_item() diff --git a/tests/mixins/__init__.py b/tests/mixins/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/mixins/image_mock_mixin.py b/tests/mixins/image_mock_mixin.py new file mode 100644 index 00000000..fab4a851 --- /dev/null +++ b/tests/mixins/image_mock_mixin.py @@ -0,0 +1,23 @@ +import os + + +class ImageMockMixin: + def _get_mock_image(self, name: str): + base_dir = os.path.dirname(__file__) + mocks_dir = os.path.join(base_dir, "..", "__mocks__") + return os.path.join(mocks_dir, name) + + @property + def image1(self): + """Get the file path of the image1.""" + return self._get_mock_image("image1.png") + + @property + def image2(self): + """Get the file path of the image2.""" + return self._get_mock_image("image2.png") + + @property + def image3(self): + """Get the file path of the image2.""" + return self._get_mock_image("image3.png") diff --git a/tests/models.py b/tests/models.py index 60e7f9ac..84fc97b6 100644 --- a/tests/models.py +++ b/tests/models.py @@ -82,7 +82,7 @@ class OrderedInlineItem(models.Model): parent = models.ForeignKey( OrderedInline, related_name="items", on_delete=models.CASCADE ) - image = models.ImageField("Image") + image = models.ImageField("Image", upload_to="admin_test") order = models.PositiveIntegerField("Order", default=1) diff --git a/tests/tests_functional/array_field/tests_functional_array_field.py b/tests/tests_functional/array_field/tests_functional_array_field.py index c098a288..991681b9 100644 --- a/tests/tests_functional/array_field/tests_functional_array_field.py +++ b/tests/tests_functional/array_field/tests_functional_array_field.py @@ -4,6 +4,28 @@ from django.test import tag from tests import models, test_case +from tests.helpers.drag_drop_label_test_helper import DragDropLabelTestCaseMixin +from tests.helpers.reorder_test_helper import ReorderTestCaseMixin +from tests.test_case import IUWTestCase + + +@tag("e2e", "array_field") +class ArrayFieldReorderTestCase(ReorderTestCaseMixin, IUWTestCase): + model = "testwitharrayfield" + + def goto_change_page(self): + instance = models.TestWithArrayField.objects.order_by("id").last() + super().goto_change_page(instance.pk) + + def get_images(self): + instance = models.TestWithArrayField.objects.order_by("id").last() + return instance.images + + +@tag("e2e", "array_field") +class ArrayFieldDragDropLabelTestCase(DragDropLabelTestCaseMixin, IUWTestCase): + model = "testwitharrayfield" + root_selector = ".iuw-inline-root" @tag("functional", "array_field") @@ -388,399 +410,3 @@ def test_should_change_image_of_item_when_change_image_on_inline(self): item = models.TestWithArrayField.objects.get(pk=self.item.pk) self.assertNotEqual(item.images[0], url1) - - def test_drop_label_leave(self): - self.goto_add_page() - - root = self.find_inline_root() - drop_label = self.find_drop_label() - - self.assertFalse(drop_label.is_visible()) - - data_transfer = self.page.evaluate_handle("() => new DataTransfer()") - root.dispatch_event("dragenter", {"dataTransfer": data_transfer}) - self.wait(0.5) - - self.assertTrue(drop_label.is_visible()) - - root.dispatch_event("dragleave", {"dataTransfer": data_transfer}) - self.wait(0.5) - - self.assertFalse(drop_label.is_visible()) - - def test_drop_label_drop(self): - self.goto_add_page() - - root = self.find_inline_root() - drop_label = self.find_drop_label() - - self.assertFalse(drop_label.is_visible()) - - data_transfer = self.page.evaluate_handle("() => new DataTransfer()") - root.dispatch_event("dragenter", {"dataTransfer": data_transfer}) - self.wait(0.5) - - self.assertTrue(drop_label.is_visible()) - - root.dispatch_event("drop", {"dataTransfer": data_transfer}) - self.wait(0.5) - - self.assertFalse(drop_label.is_visible()) - - def test_drop_label_end(self): - self.goto_add_page() - - root = self.find_inline_root() - drop_label = self.find_drop_label() - - self.assertFalse(drop_label.is_visible()) - - data_transfer = self.page.evaluate_handle("() => new DataTransfer()") - root.dispatch_event("dragenter", {"dataTransfer": data_transfer}) - self.wait(0.5) - - self.assertTrue(drop_label.is_visible()) - - root.dispatch_event("dragend", {"dataTransfer": data_transfer}) - self.wait(0.5) - - self.assertFalse(drop_label.is_visible()) - - def test_should_initialize_order_inputs_on_page(self): - self.goto_change_page(reverse=True) - - root = self.find_inline_root() - - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 2) - for index, preview in enumerate(previews): - order_input = self.find_inline_order(preview) - self.assertFalse(order_input.is_visible()) - self.assertEqual(order_input.input_value(), str(index + 1)) - - elements = root.query_selector_all( - ".inline-related:not(.empty-form):not(.deleted), .iuw-add-image-btn" - ) - classes = list(map(lambda x: x.get_attribute("class"), elements)) - self.assertEqual(classes.pop(), "iuw-add-image-btn visible-by-number") - - def test_should_reorder_two_items_from_first_to_last(self): - self.goto_add_page() - - root = self.find_inline_root() - temp_file = root.query_selector(".temp_file") - - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 0) - - temp_file.set_input_files(self.image1) - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 1) - - temp_file.set_input_files(self.image2) - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 2) - for index, preview in enumerate(previews): - img = preview.query_selector("img") - preview_button = self.find_preview_icon(preview) - remove_button = self.find_delete_icon(preview) - order_input = self.find_inline_order(preview) - self.assertFalse(order_input.is_visible()) - self.assertEqual(order_input.input_value(), str(index + 1)) - self.assertIsNotNone(img) - self.assertIsNotNone(preview_button) - self.assertIsNotNone(remove_button) - - # Reorder - preview1, preview2 = previews - preview1.hover() - self.page.mouse.down() - preview2.hover(position={"x": 100, "y": 10}) - self.page.mouse.up() - - order_input = self.find_inline_order(preview1) - self.assertEqual(order_input.input_value(), "2") - order_input = self.find_inline_order(preview2) - self.assertEqual(order_input.input_value(), "1") - - elements = root.query_selector_all( - ".inline-related:not(.empty-form):not(.deleted), .iuw-add-image-btn" - ) - classes = list(map(lambda x: x.get_attribute("class"), elements)) - self.assertEqual(classes.pop(), "iuw-add-image-btn visible-by-number") - - self.submit_form("#testwitharrayfield_form") - self.assert_success_message() - - item = models.TestWithArrayField.objects.first() - self.assertEqual(len(item.images), 2) - first, second = item.images - self.assertTrue("admin_test/image2" in first) - self.assertFalse("admin_test/image2" in second) - - def test_should_reorder_two_items_from_last_to_first(self): - self.goto_add_page() - - root = self.find_inline_root() - temp_file = root.query_selector(".temp_file") - - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 0) - - temp_file.set_input_files(self.image1) - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 1) - - temp_file.set_input_files(self.image2) - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 2) - for index, preview in enumerate(previews): - img = preview.query_selector("img") - preview_button = self.find_preview_icon(preview) - remove_button = self.find_delete_icon(preview) - order_input = self.find_inline_order(preview) - self.assertFalse(order_input.is_visible()) - self.assertEqual(order_input.input_value(), str(index + 1)) - self.assertIsNotNone(img) - self.assertIsNotNone(preview_button) - self.assertIsNotNone(remove_button) - - # Reorder - preview1, preview2 = previews - preview2.hover() - self.page.mouse.down() - preview1.hover(position={"x": 40, "y": 10}) - self.page.mouse.up() - - order_input = self.find_inline_order(preview1) - self.assertEqual(order_input.input_value(), "2") - order_input = self.find_inline_order(preview2) - self.assertEqual(order_input.input_value(), "1") - - elements = root.query_selector_all( - ".inline-related:not(.empty-form):not(.deleted), .iuw-add-image-btn" - ) - classes = list(map(lambda x: x.get_attribute("class"), elements)) - self.assertEqual(classes.pop(), "iuw-add-image-btn visible-by-number") - - self.submit_form("#testwitharrayfield_form") - self.assert_success_message() - - item = models.TestWithArrayField.objects.first() - self.assertEqual(len(item.images), 2) - first, second = item.images - self.assertTrue("admin_test/image2" in first) - self.assertFalse("admin_test/image2" in second) - - def test_should_reorder_three_items(self): - self.goto_add_page() - - root = self.find_inline_root() - temp_file = root.query_selector(".temp_file") - - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 0) - - temp_file.set_input_files(self.image1) - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 1) - - temp_file.set_input_files(self.image2) - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 2) - - temp_file.set_input_files(self.image1) - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 3) - - for index, preview in enumerate(previews): - img = preview.query_selector("img") - preview_button = self.find_preview_icon(preview) - remove_button = self.find_delete_icon(preview) - order_input = self.find_inline_order(preview) - self.assertFalse(order_input.is_visible()) - self.assertEqual(order_input.input_value(), str(index + 1)) - self.assertIsNotNone(img) - self.assertIsNotNone(preview_button) - self.assertIsNotNone(remove_button) - - # Reorder 1 to 2 - preview1, preview2, preview3 = previews - preview1.hover() - self.page.mouse.down() - preview2.hover(position={"x": 100, "y": 10}) - self.page.mouse.up() - # Reorder 3 to 1 (now 2) - preview3.hover() - self.page.mouse.down() - preview2.hover(position={"x": 40, "y": 10}) - self.page.mouse.up() - - # The currently order is 3, 2, 1 - - order_input = self.find_inline_order(preview3) - self.assertEqual(order_input.input_value(), "1") - order_input = self.find_inline_order(preview2) - self.assertEqual(order_input.input_value(), "2") - order_input = self.find_inline_order(preview1) - self.assertEqual(order_input.input_value(), "3") - - elements = root.query_selector_all( - ".inline-related:not(.empty-form):not(.deleted), .iuw-add-image-btn" - ) - classes = list(map(lambda x: x.get_attribute("class"), elements)) - self.assertEqual(classes.pop(), "iuw-add-image-btn visible-by-number") - - self.submit_form("#testwitharrayfield_form") - self.assert_success_message() - - item = models.TestWithArrayField.objects.first() - self.assertEqual(len(item.images), 3) - first, second, third = item.images - self.assertFalse("admin_test/image2" in first) - self.assertTrue("admin_test/image2" in second) - self.assertFalse("admin_test/image2" in third) - - def test_should_reorder_with_deleted_item(self): - self.goto_add_page() - - root = self.find_inline_root() - temp_file = root.query_selector(".temp_file") - - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 0) - - temp_file.set_input_files(self.image1) - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 1) - - temp_file.set_input_files(self.image2) - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 2) - - temp_file.set_input_files(self.image1) - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 3) - - for index, preview in enumerate(previews): - img = preview.query_selector("img") - preview_button = self.find_preview_icon(preview) - remove_button = self.find_delete_icon(preview) - order_input = self.find_inline_order(preview) - self.assertFalse(order_input.is_visible()) - self.assertEqual(order_input.input_value(), str(index + 1)) - self.assertIsNotNone(img) - self.assertIsNotNone(preview_button) - self.assertIsNotNone(remove_button) - - # Reorder 1 to 2 - preview1, preview2, preview3 = previews - preview1.hover() - self.page.mouse.down() - self.assertFalse(self.find_drop_label().is_visible()) - preview2.hover(position={"x": 100, "y": 10}) - self.page.mouse.up() - - # Currently Order Is: 2 1 3 - delete_button = self.find_delete_icon(preview2) - delete_button.click() - - # Reorder 3 to 1 - preview3.hover() - self.page.mouse.down() - self.assertFalse(self.find_drop_label().is_visible()) - preview1.hover(position={"x": 40, "y": 10}) - self.page.mouse.up() - - # The currently order is 3, 1 (2 is deleted) - - order_input = self.find_inline_order(preview3) - self.assertEqual(order_input.input_value(), "1") - order_input = self.find_inline_order(preview1) - self.assertEqual(order_input.input_value(), "2") - - elements = root.query_selector_all( - ".inline-related:not(.empty-form):not(.deleted), .iuw-add-image-btn" - ) - classes = list(map(lambda x: x.get_attribute("class"), elements)) - self.assertEqual(classes.pop(), "iuw-add-image-btn visible-by-number") - - self.submit_form("#testwitharrayfield_form") - self.assert_success_message() - - item = models.TestWithArrayField.objects.first() - self.assertEqual(len(item.images), 2) - first, second = item.images - self.assertFalse("admin_test/image2" in first) - self.assertFalse("admin_test/image2" in second) - - def test_should_reorder_and_delete_item(self): - self.goto_add_page() - - root = self.find_inline_root() - temp_file = root.query_selector(".temp_file") - - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 0) - - temp_file.set_input_files(self.image1) - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 1) - - temp_file.set_input_files(self.image2) - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 2) - - temp_file.set_input_files(self.image1) - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 3) - - for index, preview in enumerate(previews): - img = preview.query_selector("img") - preview_button = self.find_preview_icon(preview) - remove_button = self.find_delete_icon(preview) - order_input = self.find_inline_order(preview) - self.assertFalse(order_input.is_visible()) - self.assertEqual(order_input.input_value(), str(index + 1)) - self.assertIsNotNone(img) - self.assertIsNotNone(preview_button) - self.assertIsNotNone(remove_button) - - # Reorder 1 to 2 - preview1, preview2, preview3 = previews - preview1.hover() - self.page.mouse.down() - self.assertFalse(self.find_drop_label().is_visible()) - preview2.hover(position={"x": 100, "y": 10}) - self.page.mouse.up() - # Reorder 3 to 1 (now 2) - preview3.hover() - self.page.mouse.down() - self.assertFalse(self.find_drop_label().is_visible()) - preview2.hover(position={"x": 40, "y": 10}) - self.page.mouse.up() - - # The currently order is 3, 2, 1 - - delete = self.find_delete_icon(preview2) - delete.click() - - order_input = self.find_inline_order(preview3) - self.assertEqual(order_input.input_value(), "1") - order_input = self.find_inline_order(preview1) - self.assertEqual(order_input.input_value(), "2") - - elements = root.query_selector_all( - ".inline-related:not(.empty-form):not(.deleted), .iuw-add-image-btn" - ) - classes = list(map(lambda x: x.get_attribute("class"), elements)) - self.assertEqual(classes.pop(), "iuw-add-image-btn visible-by-number") - - self.submit_form("#testwitharrayfield_form") - self.assert_success_message() - - item = models.TestWithArrayField.objects.first() - self.assertEqual(len(item.images), 2) - first, second = item.images - self.assertFalse("admin_test/image2" in first) - self.assertFalse("admin_test/image2" in second) diff --git a/tests/tests_functional/htmx/__init__.py b/tests/tests_functional/htmx/__init__.py index e69de29b..49bf2e3b 100644 --- a/tests/tests_functional/htmx/__init__.py +++ b/tests/tests_functional/htmx/__init__.py @@ -0,0 +1,28 @@ +from tests.test_case import IUWTestCase + + +class HTMXTestCase(IUWTestCase): + input_selector = ".iuw-root input[type=file]" + root_selector = ".iuw-root" + skip_setup = False + + def load_htmx_widget(self): + """ + Select a button with .btn-load class and click on it and, then, wait for 0.4s. + """ + button = self.page.query_selector(".btn-load") + button.click() + self.wait(0.4) + + def goto_page(self): + raise NotImplementedError("goto_page() should be implemented.") + + def setUp(self): + super().setUp() + if self.skip_setup: + return + + self.goto_page() + self.load_htmx_widget() + + self.root = self.page.query_selector(self.root_selector) diff --git a/tests/tests_functional/htmx/tests_htmx_array_field.py b/tests/tests_functional/htmx/tests_htmx_array_field.py index f51a212e..f2f1a844 100644 --- a/tests/tests_functional/htmx/tests_htmx_array_field.py +++ b/tests/tests_functional/htmx/tests_htmx_array_field.py @@ -3,94 +3,81 @@ from django.core.files import File from django.test.utils import tag -from tests import models, test_case +from tests import models +from tests.helpers.drag_drop_label_test_helper import DragDropLabelTestCaseMixin +from tests.helpers.reorder_test_helper import ReorderTestCaseMixin +from . import HTMXTestCase -@tag("functional", "array_field", "htmx") -class HTMXWidgetOptionalTestCase(test_case.IUWTestCase): - def goto_add_page(self): - self.page.goto( - f"{self.live_server_url}/test-htmx/?destination=/test-htmx-image-widget/array_field/" - ) - - def goto_change_page(self, *, reverse=False, only_one=False): - self.item = self.init_item(reverse, only_one) - self.page.goto( - f"{self.live_server_url}/test-htmx/?destination=/test-htmx-image-widget/array_field/{self.item.pk}/" - ) - return self.item - def init_item(self, reverse=False, only_one=False): - images = [] +@tag("e2e", "htmx", "array_field") +class HTMXWidgetArrayFieldDragDropTestCase(DragDropLabelTestCaseMixin, HTMXTestCase): + skip_setup = True + root_selector = ".iuw-inline-root" - if reverse: - only_one = False + def goto_add_page(self): + endpoint = "test-htmx/?destination=/test-htmx-image-widget/array_field/" + self.page.goto(f"{self.live_server_url}/{endpoint}") + self.load_htmx_widget() - instance = None - with open(self.image1, "rb") as f1: - self.image1_name = f"{uuid.uuid4()}.png" - images = [*images, File(f1, self.image1_name)] - if not only_one: - with open(self.image2, "rb") as f2: - self.image2_name = f"{uuid.uuid4()}.png" - if reverse: - images = [File(f2, self.image2_name), *images] - else: - images = [*images, File(f2, self.image2_name)] +@tag("e2e", "htmx", "array_field") +class HTMXWidgetArrayFieldReorderTestCase(ReorderTestCaseMixin, HTMXTestCase): + skip_setup = True - instance = models.TestWithArrayField.objects.create(images=images) + def goto_add_page(self): + endpoint = "test-htmx/?destination=/test-htmx-image-widget/array_field/" + self.page.goto(f"{self.live_server_url}/{endpoint}") + self.load_htmx_widget() + + def goto_change_page(self): + instance = models.TestWithArrayField.objects.order_by("id").last() + endpoint = ( + f"test-htmx/?destination=/test-htmx-image-widget/array_field/{instance.pk}/" + ) + self.page.goto(f"{self.live_server_url}/{endpoint}") + self.load_htmx_widget() - else: - instance = models.TestWithArrayField.objects.create(images=images) + def get_images(self): + instance = models.TestWithArrayField.objects.order_by("id").last() + return instance.images - return instance - def load_widget(self): - button = self.page.query_selector(".btn-load") - button.click() - self.wait(0.4) +@tag("e2e", "htmx", "array_field") +class HTMXWidgetArrayFieldTestCase(HTMXTestCase): + input_selector = ".temp_file" + root_selector = ".iuw-inline-root" - def test_should_have_visible_empty_marker_when_no_images_array_field(self): - self.goto_add_page() - self.load_widget() + def goto_page(self): + endpoint = "test-htmx/?destination=/test-htmx-image-widget/array_field/" + self.page.goto(f"{self.live_server_url}/{endpoint}") - root = self.find_inline_root() - empty = self.find_empty_marker(root) - add_button = self.find_add_button(root) - self.wait(0.1) + def _have_empty_marker(self): + empty = self.find_empty_marker(self.root) + add_button = self.find_add_button(self.root) - self.assertIsNotNone(root) self.assertFalse(add_button.is_visible()) self.assertIsNotNone(empty) self.assertTrue(empty.is_visible()) - def test_should_fire_click_on_temporary_input_when_click_empty_marker(self): - self.goto_add_page() - self.load_widget() - - root = self.find_inline_root() - empty = self.find_empty_marker(root) - with self.assert_input_file_clicked(".temp_file"): - empty.click() - - def test_should_create_preview_when_select_and_upload_when_submit(self): - self.assertEqual(len(models.TestWithArrayField.objects.all()), 0) - self.goto_add_page() - self.load_widget() + def _click_on_empty(self): + with self.assert_input_file_clicked(input_selector=self.input_selector): + empty_marker = self.find_empty_marker() + self.assertTrue(empty_marker.is_visible()) + empty_marker.click() - root = self.find_inline_root() - temp_file = root.query_selector(".temp_file") + def _upload_files(self): + temp_file = self.root.query_selector(".temp_file") - previews = self.find_inline_previews(root) + previews = self.find_inline_previews(self.root) self.assertEqual(len(previews), 0) temp_file.set_input_files(self.image1) - previews = self.find_inline_previews(root) + previews = self.find_inline_previews(self.root) self.assertEqual(len(previews), 1) temp_file.set_input_files(self.image2) - previews = self.find_inline_previews(root) + previews = self.find_inline_previews(self.root) self.assertEqual(len(previews), 2) for preview in previews: @@ -101,43 +88,23 @@ def test_should_create_preview_when_select_and_upload_when_submit(self): self.assertIsNotNone(preview_button) self.assertIsNotNone(remove_button) - self.submit_form("#my-widget-form") - self.assert_success_message() + def _remove_not_uploaded_file(self): + temp_file = self.root.query_selector(".temp_file") + temp_file.set_input_files(self.image3) - item = models.TestWithArrayField.objects.first() - self.assertIsNotNone(item) - self.assertEqual(len(item.images), 2) - for url in item.images: - self.assertIsNotNone(url) - - def test_should_remove_preview_and_not_save_when_not_saved(self): - self.assertEqual(len(models.TestWithArrayField.objects.all()), 0) - self.goto_add_page() - self.load_widget() - - root = self.find_inline_root() - temp_file = root.query_selector(".temp_file") - temp_file.set_input_files(self.image1) - - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 1) - - self.find_delete_icon(previews[0]).click() - self.assertEqual(len(self.find_inline_previews(root)), 0) - - self.submit_form("#my-widget-form") - self.assert_success_message() + previews = self.find_inline_previews(self.root) + self.assertEqual(len(previews), 3) - item = models.TestWithArrayField.objects.first() - self.assertIsNotNone(item) - self.assertEqual(len(item.images), 0) + self.find_delete_icon(previews[2]).click() + self.assertEqual(len(self.find_inline_previews(self.root)), 2) - def test_should_have_initialized_with_data_when_go_to_edit_page(self): - self.goto_change_page() - self.load_widget() + def _goto_edit_page(self): + endpoint = f"test-htmx/?destination=/test-htmx-image-widget/array_field/{self.item.pk}/" + self.page.goto(f"{self.live_server_url}/{endpoint}") + self.load_htmx_widget() + self.root = self.find_inline_root() - root = self.find_inline_root() - previews = self.find_inline_previews(root) + previews = self.find_inline_previews(self.root) self.assertEqual(len(previews), 2) for index, preview in enumerate(previews): @@ -154,18 +121,14 @@ def test_should_have_initialized_with_data_when_go_to_edit_page(self): else: self.assertTrue(self.item.images[1] in src) - def test_should_remove_saved_items_when_edit(self): - self.goto_change_page() - self.load_widget() - - root = self.find_inline_root() - previews = self.find_inline_previews(root) + def _remove_saved_image(self): + previews = self.find_inline_previews(self.root) self.assertEqual(len(previews), 2) for preview in previews: self.find_delete_icon(preview).click() - previews = self.find_inline_previews(root) + previews = self.find_inline_previews(self.root) self.assertEqual(len(previews), 0) self.submit_form("#my-widget-form") @@ -174,97 +137,44 @@ def test_should_remove_saved_items_when_edit(self): item = models.TestWithArrayField.objects.get(pk=self.item.pk) self.assertEqual(len(item.images), 0) - def test_should_fire_input_click_when_click_on_preview_image(self): - self.goto_change_page() - self.load_widget() - - root = self.find_inline_root() - previews = self.find_inline_previews(root) + def _click_preview_image(self): + previews = self.find_inline_previews(self.root) self.assertEqual(len(previews), 2) - with self.assert_input_file_clicked( - ".inline-related:not(.empty-form):not(.deleted) input[type=file]", 0 - ): - preview = previews[0] - img = preview.query_selector("img") - img.click() - - with self.assert_input_file_clicked( - ".inline-related:not(.empty-form):not(.deleted) input[type=file]", 1 - ): - preview = previews[1] - img = preview.query_selector("img") - img.click() - - def test_should_fire_temp_file_click_when_click_on_add_button(self): - self.goto_change_page(only_one=True) - self.load_widget() - - root = self.find_inline_root() - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 1) + selector = ".inline-related:not(.empty-form):not(.deleted) input[type=file]" + for index, preview in enumerate(previews): + with self.assert_input_file_clicked(selector, index): + img = preview.query_selector("img") + img.click() + def _click_on_add_button(self): with self.assert_input_file_clicked(".temp_file"): - add_button = self.find_add_button(root) + add_button = self.find_add_button(self.root) self.assertTrue(add_button.is_visible()) add_button.click() - def test_should_open_preview_modal_when_click_preview_button(self): - self.goto_change_page(only_one=True) - self.load_widget() - - root = self.find_inline_root() - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 1) - - preview = previews[0] - preview_img = preview.query_selector("img") - self.find_preview_icon(preview).click() - self.assert_preview_modal(preview_img) - - def test_should_not_close_preview_modal_when_click_image(self): - self.goto_change_page(only_one=True) - self.load_widget() - - root = self.find_inline_root() - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 1) - - preview = previews[0] - preview_img = preview.query_selector("img") - self.find_preview_icon(preview).click() - self.assert_preview_modal(preview_img) - - preview_modal = self.get_preview_modal(True, 3000) - img = preview_modal.query_selector("img") - img.click() - self.wait(0.5) - self.assertEqual(preview_modal.get_attribute("class"), "iuw-modal visible") - - def test_should_close_preview_modal_when_click_close_button(self): - self.goto_change_page(only_one=True) - self.load_widget() + def _preview_modal(self): + previews = self.find_inline_previews(self.root) + self.assertEqual(len(previews), 2) - root = self.find_inline_root() - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 1) + for preview in previews: + preview_img = preview.query_selector("img") + self.find_preview_icon(preview).click() + self.assert_preview_modal(preview_img) - preview = previews[0] - preview_img = preview.query_selector("img") - self.find_preview_icon(preview).click() - self.assert_preview_modal(preview_img) - self.assert_preview_modal_close() + preview_modal = self.get_preview_modal(True, 3000) + img = preview_modal.query_selector("img") + img.click() + self.wait(0.5) + self.assertEqual(preview_modal.get_attribute("class"), "iuw-modal visible") - def test_should_change_image_of_item_when_change_image_on_inline(self): - self.goto_change_page() - self.load_widget() + self.assert_preview_modal_close() - root = self.find_inline_root() - previews = self.find_inline_previews(root) + def _change_image(self): + previews = self.find_inline_previews(self.root) self.assertEqual(len(previews), 2) url1 = self.item.images[0] - preview = previews[0] preview_img = preview.query_selector("img") preview_src = preview_img.get_attribute("src") @@ -280,407 +190,29 @@ def test_should_change_image_of_item_when_change_image_on_inline(self): item = models.TestWithArrayField.objects.get(pk=self.item.pk) self.assertNotEqual(item.images[0], url1) - def test_drop_label_leave(self): - self.goto_add_page() - self.load_widget() - - root = self.find_inline_root() - drop_label = self.find_drop_label() - - self.assertFalse(drop_label.is_visible()) - - data_transfer = self.page.evaluate_handle("() => new DataTransfer()") - root.dispatch_event("dragenter", {"dataTransfer": data_transfer}) - self.wait(0.5) - - self.assertTrue(drop_label.is_visible()) - - root.dispatch_event("dragleave", {"dataTransfer": data_transfer}) - self.wait(0.5) - - self.assertFalse(drop_label.is_visible()) - - def test_drop_label_drop(self): - self.goto_add_page() - self.load_widget() - - root = self.find_inline_root() - drop_label = self.find_drop_label() - - self.assertFalse(drop_label.is_visible()) - - data_transfer = self.page.evaluate_handle("() => new DataTransfer()") - root.dispatch_event("dragenter", {"dataTransfer": data_transfer}) - self.wait(0.5) - - self.assertTrue(drop_label.is_visible()) - - root.dispatch_event("drop", {"dataTransfer": data_transfer}) - self.wait(0.5) - - self.assertFalse(drop_label.is_visible()) - - def test_drop_label_end(self): - self.goto_add_page() - self.load_widget() - - root = self.find_inline_root() - drop_label = self.find_drop_label() - - self.assertFalse(drop_label.is_visible()) - - data_transfer = self.page.evaluate_handle("() => new DataTransfer()") - root.dispatch_event("dragenter", {"dataTransfer": data_transfer}) - self.wait(0.5) - - self.assertTrue(drop_label.is_visible()) - - root.dispatch_event("dragend", {"dataTransfer": data_transfer}) - self.wait(0.5) - - self.assertFalse(drop_label.is_visible()) - - def test_should_initialize_order_inputs_on_page(self): - self.goto_change_page(reverse=True) - self.load_widget() - - root = self.find_inline_root() - - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 2) - for index, preview in enumerate(previews): - order_input = self.find_inline_order(preview) - self.assertFalse(order_input.is_visible()) - self.assertEqual(order_input.input_value(), str(index + 1)) - - elements = root.query_selector_all( - ".inline-related:not(.empty-form):not(.deleted), .iuw-add-image-btn" - ) - classes = list(map(lambda x: x.get_attribute("class"), elements)) - self.assertEqual(classes.pop(), "iuw-add-image-btn visible-by-number") - - def test_should_reorder_two_items_from_first_to_last(self): - self.goto_add_page() - self.load_widget() - - root = self.find_inline_root() - temp_file = root.query_selector(".temp_file") - - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 0) - - temp_file.set_input_files(self.image1) - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 1) - - temp_file.set_input_files(self.image2) - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 2) - for index, preview in enumerate(previews): - img = preview.query_selector("img") - preview_button = self.find_preview_icon(preview) - remove_button = self.find_delete_icon(preview) - order_input = self.find_inline_order(preview) - self.assertFalse(order_input.is_visible()) - self.assertEqual(order_input.input_value(), str(index + 1)) - self.assertIsNotNone(img) - self.assertIsNotNone(preview_button) - self.assertIsNotNone(remove_button) - - # Reorder - preview1, preview2 = previews - preview1.hover() - self.page.mouse.down() - preview2.hover(position={"x": 100, "y": 10}) - self.page.mouse.up() - - order_input = self.find_inline_order(preview1) - self.assertEqual(order_input.input_value(), "2") - order_input = self.find_inline_order(preview2) - self.assertEqual(order_input.input_value(), "1") - - elements = root.query_selector_all( - ".inline-related:not(.empty-form):not(.deleted), .iuw-add-image-btn" - ) - classes = list(map(lambda x: x.get_attribute("class"), elements)) - self.assertEqual(classes.pop(), "iuw-add-image-btn visible-by-number") + def test_htmx_array_field_add_flow(self): + self._have_empty_marker() + self._click_on_empty() + self._upload_files() + self._remove_not_uploaded_file() + self._click_preview_image() + self._click_on_add_button() + self._preview_modal() self.submit_form("#my-widget-form") self.assert_success_message() - item = models.TestWithArrayField.objects.first() - self.assertEqual(len(item.images), 2) - first, second = item.images - self.assertTrue("admin_test/image2" in first) - self.assertFalse("admin_test/image2" in second) - - def test_should_reorder_two_items_from_last_to_first(self): - self.goto_add_page() - self.load_widget() - - root = self.find_inline_root() - temp_file = root.query_selector(".temp_file") - - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 0) - - temp_file.set_input_files(self.image1) - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 1) - - temp_file.set_input_files(self.image2) - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 2) - for index, preview in enumerate(previews): - img = preview.query_selector("img") - preview_button = self.find_preview_icon(preview) - remove_button = self.find_delete_icon(preview) - order_input = self.find_inline_order(preview) - self.assertFalse(order_input.is_visible()) - self.assertEqual(order_input.input_value(), str(index + 1)) - self.assertIsNotNone(img) - self.assertIsNotNone(preview_button) - self.assertIsNotNone(remove_button) - - # Reorder - preview1, preview2 = previews - preview2.hover() - self.page.mouse.down() - preview1.hover(position={"x": 40, "y": 10}) - self.page.mouse.up() - - order_input = self.find_inline_order(preview1) - self.assertEqual(order_input.input_value(), "2") - order_input = self.find_inline_order(preview2) - self.assertEqual(order_input.input_value(), "1") - - elements = root.query_selector_all( - ".inline-related:not(.empty-form):not(.deleted), .iuw-add-image-btn" - ) - classes = list(map(lambda x: x.get_attribute("class"), elements)) - self.assertEqual(classes.pop(), "iuw-add-image-btn visible-by-number") - - self.submit_form("#my-widget-form") - self.assert_success_message() - - item = models.TestWithArrayField.objects.first() - self.assertEqual(len(item.images), 2) - first, second = item.images - self.assertTrue("admin_test/image2" in first) - self.assertFalse("admin_test/image2" in second) - - def test_should_reorder_three_items(self): - self.goto_add_page() - self.load_widget() - - root = self.find_inline_root() - temp_file = root.query_selector(".temp_file") - - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 0) - - temp_file.set_input_files(self.image1) - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 1) - - temp_file.set_input_files(self.image2) - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 2) - - temp_file.set_input_files(self.image1) - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 3) - - for index, preview in enumerate(previews): - img = preview.query_selector("img") - preview_button = self.find_preview_icon(preview) - remove_button = self.find_delete_icon(preview) - order_input = self.find_inline_order(preview) - self.assertFalse(order_input.is_visible()) - self.assertEqual(order_input.input_value(), str(index + 1)) - self.assertIsNotNone(img) - self.assertIsNotNone(preview_button) - self.assertIsNotNone(remove_button) - - # Reorder 1 to 2 - preview1, preview2, preview3 = previews - preview1.hover() - self.page.mouse.down() - preview2.hover(position={"x": 100, "y": 10}) - self.page.mouse.up() - # Reorder 3 to 1 (now 2) - preview3.hover() - self.page.mouse.down() - preview2.hover(position={"x": 40, "y": 10}) - self.page.mouse.up() - - # The currently order is 3, 2, 1 - - order_input = self.find_inline_order(preview3) - self.assertEqual(order_input.input_value(), "1") - order_input = self.find_inline_order(preview2) - self.assertEqual(order_input.input_value(), "2") - order_input = self.find_inline_order(preview1) - self.assertEqual(order_input.input_value(), "3") - - elements = root.query_selector_all( - ".inline-related:not(.empty-form):not(.deleted), .iuw-add-image-btn" - ) - classes = list(map(lambda x: x.get_attribute("class"), elements)) - self.assertEqual(classes.pop(), "iuw-add-image-btn visible-by-number") - - self.submit_form("#my-widget-form") - self.assert_success_message() - - item = models.TestWithArrayField.objects.first() - self.assertEqual(len(item.images), 3) - first, second, third = item.images - self.assertFalse("admin_test/image2" in first) - self.assertTrue("admin_test/image2" in second) - self.assertFalse("admin_test/image2" in third) - - def test_should_reorder_with_deleted_item(self): - self.goto_add_page() - self.load_widget() - - root = self.find_inline_root() - temp_file = root.query_selector(".temp_file") - - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 0) - - temp_file.set_input_files(self.image1) - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 1) - - temp_file.set_input_files(self.image2) - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 2) - - temp_file.set_input_files(self.image1) - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 3) - - for index, preview in enumerate(previews): - img = preview.query_selector("img") - preview_button = self.find_preview_icon(preview) - remove_button = self.find_delete_icon(preview) - order_input = self.find_inline_order(preview) - self.assertFalse(order_input.is_visible()) - self.assertEqual(order_input.input_value(), str(index + 1)) - self.assertIsNotNone(img) - self.assertIsNotNone(preview_button) - self.assertIsNotNone(remove_button) - - # Reorder 1 to 2 - preview1, preview2, preview3 = previews - preview1.hover() - self.page.mouse.down() - self.assertFalse(self.find_drop_label().is_visible()) - preview2.hover(position={"x": 100, "y": 10}) - self.page.mouse.up() - - # Currently Order Is: 2 1 3 - delete_button = self.find_delete_icon(preview2) - delete_button.click() - - # Reorder 3 to 1 - preview3.hover() - self.page.mouse.down() - self.assertFalse(self.find_drop_label().is_visible()) - preview1.hover(position={"x": 40, "y": 10}) - self.page.mouse.up() - - # The currently order is 3, 1 (2 is deleted) - - order_input = self.find_inline_order(preview3) - self.assertEqual(order_input.input_value(), "1") - order_input = self.find_inline_order(preview1) - self.assertEqual(order_input.input_value(), "2") - - elements = root.query_selector_all( - ".inline-related:not(.empty-form):not(.deleted), .iuw-add-image-btn" - ) - classes = list(map(lambda x: x.get_attribute("class"), elements)) - self.assertEqual(classes.pop(), "iuw-add-image-btn visible-by-number") - - self.submit_form("#my-widget-form") - self.assert_success_message() - - item = models.TestWithArrayField.objects.first() - self.assertEqual(len(item.images), 2) - first, second = item.images - self.assertFalse("admin_test/image2" in first) - self.assertFalse("admin_test/image2" in second) - - def test_should_reorder_and_delete_item(self): - self.goto_add_page() - self.load_widget() - - root = self.find_inline_root() - temp_file = root.query_selector(".temp_file") - - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 0) - - temp_file.set_input_files(self.image1) - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 1) - - temp_file.set_input_files(self.image2) - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 2) - - temp_file.set_input_files(self.image1) - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 3) - - for index, preview in enumerate(previews): - img = preview.query_selector("img") - preview_button = self.find_preview_icon(preview) - remove_button = self.find_delete_icon(preview) - order_input = self.find_inline_order(preview) - self.assertFalse(order_input.is_visible()) - self.assertEqual(order_input.input_value(), str(index + 1)) - self.assertIsNotNone(img) - self.assertIsNotNone(preview_button) - self.assertIsNotNone(remove_button) - - # Reorder 1 to 2 - preview1, preview2, preview3 = previews - preview1.hover() - self.page.mouse.down() - self.assertFalse(self.find_drop_label().is_visible()) - preview2.hover(position={"x": 100, "y": 10}) - self.page.mouse.up() - # Reorder 3 to 1 (now 2) - preview3.hover() - self.page.mouse.down() - self.assertFalse(self.find_drop_label().is_visible()) - preview2.hover(position={"x": 40, "y": 10}) - self.page.mouse.up() - - # The currently order is 3, 2, 1 - - delete = self.find_delete_icon(preview2) - delete.click() - - order_input = self.find_inline_order(preview3) - self.assertEqual(order_input.input_value(), "1") - order_input = self.find_inline_order(preview1) - self.assertEqual(order_input.input_value(), "2") - - elements = root.query_selector_all( - ".inline-related:not(.empty-form):not(.deleted), .iuw-add-image-btn" - ) - classes = list(map(lambda x: x.get_attribute("class"), elements)) - self.assertEqual(classes.pop(), "iuw-add-image-btn visible-by-number") + self.item = models.TestWithArrayField.objects.first() + self.assertIsNotNone(self.item) + self.assertEqual(len(self.item.images), 2) + for url in self.item.images: + self.assertIsNotNone(url) - self.submit_form("#my-widget-form") - self.assert_success_message() + self._goto_edit_page() + self._change_image() - item = models.TestWithArrayField.objects.first() - self.assertEqual(len(item.images), 2) - first, second = item.images - self.assertFalse("admin_test/image2" in first) - self.assertFalse("admin_test/image2" in second) + endpoint = f"test-htmx/?destination=/test-htmx-image-widget/array_field/{self.item.pk}/" + self.page.goto(f"{self.live_server_url}/{endpoint}") + self.load_htmx_widget() + self.root = self.find_inline_root() + self._remove_saved_image() diff --git a/tests/tests_functional/htmx/tests_htmx_widget_optional.py b/tests/tests_functional/htmx/tests_htmx_widget_optional.py index ca079029..09f151b3 100644 --- a/tests/tests_functional/htmx/tests_htmx_widget_optional.py +++ b/tests/tests_functional/htmx/tests_htmx_widget_optional.py @@ -1,59 +1,42 @@ -from django.core.files import File from django.test.utils import tag -from tests import models, test_case +from tests import models +from tests.helpers.drag_drop_label_test_helper import DragDropLabelTestCaseMixin +from . import HTMXTestCase + + +@tag("e2e", "htmx") +class HTMXWidgetOptionalAddDragDropTestCase(DragDropLabelTestCaseMixin, HTMXTestCase): + root_selector = ".iuw-root" + skip_setup = True -@tag("functional", "functional_widget", "widget", "htmx") -class HTMXWidgetOptionalTestCase(test_case.IUWTestCase): def goto_add_page(self): - self.page.goto( - f"{self.live_server_url}/test-htmx/?destination=/test-htmx-image-widget/optional/" - ) + endpoint = "test-htmx/?destination=/test-htmx-image-widget/optional/" + self.page.goto(f"{self.live_server_url}/{endpoint}") + self.load_htmx_widget() - def goto_change_page(self): - item = self.init_item() - self.page.goto( - f"{self.live_server_url}/test-htmx/?destination=/test-htmx-image-widget/optional/{item.pk}/" - ) - return item - - def init_item(self): - item = models.TestNonRequired() - with open(self.image1, "rb") as f: - item.image.save("image.png", File(f), False) - item.save() - return item - - def load_widget(self): - button = self.page.query_selector(".btn-load") - button.click() - self.wait(0.4) - - def test_empty_marker_click(self): - self.goto_add_page() - self.load_widget() - - with self.assert_input_file_clicked( - input_selector=".iuw-root input[type=file]" - ): + +@tag("e2e", "htmx") +class HTMXWidgetOptionalAddTestCase(HTMXTestCase): + def goto_page(self): + endpoint = "test-htmx/?destination=/test-htmx-image-widget/optional/" + self.page.goto(f"{self.live_server_url}/{endpoint}") + + def _click_on_empty(self): + with self.assert_input_file_clicked(input_selector=self.input_selector): empty_marker = self.find_empty_marker() self.assertTrue(empty_marker.is_visible()) empty_marker.click() - def test_non_required_file_input(self): - self.assertEqual(models.TestNonRequired.objects.count(), 0) - self.goto_add_page() - self.load_widget() - - form_row = self.page.query_selector(".iuw-root") - preview = self.find_widget_preview(form_row) + def _upload_image(self): + preview = self.find_widget_preview(self.root) self.assertFalse(preview.is_visible()) - file_input = form_row.query_selector("input[type=file]") + file_input = self.root.query_selector("input[type=file]") file_input.set_input_files(self.image1) - preview = self.find_widget_preview(form_row) + preview = self.find_widget_preview(self.root) self.assertIsNotNone(preview) img = preview.query_selector("img") @@ -64,41 +47,12 @@ def test_non_required_file_input(self): self.assertIsNotNone(preview_button) self.assertIsNotNone(delete_button) - self.submit_form("#my-widget-form") - self.assert_success_message() - - items = models.TestNonRequired.objects.all() - self.assertEqual(len(items), 1) - self.assertIsNotNone(items[0].image) - - def test_remove_button_with_non_saved_image(self): - self.assertEqual(models.TestNonRequired.objects.count(), 0) - self.goto_add_page() - self.load_widget() - - form_row = self.page.query_selector(".iuw-root") - file_input = form_row.query_selector("input[type=file]") - file_input.set_input_files(self.image2) - - preview = self.find_widget_preview(form_row) - self.assertIsNotNone(preview) - delete_button = self.find_delete_icon(preview) - delete_button.click() - - preview = self.find_widget_preview(form_row) - self.assertFalse(preview.is_visible()) - - def test_image_with_database_data(self): - item = self.goto_change_page() - self.load_widget() - - root = self.page.query_selector(".iuw-root") - - preview = self.find_widget_preview(root) + def _initialized_data(self): + preview = self.find_widget_preview(self.root) self.assertIsNotNone(preview) - self.assertEqual(root.get_attribute("data-raw"), item.image.url) + self.assertEqual(self.root.get_attribute("data-raw"), self.item.image.url) - empty_marker = self.find_empty_marker(root) + empty_marker = self.find_empty_marker(self.root) self.assertFalse(empty_marker.is_visible()) img = preview.query_selector("img") @@ -106,17 +60,13 @@ def test_image_with_database_data(self): delete_button = self.find_delete_icon(preview) self.assertTrue(preview.is_visible()) self.assertIsNotNone(img) - self.assertTrue(item.image.url in img.get_attribute("src")) + self.assertTrue(self.item.image.url in img.get_attribute("src")) self.assertIsNotNone(preview_button) self.assertIsNotNone(delete_button) - def test_delete_saved_image(self): - self.goto_change_page() - self.load_widget() - - form_row = self.page.query_selector(".iuw-root") - checkbox = form_row.query_selector("[type=checkbox]") - preview = self.find_widget_preview(form_row) + def _delete_saved_image(self): + checkbox = self.root.query_selector("[type=checkbox]") + preview = self.find_widget_preview(self.root) self.assertIsNotNone(preview) self.assertFalse(checkbox.is_checked()) @@ -124,7 +74,7 @@ def test_delete_saved_image(self): delete_button = self.find_delete_icon(preview) delete_button.click() - preview = self.find_widget_preview(form_row) + preview = self.find_widget_preview(self.root) self.assertFalse(preview.is_visible()) self.assertTrue(checkbox.is_checked()) @@ -136,143 +86,62 @@ def test_delete_saved_image(self): self.assertEqual(len(items), 1) self.assertFalse(bool(items[0].image)) - def test_click_on_the_preview_image(self): - self.goto_add_page() - self.load_widget() - - form_row = self.page.query_selector(".iuw-root") - preview = self.find_widget_preview(form_row) - self.assertFalse(preview.is_visible()) - file_input = form_row.query_selector("input[type=file]") - file_input.set_input_files(self.image1) - - with self.assert_input_file_clicked( - input_selector=".iuw-root input[type=file]" - ): - preview = self.find_widget_preview(form_row) - self.assertIsNotNone(preview) - img = preview.query_selector("img") - img.click() - - def test_click_on_the_preview_button(self): - self.goto_add_page() - self.load_widget() - - form_row = self.page.query_selector(".iuw-root") - preview = self.find_widget_preview(form_row) - self.assertFalse(preview.is_visible()) - file_input = form_row.query_selector("input[type=file]") + def _remove_non_saved_image(self): + file_input = self.root.query_selector("input[type=file]") file_input.set_input_files(self.image2) - preview = self.find_widget_preview(form_row) + preview = self.find_widget_preview(self.root) self.assertIsNotNone(preview) - preview_img = preview.query_selector("img") - preview_button = self.find_preview_icon(form_row) - preview_button.click() - - self.assert_preview_modal(preview_img) - - def test_click_on_the_preview_button_and_image_on_modal(self): - self.goto_add_page() - self.load_widget() + delete_button = self.find_delete_icon(preview) + delete_button.click() - form_row = self.page.query_selector(".iuw-root") - preview = self.find_widget_preview(form_row) + preview = self.find_widget_preview(self.root) self.assertFalse(preview.is_visible()) - file_input = form_row.query_selector("input[type=file]") - file_input.set_input_files(self.image2) + def _click_on_preview(self): + with self.assert_input_file_clicked(input_selector=self.input_selector): + preview = self.find_widget_preview(self.root) + img = preview.query_selector("img") + img.click() - preview = self.find_widget_preview(form_row) - self.assertIsNotNone(preview) + def _preview_modal(self): + preview = self.find_widget_preview(self.root) preview_img = preview.query_selector("img") - preview_button = self.find_preview_icon(form_row) + preview_button = self.find_preview_icon(preview) preview_button.click() - self.assert_preview_modal(preview_img) - preview_modal = self.get_preview_modal() + + preview_modal = self.get_preview_modal(True, 3000) img = preview_modal.query_selector("img") img.click() self.wait(0.5) self.assertEqual(preview_modal.get_attribute("class"), "iuw-modal visible") - def test_click_on_the_preview_button_and_close_on_modal(self): - self.goto_add_page() - self.load_widget() - - form_row = self.page.query_selector(".iuw-root") - preview = self.find_widget_preview(form_row) - self.assertFalse(preview.is_visible()) - - file_input = form_row.query_selector("input[type=file]") - file_input.set_input_files(self.image2) - - preview = self.find_widget_preview(form_row) - self.assertIsNotNone(preview) - preview_img = preview.query_selector("img") - preview_button = self.find_preview_icon(form_row) - preview_button.click() - - self.assert_preview_modal(preview_img) self.assert_preview_modal_close() - def test_drop_label_leave(self): - self.goto_add_page() - self.load_widget() - - root = self.page.query_selector(".iuw-root") - drop_label = self.find_drop_label() - - self.assertFalse(drop_label.is_visible()) - - data_transfer = self.page.evaluate_handle("() => new DataTransfer()") - root.dispatch_event("dragenter", {"dataTransfer": data_transfer}) - self.wait(0.5) - - self.assertTrue(drop_label.is_visible()) - - root.dispatch_event("dragleave", {"dataTransfer": data_transfer}) - self.wait(0.5) + def test_htmx_widget_optional_add_page_flow(self): + self._click_on_empty() + self._upload_image() + self._remove_non_saved_image() + self._upload_image() + self._click_on_preview() + self._preview_modal() - self.assertFalse(drop_label.is_visible()) - - def test_drop_label_drop(self): - self.goto_add_page() - self.load_widget() - - root = self.page.query_selector(".iuw-root") - drop_label = self.find_drop_label() - - self.assertFalse(drop_label.is_visible()) - - data_transfer = self.page.evaluate_handle("() => new DataTransfer()") - root.dispatch_event("dragenter", {"dataTransfer": data_transfer}) - self.wait(0.5) - - self.assertTrue(drop_label.is_visible()) - - root.dispatch_event("drop", {"dataTransfer": data_transfer}) - self.wait(0.5) - - self.assertFalse(drop_label.is_visible()) - - def test_drop_label_end(self): - self.goto_add_page() - self.load_widget() - - root = self.page.query_selector(".iuw-root") - drop_label = self.find_drop_label() - - self.assertFalse(drop_label.is_visible()) - - data_transfer = self.page.evaluate_handle("() => new DataTransfer()") - root.dispatch_event("dragenter", {"dataTransfer": data_transfer}) - self.wait(0.5) + self.submit_form("#my-widget-form") + self.assert_success_message() - self.assertTrue(drop_label.is_visible()) + items = models.TestNonRequired.objects.all() + self.assertEqual(len(items), 1) + self.assertIsNotNone(items[0].image) - root.dispatch_event("dragend", {"dataTransfer": data_transfer}) - self.wait(0.5) + endpoint = ( + f"test-htmx/?destination=/test-htmx-image-widget/optional/{items[0].pk}/" + ) + self.page.goto(f"{self.live_server_url}/{endpoint}") + self.load_htmx_widget() + self.root = self.page.query_selector(self.root_selector) + self.item = items[0] - self.assertFalse(drop_label.is_visible()) + self._initialized_data() + self._delete_saved_image() diff --git a/tests/tests_functional/htmx/tests_htmx_widget_required.py b/tests/tests_functional/htmx/tests_htmx_widget_required.py index d13c9d9e..6e626909 100644 --- a/tests/tests_functional/htmx/tests_htmx_widget_required.py +++ b/tests/tests_functional/htmx/tests_htmx_widget_required.py @@ -1,229 +1,102 @@ from django.core.files import File from django.test import tag -from tests import models, test_case +from tests import models +from tests.helpers.drag_drop_label_test_helper import DragDropLabelTestCaseMixin +from . import HTMXTestCase + + +@tag("e2e", "htmx") +class HTMXWidgetRequiredDragDropTestCase(DragDropLabelTestCaseMixin, HTMXTestCase): + skip_setup = True + root_selector = ".iuw-root" -@tag("functional", "functional_widget", "widget", "htmx") -class HTMXWidgetRequiredTestCase(test_case.IUWTestCase): def goto_add_page(self): self.page.goto(f"{self.live_server_url}/test-htmx/") + self.load_htmx_widget() - def goto_change_page(self): - item = self.init_item() - self.page.goto( - f"{self.live_server_url}/test-htmx/?destination=/test-htmx-image-widget/required/{item.pk}/" - ) - return item - - def init_item(self): - item = models.TestRequired() - with open(self.image1, "rb") as f: - item.image.save("image.png", File(f), False) - item.save() - return item - - def load_widget(self): - button = self.page.query_selector(".btn-load") - button.click() - self.wait(0.4) - - def test_should_fire_click_on_file_input_when_click_on_empty_marker(self): - self.goto_add_page() - self.load_widget() - - with self.assert_input_file_clicked( - input_selector=".iuw-root input[type=file]" - ): - self.page.query_selector(".iuw-empty").click() - - def test_should_create_preview_and_upload_file(self): - self.goto_add_page() - self.load_widget() - - root = self.page.query_selector(".iuw-root") - preview = root.query_selector(".iuw-image-preview") + +@tag("e2e", "htmx") +class HTMXWidgetRequiredAddTestCase(HTMXTestCase): + def goto_page(self): + self.page.goto(f"{self.live_server_url}/test-htmx/") + + def _click_on_empty(self): + with self.assert_input_file_clicked(input_selector=self.input_selector): + empty_marker = self.find_empty_marker() + self.assertTrue(empty_marker.is_visible()) + empty_marker.click() + + def _upload_image(self): + preview = self.find_widget_preview(self.root) self.assertFalse(preview.is_visible()) - file_input = root.query_selector("input[type=file]") + file_input = self.root.query_selector("input[type=file]") self.assertEqual(file_input.get_attribute("value"), None) file_input.set_input_files(self.image1) - preview = root.query_selector(".iuw-image-preview") + preview = self.find_widget_preview(self.root) img = preview.query_selector("img") preview_button = preview.query_selector(".iuw-preview-icon") self.assertTrue(preview.is_visible()) self.assertIsNotNone(img) self.assertIsNotNone(preview_button) - self.submit_form("#my-widget-form") - self.assert_success_message() - - itens = models.TestRequired.objects.all() - self.assertEqual(len(itens), 1) - item = itens[0] - self.assertIsNotNone(item.image) - - def test_should_intiialized_with_preview_when_editing(self): - item = self.goto_change_page() - self.load_widget() - - root = self.page.query_selector(".iuw-root") - preview = self.find_widget_preview(root) - - self.assertIsNotNone(preview) - self.assertEqual(root.get_attribute("data-raw"), item.image.url) - - empty_marker = self.find_empty_marker(root) - self.assertFalse(empty_marker.is_visible()) - - img = preview.query_selector("img") - preview_button = self.find_preview_icon(preview) - self.assertTrue(preview.is_visible()) - self.assertIsNotNone(img) - self.assertTrue(item.image.url in img.get_attribute("src")) - self.assertIsNotNone(preview_button) - - def test_should_fire_click_on_file_input_when_click_on_the_preview_image(self): - self.goto_add_page() - self.load_widget() - - root = self.page.query_selector(".iuw-root") - self.assertFalse(self.find_widget_preview(root).is_visible()) - - file_input = root.query_selector("input[type=file]") - file_input.set_input_files(self.image2) - - with self.assert_input_file_clicked( - input_selector=".iuw-root input[type=file]" - ): - preview = self.find_widget_preview(root) - self.assertIsNotNone(preview) + def _click_on_preview(self): + with self.assert_input_file_clicked(input_selector=self.input_selector): + preview = self.find_widget_preview(self.root) img = preview.query_selector("img") img.click() - def test_should_open_preview_modal_when_click_on_preview_button(self): - self.goto_add_page() - self.load_widget() - - root = self.page.query_selector(".iuw-root") - preview = self.find_widget_preview(root) - self.assertFalse(preview.is_visible()) - file_input = root.query_selector("input[type=file]") - file_input.set_input_files(self.image2) - - preview = self.find_widget_preview(root) - self.assertIsNotNone(preview) + def _preview_modal(self): + preview = self.find_widget_preview(self.root) preview_img = preview.query_selector("img") - preview_button = self.find_preview_icon(preview) preview_button.click() - self.assert_preview_modal(preview_img) - def test_should_not_close_preview_modal_when_click_image_inside_it(self): - self.goto_add_page() - self.load_widget() - - root = self.page.query_selector(".iuw-root") - preview = self.find_widget_preview(root) - self.assertFalse(preview.is_visible()) - file_input = root.query_selector("input[type=file]") - file_input.set_input_files(self.image1) - - preview = self.find_widget_preview(root) - self.assertIsNotNone(preview.is_visible) - preview_img = preview.query_selector("img") - - preview_button = self.find_preview_icon(preview) - preview_button.click() - - self.assert_preview_modal(preview_img) preview_modal = self.get_preview_modal(True, 3000) - img = preview_modal.query_selector("img") img.click() self.wait(0.5) - self.assertEqual(preview_modal.get_attribute("class"), "iuw-modal visible") - def test_should_close_preview_modal_when_click_on_close_button_inside_it(self): - self.goto_add_page() - self.load_widget() - - root = self.page.query_selector(".iuw-root") - preview = self.find_widget_preview(root) - self.assertFalse(preview.is_visible()) - file_input = root.query_selector("input[type=file]") - file_input.set_input_files(self.image1) - - preview = self.find_widget_preview(root) - self.assertIsNotNone(preview) - preview_img = preview.query_selector("img") - - preview_button = self.find_preview_icon(preview) - preview_button.click() - - self.assert_preview_modal(preview_img) self.assert_preview_modal_close() - def test_drop_label_leave(self): - self.goto_add_page() - self.load_widget() - - root = self.page.query_selector(".iuw-root") - drop_label = self.find_drop_label() - - self.assertFalse(drop_label.is_visible()) - - data_transfer = self.page.evaluate_handle("() => new DataTransfer()") - root.dispatch_event("dragenter", {"dataTransfer": data_transfer}) - self.wait(0.5) - - self.assertTrue(drop_label.is_visible()) - - root.dispatch_event("dragleave", {"dataTransfer": data_transfer}) - self.wait(0.5) - - self.assertFalse(drop_label.is_visible()) - - def test_drop_label_drop(self): - self.goto_add_page() - self.load_widget() + def test_htmx_widget_required_add_page_flow(self): + self._click_on_empty() + self._upload_image() + self._click_on_preview() + self._preview_modal() - root = self.page.query_selector(".iuw-root") - drop_label = self.find_drop_label() - - self.assertFalse(drop_label.is_visible()) - - data_transfer = self.page.evaluate_handle("() => new DataTransfer()") - root.dispatch_event("dragenter", {"dataTransfer": data_transfer}) - self.wait(0.5) - - self.assertTrue(drop_label.is_visible()) - - root.dispatch_event("drop", {"dataTransfer": data_transfer}) - self.wait(0.5) - - self.assertFalse(drop_label.is_visible()) - - def test_drop_label_end(self): - self.goto_add_page() - self.load_widget() - - root = self.page.query_selector(".iuw-root") - drop_label = self.find_drop_label() + self.submit_form("#my-widget-form") + self.assert_success_message() - self.assertFalse(drop_label.is_visible()) + items = models.TestRequired.objects.all() + self.assertEqual(len(items), 1) + self.item = items[0] + self.assertIsNotNone(self.item.image) - data_transfer = self.page.evaluate_handle("() => new DataTransfer()") - root.dispatch_event("dragenter", {"dataTransfer": data_transfer}) - self.wait(0.5) + endpoint = ( + f"test-htmx/?destination=/test-htmx-image-widget/required/{self.item.pk}/" + ) + self.page.goto(f"{self.live_server_url}/{endpoint}") + self.load_htmx_widget() + self.root = self.page.query_selector(self.root_selector) + self.item = items[0] - self.assertTrue(drop_label.is_visible()) + preview = self.find_widget_preview(self.root) + self.assertIsNotNone(preview) + self.assertEqual(self.root.get_attribute("data-raw"), self.item.image.url) - root.dispatch_event("dragend", {"dataTransfer": data_transfer}) - self.wait(0.5) + empty_marker = self.find_empty_marker(self.root) + self.assertFalse(empty_marker.is_visible()) - self.assertFalse(drop_label.is_visible()) + img = preview.query_selector("img") + preview_button = self.find_preview_icon(preview) + self.assertTrue(preview.is_visible()) + self.assertIsNotNone(img) + self.assertTrue(self.item.image.url in img.get_attribute("src")) + self.assertIsNotNone(preview_button) diff --git a/tests/tests_functional/inlines/tests_functional_inline.py b/tests/tests_functional/inlines/tests_functional_inline.py index e929c86e..dc85bb46 100644 --- a/tests/tests_functional/inlines/tests_functional_inline.py +++ b/tests/tests_functional/inlines/tests_functional_inline.py @@ -2,6 +2,14 @@ from django.test import tag from tests import models, test_case +from tests.helpers.drag_drop_label_test_helper import DragDropLabelTestCaseMixin +from tests.test_case import IUWTestCase + + +@tag("e2e", "inline") +class OrderedInlineDragDropLabelTestCase(DragDropLabelTestCaseMixin, IUWTestCase): + model = "inline" + root_selector = ".iuw-inline-root" @tag("functional", "inline", "functional_inline", "functional_inline_simple") @@ -378,60 +386,3 @@ def test_should_change_image_of_item_when_change_image_on_inline(self): item1 = models.InlineItem.objects.filter(pk=self.item1.pk).first() self.assertNotEqual(item1.image.url, url1) - - def test_drop_label_leave(self): - self.goto_add_page() - - root = self.find_inline_root() - drop_label = self.find_drop_label() - - self.assertFalse(drop_label.is_visible()) - - data_transfer = self.page.evaluate_handle("() => new DataTransfer()") - root.dispatch_event("dragenter", {"dataTransfer": data_transfer}) - self.wait(0.5) - - self.assertTrue(drop_label.is_visible()) - - root.dispatch_event("dragleave", {"dataTransfer": data_transfer}) - self.wait(0.5) - - self.assertFalse(drop_label.is_visible()) - - def test_drop_label_drop(self): - self.goto_add_page() - - root = self.find_inline_root() - drop_label = self.find_drop_label() - - self.assertFalse(drop_label.is_visible()) - - data_transfer = self.page.evaluate_handle("() => new DataTransfer()") - root.dispatch_event("dragenter", {"dataTransfer": data_transfer}) - self.wait(0.5) - - self.assertTrue(drop_label.is_visible()) - - root.dispatch_event("drop", {"dataTransfer": data_transfer}) - self.wait(0.5) - - self.assertFalse(drop_label.is_visible()) - - def test_drop_label_end(self): - self.goto_add_page() - - root = self.find_inline_root() - drop_label = self.find_drop_label() - - self.assertFalse(drop_label.is_visible()) - - data_transfer = self.page.evaluate_handle("() => new DataTransfer()") - root.dispatch_event("dragenter", {"dataTransfer": data_transfer}) - self.wait(0.5) - - self.assertTrue(drop_label.is_visible()) - - root.dispatch_event("dragend", {"dataTransfer": data_transfer}) - self.wait(0.5) - - self.assertFalse(drop_label.is_visible()) diff --git a/tests/tests_functional/inlines/tests_functional_inline_with_order.py b/tests/tests_functional/inlines/tests_functional_inline_with_order.py index 31128f67..17b7407a 100644 --- a/tests/tests_functional/inlines/tests_functional_inline_with_order.py +++ b/tests/tests_functional/inlines/tests_functional_inline_with_order.py @@ -2,9 +2,33 @@ from django.test import tag from tests import models, test_case +from tests.helpers.drag_drop_label_test_helper import DragDropLabelTestCaseMixin +from tests.helpers.reorder_test_helper import ReorderTestCaseMixin +from tests.test_case import IUWTestCase + + +@tag("e2e", "ordered_inline") +class OrderedInlineEditorSortingTestCase(ReorderTestCaseMixin, IUWTestCase): + model = "orderedinline" + + def goto_change_page(self): + instance = models.OrderedInline.objects.order_by("id").last() + super().goto_change_page(instance.id) + + def get_images(self): + instance = models.OrderedInline.objects.order_by("id").last() + data = models.OrderedInlineItem.objects.order_by("order").filter( + parent=instance + ) + return [x.image.url for x in data] + + +@tag("e2e", "ordered_inline") +class OrderedInlineDragDropLabelTestCase(DragDropLabelTestCaseMixin, IUWTestCase): + model = "orderedinline" + root_selector = ".iuw-inline-root" -@tag("functional", "ordered", "inline", "functional_inline") class OrderedInlineEditorTests(test_case.IUWTestCase): model = "orderedinline" @@ -395,417 +419,3 @@ def test_should_change_image_of_item_when_change_image_on_inline(self): item2 = models.OrderedInlineItem.objects.filter(pk=self.item2.pk).first() self.assertEqual(str(item2.order), str(order_other)) - - def test_should_initialize_order_inputs_on_page(self): - self.goto_change_page() - - root = self.find_inline_root() - - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 2) - for index, preview in enumerate(previews): - order_input = self.find_inline_order(preview) - self.assertFalse(order_input.is_visible()) - self.assertEqual(order_input.input_value(), str(index + 1)) - - elements = root.query_selector_all( - ".inline-related:not(.empty-form):not(.deleted), .iuw-add-image-btn" - ) - classes = list(map(lambda x: x.get_attribute("class"), elements)) - self.assertEqual(classes.pop(), "iuw-add-image-btn visible-by-number") - - def test_should_reorder_two_items_from_first_to_last(self): - self.assertEqual(len(models.OrderedInlineItem.objects.all()), 0) - self.goto_add_page() - - root = self.find_inline_root() - temp_file = root.query_selector(".temp_file") - - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 0) - - temp_file.set_input_files(self.image1) - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 1) - - temp_file.set_input_files(self.image2) - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 2) - for index, preview in enumerate(previews): - img = preview.query_selector("img") - preview_button = self.find_preview_icon(preview) - remove_button = self.find_delete_icon(preview) - order_input = self.find_inline_order(preview) - self.assertFalse(order_input.is_visible()) - self.assertEqual(order_input.input_value(), str(index + 1)) - self.assertIsNotNone(img) - self.assertIsNotNone(preview_button) - self.assertIsNotNone(remove_button) - - # Reorder - preview1, preview2 = previews - preview1.hover() - self.page.mouse.down() - preview2.hover(position={"x": 100, "y": 10}) - self.page.mouse.up() - - order_input = self.find_inline_order(preview1) - self.assertEqual(order_input.input_value(), "2") - order_input = self.find_inline_order(preview2) - self.assertEqual(order_input.input_value(), "1") - - elements = root.query_selector_all( - ".inline-related:not(.empty-form):not(.deleted), .iuw-add-image-btn" - ) - classes = list(map(lambda x: x.get_attribute("class"), elements)) - self.assertEqual(classes.pop(), "iuw-add-image-btn visible-by-number") - - self.submit_form("#orderedinline_form") - self.assert_success_message() - - items = models.OrderedInlineItem.objects.order_by("id").all() - self.assertEqual(len(items), 2) - item1, item2 = items - - self.assertTrue("image2" in item1.image.path) - self.assertEqual(str(item1.order), "1") - self.assertFalse("image2" in item2.image.path) - self.assertEqual(str(item2.order), "2") - - def test_should_reorder_two_items_from_last_to_first(self): - self.assertEqual(len(models.OrderedInlineItem.objects.all()), 0) - self.goto_add_page() - - root = self.find_inline_root() - temp_file = root.query_selector(".temp_file") - - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 0) - - temp_file.set_input_files(self.image1) - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 1) - - temp_file.set_input_files(self.image2) - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 2) - for index, preview in enumerate(previews): - img = preview.query_selector("img") - preview_button = self.find_preview_icon(preview) - remove_button = self.find_delete_icon(preview) - order_input = self.find_inline_order(preview) - self.assertFalse(order_input.is_visible()) - self.assertEqual(order_input.input_value(), str(index + 1)) - self.assertIsNotNone(img) - self.assertIsNotNone(preview_button) - self.assertIsNotNone(remove_button) - - # Reorder - preview1, preview2 = previews - preview2.hover() - self.page.mouse.down() - preview1.hover(position={"x": 40, "y": 10}) - self.page.mouse.up() - - order_input = self.find_inline_order(preview1) - self.assertEqual(order_input.input_value(), "2") - order_input = self.find_inline_order(preview2) - self.assertEqual(order_input.input_value(), "1") - - elements = root.query_selector_all( - ".inline-related:not(.empty-form):not(.deleted), .iuw-add-image-btn" - ) - classes = list(map(lambda x: x.get_attribute("class"), elements)) - self.assertEqual(classes.pop(), "iuw-add-image-btn visible-by-number") - - self.submit_form("#orderedinline_form") - self.assert_success_message() - - items = models.OrderedInlineItem.objects.order_by("id").all() - self.assertEqual(len(items), 2) - item1, item2 = items - - self.assertTrue("image2" in item1.image.path) - self.assertEqual(str(item1.order), "1") - self.assertTrue("image1" in item2.image.path) - self.assertEqual(str(item2.order), "2") - - def test_should_reorder_three_items(self): - self.assertEqual(len(models.OrderedInlineItem.objects.all()), 0) - self.goto_add_page() - - root = self.find_inline_root() - temp_file = root.query_selector(".temp_file") - - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 0) - - temp_file.set_input_files(self.image1) - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 1) - - temp_file.set_input_files(self.image2) - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 2) - - temp_file.set_input_files(self.image3) - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 3) - - for index, preview in enumerate(previews): - img = preview.query_selector("img") - preview_button = self.find_preview_icon(preview) - remove_button = self.find_delete_icon(preview) - order_input = self.find_inline_order(preview) - self.assertFalse(order_input.is_visible()) - self.assertEqual(order_input.input_value(), str(index + 1)) - self.assertIsNotNone(img) - self.assertIsNotNone(preview_button) - self.assertIsNotNone(remove_button) - - # Reorder 1 to 2 - preview1, preview2, preview3 = previews - preview1.hover() - self.page.mouse.down() - preview2.hover(position={"x": 100, "y": 10}) - self.page.mouse.up() - # Reorder 3 to 1 (now 2) - preview3.hover() - self.page.mouse.down() - preview2.hover(position={"x": 40, "y": 10}) - self.page.mouse.up() - - # The currently order is 3, 2, 1 - - order_input = self.find_inline_order(preview3) - self.assertEqual(order_input.input_value(), "1") - order_input = self.find_inline_order(preview2) - self.assertEqual(order_input.input_value(), "2") - order_input = self.find_inline_order(preview1) - self.assertEqual(order_input.input_value(), "3") - - elements = root.query_selector_all( - ".inline-related:not(.empty-form):not(.deleted), .iuw-add-image-btn" - ) - classes = list(map(lambda x: x.get_attribute("class"), elements)) - self.assertEqual(classes.pop(), "iuw-add-image-btn visible-by-number") - - self.submit_form("#orderedinline_form") - self.assert_success_message() - - items = models.OrderedInlineItem.objects.order_by("id").all() - self.assertEqual(len(items), 3) - item1, item2, item3 = items - self.assertTrue("image3" in item1.image.path) - self.assertEqual(str(item1.order), "1") - self.assertTrue("image2" in item2.image.path) - self.assertEqual(str(item2.order), "2") - self.assertTrue("image1" in item3.image.path) - self.assertEqual(str(item3.order), "3") - - def test_should_reorder_with_deleted_item(self): - self.assertEqual(len(models.OrderedInlineItem.objects.all()), 0) - self.goto_add_page() - - root = self.find_inline_root() - temp_file = root.query_selector(".temp_file") - - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 0) - - temp_file.set_input_files(self.image1) - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 1) - - temp_file.set_input_files(self.image2) - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 2) - - temp_file.set_input_files(self.image3) - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 3) - - for index, preview in enumerate(previews): - img = preview.query_selector("img") - preview_button = self.find_preview_icon(preview) - remove_button = self.find_delete_icon(preview) - order_input = self.find_inline_order(preview) - self.assertFalse(order_input.is_visible()) - self.assertEqual(order_input.input_value(), str(index + 1)) - self.assertIsNotNone(img) - self.assertIsNotNone(preview_button) - self.assertIsNotNone(remove_button) - - # Reorder 1 to 2 - preview1, preview2, preview3 = previews - preview1.hover() - self.page.mouse.down() - self.assertFalse(self.find_drop_label().is_visible()) - preview2.hover(position={"x": 100, "y": 10}) - self.page.mouse.up() - - # Currently Order Is: 2 1 3 - delete_button = self.find_delete_icon(preview2) - delete_button.click() - - # Reorder 3 to 1 - preview3.hover() - self.page.mouse.down() - self.assertFalse(self.find_drop_label().is_visible()) - preview1.hover(position={"x": 40, "y": 10}) - self.page.mouse.up() - - # The currently order is 3, 1 (2 is deleted) - - order_input = self.find_inline_order(preview3) - self.assertEqual(order_input.input_value(), "1") - order_input = self.find_inline_order(preview1) - self.assertEqual(order_input.input_value(), "2") - - elements = root.query_selector_all( - ".inline-related:not(.empty-form):not(.deleted), .iuw-add-image-btn" - ) - classes = list(map(lambda x: x.get_attribute("class"), elements)) - self.assertEqual(classes.pop(), "iuw-add-image-btn visible-by-number") - - self.submit_form("#orderedinline_form") - self.assert_success_message() - - items = models.OrderedInlineItem.objects.order_by("id").all() - self.assertEqual(len(items), 2) - item1, item2 = items - self.assertTrue("image3" in item1.image.path) - self.assertEqual(str(item1.order), "1") - self.assertTrue("image1" in item2.image.path) - self.assertEqual(str(item2.order), "2") - - def test_should_reorder_and_delete_item(self): - self.assertEqual(len(models.OrderedInlineItem.objects.all()), 0) - self.goto_add_page() - - root = self.find_inline_root() - temp_file = root.query_selector(".temp_file") - - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 0) - - temp_file.set_input_files(self.image1) - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 1) - - temp_file.set_input_files(self.image2) - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 2) - - temp_file.set_input_files(self.image1) - previews = self.find_inline_previews(root) - self.assertEqual(len(previews), 3) - - for index, preview in enumerate(previews): - img = preview.query_selector("img") - preview_button = self.find_preview_icon(preview) - remove_button = self.find_delete_icon(preview) - order_input = self.find_inline_order(preview) - self.assertFalse(order_input.is_visible()) - self.assertEqual(order_input.input_value(), str(index + 1)) - self.assertIsNotNone(img) - self.assertIsNotNone(preview_button) - self.assertIsNotNone(remove_button) - - # Reorder 1 to 2 - preview1, preview2, preview3 = previews - preview1.hover() - self.page.mouse.down() - self.assertFalse(self.find_drop_label().is_visible()) - preview2.hover(position={"x": 100, "y": 10}) - self.page.mouse.up() - # Reorder 3 to 1 (now 2) - preview3.hover() - self.page.mouse.down() - self.assertFalse(self.find_drop_label().is_visible()) - preview2.hover(position={"x": 40, "y": 10}) - self.page.mouse.up() - - # The currently order is 3, 2, 1 - - delete = self.find_delete_icon(preview2) - delete.click() - - order_input = self.find_inline_order(preview3) - self.assertEqual(order_input.input_value(), "1") - order_input = self.find_inline_order(preview1) - self.assertEqual(order_input.input_value(), "2") - - elements = root.query_selector_all( - ".inline-related:not(.empty-form):not(.deleted), .iuw-add-image-btn" - ) - classes = list(map(lambda x: x.get_attribute("class"), elements)) - self.assertEqual(classes.pop(), "iuw-add-image-btn visible-by-number") - - self.submit_form("#orderedinline_form") - self.assert_success_message() - - items = models.OrderedInlineItem.objects.order_by("id").all() - self.assertEqual(len(items), 2) - item3, item1 = items - self.assertIsNotNone(item3.image) - self.assertEqual(str(item3.order), "1") - self.assertIsNotNone(item1.image) - self.assertEqual(str(item1.order), "2") - - def test_drop_label_leave(self): - self.goto_add_page() - - root = self.find_inline_root() - drop_label = self.find_drop_label() - - self.assertFalse(drop_label.is_visible()) - - data_transfer = self.page.evaluate_handle("() => new DataTransfer()") - root.dispatch_event("dragenter", {"dataTransfer": data_transfer}) - self.wait(0.5) - - self.assertTrue(drop_label.is_visible()) - - root.dispatch_event("dragleave", {"dataTransfer": data_transfer}) - self.wait(0.5) - - self.assertFalse(drop_label.is_visible()) - - def test_drop_label_drop(self): - self.goto_add_page() - - root = self.find_inline_root() - drop_label = self.find_drop_label() - - self.assertFalse(drop_label.is_visible()) - - data_transfer = self.page.evaluate_handle("() => new DataTransfer()") - root.dispatch_event("dragenter", {"dataTransfer": data_transfer}) - self.wait(0.5) - - self.assertTrue(drop_label.is_visible()) - - root.dispatch_event("drop", {"dataTransfer": data_transfer}) - self.wait(0.5) - - self.assertFalse(drop_label.is_visible()) - - def test_drop_label_end(self): - self.goto_add_page() - - root = self.find_inline_root() - drop_label = self.find_drop_label() - - self.assertFalse(drop_label.is_visible()) - - data_transfer = self.page.evaluate_handle("() => new DataTransfer()") - root.dispatch_event("dragenter", {"dataTransfer": data_transfer}) - self.wait(0.5) - - self.assertTrue(drop_label.is_visible()) - - root.dispatch_event("dragend", {"dataTransfer": data_transfer}) - self.wait(0.5) - - self.assertFalse(drop_label.is_visible()) diff --git a/tests/tests_ui_regression/inlines/tests_ui_regression_inlines.py b/tests/tests_ui_regression/inlines/tests_ui_regression_inlines.py index bcc22176..23bddf79 100644 --- a/tests/tests_ui_regression/inlines/tests_ui_regression_inlines.py +++ b/tests/tests_ui_regression/inlines/tests_ui_regression_inlines.py @@ -1,145 +1,142 @@ -import django -from django.core.files import File -from django.test import tag - -from tests import models, test_case - - -@tag("ui-regression", "inline") -class InlineEditorUIRegressionTestCase(test_case.IUWTestCase): - model = "inline" - - def init_item(self, only_one=False): - inline = models.Inline.objects.create() - - self.item1 = models.InlineItem() - self.item1.parent = inline - with open(self.image1, "rb") as f: - self.item1.image.save("image.png", File(f)) - self.item1.save() - - if not only_one: - self.item2 = models.InlineItem() - self.item2.parent = inline - with open(self.image2, "rb") as f: - self.item2.image.save("image2.png", File(f)) - self.item2.save() - - return inline - - def goto_change_page(self, only_one=False): - item = self.init_item(only_one) - super().goto_change_page(item.id) - return item - - def test_empty_marker(self): - self.goto_add_page() - self.wait_for_empty_marker() - - root = self.find_inline_root() - self.wait(0.5) - - self.assert_match_snapshot(root, "in_test_empty_marker") - - def test_empty_marker_hover(self): - self.goto_add_page() - self.wait_for_empty_marker() - - root = self.find_inline_root() - self.find_empty_marker().hover() - self.wait(0.5) - - self.assert_match_snapshot(root, "in_test_empty_marker_hover") - - def test_with_images_data(self): - self.goto_change_page() - - root = self.find_inline_root() - self.assert_match_snapshot(root, "in_test_with_images_data") - - def test_with_images_hover_preview(self): - self.goto_change_page() - - root = self.find_inline_root() - previews = self.find_inline_previews(root) - previews[0].hover() - self.wait(0.5) - - self.assert_match_snapshot(root, "in_test_with_images_hover_preview") - - def test_hover_preview_icon(self): - self.goto_change_page() - - root = self.find_inline_root() - previews = self.find_inline_previews(root) - self.find_preview_icon(previews[0]).hover() - self.wait(0.5) - - self.assert_match_snapshot(root, "in_test_hover_preview_icon") - - def test_show_preview_modal(self): - self.goto_change_page() - - root = self.find_inline_root() - previews = self.find_inline_previews(root) - self.find_preview_icon(previews[0]).click() - self.wait(0.5) - - modal = self.get_preview_modal(black_overlay=True) - self.assert_match_snapshot(modal, "in_test_show_preview_modal") - - def test_hover_delete_icon(self): - self.goto_change_page() - - root = self.find_inline_root() - previews = self.find_inline_previews(root) - self.find_delete_icon(previews[0]).hover() - self.wait(0.5) - - self.assert_match_snapshot(root, "in_test_hover_delete_icon") - - def test_hover_add_button(self): - self.goto_change_page() - - root = self.find_inline_root() - self.find_add_button(root).hover() - self.wait(0.5) - - self.assert_match_snapshot(root, "in_test_hover_add_button") - - def test_add_button_on_small_screen(self): - self.goto_change_page() - self.page.set_viewport_size({"width": 800, "height": 800}) - - self.wait(0.5) - - has_scrollbars = self.page.evaluate( - """() => { - var element = document.querySelector(".iuw-inline-root"); - return element.scrollWidth > element.clientWidth; - }""" - ) - self.assertTrue(has_scrollbars) - - add_button = self.page.query_selector(".iuw-add-image-btn") - self.assert_match_snapshot(add_button, "in_test_add_button_on_small_screen") - - def test_ui_initialized_toggle_dark_theme(self): - major, minor, _, _, _ = django.VERSION - if major < 4 or minor < 2: - # Theme toggle is added in django 4.2 - # https://docs.djangoproject.com/en/4.2/releases/4.2/#django-contrib-admin - return - - self.page.emulate_media(color_scheme="light") - self.goto_change_page() - - root = self.find_inline_root() - self.assert_match_snapshot(root, "in_test_ui_initialized_toggle_dark_theme") - - self.page.query_selector("#header button.theme-toggle").click() - self.wait(0.3) - - self.assert_match_snapshot(root, "in_test_ui_initialized_toggle_dark_theme2") - - self.page.emulate_media(color_scheme="light") +# import django +# from django.core.files import File +# from django.test import tag +# +# from tests import models, test_case +# +# +# @tag("ui-regression", "inline") +# class InlineEditorUIRegressionTestCase(test_case.IUWTestCase): +# model = "inline" +# +# def init_item(self, only_one=False): +# inline = models.Inline.objects.create() +# +# self.item1 = models.InlineItem() +# self.item1.parent = inline +# with open(self.image1, "rb") as f: +# self.item1.image.save("image.png", File(f)) +# self.item1.save() +# +# if not only_one: +# self.item2 = models.InlineItem() +# self.item2.parent = inline +# with open(self.image2, "rb") as f: +# self.item2.image.save("image2.png", File(f)) +# self.item2.save() +# +# return inline +# +# def goto_change_page(self, only_one=False): +# item = self.init_item(only_one) +# super().goto_change_page(item.id) +# return item +# +# def test_empty_marker(self): +# self.goto_add_page() +# self.wait_for_empty_marker() +# +# root = self.find_inline_root() +# self.wait(0.5) +# +# self.assert_match_snapshot(root, "in_test_empty_marker") +# +# def test_empty_marker_hover(self): +# self.goto_add_page() +# self.wait_for_empty_marker() +# +# root = self.find_inline_root() +# self.find_empty_marker().hover() +# self.wait(0.5) +# +# self.assert_match_snapshot(root, "in_test_empty_marker_hover") +# +# def test_with_images_data(self): +# self.goto_change_page() +# +# root = self.find_inline_root() +# self.assert_match_snapshot(root, "in_test_with_images_data") +# +# def test_with_images_hover_preview(self): +# self.goto_change_page() +# +# root = self.find_inline_root() +# previews = self.find_inline_previews(root) +# previews[0].hover() +# self.wait(0.5) +# +# self.assert_match_snapshot(root, "in_test_with_images_hover_preview") +# +# def test_hover_preview_icon(self): +# self.goto_change_page() +# +# root = self.find_inline_root() +# previews = self.find_inline_previews(root) +# self.find_preview_icon(previews[0]).hover() +# self.wait(0.5) +# +# self.assert_match_snapshot(root, "in_test_hover_preview_icon") +# +# def test_show_preview_modal(self): +# self.goto_change_page() +# +# root = self.find_inline_root() +# previews = self.find_inline_previews(root) +# self.find_preview_icon(previews[0]).click() +# self.wait(0.5) +# +# modal = self.get_preview_modal(black_overlay=True) +# self.assert_match_snapshot(modal, "in_test_show_preview_modal") +# +# def test_hover_delete_icon(self): +# self.goto_change_page() +# +# root = self.find_inline_root() +# previews = self.find_inline_previews(root) +# self.find_delete_icon(previews[0]).hover() +# self.wait(0.5) +# +# self.assert_match_snapshot(root, "in_test_hover_delete_icon") +# +# def test_hover_add_button(self): +# self.goto_change_page() +# +# root = self.find_inline_root() +# self.find_add_button(root).hover() +# self.wait(0.5) +# +# self.assert_match_snapshot(root, "in_test_hover_add_button") +# +# def has_scrollbars(self) -> bool: +# return self.page.evaluate( +# """() => { +# var element = document.querySelector(".iuw-inline-root"); +# return element.scrollWidth > element.clientWidth; +# }""" +# ) +# +# def test_add_button_on_small_screen(self): +# self.goto_change_page() +# self.page.set_viewport_size({"width": 800, "height": 800}) +# +# self.wait(0.5) +# +# self.assertTrue(self.has_scrollbars()) +# +# add_button = self.page.query_selector(".iuw-add-image-btn") +# self.assert_match_snapshot(add_button, "in_test_add_button_on_small_screen") +# +# def test_ui_initialized_toggle_dark_theme(self): +# self.page.emulate_media(color_scheme="light") +# self.goto_change_page() +# +# root = self.find_inline_root() +# self.assert_match_snapshot(root, "in_test_ui_initialized_toggle_dark_theme") +# +# self.page.query_selector("#header button.theme-toggle").click() +# self.wait(0.3) +# +# self.assert_match_snapshot(root, "in_test_ui_initialized_toggle_dark_theme2") +# +# self.page.emulate_media(color_scheme="light") +# diff --git a/tests/tests_ui_regression/widget/tests_ui_regression_widget_force_theme.py b/tests/tests_ui_regression/widget/tests_ui_regression_widget_force_theme.py index ae28947e..1c360d41 100644 --- a/tests/tests_ui_regression/widget/tests_ui_regression_widget_force_theme.py +++ b/tests/tests_ui_regression/widget/tests_ui_regression_widget_force_theme.py @@ -1,3 +1,4 @@ +""" from django.core.files import File from django.test import tag @@ -46,3 +47,4 @@ def test_force_dark_theme(self): self.assert_match_snapshot(root, "wo_test_ui_test_force_dark_theme") self.page.emulate_media(color_scheme="light") +""" diff --git a/tests/tests_ui_regression/widget/tests_ui_regression_widget_optional.py b/tests/tests_ui_regression/widget/tests_ui_regression_widget_optional.py index e880d74b..3c68eaed 100644 --- a/tests/tests_ui_regression/widget/tests_ui_regression_widget_optional.py +++ b/tests/tests_ui_regression/widget/tests_ui_regression_widget_optional.py @@ -1,3 +1,4 @@ +""" import django from django.core.files import File from django.test.utils import tag @@ -204,3 +205,4 @@ def test_ui_initialized_toggle_dark_theme_inverted(self): root, "wo_test_ui_initialized_toggle_dark_theme_inverted2" ) self.page.emulate_media(color_scheme="light") +""" diff --git a/tests/tests_ui_regression/widget/tests_ui_regression_widget_required.py b/tests/tests_ui_regression/widget/tests_ui_regression_widget_required.py index 1c1fa039..4f70090a 100644 --- a/tests/tests_ui_regression/widget/tests_ui_regression_widget_required.py +++ b/tests/tests_ui_regression/widget/tests_ui_regression_widget_required.py @@ -1,3 +1,4 @@ +""" import django from django.core.files import File from django.test.utils import tag @@ -173,3 +174,4 @@ def test_ui_initialized_toggle_dark_theme_inverted(self): self.assert_match_snapshot( root, "wr_test_ui_initialized_toggle_dark_theme_inverted2" ) +""" From 506e759c7955a6ea0f0cd87a92e354fc23c44aa1 Mon Sep 17 00:00:00 2001 From: Eduardo Oliveira Date: Mon, 23 Dec 2024 07:50:31 -0300 Subject: [PATCH 2/4] ci: change test run tag for now --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 4975661c..2a9f0af9 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -62,7 +62,7 @@ jobs: run: python -m playwright install --with-deps - name: Run Tests - run: python manage.py test + run: python manage.py test --tag e2e env: DATABASE_USE_POSTGRES: 1 POSTGRES_PORT: 5432 From df3d61f14ac51677cfc41a2cacdfdb82acbaa6b9 Mon Sep 17 00:00:00 2001 From: Eduardo Oliveira Date: Mon, 23 Dec 2024 07:57:15 -0300 Subject: [PATCH 3/4] fix: change type hint --- tests/helpers/reorder_test_helper.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/helpers/reorder_test_helper.py b/tests/helpers/reorder_test_helper.py index 969edeb2..6c2cbe57 100644 --- a/tests/helpers/reorder_test_helper.py +++ b/tests/helpers/reorder_test_helper.py @@ -15,7 +15,7 @@ class ReorderTestHelper(ImageMockMixin): form_selector = 'form[enctype="multipart/form-data"]' drop_label_selector = ".iuw-drop-label" - get_images_to_validate: Callable[[], list[str]] = None + get_images_to_validate: Callable[[], List[str]] = None @property def root(self): @@ -41,7 +41,7 @@ def __init__( self, page: Page, root_selector: str, - get_images_to_validate: Callable[[], list[str]], + get_images_to_validate: Callable[[], List[str]], ): """Creates a new instance of ReorderTestHelper. From 40a4fbfe1dca7be6e882a5ee42ff736880d0e1a5 Mon Sep 17 00:00:00 2001 From: Eduardo Oliveira Date: Tue, 22 Apr 2025 19:30:27 -0300 Subject: [PATCH 4/4] chore: trigger ci