From 6d9d0e19f128c3089909b02951ae2d41897429b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sascha=20I=C3=9Fbr=C3=BCcker?= Date: Sat, 22 Mar 2025 12:16:48 +0100 Subject: [PATCH] Add E2E tests for refresh button --- .../tests_e2e/e2e_test_edit_bookmark_form.py | 9 ++ .../tests_e2e/e2e_test_new_bookmark_form.py | 146 +++++++++++++++++- 2 files changed, 154 insertions(+), 1 deletion(-) diff --git a/bookmarks/tests_e2e/e2e_test_edit_bookmark_form.py b/bookmarks/tests_e2e/e2e_test_edit_bookmark_form.py index 777350b..c1785da 100644 --- a/bookmarks/tests_e2e/e2e_test_edit_bookmark_form.py +++ b/bookmarks/tests_e2e/e2e_test_edit_bookmark_form.py @@ -63,3 +63,12 @@ class BookmarkFormE2ETestCase(LinkdingE2ETestCase): description = page.get_by_label("Description") expect(title).to_have_value(bookmark.title) expect(description).to_have_value(bookmark.description) + + def test_refresh_button_should_be_visible_when_editing(self): + bookmark = self.setup_bookmark() + + with sync_playwright() as p: + page = self.open(reverse("linkding:bookmarks.edit", args=[bookmark.id]), p) + + refresh_button = page.get_by_text("Refresh from website") + expect(refresh_button).to_be_visible() diff --git a/bookmarks/tests_e2e/e2e_test_new_bookmark_form.py b/bookmarks/tests_e2e/e2e_test_new_bookmark_form.py index 36503e0..f7a5ae7 100644 --- a/bookmarks/tests_e2e/e2e_test_new_bookmark_form.py +++ b/bookmarks/tests_e2e/e2e_test_new_bookmark_form.py @@ -22,7 +22,7 @@ class BookmarkFormE2ETestCase(LinkdingE2ETestCase): self.website_loader_patch = patch.object( website_loader, "load_website_metadata", return_value=mock_website_metadata ) - self.website_loader_patch.start() + self.website_loader_mock = self.website_loader_patch.start() def tearDown(self) -> None: super().tearDown() @@ -167,3 +167,147 @@ class BookmarkFormE2ETestCase(LinkdingE2ETestCase): page.get_by_label("URL").fill("https://example.com") expect(auto_tags_hint).to_be_hidden() + + def test_clear_buttons_only_shown_when_fields_have_content(self): + with sync_playwright() as p: + page = self.open(reverse("linkding:bookmarks.new"), p) + + title_field = page.get_by_label("Title") + title_clear_button = page.locator("[ld-clear-button][data-for='id_title']") + description_field = page.get_by_label("Description") + description_clear_button = page.locator( + "[ld-clear-button][data-for='id_description']" + ) + + # Initially, clear buttons should be hidden because fields are empty + expect(title_clear_button).to_be_hidden() + expect(description_clear_button).to_be_hidden() + + # Add content to title field, its clear button should become visible + title_field.fill("Test title") + expect(title_clear_button).to_be_visible() + + # Add content to description field, its clear button should become visible + description_field.fill("Test description") + expect(description_clear_button).to_be_visible() + + # Clear title field, its clear button should be hidden again + title_field.fill("") + expect(title_clear_button).to_be_hidden() + + # Clear description field, its clear button should be hidden again + description_field.fill("") + expect(description_clear_button).to_be_hidden() + + def test_refresh_button_only_shown_for_existing_bookmarks(self): + existing_bookmark = self.setup_bookmark( + title="Existing title", description="Existing description" + ) + + with sync_playwright() as p: + page = self.open(reverse("linkding:bookmarks.new"), p) + refresh_button = page.locator("#refresh-button") + + # Initially, refresh button should be hidden + expect(refresh_button).to_be_hidden() + + # Enter a URL that is not bookmarked yet + page.get_by_label("URL").fill("https://example.com/not-bookmarked") + page.wait_for_timeout(timeout=1000) + + expect(refresh_button).to_be_hidden() + + # Enter a URL that is already bookmarked + page.get_by_label("URL").fill(existing_bookmark.url) + + expect(refresh_button).to_be_visible() + + # Change back to non-bookmarked URL + page.get_by_label("URL").fill("https://example.com/another-not-bookmarked") + + expect(refresh_button).to_be_hidden() + + def test_refresh_from_website_button_updates_title_and_description(self): + existing_bookmark = self.setup_bookmark( + title="Existing title", description="Existing description" + ) + + with sync_playwright() as p: + page = self.open(reverse("linkding:bookmarks.new"), p) + url_field = page.get_by_label("URL") + title_field = page.get_by_label("Title") + description_field = page.get_by_label("Description") + refresh_button = page.locator("#refresh-button") + + # Enter the URL of the existing bookmark to make refresh button visible + url_field.fill(existing_bookmark.url) + + # Wait for metadata to be loaded and for refresh button to be visible + expect(refresh_button).to_be_visible() + expect(title_field).to_have_value("Existing title") + expect(description_field).to_have_value("Existing description") + + # Update the mock to return different metadata when refresh is requested + self.website_loader_mock.reset_mock() + self.website_loader_mock.return_value = website_loader.WebsiteMetadata( + url="https://example.com", + title="Updated Example Domain", + description="This is a refreshed description for the example domain.", + preview_image=None, + ) + + # Click the refresh button + refresh_button.click() + + # Verify that title and description have been updated with new values + expect(title_field).to_have_value("Updated Example Domain") + expect(description_field).to_have_value( + "This is a refreshed description for the example domain." + ) + + # Verify that the fields are visually marked as modified + expect(title_field).to_have_class("form-input modified") + expect(description_field).to_have_class("form-input modified") + + def test_refresh_from_website_button_does_not_modify_fields_if_metadata_is_same( + self, + ): + existing_bookmark = self.setup_bookmark( + title="Existing title", description="Existing description" + ) + + with sync_playwright() as p: + page = self.open(reverse("linkding:bookmarks.new"), p) + url_field = page.get_by_label("URL") + title_field = page.get_by_label("Title") + description_field = page.get_by_label("Description") + refresh_button = page.locator("#refresh-button") + + # Enter the URL of the existing bookmark to make refresh button visible + url_field.fill(existing_bookmark.url) + + # Wait for metadata to be loaded and for refresh button to be visible + expect(refresh_button).to_be_visible() + expect(title_field).to_have_value("Existing title") + expect(description_field).to_have_value("Existing description") + + # Update the mock to return same metadata when refresh is requested + self.website_loader_mock.reset_mock() + self.website_loader_mock.return_value = website_loader.WebsiteMetadata( + url="https://example.com", + title="Existing title", + description="Existing description", + preview_image=None, + ) + + # Click the refresh button + refresh_button.click() + page.wait_for_timeout(timeout=1000) + + # Verify that title and description values are still the same + expect(title_field).to_have_value("Existing title") + expect(description_field).to_have_value("Existing description") + + # Verify that the fields are NOT visually marked as modified + expect(title_field).to_have_class("form-input") + expect(description_field).to_have_class("form-input")