{{ props.page.description }}
+ +NewContent!
") self._post(f"pages/{older1}/revisions", data=revision_data).raise_for_status() - index_ids = self._index_ids() + index_ids = self._index_ids(dict(sort_desc=True)) assert index_ids.index(older1) < index_ids.index(newer1) - # if we switch to create time instead of update time, older1 still appears later in - # in the list... - index_ids = self._index_ids(dict(sort_by="create_time")) - assert index_ids.index(older1) > index_ids.index(newer1) + index_ids = self._index_ids(dict(sort_by="title", sort_desc=False)) + assert index_ids.index(older1) < index_ids.index(newer1) - def test_limit_offset(self): + def test_index_limit_offset(self): older1 = self._create_valid_page_with_slug("indexlimitoffsetcreatedfirst")["id"] newer1 = self._create_valid_page_with_slug("indexlimitoffsetcreatedsecond")["id"] - index_ids = self._index_ids(dict(limit=1)) + index_ids = self._index_ids(dict(limit=1, sort_desc=True)) assert newer1 in index_ids assert older1 not in index_ids - index_ids = self._index_ids(dict(limit=1, offset=1)) + index_ids = self._index_ids(dict(limit=1, offset=1, sort_desc=True)) assert newer1 not in index_ids assert older1 in index_ids + def test_index_search_slug(self): + response = self._create_valid_page_with_slug("indexsearchstringfoo") + older1 = response["id"] + newer1 = self._create_valid_page_with_slug("indexsearchstringbar")["id"] + + index_ids = self._index_ids(dict(search="slug:indexsearchstringfoo")) + assert newer1 not in index_ids + assert older1 in index_ids + + index_ids = self._index_ids(dict(search="slug:'indexsearchstringfoo'")) + assert newer1 not in index_ids + assert older1 in index_ids + + index_ids = self._index_ids(dict(search="slug:foo")) + assert newer1 not in index_ids + assert older1 in index_ids + + index_ids = self._index_ids(dict(search="foo")) + assert newer1 not in index_ids + assert older1 in index_ids + + def test_index_search_title(self): + page_id = self._create_valid_page_with_slug("indexsearchbytitle", title="mycooltitle")["id"] + assert page_id in self._index_ids(dict(search="mycooltitle")) + assert page_id not in self._index_ids(dict(search="mycoolwrongtitle")) + assert page_id in self._index_ids(dict(search="title:mycoolti")) + assert page_id in self._index_ids(dict(search="title:'mycooltitle'")) + assert page_id not in self._index_ids(dict(search="title:'mycoolti'")) + + def test_index_search_sharing_tags(self): + user_id = self.dataset_populator.user_id() + with self._different_user(): + response_published = self._create_valid_page_with_slug("indexshowsharedpublishedtags")["id"] + self._make_public(response_published) + response_shared = self._create_valid_page_with_slug("indexshowsharedsharedtags")["id"] + self._share_with_user(response_shared, user_id) + + assert response_published in self._index_ids(dict(show_published=True, show_shared=True)) + assert response_shared in self._index_ids(dict(show_published=True, show_shared=True)) + + assert response_published in self._index_ids(dict(show_published=True, show_shared=True, search="is:published")) + assert response_shared not in self._index_ids( + dict(show_published=True, show_shared=True, search="is:published") + ) + + assert response_published not in self._index_ids( + dict(show_published=True, show_shared=True, search="is:shared_with_me") + ) + assert response_shared in self._index_ids( + dict(show_published=True, show_shared=True, search="is:shared_with_me") + ) + def test_index_does_not_show_unavailable_pages(self): create_response_json = self._create_valid_page_as("others_page_index@bx.psu.edu", "otherspageindex") assert not self._users_index_has_page_with_id(create_response_json) @@ -356,10 +431,13 @@ def test_400_on_download_pdf_when_unsupported_content_format(self): pdf_response = self._get(f"pages/{page_id}.pdf") self._assert_status_code_is(pdf_response, 400) + def _create_published_page_with_slug(self, slug, **kwd) -> Dict[str, Any]: + response = self.dataset_populator.new_page(slug=slug, **kwd) + response = self._make_public(response["id"]) + return response + def _make_public(self, page_id: str) -> dict: - sharing_response = self._put(f"pages/{page_id}/publish") - assert sharing_response.status_code == 200 - return sharing_response.json() + return self.dataset_populator.make_page_public(page_id) def _share_with_user(self, page_id: str, user_id_or_email: str): data = {"user_ids": [user_id_or_email]} @@ -373,6 +451,8 @@ def _index_raw(self, params: Optional[Dict[str, Any]] = None) -> Response: def _index(self, params: Optional[Dict[str, Any]] = None) -> List[Dict[str, Any]]: index_response = self._index_raw(params) self._assert_status_code_is(index_response, 200) + print(params) + print(index_response.json()) return index_response.json() def _index_ids(self, params: Optional[Dict[str, Any]] = None) -> List[Dict[str, Any]]: diff --git a/lib/galaxy_test/base/populators.py b/lib/galaxy_test/base/populators.py index 72ee71034b12..5f3dc5f72187 100644 --- a/lib/galaxy_test/base/populators.py +++ b/lib/galaxy_test/base/populators.py @@ -1417,7 +1417,7 @@ def new_page( self, slug: str = "mypage", title: str = "MY PAGE", content_format: str = "html", content: Optional[str] = None ) -> Dict[str, Any]: page_response = self.new_page_raw(slug=slug, title=title, content_format=content_format, content=content) - page_response.raise_for_status() + api_asserts.assert_status_code_is(page_response, 200) return page_response.json() def new_page_raw( @@ -1480,6 +1480,11 @@ def get_history_export_tasks(self, history_id: str): api_asserts.assert_status_code_is_ok(response) return response.json() + def make_page_public(self, page_id: str) -> Dict[str, Any]: + sharing_response = self._put(f"pages/{page_id}/publish") + assert sharing_response.status_code == 200 + return sharing_response.json() + def wait_for_export_task_on_record(self, export_record): if export_record["preparing"]: assert export_record["task_uuid"] diff --git a/lib/galaxy_test/selenium/test_pages.py b/lib/galaxy_test/selenium/test_pages.py index 88ada1ff8d01..8a7153874918 100644 --- a/lib/galaxy_test/selenium/test_pages.py +++ b/lib/galaxy_test/selenium/test_pages.py @@ -21,7 +21,7 @@ def test_simple_page_creation_edit_and_view(self): self.history_panel_wait_for_hid_ok(1) self.navigate_to_pages() self.screenshot("pages_grid") - name = self.create_page_and_edit(screenshot_name="pages_create_form") + self.create_page_and_edit(screenshot_name="pages_create_form") self.screenshot("pages_editor_new") editor = self._page_editor editor.markdown_editor.wait_for_and_send_keys("moo\n\n\ncow\n\n") @@ -31,7 +31,7 @@ def test_simple_page_creation_edit_and_view(self): self.sleep_for(self.wait_types.UX_RENDER) editor.save.wait_for_and_click() self.screenshot("pages_editor_saved") - self.page_open_with_name(name, "page_view_with_embedded_dataset") + self.page_open_and_screenshot("page_view_with_embedded_dataset") @selenium_test @managed_history @@ -43,9 +43,8 @@ def test_workflow_problem_display(self): problem_workflow_2_id = workflow_populator.upload_yaml_workflow( WORKFLOW_WITH_BAD_COLUMN_PARAMETER, exact_tools=True ) - self.navigate_to_pages() - name = self.create_page_and_edit() + self.create_page_and_edit() editor = self._page_editor editor.markdown_editor.wait_for_and_send_keys("moo\n\n\ncow\n\n") editor.embed_workflow_display.wait_for_and_click() @@ -56,7 +55,7 @@ def test_workflow_problem_display(self): editor.workflow_selection(id=problem_workflow_2_id).wait_for_and_click() self.sleep_for(self.wait_types.UX_RENDER) editor.save.wait_for_and_click() - self.page_open_with_name(name, "page_view_with_workflow_problems") + self.page_open_and_screenshot("page_view_with_workflow_problems") @selenium_test @managed_history @@ -66,13 +65,13 @@ def test_history_links(self): self.current_history_publish() history_id = self.current_history_id() self.navigate_to_pages() - name = self.create_page_and_edit() + self.create_page_and_edit() editor = self._page_editor editor.history_link.wait_for_and_click() editor.history_selection(id=history_id).wait_for_and_click() self.sleep_for(self.wait_types.UX_RENDER) editor.save.wait_for_and_click() - self.page_open_with_name(name, "page_view_with_history_link") + self.page_open_and_screenshot("page_view_with_history_link") view = self.components.pages.view view.history_link(history_id=history_id).wait_for_and_click() self.sleep_for(self.wait_types.UX_RENDER) diff --git a/lib/galaxy_test/selenium/test_pages_index.py b/lib/galaxy_test/selenium/test_pages_index.py new file mode 100644 index 000000000000..f7f82676b7e6 --- /dev/null +++ b/lib/galaxy_test/selenium/test_pages_index.py @@ -0,0 +1,34 @@ +from .framework import ( + retry_assertion_during_transitions, + selenium_test, + SeleniumTestCase, +) + + +class TestPagesIndex(SeleniumTestCase): + ensure_registered = True + + @selenium_test + def test_page_deletion(self): + page_response = self.new_page() + page_id = page_response["id"] + self.navigate_to_pages() + self._assert_showing_n_pages(1) + self.components.pages.dropdown(id=page_id).wait_for_visible() + self.page_index_click_option("Delete", page_id) + self.sleep_for(self.wait_types.UX_RENDER) + self.components.pages.delete_modal_confirm(id=page_id).wait_for_and_click() + self.components.pages.dropdown(id=page_id).wait_for_absent_or_hidden() + self._assert_showing_n_pages(0) + + def new_page(self): + slug = self._get_random_name() + response = self.dataset_populator.new_page(slug=slug) + return response + + @retry_assertion_during_transitions + def _assert_showing_n_pages(self, n): + actual_count = len(self.pages_index_table_elements()) + if actual_count != n: + message = f"Expected {n} pages to be displayed, based on DOM found {actual_count} page index rows." + raise AssertionError(message) diff --git a/lib/galaxy_test/selenium/test_published_pages.py b/lib/galaxy_test/selenium/test_published_pages.py new file mode 100644 index 000000000000..7d367ae7da17 --- /dev/null +++ b/lib/galaxy_test/selenium/test_published_pages.py @@ -0,0 +1,31 @@ +from .framework import ( + selenium_test, + SharedStateSeleniumTestCase, +) + + +class TestPublishedPagesGrid(SharedStateSeleniumTestCase): + @selenium_test + def test_index(self): + self.navigate_to_published_pages() + self.components.pages.dropdown(id=self.page_id_1).wait_for_visible() + + def setup_shared_state(self): + self.user1_email = self._get_random_email("test1") + self.user2_email = self._get_random_email("test2") + self.register(self.user1_email) + page_1 = self.new_public_page() + self.page_id_1 = page_1["id"] + self.slug_1 = page_1["slug"] + self.logout_if_needed() + + self.register(self.user2_email) + page_2 = self.new_public_page() + self.page_id_2 = page_2["id"] + self.slug_2 = page_2["slug"] + + def new_public_page(self): + slug = self._get_random_name() + response = self.dataset_populator.new_page(slug=slug) + self.dataset_populator.make_page_public(response["id"]) + return response diff --git a/test/integration_selenium/test_pages_pdf_export.py b/test/integration_selenium/test_pages_pdf_export.py index eb291c13efa1..801dcbae620b 100644 --- a/test/integration_selenium/test_pages_pdf_export.py +++ b/test/integration_selenium/test_pages_pdf_export.py @@ -16,8 +16,10 @@ def handle_galaxy_config_kwds(cls, config): def test_page_pdf_export(self): self.navigate_to_pages() self.screenshot("pages_grid") - name = self.create_page() - self.click_grid_popup_option(name, "Edit content") + self.create_page() + self.components.pages.drop.wait_for_and_click() + self.sleep_for(self.wait_types.UX_RENDER) + self.components.pages.drop_edit.wait_for_and_click() self.components.pages.editor.markdown_editor.wait_for_and_send_keys("moo\n\n\ncow\n\n") self.screenshot("pages_markdown_editor") self.sleep_for(self.wait_types.UX_RENDER) @@ -26,7 +28,9 @@ def test_page_pdf_export(self): self.screenshot("pages_markdown_editor_saved") self.sleep_for(self.wait_types.UX_RENDER) self.navigate_to_pages() - self.click_grid_popup_option(name, "View") + self.components.pages.drop.wait_for_and_click() + self.sleep_for(self.wait_types.UX_RENDER) + self.components.pages.drop_view.wait_for_and_click() self.screenshot("pages_view_simple") self.components.pages.export.wait_for_and_click() self.sleep_for(self.wait_types.UX_RENDER)