diff --git a/Makefile b/Makefile index f089dc6..72b1955 100644 --- a/Makefile +++ b/Makefile @@ -124,7 +124,6 @@ i18n: $(VENV_FOLDER) ## Update locales .PHONY: test test: $(VENV_FOLDER) ## run tests @$(BIN_FOLDER)/pytest - @if [ -d "src/cs_dynamicpages/tests" ]; then $(BIN_FOLDER)/pytest src/cs_dynamicpages/tests; fi .PHONY: test-coverage test-coverage: $(VENV_FOLDER) ## run tests with coverage diff --git a/news/+tests.internal b/news/+tests.internal deleted file mode 100644 index 780bc01..0000000 --- a/news/+tests.internal +++ /dev/null @@ -1 +0,0 @@ -- Fix and expand test coverage: fix pre-existing placeholder tests, add tests for utils, indexers, upgrade steps, behaviors, vocabularies, control panel and browser components @erral diff --git a/src/cs_dynamicpages/testing.py b/src/cs_dynamicpages/testing.py index 1b38633..bd76714 100644 --- a/src/cs_dynamicpages/testing.py +++ b/src/cs_dynamicpages/testing.py @@ -44,8 +44,3 @@ def setUpPloneSite(self, portal): ), name="CsDynamicpagesLayer:AcceptanceTesting", ) - -# Aliases for backward compatibility with bobtemplates.plone naming -CS_DYNAMICPAGES_INTEGRATION_TESTING = INTEGRATION_TESTING -CS_DYNAMICPAGES_FUNCTIONAL_TESTING = FUNCTIONAL_TESTING -CS_DYNAMICPAGES_ACCEPTANCE_TESTING = ACCEPTANCE_TESTING diff --git a/src/cs_dynamicpages/tests/test_behavior_extra_class.py b/src/cs_dynamicpages/tests/test_behavior_extra_class.py deleted file mode 100644 index 889d8a6..0000000 --- a/src/cs_dynamicpages/tests/test_behavior_extra_class.py +++ /dev/null @@ -1,39 +0,0 @@ -from cs_dynamicpages.behaviors.extra_class import IExtraClassMarker -from cs_dynamicpages.testing import CS_DYNAMICPAGES_INTEGRATION_TESTING -from plone.app.testing import setRoles -from plone.app.testing import TEST_USER_ID -from plone.behavior.interfaces import IBehavior -from zope.component import getUtility - -import unittest - - -class ExtraClassIntegrationTest(unittest.TestCase): - """Integration tests for the extra_class behavior.""" - - layer = CS_DYNAMICPAGES_INTEGRATION_TESTING - - def setUp(self): - self.portal = self.layer["portal"] - setRoles(self.portal, TEST_USER_ID, ["Manager"]) - - def test_behavior_extra_class_registered(self): - """Test that the behavior is properly registered.""" - behavior = getUtility(IBehavior, "cs_dynamicpages.extra_class") - self.assertEqual( - behavior.marker, - IExtraClassMarker, - ) - - def test_behavior_extra_class_interface_name(self): - """Test the behavior interface name.""" - behavior = getUtility(IBehavior, "cs_dynamicpages.extra_class") - self.assertEqual( - behavior.interface.__name__, - "IExtraClass", - ) - - def test_behavior_extra_class_title(self): - """Test that the behavior has a title.""" - behavior = getUtility(IBehavior, "cs_dynamicpages.extra_class") - self.assertIsNotNone(behavior.title) diff --git a/src/cs_dynamicpages/tests/test_behavior_fetchpriority_image.py b/src/cs_dynamicpages/tests/test_behavior_fetchpriority_image.py deleted file mode 100644 index 5bec24d..0000000 --- a/src/cs_dynamicpages/tests/test_behavior_fetchpriority_image.py +++ /dev/null @@ -1,39 +0,0 @@ -from cs_dynamicpages.behaviors.fetchpriority_image import IFetchPriorityImageMarker -from cs_dynamicpages.testing import CS_DYNAMICPAGES_INTEGRATION_TESTING -from plone.app.testing import setRoles -from plone.app.testing import TEST_USER_ID -from plone.behavior.interfaces import IBehavior -from zope.component import getUtility - -import unittest - - -class FetchPriorityImageIntegrationTest(unittest.TestCase): - """Integration tests for the fetchpriority_image behavior.""" - - layer = CS_DYNAMICPAGES_INTEGRATION_TESTING - - def setUp(self): - self.portal = self.layer["portal"] - setRoles(self.portal, TEST_USER_ID, ["Manager"]) - - def test_behavior_fetchpriority_image_registered(self): - """Test that the behavior is properly registered.""" - behavior = getUtility(IBehavior, "cs_dynamicpages.fetchpriority_image") - self.assertEqual( - behavior.marker, - IFetchPriorityImageMarker, - ) - - def test_behavior_fetchpriority_image_interface_name(self): - """Test the behavior interface name.""" - behavior = getUtility(IBehavior, "cs_dynamicpages.fetchpriority_image") - self.assertEqual( - behavior.interface.__name__, - "IFetchPriorityImage", - ) - - def test_behavior_fetchpriority_image_title(self): - """Test that the behavior has a title.""" - behavior = getUtility(IBehavior, "cs_dynamicpages.fetchpriority_image") - self.assertIsNotNone(behavior.title) diff --git a/src/cs_dynamicpages/tests/test_behavior_row_vertical_spacing.py b/src/cs_dynamicpages/tests/test_behavior_row_vertical_spacing.py deleted file mode 100644 index 92ac824..0000000 --- a/src/cs_dynamicpages/tests/test_behavior_row_vertical_spacing.py +++ /dev/null @@ -1,59 +0,0 @@ -from cs_dynamicpages.behaviors.row_vertical_spacing import IRowVerticalSpacingMarker -from cs_dynamicpages.testing import CS_DYNAMICPAGES_INTEGRATION_TESTING -from plone.app.testing import setRoles -from plone.app.testing import TEST_USER_ID -from plone.behavior.interfaces import IBehavior -from zope.component import getUtility - -import unittest - - -class RowVerticalSpacingIntegrationTest(unittest.TestCase): - """Integration tests for the row_vertical_spacing behavior.""" - - layer = CS_DYNAMICPAGES_INTEGRATION_TESTING - - def setUp(self): - self.portal = self.layer["portal"] - setRoles(self.portal, TEST_USER_ID, ["Manager"]) - - def test_behavior_row_vertical_spacing_registered(self): - """Test that the behavior is properly registered.""" - behavior = getUtility(IBehavior, "cs_dynamicpages.row_vertical_spacing") - self.assertEqual( - behavior.marker, - IRowVerticalSpacingMarker, - ) - - def test_behavior_row_vertical_spacing_interface_name(self): - """Test the behavior interface name.""" - behavior = getUtility(IBehavior, "cs_dynamicpages.row_vertical_spacing") - self.assertEqual( - behavior.interface.__name__, - "IRowVerticalSpacing", - ) - - def test_behavior_row_vertical_spacing_title(self): - """Test that the behavior has a title.""" - behavior = getUtility(IBehavior, "cs_dynamicpages.row_vertical_spacing") - self.assertIsNotNone(behavior.title) - - def test_behavior_has_padding_top_field(self): - """Test that the behavior schema has padding_top field.""" - behavior = getUtility(IBehavior, "cs_dynamicpages.row_vertical_spacing") - self.assertIn("padding_top", behavior.interface.names()) - - def test_behavior_has_padding_bottom_field(self): - """Test that the behavior schema has padding_bottom field.""" - behavior = getUtility(IBehavior, "cs_dynamicpages.row_vertical_spacing") - self.assertIn("padding_bottom", behavior.interface.names()) - - def test_behavior_has_margin_top_field(self): - """Test that the behavior schema has margin_top field.""" - behavior = getUtility(IBehavior, "cs_dynamicpages.row_vertical_spacing") - self.assertIn("margin_top", behavior.interface.names()) - - def test_behavior_has_margin_bottom_field(self): - """Test that the behavior schema has margin_bottom field.""" - behavior = getUtility(IBehavior, "cs_dynamicpages.row_vertical_spacing") - self.assertIn("margin_bottom", behavior.interface.names()) diff --git a/src/cs_dynamicpages/tests/test_browser_body_class.py b/src/cs_dynamicpages/tests/test_browser_body_class.py deleted file mode 100644 index 7807dea..0000000 --- a/src/cs_dynamicpages/tests/test_browser_body_class.py +++ /dev/null @@ -1,94 +0,0 @@ -from cs_dynamicpages.browser.body_class import DynamicViewFolderClasses -from cs_dynamicpages.testing import CS_DYNAMICPAGES_INTEGRATION_TESTING -from plone import api -from plone.app.testing import setRoles -from plone.app.testing import TEST_USER_ID -from unittest.mock import Mock - -import unittest - - -class DynamicViewFolderClassesIntegrationTest(unittest.TestCase): - """Integration tests for the DynamicViewFolderClasses body class adapter.""" - - layer = CS_DYNAMICPAGES_INTEGRATION_TESTING - - def setUp(self): - self.portal = self.layer["portal"] - self.request = self.layer["request"] - setRoles(self.portal, TEST_USER_ID, ["Manager"]) - - def test_adapter_instantiation(self): - """Test that the adapter can be instantiated.""" - adapter = DynamicViewFolderClasses(self.portal, self.request) - self.assertIsNotNone(adapter) - self.assertEqual(adapter.context, self.portal) - self.assertEqual(adapter.request, self.request) - - def test_returns_can_edit_for_dynamic_view_template(self): - """Test that get_classes returns 'can_edit' for dynamic_view template.""" - folder = api.content.create( - container=self.portal, - type="Folder", - id="test-folder-body-class", - title="Test Folder", - ) - - adapter = DynamicViewFolderClasses(folder, self.request) - - # Mock template with id="dynamic_view.pt" - mock_template = Mock() - mock_template.id = "dynamic_view.pt" - mock_view = Mock() - - classes = adapter.get_classes(mock_template, mock_view) - self.assertIn("can_edit", classes) - - api.content.delete(obj=folder) - - def test_returns_empty_for_non_dynamic_view_template(self): - """Test that get_classes returns empty list for other templates.""" - folder = api.content.create( - container=self.portal, - type="Folder", - id="test-folder-other-template", - title="Test Folder", - ) - - adapter = DynamicViewFolderClasses(folder, self.request) - - # Mock template with different id - mock_template = Mock() - mock_template.id = "folder_listing.pt" - mock_view = Mock() - - classes = adapter.get_classes(mock_template, mock_view) - self.assertEqual(classes, []) - - api.content.delete(obj=folder) - - def test_returns_empty_for_user_without_edit_permission(self): - """Test that get_classes returns empty for user without edit permission.""" - folder = api.content.create( - container=self.portal, - type="Folder", - id="test-folder-no-permission", - title="Test Folder", - ) - - # Remove local Owner role and set global role to Member (no edit permission) - folder.manage_delLocalRoles([TEST_USER_ID]) - setRoles(self.portal, TEST_USER_ID, ["Member"]) - - adapter = DynamicViewFolderClasses(folder, self.request) - - mock_template = Mock() - mock_template.id = "dynamic_view.pt" - mock_view = Mock() - - classes = adapter.get_classes(mock_template, mock_view) - self.assertEqual(classes, []) - - # Restore Manager role for cleanup - setRoles(self.portal, TEST_USER_ID, ["Manager"]) - api.content.delete(obj=folder) diff --git a/src/cs_dynamicpages/tests/test_controlpanel.py b/src/cs_dynamicpages/tests/test_controlpanel.py deleted file mode 100644 index 67ebd49..0000000 --- a/src/cs_dynamicpages/tests/test_controlpanel.py +++ /dev/null @@ -1,133 +0,0 @@ -from cs_dynamicpages.controlpanels.dynamic_pages_control_panel.controlpanel import ( - IDynamicPagesControlPanel, -) -from cs_dynamicpages.testing import CS_DYNAMICPAGES_INTEGRATION_TESTING -from plone import api -from plone.app.testing import setRoles -from plone.app.testing import TEST_USER_ID -from plone.registry.interfaces import IRegistry -from zope.component import getUtility - -import unittest - - -class DynamicPagesControlPanelIntegrationTest(unittest.TestCase): - """Integration tests for the Dynamic Pages Control Panel.""" - - layer = CS_DYNAMICPAGES_INTEGRATION_TESTING - - def setUp(self): - self.portal = self.layer["portal"] - setRoles(self.portal, TEST_USER_ID, ["Manager"]) - self.registry = getUtility(IRegistry) - - def test_controlpanel_schema_registered(self): - """Test that the control panel schema is registered in the registry.""" - records = self.registry.records - self.assertIn( - "cs_dynamicpages.dynamic_pages_control_panel.row_type_fields", - records, - ) - - def test_row_type_fields_record_exists(self): - """Test that row_type_fields registry record exists.""" - value = api.portal.get_registry_record( - "cs_dynamicpages.dynamic_pages_control_panel.row_type_fields" - ) - self.assertIsInstance(value, list) - - def test_row_widths_record_exists(self): - """Test that row_widths registry record exists.""" - value = api.portal.get_registry_record( - "cs_dynamicpages.dynamic_pages_control_panel.row_widths" - ) - self.assertIsInstance(value, list) - - def test_spacer_padding_top_record_exists(self): - """Test that spacer_padding_top registry record exists.""" - value = api.portal.get_registry_record( - "cs_dynamicpages.dynamic_pages_control_panel.spacer_padding_top" - ) - self.assertIsInstance(value, list) - - def test_spacer_padding_bottom_record_exists(self): - """Test that spacer_padding_bottom registry record exists.""" - value = api.portal.get_registry_record( - "cs_dynamicpages.dynamic_pages_control_panel.spacer_padding_bottom" - ) - self.assertIsInstance(value, list) - - def test_spacer_margin_top_record_exists(self): - """Test that spacer_margin_top registry record exists.""" - value = api.portal.get_registry_record( - "cs_dynamicpages.dynamic_pages_control_panel.spacer_margin_top" - ) - self.assertIsInstance(value, list) - - def test_spacer_margin_bottom_record_exists(self): - """Test that spacer_margin_bottom registry record exists.""" - value = api.portal.get_registry_record( - "cs_dynamicpages.dynamic_pages_control_panel.spacer_margin_bottom" - ) - self.assertIsInstance(value, list) - - def test_row_type_fields_has_default_values(self): - """Test that row_type_fields has default row types configured.""" - value = api.portal.get_registry_record( - "cs_dynamicpages.dynamic_pages_control_panel.row_type_fields" - ) - row_types = [item["row_type"] for item in value] - - # Check for some expected default row types - self.assertIn("cs_dynamicpages-horizontal-rule-view", row_types) - self.assertIn("cs_dynamicpages-spacer-view", row_types) - - def test_row_widths_has_default_values(self): - """Test that row_widths has default width options.""" - value = api.portal.get_registry_record( - "cs_dynamicpages.dynamic_pages_control_panel.row_widths" - ) - self.assertTrue(len(value) > 0) - - # Check structure of first item - first_item = value[0] - self.assertIn("row_width_label", first_item) - self.assertIn("row_width_class", first_item) - - def test_spacer_values_have_correct_structure(self): - """Test that spacer values have correct structure.""" - for record_name in [ - "spacer_padding_top", - "spacer_padding_bottom", - "spacer_margin_top", - "spacer_margin_bottom", - ]: - value = api.portal.get_registry_record( - f"cs_dynamicpages.dynamic_pages_control_panel.{record_name}" - ) - self.assertTrue(len(value) > 0, f"{record_name} should have values") - - # Check structure of first item - first_item = value[0] - self.assertIn("spacer_label", first_item) - self.assertIn("spacer_class", first_item) - - -class DynamicPagesControlPanelSchemaTest(unittest.TestCase): - """Tests for the control panel schema interface.""" - - def test_schema_has_row_type_fields(self): - """Test that schema has row_type_fields field.""" - self.assertIn("row_type_fields", IDynamicPagesControlPanel.names()) - - def test_schema_has_row_widths(self): - """Test that schema has row_widths field.""" - self.assertIn("row_widths", IDynamicPagesControlPanel.names()) - - def test_schema_has_spacer_fields(self): - """Test that schema has all spacer fields.""" - names = IDynamicPagesControlPanel.names() - self.assertIn("spacer_padding_top", names) - self.assertIn("spacer_padding_bottom", names) - self.assertIn("spacer_margin_top", names) - self.assertIn("spacer_margin_bottom", names) diff --git a/src/cs_dynamicpages/tests/test_ct_dynamic_page_folder.py b/src/cs_dynamicpages/tests/test_ct_dynamic_page_folder.py index db6397f..7dcc043 100644 --- a/src/cs_dynamicpages/tests/test_ct_dynamic_page_folder.py +++ b/src/cs_dynamicpages/tests/test_ct_dynamic_page_folder.py @@ -66,10 +66,10 @@ def test_ct_dynamic_page_folder_adding(self): api.content.delete(obj=obj) self.assertNotIn("dynamic_page_folder", parent.objectIds()) - def test_ct_dynamic_page_folder_globally_addable(self): + def test_ct_dynamic_page_folder_globally_not_addable(self): setRoles(self.portal, TEST_USER_ID, ["Contributor"]) fti = queryUtility(IDexterityFTI, name="DynamicPageFolder") - self.assertTrue(fti.global_allow, f"{fti.id} is not globally addable!") + self.assertFalse(fti.global_allow, f"{fti.id} is globally addable!") def test_ct_dynamic_page_folder_filter_content_type_true(self): setRoles(self.portal, TEST_USER_ID, ["Contributor"]) diff --git a/src/cs_dynamicpages/tests/test_indexer_content_index_extender.py b/src/cs_dynamicpages/tests/test_indexer_content_index_extender.py deleted file mode 100644 index e104fd4..0000000 --- a/src/cs_dynamicpages/tests/test_indexer_content_index_extender.py +++ /dev/null @@ -1,277 +0,0 @@ -from cs_dynamicpages.indexers.content_index_extender import extract_text_value_to_index -from cs_dynamicpages.indexers.content_index_extender import FIELDS_TO_INDEX -from cs_dynamicpages.indexers.content_index_extender import FolderishItemTextExtender -from cs_dynamicpages.indexers.content_index_extender import ( - get_available_text_from_dynamic_pages, -) -from cs_dynamicpages.indexers.content_index_extender import get_enabled_fields -from cs_dynamicpages.testing import CS_DYNAMICPAGES_INTEGRATION_TESTING -from plone import api -from plone.app.testing import setRoles -from plone.app.testing import TEST_USER_ID -from plone.app.textfield.value import RichTextValue - -import unittest - - -class TestFieldsToIndex(unittest.TestCase): - """Tests for FIELDS_TO_INDEX constant.""" - - def test_contains_title_field(self): - self.assertIn("IBasic.title", FIELDS_TO_INDEX) - - def test_contains_description_field(self): - self.assertIn("IBasic.description", FIELDS_TO_INDEX) - - def test_contains_text_field(self): - self.assertIn("IRichTextBehavior-text", FIELDS_TO_INDEX) - - def test_title_field_is_callable(self): - self.assertTrue(callable(FIELDS_TO_INDEX["IBasic.title"])) - - def test_description_field_is_callable(self): - self.assertTrue(callable(FIELDS_TO_INDEX["IBasic.description"])) - - def test_text_field_is_callable(self): - self.assertTrue(callable(FIELDS_TO_INDEX["IRichTextBehavior-text"])) - - -class ExtractTextValueToIndexIntegrationTest(unittest.TestCase): - """Integration tests for extract_text_value_to_index function.""" - - layer = CS_DYNAMICPAGES_INTEGRATION_TESTING - - def setUp(self): - self.portal = self.layer["portal"] - setRoles(self.portal, TEST_USER_ID, ["Manager"]) - - def test_extracts_plain_text_from_html(self): - doc = api.content.create( - container=self.portal, - type="Document", - id="test-doc-html", - title="Test Document", - ) - doc.text = RichTextValue( - "

Hello World

", - "text/html", - "text/x-html-safe", - ) - - result = extract_text_value_to_index(doc) - self.assertIn("Hello", result) - self.assertIn("World", result) - self.assertNotIn("

", result) - self.assertNotIn("", result) - - api.content.delete(obj=doc) - - def test_returns_empty_for_none_text(self): - doc = api.content.create( - container=self.portal, - type="Document", - id="test-doc-none", - title="Test Document", - ) - doc.text = None - - result = extract_text_value_to_index(doc) - self.assertEqual(result, "") - - api.content.delete(obj=doc) - - -class GetEnabledFieldsIntegrationTest(unittest.TestCase): - """Integration tests for get_enabled_fields function.""" - - layer = CS_DYNAMICPAGES_INTEGRATION_TESTING - - def setUp(self): - self.portal = self.layer["portal"] - setRoles(self.portal, TEST_USER_ID, ["Manager"]) - # Store original registry value for restoration - self.record_name = "cs_dynamicpages.dynamic_pages_control_panel.row_type_fields" - self.original_values = list(api.portal.get_registry_record(self.record_name)) - - def tearDown(self): - # Restore original registry values to prevent test pollution - from plone.registry.interfaces import IRegistry - from zope.component import getUtility - - registry = getUtility(IRegistry) - record = registry.records[self.record_name] - record.value = self.original_values - - def test_returns_list(self): - result = get_enabled_fields("cs_dynamicpages-horizontal-rule-view") - self.assertIsInstance(result, list) - - def test_returns_empty_list_for_unknown_row_type(self): - result = get_enabled_fields("nonexistent-row-type") - self.assertEqual(result, []) - - def test_returns_fields_for_known_row_type(self): - # Test with an existing registered view - result = get_enabled_fields("cs_dynamicpages-slider-view") - # slider-view should have fields defined - self.assertIsInstance(result, list) - - -class FolderishItemTextExtenderIntegrationTest(unittest.TestCase): - """Integration tests for FolderishItemTextExtender class.""" - - layer = CS_DYNAMICPAGES_INTEGRATION_TESTING - - def setUp(self): - self.portal = self.layer["portal"] - setRoles(self.portal, TEST_USER_ID, ["Manager"]) - - def test_returns_empty_string_for_non_dynamic_layout(self): - folder = api.content.create( - container=self.portal, - type="Folder", - id="test-folder-non-dynamic", - title="Test Folder", - ) - - extender = FolderishItemTextExtender(folder) - result = extender() - self.assertEqual(result, "") - - api.content.delete(obj=folder) - - def test_calls_get_available_text_for_dynamic_layout(self): - folder = api.content.create( - container=self.portal, - type="Folder", - id="test-folder-dynamic", - title="Test Folder", - ) - folder.setLayout("dynamic-view") - - extender = FolderishItemTextExtender(folder) - result = extender() - # Should return a string (may be empty if no dynamic page rows) - self.assertIsInstance(result, str) - - api.content.delete(obj=folder) - - -class GetAvailableTextFromDynamicPagesIntegrationTest(unittest.TestCase): - """Integration tests for get_available_text_from_dynamic_pages function.""" - - layer = CS_DYNAMICPAGES_INTEGRATION_TESTING - - def setUp(self): - self.portal = self.layer["portal"] - setRoles(self.portal, TEST_USER_ID, ["Manager"]) - # Store original registry value for restoration - self.record_name = "cs_dynamicpages.dynamic_pages_control_panel.row_type_fields" - self.original_values = list(api.portal.get_registry_record(self.record_name)) - - def tearDown(self): - # Restore original registry values to prevent test pollution - from plone.registry.interfaces import IRegistry - from zope.component import getUtility - - registry = getUtility(IRegistry) - record = registry.records[self.record_name] - record.value = self.original_values - - def test_returns_string(self): - folder = api.content.create( - container=self.portal, - type="Folder", - id="test-folder-text", - title="Test Folder", - ) - - result = get_available_text_from_dynamic_pages(folder) - self.assertIsInstance(result, str) - - api.content.delete(obj=folder) - - def test_returns_empty_for_folder_without_rows(self): - folder = api.content.create( - container=self.portal, - type="Folder", - id="test-folder-empty", - title="Test Folder", - ) - - result = get_available_text_from_dynamic_pages(folder) - self.assertEqual(result, "") - - api.content.delete(obj=folder) - - def test_extracts_text_from_published_rows(self): - # Create folder - folder = api.content.create( - container=self.portal, - type="Folder", - id="test-folder-with-rows", - title="Test Folder", - ) - api.content.transition(obj=folder, transition="publish") - - # Create DynamicPageFolder - dpf = api.content.create( - container=folder, - type="DynamicPageFolder", - id="rows", - title="Rows", - ) - api.content.transition(obj=dpf, transition="publish") - - # Use slider-view which has IBasic.title enabled - view_name = "cs_dynamicpages-slider-view" - - # Create DynamicPageRow - row = api.content.create( - container=dpf, - type="DynamicPageRow", - id="test-row", - title="Indexable Row Title", - ) - row.row_type = view_name - api.content.transition(obj=row, transition="publish") - - result = get_available_text_from_dynamic_pages(folder) - self.assertIn("Indexable Row Title", result) - - api.content.delete(obj=folder) - - def test_ignores_unpublished_rows(self): - # Create folder - folder = api.content.create( - container=self.portal, - type="Folder", - id="test-folder-unpublished", - title="Test Folder", - ) - - # Create DynamicPageFolder - dpf = api.content.create( - container=folder, - type="DynamicPageFolder", - id="rows", - title="Rows", - ) - - # Use slider-view which has IBasic.title enabled - view_name = "cs_dynamicpages-slider-view" - - # Create unpublished DynamicPageRow - row = api.content.create( - container=dpf, - type="DynamicPageRow", - id="test-row-unpublished", - title="Should Not Be Indexed", - ) - row.row_type = view_name - # Don't publish the row - - result = get_available_text_from_dynamic_pages(folder) - self.assertNotIn("Should Not Be Indexed", result) - - api.content.delete(obj=folder) diff --git a/src/cs_dynamicpages/tests/test_subscriber_index_contents_in_parents.py b/src/cs_dynamicpages/tests/test_subscriber_index_contents_in_parents.py index af147e0..a2772c8 100644 --- a/src/cs_dynamicpages/tests/test_subscriber_index_contents_in_parents.py +++ b/src/cs_dynamicpages/tests/test_subscriber_index_contents_in_parents.py @@ -1,87 +1,22 @@ -from cs_dynamicpages.subscribers.index_contents_in_parents import handler +from cs_dynamicpages.testing import CS_DYNAMICPAGES_FUNCTIONAL_TESTING from cs_dynamicpages.testing import CS_DYNAMICPAGES_INTEGRATION_TESTING -from plone import api from plone.app.testing import setRoles from plone.app.testing import TEST_USER_ID import unittest -class SubscriberIndexContentsInParentsIntegrationTest(unittest.TestCase): - """Integration tests for the index_contents_in_parents subscriber.""" - +class SubscriberIntegrationTest(unittest.TestCase): layer = CS_DYNAMICPAGES_INTEGRATION_TESTING def setUp(self): self.portal = self.layer["portal"] setRoles(self.portal, TEST_USER_ID, ["Manager"]) - def test_handler_reindexes_parent_content(self): - """Test that handler reindexes the parent content.""" - # Create a folder - folder = api.content.create( - container=self.portal, - type="Folder", - id="test-folder-subscriber", - title="Test Folder", - ) - - # Create DynamicPageFolder - dpf = api.content.create( - container=folder, - type="DynamicPageFolder", - id="rows", - title="Rows", - ) - - # Create DynamicPageRow - row = api.content.create( - container=dpf, - type="DynamicPageRow", - id="test-row", - title="Test Row", - ) - - # Call handler - should not raise any exceptions - handler(row, None) - - # Cleanup - api.content.delete(obj=folder) - - def test_handler_does_not_fail_for_non_dynamic_page_folder_parent(self): - """Test that handler handles non-DynamicPageFolder parents gracefully.""" - # Create a folder directly containing a DynamicPageRow - # (this is an edge case that shouldn't normally happen) - folder = api.content.create( - container=self.portal, - type="Folder", - id="test-folder-edge", - title="Test Folder", - ) - - # Create DynamicPageFolder to get a proper row - dpf = api.content.create( - container=folder, - type="DynamicPageFolder", - id="rows", - title="Rows", - ) - row = api.content.create( - container=dpf, - type="DynamicPageRow", - id="test-row", - title="Test Row", - ) +class SubscriberFunctionalTest(unittest.TestCase): + layer = CS_DYNAMICPAGES_FUNCTIONAL_TESTING - # Handler should work since parent is DynamicPageFolder - handler(row, None) - - # Cleanup - api.content.delete(obj=folder) - - def test_handler_function_exists(self): - """Test that the handler function is properly defined.""" - from cs_dynamicpages.subscribers.index_contents_in_parents import handler - - self.assertTrue(callable(handler)) + def setUp(self): + self.portal = self.layer["portal"] + setRoles(self.portal, TEST_USER_ID, ["Manager"]) diff --git a/src/cs_dynamicpages/tests/test_upgrade_step_1002.py b/src/cs_dynamicpages/tests/test_upgrade_step_1002.py index e088157..f3a1881 100644 --- a/src/cs_dynamicpages/tests/test_upgrade_step_1002.py +++ b/src/cs_dynamicpages/tests/test_upgrade_step_1002.py @@ -1,170 +1,27 @@ +# from cs_dynamicpages.testing import CS_DYNAMICPAGES_FUNCTIONAL_TESTING from cs_dynamicpages.testing import CS_DYNAMICPAGES_INTEGRATION_TESTING -from cs_dynamicpages.upgrades.v1002 import post_handler -from cs_dynamicpages.upgrades.v1002 import pre_handler -from cs_dynamicpages.upgrades.v1002 import UPGRADEABLE_KEYS -from plone import api from plone.app.testing import setRoles from plone.app.testing import TEST_USER_ID -from zope.annotation.interfaces import IAnnotations -import json import unittest -class UpgradeStep1002IntegrationTest(unittest.TestCase): - """Integration tests for upgrade step 1002.""" - +class UpgradeStepIntegrationTest(unittest.TestCase): layer = CS_DYNAMICPAGES_INTEGRATION_TESTING def setUp(self): self.portal = self.layer["portal"] setRoles(self.portal, TEST_USER_ID, ["Manager"]) - # Store original registry values for restoration - self.original_values = {} - for key in UPGRADEABLE_KEYS: - record_name = f"cs_dynamicpages.dynamic_pages_control_panel.{key}" - self.original_values[key] = list( - api.portal.get_registry_record(record_name) - ) - # Clear any existing upgrade annotations - self._clear_upgrade_annotations() - - def tearDown(self): - # Restore original registry values - from plone.registry.interfaces import IRegistry - from zope.component import getUtility - - registry = getUtility(IRegistry) - for key in UPGRADEABLE_KEYS: - record_name = f"cs_dynamicpages.dynamic_pages_control_panel.{key}" - record = registry.records[record_name] - record.value = self.original_values[key] - # Clear upgrade annotations - self._clear_upgrade_annotations() - - def _clear_upgrade_annotations(self): - """Clear any upgrade annotations from the portal.""" - annotations = IAnnotations(self.portal) - for key in UPGRADEABLE_KEYS: - annotation_key = ( - f"cs_dynamicpages.dynamic_pages_control_panel.{key}.UPGRADE" - ) - if annotation_key in annotations: - del annotations[annotation_key] - - def test_upgradeable_keys_defined(self): - """Test that UPGRADEABLE_KEYS contains expected keys.""" - self.assertIn("row_type_fields", UPGRADEABLE_KEYS) - self.assertIn("row_widths", UPGRADEABLE_KEYS) - - def test_pre_handler_saves_values_to_annotations(self): - """Test that pre_handler saves registry values to annotations.""" - # Run pre_handler - pre_handler() - - # Check annotations were created - annotations = IAnnotations(self.portal) - for key in UPGRADEABLE_KEYS: - annotation_key = ( - f"cs_dynamicpages.dynamic_pages_control_panel.{key}.UPGRADE" - ) - self.assertIn(annotation_key, annotations) - # Value should be a JSON string - value_str = annotations[annotation_key] - self.assertIsInstance(value_str, str) - # Should be valid JSON - parsed = json.loads(value_str) - self.assertIsInstance(parsed, list) - - def test_post_handler_restores_values_from_annotations(self): - """Test that post_handler restores values from annotations. - - Note: pre_handler reads from old typo registry key - 'dynamica_pages_control_panel' which is typically empty. - This test verifies the restore mechanism works by manually - setting up annotations. - """ - # Manually set up annotations with known values - annotations = IAnnotations(self.portal) - for key in UPGRADEABLE_KEYS: - annotation_key = ( - f"cs_dynamicpages.dynamic_pages_control_panel.{key}.UPGRADE" - ) - # Store current values in annotations - current_values = api.portal.get_registry_record( - f"cs_dynamicpages.dynamic_pages_control_panel.{key}", default=[] - ) - annotations[annotation_key] = json.dumps(current_values) - - # Run post_handler - post_handler() - - # Verify values were restored (should match what we stored) - for key in UPGRADEABLE_KEYS: - restored = api.portal.get_registry_record( - f"cs_dynamicpages.dynamic_pages_control_panel.{key}" - ) - self.assertEqual(restored, self.original_values[key]) - - def test_post_handler_removes_annotations(self): - """Test that post_handler cleans up annotations.""" - # First run pre_handler - pre_handler() - - annotations = IAnnotations(self.portal) - # Verify annotations exist - for key in UPGRADEABLE_KEYS: - annotation_key = ( - f"cs_dynamicpages.dynamic_pages_control_panel.{key}.UPGRADE" - ) - self.assertIn(annotation_key, annotations) - - # Run post_handler - post_handler() - - # Verify annotations were removed - for key in UPGRADEABLE_KEYS: - annotation_key = ( - f"cs_dynamicpages.dynamic_pages_control_panel.{key}.UPGRADE" - ) - self.assertNotIn(annotation_key, annotations) - - def test_post_handler_handles_invalid_json(self): - """Test that post_handler handles invalid JSON gracefully.""" - # Manually set invalid JSON in annotations - annotations = IAnnotations(self.portal) - for key in UPGRADEABLE_KEYS: - annotation_key = ( - f"cs_dynamicpages.dynamic_pages_control_panel.{key}.UPGRADE" - ) - annotations[annotation_key] = "invalid json {" - - # Should not raise exception - post_handler() - - # Should set empty list for invalid JSON - for key in UPGRADEABLE_KEYS: - value = api.portal.get_registry_record( - f"cs_dynamicpages.dynamic_pages_control_panel.{key}" - ) - self.assertEqual(value, []) - def test_post_handler_handles_non_list_value(self): - """Test that post_handler handles non-list values.""" - # Manually set a non-list JSON value - annotations = IAnnotations(self.portal) - for key in UPGRADEABLE_KEYS: - annotation_key = ( - f"cs_dynamicpages.dynamic_pages_control_panel.{key}.UPGRADE" - ) - annotations[annotation_key] = json.dumps({"not": "a list"}) + def test_upgrade_step(self): + # dummy, add tests here + self.assertTrue(True) - # Should not raise exception - post_handler() - # Should set empty list for non-list values - for key in UPGRADEABLE_KEYS: - value = api.portal.get_registry_record( - f"cs_dynamicpages.dynamic_pages_control_panel.{key}" - ) - self.assertEqual(value, []) +# class UpgradeStepFunctionalTest(unittest.TestCase): +# +# layer = CS_DYNAMICPAGES_FUNCTIONAL_TESTING +# +# def setUp(self): +# self.portal = self.layer['portal'] +# setRoles(self.portal, TEST_USER_ID, ['Manager']) diff --git a/src/cs_dynamicpages/tests/test_upgrade_step_1005.py b/src/cs_dynamicpages/tests/test_upgrade_step_1005.py deleted file mode 100644 index f844db6..0000000 --- a/src/cs_dynamicpages/tests/test_upgrade_step_1005.py +++ /dev/null @@ -1,109 +0,0 @@ -from cs_dynamicpages.testing import CS_DYNAMICPAGES_INTEGRATION_TESTING -from cs_dynamicpages.upgrades.v1005 import upgrade -from plone import api -from plone.app.testing import setRoles -from plone.app.testing import TEST_USER_ID - -import unittest - - -class UpgradeStep1005IntegrationTest(unittest.TestCase): - """Integration tests for upgrade step 1005.""" - - layer = CS_DYNAMICPAGES_INTEGRATION_TESTING - - def setUp(self): - self.portal = self.layer["portal"] - setRoles(self.portal, TEST_USER_ID, ["Manager"]) - # Store original registry value for restoration - self.record_name = "cs_dynamicpages.dynamic_pages_control_panel.row_type_fields" - self.original_values = list(api.portal.get_registry_record(self.record_name)) - - def tearDown(self): - # Restore original registry values - from plone.registry.interfaces import IRegistry - from zope.component import getUtility - - registry = getUtility(IRegistry) - record = registry.records[self.record_name] - record.value = self.original_values - - def test_upgrade_runs_without_error(self): - """Test that upgrade runs without raising exceptions. - - Note: The schema now requires row_type_icon, so we can't test adding it - to entries without it. Instead we verify the upgrade runs successfully. - """ - # Run upgrade - should not raise - upgrade() - - # Verify registry values still valid - record_name = "cs_dynamicpages.dynamic_pages_control_panel.row_type_fields" - values = api.portal.get_registry_record(record_name) - self.assertIsInstance(values, list) - # All entries should have row_type_icon - for entry in values: - self.assertIn("row_type_icon", entry) - - def test_upgrade_preserves_existing_icons(self): - """Test that upgrade preserves existing custom icons.""" - record_name = "cs_dynamicpages.dynamic_pages_control_panel.row_type_fields" - - # Get current values - values = api.portal.get_registry_record(record_name) - - # Find an entry with an icon - entry_with_custom_icon = None - for entry in values: - if entry.get("row_type_icon") and entry["row_type_icon"] != "bricks": - entry_with_custom_icon = entry.copy() - break - - # Run upgrade - upgrade() - - # Check that custom icon was preserved - if entry_with_custom_icon: - updated_values = api.portal.get_registry_record(record_name) - for updated_entry in updated_values: - if updated_entry["row_type"] == entry_with_custom_icon["row_type"]: - self.assertEqual( - updated_entry["row_type_icon"], - entry_with_custom_icon["row_type_icon"], - ) - break - - def test_upgrade_adds_title_description_view_if_missing(self): - """Test that upgrade adds title-description-view if not present.""" - record_name = "cs_dynamicpages.dynamic_pages_control_panel.row_type_fields" - - # Run upgrade - upgrade() - - # Check updated values - updated_values = api.portal.get_registry_record(record_name) - updated_view_names = [v["row_type"] for v in updated_values] - - # View should now exist - self.assertIn("cs_dynamicpages-title-description-view", updated_view_names) - - def test_title_description_view_has_correct_fields(self): - """Test that title-description-view has correct fields configured.""" - record_name = "cs_dynamicpages.dynamic_pages_control_panel.row_type_fields" - - # Run upgrade to ensure view exists - upgrade() - - # Find the title-description-view - values = api.portal.get_registry_record(record_name) - view_config = None - for value in values: - if value["row_type"] == "cs_dynamicpages-title-description-view": - view_config = value - break - - self.assertIsNotNone(view_config) - self.assertIn("IBasic.title", view_config["each_row_type_fields"]) - self.assertIn("IBasic.description", view_config["each_row_type_fields"]) - self.assertEqual(view_config["row_type_icon"], "fonts") - self.assertFalse(view_config["row_type_has_featured_add_button"]) diff --git a/src/cs_dynamicpages/tests/test_upgrade_step_1006.py b/src/cs_dynamicpages/tests/test_upgrade_step_1006.py deleted file mode 100644 index b2179ad..0000000 --- a/src/cs_dynamicpages/tests/test_upgrade_step_1006.py +++ /dev/null @@ -1,74 +0,0 @@ -from cs_dynamicpages.testing import CS_DYNAMICPAGES_INTEGRATION_TESTING -from cs_dynamicpages.upgrades.v1006 import upgrade -from plone import api -from plone.app.testing import setRoles -from plone.app.testing import TEST_USER_ID - -import unittest - - -class UpgradeStep1006IntegrationTest(unittest.TestCase): - """Integration tests for upgrade step 1006.""" - - layer = CS_DYNAMICPAGES_INTEGRATION_TESTING - - def setUp(self): - self.portal = self.layer["portal"] - setRoles(self.portal, TEST_USER_ID, ["Manager"]) - - def test_upgrade_enables_row_vertical_spacing_behavior(self): - """Test that upgrade enables the row_vertical_spacing behavior.""" - portal_types = api.portal.get_tool("portal_types") - fti = getattr(portal_types, "DynamicPageRow", None) - - # Run upgrade - upgrade() - - # Check behavior is enabled - self.assertIn("cs_dynamicpages.row_vertical_spacing", fti.behaviors) - - def test_upgrade_adds_vertical_spacing_fields_to_all_row_types(self): - """Test that upgrade adds vertical spacing fields to all row types.""" - record_name = "cs_dynamicpages.dynamic_pages_control_panel.row_type_fields" - - # Run upgrade - upgrade() - - # Check all row types have the new fields - values = api.portal.get_registry_record(record_name) - expected_fields = [ - "IRowVerticalSpacing.padding_top", - "IRowVerticalSpacing.padding_bottom", - "IRowVerticalSpacing.margin_top", - "IRowVerticalSpacing.margin_bottom", - ] - - for value in values: - fields = value["each_row_type_fields"] - for expected_field in expected_fields: - self.assertIn( - expected_field, - fields, - f"Field {expected_field} not found in row type {value['row_type']}", - ) - - def test_upgrade_preserves_existing_fields(self): - """Test that upgrade preserves existing fields in row types.""" - record_name = "cs_dynamicpages.dynamic_pages_control_panel.row_type_fields" - - # Get original fields for first row type - values = api.portal.get_registry_record(record_name) - if values: - original_fields = values[0]["each_row_type_fields"].copy() - original_row_type = values[0]["row_type"] - - # Run upgrade - upgrade() - - # Check original fields are preserved - updated_values = api.portal.get_registry_record(record_name) - for updated in updated_values: - if updated["row_type"] == original_row_type: - for field in original_fields: - self.assertIn(field, updated["each_row_type_fields"]) - break diff --git a/src/cs_dynamicpages/tests/test_upgrade_step_1007.py b/src/cs_dynamicpages/tests/test_upgrade_step_1007.py deleted file mode 100644 index 8322cd6..0000000 --- a/src/cs_dynamicpages/tests/test_upgrade_step_1007.py +++ /dev/null @@ -1,116 +0,0 @@ -from cs_dynamicpages.testing import CS_DYNAMICPAGES_INTEGRATION_TESTING -from cs_dynamicpages.upgrades.v1007 import upgrade -from plone import api -from plone.app.testing import setRoles -from plone.app.testing import TEST_USER_ID -from typing import ClassVar - -import unittest - - -class UpgradeStep1007IntegrationTest(unittest.TestCase): - """Integration tests for upgrade step 1007.""" - - layer = CS_DYNAMICPAGES_INTEGRATION_TESTING - - # Row types that should get the fetchpriority_image field - TARGET_ROW_TYPES: ClassVar[list[str]] = [ - "cs_dynamicpages-slider-view", - "cs_dynamicpages-features-view", - "cs_dynamicpages-query-columns-view", - "cs_dynamicpages-featured-overlay-view", - "cs_dynamicpages-featured-view", - ] - - def setUp(self): - self.portal = self.layer["portal"] - setRoles(self.portal, TEST_USER_ID, ["Manager"]) - - def test_upgrade_enables_fetchpriority_image_behavior(self): - """Test that upgrade enables the fetchpriority_image behavior.""" - portal_types = api.portal.get_tool("portal_types") - fti = getattr(portal_types, "DynamicPageRow", None) - - # Run upgrade - upgrade() - - # Check behavior is enabled - self.assertIn("cs_dynamicpages.fetchpriority_image", fti.behaviors) - - def test_upgrade_adds_fetchpriority_field_to_target_row_types(self): - """Test that upgrade adds fetchpriority field to specific row types.""" - record_name = "cs_dynamicpages.dynamic_pages_control_panel.row_type_fields" - - # Run upgrade - upgrade() - - # Check target row types have the new field - values = api.portal.get_registry_record(record_name) - - for value in values: - if value["row_type"] in self.TARGET_ROW_TYPES: - self.assertIn( - "IFetchPriorityImage.fetchpriority_image", - value["each_row_type_fields"], - f"Field not found in target row type {value['row_type']}", - ) - - def test_upgrade_does_not_add_field_to_other_row_types(self): - """Test that upgrade does not add field to non-target row types.""" - record_name = "cs_dynamicpages.dynamic_pages_control_panel.row_type_fields" - - # Get original state - original_values = api.portal.get_registry_record(record_name) - non_target_types_fields = {} - for value in original_values: - if value["row_type"] not in self.TARGET_ROW_TYPES: - # Check if fetchpriority field is already present - has_field = "IFetchPriorityImage.fetchpriority_image" in value.get( - "each_row_type_fields", [] - ) - non_target_types_fields[value["row_type"]] = has_field - - # Run upgrade - upgrade() - - # Check non-target row types do not have the field (unless they had it before) - updated_values = api.portal.get_registry_record(record_name) - for value in updated_values: - row_type = value["row_type"] - is_non_target = row_type not in self.TARGET_ROW_TYPES - had_field_before = non_target_types_fields.get(row_type, False) - if is_non_target and not had_field_before: - self.assertNotIn( - "IFetchPriorityImage.fetchpriority_image", - value["each_row_type_fields"], - f"Field unexpectedly added to non-target: {row_type}", - ) - - def test_upgrade_preserves_existing_fields_in_target_types(self): - """Test that upgrade preserves existing fields in target row types.""" - record_name = "cs_dynamicpages.dynamic_pages_control_panel.row_type_fields" - - # Get original fields for a target row type - values = api.portal.get_registry_record(record_name) - target_type_fields = None - target_row_type = None - - for value in values: - if value["row_type"] in self.TARGET_ROW_TYPES: - target_row_type = value["row_type"] - target_type_fields = value["each_row_type_fields"].copy() - break - - if target_type_fields is None: - self.skipTest("No target row types found in registry") - - # Run upgrade - upgrade() - - # Check original fields are preserved - updated_values = api.portal.get_registry_record(record_name) - for updated in updated_values: - if updated["row_type"] == target_row_type: - for field in target_type_fields: - self.assertIn(field, updated["each_row_type_fields"]) - break diff --git a/src/cs_dynamicpages/tests/test_utils.py b/src/cs_dynamicpages/tests/test_utils.py deleted file mode 100644 index 0ff5417..0000000 --- a/src/cs_dynamicpages/tests/test_utils.py +++ /dev/null @@ -1,334 +0,0 @@ -from cs_dynamicpages.testing import CS_DYNAMICPAGES_INTEGRATION_TESTING -from cs_dynamicpages.utils import _url_uses_scheme -from cs_dynamicpages.utils import absolute_target_url -from cs_dynamicpages.utils import add_custom_view -from cs_dynamicpages.utils import enable_behavior -from cs_dynamicpages.utils import get_available_views_for_row -from cs_dynamicpages.utils import NON_REDIRECTABLE_URL_SCHEMES -from cs_dynamicpages.utils import NON_RESOLVABLE_URL_SCHEMES -from cs_dynamicpages.utils import normalize_uid_from_path -from cs_dynamicpages.utils import VIEW_PREFIX -from plone import api -from plone.app.testing import setRoles -from plone.app.testing import TEST_USER_ID - -import unittest - - -class TestNormalizeUidFromPath(unittest.TestCase): - """Tests for normalize_uid_from_path function.""" - - def test_returns_none_tuple_for_empty_url(self): - uid, fragment = normalize_uid_from_path(None) - self.assertIsNone(uid) - self.assertIsNone(fragment) - - def test_returns_none_tuple_for_empty_string(self): - uid, fragment = normalize_uid_from_path("") - self.assertIsNone(uid) - self.assertIsNone(fragment) - - def test_extracts_uid_from_resolveuid_path(self): - uid, fragment = normalize_uid_from_path("/resolveuid/abc123") - self.assertEqual(uid, "abc123") - self.assertIsNone(fragment) - - def test_extracts_uid_case_insensitive(self): - uid, fragment = normalize_uid_from_path("/ResolveUid/abc123") - self.assertEqual(uid, "abc123") - self.assertIsNone(fragment) - - def test_extracts_uid_and_fragment(self): - uid, fragment = normalize_uid_from_path("/resolveuid/abc123#section1") - self.assertEqual(uid, "abc123") - self.assertEqual(fragment, "#section1") - - def test_returns_none_when_resolveuid_at_end(self): - uid, fragment = normalize_uid_from_path("/resolveuid/") - self.assertIsNone(uid) - self.assertIsNone(fragment) - - def test_returns_none_for_url_without_resolveuid(self): - uid, fragment = normalize_uid_from_path("/some/path/to/content") - self.assertIsNone(uid) - self.assertIsNone(fragment) - - def test_handles_full_url_with_resolveuid(self): - uid, fragment = normalize_uid_from_path( - "http://example.com/resolveuid/abc123#anchor" - ) - self.assertEqual(uid, "abc123") - self.assertEqual(fragment, "#anchor") - - -class TestUrlUsesScheme(unittest.TestCase): - """Tests for _url_uses_scheme function.""" - - def test_returns_true_for_mailto(self): - self.assertTrue( - _url_uses_scheme(NON_REDIRECTABLE_URL_SCHEMES, "mailto:test@example.com") - ) - - def test_returns_true_for_tel(self): - self.assertTrue( - _url_uses_scheme(NON_REDIRECTABLE_URL_SCHEMES, "tel:+1234567890") - ) - - def test_returns_true_for_callto(self): - self.assertTrue( - _url_uses_scheme(NON_REDIRECTABLE_URL_SCHEMES, "callto:username") - ) - - def test_returns_false_for_http(self): - self.assertFalse( - _url_uses_scheme(NON_REDIRECTABLE_URL_SCHEMES, "http://example.com") - ) - - def test_returns_false_for_https(self): - self.assertFalse( - _url_uses_scheme(NON_REDIRECTABLE_URL_SCHEMES, "https://example.com") - ) - - def test_returns_true_for_file_in_non_resolvable(self): - self.assertTrue( - _url_uses_scheme(NON_RESOLVABLE_URL_SCHEMES, "file:///path/to/file") - ) - - def test_returns_true_for_ftp_in_non_resolvable(self): - self.assertTrue( - _url_uses_scheme(NON_RESOLVABLE_URL_SCHEMES, "ftp://server/path") - ) - - def test_returns_false_for_empty_schemes_list(self): - self.assertFalse(_url_uses_scheme([], "mailto:test@example.com")) - - -class TestViewPrefix(unittest.TestCase): - """Tests for VIEW_PREFIX constant.""" - - def test_view_prefix_value(self): - self.assertEqual(VIEW_PREFIX, "cs_dynamicpages-") - - -class AddCustomViewIntegrationTest(unittest.TestCase): - """Integration tests for add_custom_view function. - - Note: add_custom_view modifies registry with values that may not satisfy - schema constraints. These tests verify the function works but we cannot - easily test the actual registry modification due to schema validation. - """ - - layer = CS_DYNAMICPAGES_INTEGRATION_TESTING - - def setUp(self): - self.portal = self.layer["portal"] - setRoles(self.portal, TEST_USER_ID, ["Manager"]) - # Store original registry value for restoration - self.record_name = "cs_dynamicpages.dynamic_pages_control_panel.row_type_fields" - self.original_values = list(api.portal.get_registry_record(self.record_name)) - - def tearDown(self): - # Restore original registry values to prevent test pollution - from plone.registry.interfaces import IRegistry - from zope.component import getUtility - - registry = getUtility(IRegistry) - # Direct assignment to bypass validation for cleanup - record = registry.records[self.record_name] - record.value = self.original_values - - def test_add_custom_view_returns_true(self): - # Use an existing view name to avoid schema constraint issues - existing_views = get_available_views_for_row() - if existing_views: - # Test with existing view - function should still work - result = add_custom_view( - existing_views[0]["row_type"], - ["title", "description"], - has_button=False, - icon="star", - ) - # Function returns True even if view already exists - self.assertTrue(result) - else: - self.skipTest("No existing views to test with") - - def test_add_custom_view_structure(self): - """Test that add_custom_view creates correct structure.""" - # Test using slider-view which is registered - view_name = "cs_dynamicpages-slider-view" - original_len = len(api.portal.get_registry_record(self.record_name)) - - add_custom_view(view_name, ["title"], has_button=True, icon="heart") - - values = api.portal.get_registry_record(self.record_name) - # Should have added one entry - self.assertEqual(len(values), original_len + 1) - - # Last entry should be our new one - matching = [ - v - for v in values - if v["row_type"] == view_name and v["row_type_icon"] == "heart" - ] - self.assertTrue(len(matching) >= 1) - - def test_add_custom_view_default_icon_is_bricks(self): - """Test that default icon is 'bricks'.""" - view_name = "cs_dynamicpages-featured-view" - - add_custom_view(view_name, ["title"]) - - values = api.portal.get_registry_record(self.record_name) - matching = [v for v in values if v["row_type"] == view_name] - # Should find at least one entry (original + new) - last_match = matching[-1] # Get the last added one - self.assertEqual(last_match["row_type_icon"], "bricks") - - -class EnableBehaviorIntegrationTest(unittest.TestCase): - """Integration tests for enable_behavior function.""" - - layer = CS_DYNAMICPAGES_INTEGRATION_TESTING - - def setUp(self): - self.portal = self.layer["portal"] - setRoles(self.portal, TEST_USER_ID, ["Manager"]) - - def test_enable_behavior_adds_to_fti(self): - behavior_name = "plone.basic" - portal_types = api.portal.get_tool("portal_types") - fti = getattr(portal_types, "DynamicPageRow", None) - - # Store original behaviors - original_behaviors = fti.behaviors - - # Only test if behavior not already present - if behavior_name not in fti.behaviors: - enable_behavior(behavior_name) - self.assertIn(behavior_name, fti.behaviors) - - # Restore original behaviors - fti.behaviors = original_behaviors - - def test_enable_behavior_does_not_duplicate(self): - portal_types = api.portal.get_tool("portal_types") - fti = getattr(portal_types, "DynamicPageRow", None) - - # Get a behavior that's already enabled - if fti.behaviors: - existing_behavior = fti.behaviors[0] - original_count = fti.behaviors.count(existing_behavior) - - enable_behavior(existing_behavior) - - # Count should remain the same - self.assertEqual(fti.behaviors.count(existing_behavior), original_count) - - -class GetAvailableViewsForRowIntegrationTest(unittest.TestCase): - """Integration tests for get_available_views_for_row function.""" - - layer = CS_DYNAMICPAGES_INTEGRATION_TESTING - - def setUp(self): - self.portal = self.layer["portal"] - setRoles(self.portal, TEST_USER_ID, ["Manager"]) - - def test_returns_list(self): - result = get_available_views_for_row() - self.assertIsInstance(result, list) - - def test_all_items_have_required_keys(self): - result = get_available_views_for_row() - required_keys = [ - "row_type", - "each_row_type_fields", - "row_type_has_featured_add_button", - "row_type_icon", - ] - for item in result: - for key in required_keys: - self.assertIn(key, item) - - def test_all_row_types_start_with_prefix(self): - result = get_available_views_for_row() - for item in result: - self.assertTrue( - item["row_type"].startswith(VIEW_PREFIX), - f"Row type {item['row_type']} does not start with {VIEW_PREFIX}", - ) - - -class AbsoluteTargetUrlIntegrationTest(unittest.TestCase): - """Integration tests for absolute_target_url function.""" - - layer = CS_DYNAMICPAGES_INTEGRATION_TESTING - - def setUp(self): - self.portal = self.layer["portal"] - setRoles(self.portal, TEST_USER_ID, ["Manager"]) - - def test_returns_mailto_unchanged(self): - url = "mailto:test@example.com" - result = absolute_target_url(url) - self.assertEqual(result, url) - - def test_returns_tel_unchanged(self): - url = "tel:+1234567890" - result = absolute_target_url(url) - self.assertEqual(result, url) - - def test_returns_file_unchanged(self): - url = "file:///path/to/file" - result = absolute_target_url(url) - self.assertEqual(result, url) - - def test_returns_ftp_unchanged(self): - url = "ftp://server/path" - result = absolute_target_url(url) - self.assertEqual(result, url) - - def test_returns_url_unchanged_when_no_resolveuid(self): - url = "http://example.com/page" - result = absolute_target_url(url) - self.assertEqual(result, url) - - def test_returns_original_url_for_invalid_uid(self): - url = "/resolveuid/nonexistent-uid-12345" - result = absolute_target_url(url) - self.assertEqual(result, url) - - def test_resolves_valid_uid_to_url(self): - # Create a document to resolve - doc = api.content.create( - container=self.portal, - type="Document", - id="test-doc-for-url", - title="Test Document", - ) - uid = doc.UID() - - url = f"/resolveuid/{uid}" - result = absolute_target_url(url) - self.assertEqual(result, doc.absolute_url()) - - # Cleanup - api.content.delete(obj=doc) - - def test_resolves_uid_with_fragment(self): - # Create a document to resolve - doc = api.content.create( - container=self.portal, - type="Document", - id="test-doc-for-fragment", - title="Test Document", - ) - uid = doc.UID() - - url = f"/resolveuid/{uid}#section1" - result = absolute_target_url(url) - self.assertEqual(result, f"{doc.absolute_url()}#section1") - - # Cleanup - api.content.delete(obj=doc) diff --git a/src/cs_dynamicpages/tests/test_view_dynamic_page_folder_view.py b/src/cs_dynamicpages/tests/test_view_dynamic_page_folder_view.py index 3e75719..caf7d16 100644 --- a/src/cs_dynamicpages/tests/test_view_dynamic_page_folder_view.py +++ b/src/cs_dynamicpages/tests/test_view_dynamic_page_folder_view.py @@ -10,61 +10,39 @@ import unittest -class DynamicPageFolderViewsIntegrationTest(unittest.TestCase): +class ViewsIntegrationTest(unittest.TestCase): layer = CS_DYNAMICPAGES_INTEGRATION_TESTING def setUp(self): self.portal = self.layer["portal"] setRoles(self.portal, TEST_USER_ID, ["Manager"]) - - # Create a DynamicPageFolder - self.folder = api.content.create(self.portal, "Folder", "test-folder") - self.dpf = api.content.create( - self.folder, "DynamicPageFolder", "rows", title="Rows" - ) + api.content.create(self.portal, "Folder", "other-folder") + api.content.create(self.portal, "Document", "front-page") def test_dynamic_page_folder_view_is_registered(self): - """Test that view is registered for DynamicPageFolder.""" view = getMultiAdapter( - (self.dpf, self.portal.REQUEST), - name="view", + (self.portal["other-folder"], self.portal.REQUEST), + name="dynamic-page-folder-view", ) self.assertTrue(IDynamicPageFolderView.providedBy(view)) - def test_dynamic_page_folder_view_not_found_for_document(self): - """Test that view is not registered for Document.""" - doc = api.content.create(self.portal, "Document", "front-page") + def test_dynamic_page_folder_view_not_matching_interface(self): view_found = True try: view = getMultiAdapter( - (doc, self.portal.REQUEST), - name="view", + (self.portal["front-page"], self.portal.REQUEST), + name="dynamic-page-folder-view", ) - view_found = IDynamicPageFolderView.providedBy(view) except ComponentLookupError: view_found = False + else: + view_found = IDynamicPageFolderView.providedBy(view) self.assertFalse(view_found) -class DynamicPageFolderViewsFunctionalTest(unittest.TestCase): +class ViewsFunctionalTest(unittest.TestCase): layer = CS_DYNAMICPAGES_FUNCTIONAL_TESTING def setUp(self): self.portal = self.layer["portal"] - self.request = self.layer["request"] setRoles(self.portal, TEST_USER_ID, ["Manager"]) - - # Create a DynamicPageFolder - self.folder = api.content.create(self.portal, "Folder", "test-folder-dpf-func") - self.dpf = api.content.create( - self.folder, "DynamicPageFolder", "rows", title="Rows" - ) - - def test_dynamic_page_folder_view_renders_without_error(self): - """Test that DynamicPageFolder view renders without raising an error.""" - view = getMultiAdapter( - (self.dpf, self.request), - name="view", - ) - html = view() - self.assertIsInstance(html, str) diff --git a/src/cs_dynamicpages/tests/test_view_dynamic_page_row_featured_view.py b/src/cs_dynamicpages/tests/test_view_dynamic_page_row_featured_view.py index ea4375a..e8d71fa 100644 --- a/src/cs_dynamicpages/tests/test_view_dynamic_page_row_featured_view.py +++ b/src/cs_dynamicpages/tests/test_view_dynamic_page_row_featured_view.py @@ -12,87 +12,39 @@ import unittest -class DynamicPageRowFeaturedViewsIntegrationTest(unittest.TestCase): +class ViewsIntegrationTest(unittest.TestCase): layer = CS_DYNAMICPAGES_INTEGRATION_TESTING def setUp(self): self.portal = self.layer["portal"] setRoles(self.portal, TEST_USER_ID, ["Manager"]) - - # Create a DynamicPageFolder with a DynamicPageRow and Featured item - self.folder = api.content.create(self.portal, "Folder", "test-folder") - self.dpf = api.content.create( - self.folder, "DynamicPageFolder", "rows", title="Rows" - ) - self.row = api.content.create( - self.dpf, - "DynamicPageRow", - "test-row", - title="Test Row", - ) - self.featured = api.content.create( - self.row, - "DynamicPageRowFeatured", - "test-featured", - title="Test Featured", - ) + api.content.create(self.portal, "Folder", "other-folder") + api.content.create(self.portal, "Document", "front-page") def test_dynamic_page_row_featured_view_is_registered(self): - """Test that view is registered for DynamicPageRowFeatured.""" view = getMultiAdapter( - (self.featured, self.portal.REQUEST), - name="view", + (self.portal["other-folder"], self.portal.REQUEST), + name="dynamic-page-row-featured-view", ) self.assertTrue(IDynamicPageRowFeaturedView.providedBy(view)) - def test_dynamic_page_row_featured_view_not_found_for_document(self): - """Test that view is not registered for Document.""" - doc = api.content.create(self.portal, "Document", "front-page") + def test_dynamic_page_row_featured_view_not_matching_interface(self): view_found = True try: view = getMultiAdapter( - (doc, self.portal.REQUEST), - name="view", + (self.portal["front-page"], self.portal.REQUEST), + name="dynamic-page-row-featured-view", ) - view_found = IDynamicPageRowFeaturedView.providedBy(view) except ComponentLookupError: view_found = False + else: + view_found = IDynamicPageRowFeaturedView.providedBy(view) self.assertFalse(view_found) -class DynamicPageRowFeaturedViewsFunctionalTest(unittest.TestCase): +class ViewsFunctionalTest(unittest.TestCase): layer = CS_DYNAMICPAGES_FUNCTIONAL_TESTING def setUp(self): self.portal = self.layer["portal"] - self.request = self.layer["request"] setRoles(self.portal, TEST_USER_ID, ["Manager"]) - - # Create full content structure - self.folder = api.content.create( - self.portal, "Folder", "test-folder-featured-func" - ) - self.dpf = api.content.create( - self.folder, "DynamicPageFolder", "rows", title="Rows" - ) - self.row = api.content.create( - self.dpf, - "DynamicPageRow", - "test-row", - title="Test Row", - ) - self.featured = api.content.create( - self.row, - "DynamicPageRowFeatured", - "test-featured-func", - title="Test Featured", - ) - - def test_dynamic_page_row_featured_view_renders_without_error(self): - """Test that DynamicPageRowFeatured view renders without error.""" - view = getMultiAdapter( - (self.featured, self.request), - name="view", - ) - html = view() - self.assertIsInstance(html, str) diff --git a/src/cs_dynamicpages/tests/test_view_dynamic_page_row_view.py b/src/cs_dynamicpages/tests/test_view_dynamic_page_row_view.py index b49f7e7..927aded 100644 --- a/src/cs_dynamicpages/tests/test_view_dynamic_page_row_view.py +++ b/src/cs_dynamicpages/tests/test_view_dynamic_page_row_view.py @@ -10,73 +10,39 @@ import unittest -class DynamicPageRowViewsIntegrationTest(unittest.TestCase): +class ViewsIntegrationTest(unittest.TestCase): layer = CS_DYNAMICPAGES_INTEGRATION_TESTING def setUp(self): self.portal = self.layer["portal"] setRoles(self.portal, TEST_USER_ID, ["Manager"]) - - # Create a DynamicPageFolder with a DynamicPageRow - self.folder = api.content.create(self.portal, "Folder", "test-folder") - self.dpf = api.content.create( - self.folder, "DynamicPageFolder", "rows", title="Rows" - ) - self.row = api.content.create( - self.dpf, - "DynamicPageRow", - "test-row", - title="Test Row", - ) + api.content.create(self.portal, "Folder", "other-folder") + api.content.create(self.portal, "Document", "front-page") def test_dynamic_page_row_view_is_registered(self): - """Test that view is registered for DynamicPageRow.""" view = getMultiAdapter( - (self.row, self.portal.REQUEST), - name="view", + (self.portal["other-folder"], self.portal.REQUEST), + name="dynamic-page-row-view", ) self.assertTrue(IDynamicPageRowView.providedBy(view)) - def test_dynamic_page_row_view_not_found_for_document(self): - """Test that view is not registered for Document.""" - doc = api.content.create(self.portal, "Document", "front-page") + def test_dynamic_page_row_view_not_matching_interface(self): view_found = True try: view = getMultiAdapter( - (doc, self.portal.REQUEST), - name="view", + (self.portal["front-page"], self.portal.REQUEST), + name="dynamic-page-row-view", ) - view_found = IDynamicPageRowView.providedBy(view) except ComponentLookupError: view_found = False + else: + view_found = IDynamicPageRowView.providedBy(view) self.assertFalse(view_found) -class DynamicPageRowViewsFunctionalTest(unittest.TestCase): +class ViewsFunctionalTest(unittest.TestCase): layer = CS_DYNAMICPAGES_FUNCTIONAL_TESTING def setUp(self): self.portal = self.layer["portal"] - self.request = self.layer["request"] setRoles(self.portal, TEST_USER_ID, ["Manager"]) - - # Create a DynamicPageFolder with a DynamicPageRow - self.folder = api.content.create(self.portal, "Folder", "test-folder-row-func") - self.dpf = api.content.create( - self.folder, "DynamicPageFolder", "rows", title="Rows" - ) - self.row = api.content.create( - self.dpf, - "DynamicPageRow", - "test-row-func", - title="Test Row", - ) - - def test_dynamic_page_row_view_renders_without_error(self): - """Test that DynamicPageRow view renders without raising an error.""" - view = getMultiAdapter( - (self.row, self.request), - name="view", - ) - html = view() - self.assertIsInstance(html, str) diff --git a/src/cs_dynamicpages/tests/test_view_dynamic_view.py b/src/cs_dynamicpages/tests/test_view_dynamic_view.py index 9f39d17..c20855c 100644 --- a/src/cs_dynamicpages/tests/test_view_dynamic_view.py +++ b/src/cs_dynamicpages/tests/test_view_dynamic_view.py @@ -43,58 +43,4 @@ class ViewsFunctionalTest(unittest.TestCase): def setUp(self): self.portal = self.layer["portal"] - self.request = self.layer["request"] setRoles(self.portal, TEST_USER_ID, ["Manager"]) - - def test_dynamic_view_renders_without_error(self): - """Test that dynamic view renders without raising an error.""" - folder = api.content.create(self.portal, "Folder", "test-folder-dynamic") - view = getMultiAdapter( - (folder, self.request), - name="dynamic-view", - ) - html = view() - self.assertIsInstance(html, str) - - def test_dynamic_view_renders_with_rows(self): - """Test that dynamic view renders rows correctly.""" - folder = api.content.create(self.portal, "Folder", "test-folder-with-rows") - # Create DynamicPageFolder with a row - dpf = api.content.create(folder, "DynamicPageFolder", "rows", title="Rows") - api.content.transition(obj=dpf, transition="publish") - - row = api.content.create( - dpf, - "DynamicPageRow", - "test-row", - title="Test Row", - ) - row.row_type = "cs_dynamicpages-horizontal-rule-view" - api.content.transition(obj=row, transition="publish") - - view = getMultiAdapter( - (folder, self.request), - name="dynamic-view", - ) - html = view() - # Should contain main content area - self.assertIn("content", html) - - def test_dynamic_view_rows_method_returns_rows(self): - """Test that dynamic view rows() method returns created rows.""" - folder = api.content.create(self.portal, "Folder", "test-folder-rows-method") - dpf = api.content.create(folder, "DynamicPageFolder", "rows", title="Rows") - row = api.content.create( - dpf, - "DynamicPageRow", - "test-row", - title="Test Row", - ) - row.row_type = "cs_dynamicpages-horizontal-rule-view" - - view = getMultiAdapter( - (folder, self.request), - name="dynamic-view", - ) - rows = view.rows() - self.assertEqual(len(rows), 1) diff --git a/src/cs_dynamicpages/tests/test_view_featured_view.py b/src/cs_dynamicpages/tests/test_view_featured_view.py index 8394303..bb0257b 100644 --- a/src/cs_dynamicpages/tests/test_view_featured_view.py +++ b/src/cs_dynamicpages/tests/test_view_featured_view.py @@ -10,106 +10,37 @@ import unittest -class FeaturedViewsIntegrationTest(unittest.TestCase): +class ViewsIntegrationTest(unittest.TestCase): layer = CS_DYNAMICPAGES_INTEGRATION_TESTING def setUp(self): self.portal = self.layer["portal"] setRoles(self.portal, TEST_USER_ID, ["Manager"]) - - # Create a DynamicPageFolder with a DynamicPageRow - self.folder = api.content.create(self.portal, "Folder", "test-folder") - self.dpf = api.content.create( - self.folder, "DynamicPageFolder", "rows", title="Rows" - ) - self.row = api.content.create( - self.dpf, - "DynamicPageRow", - "test-row", - title="Test Row", - ) - self.row.row_type = "cs_dynamicpages-featured-view" + api.content.create(self.portal, "Folder", "other-folder") + api.content.create(self.portal, "Document", "front-page") def test_featured_view_is_registered(self): - """Test that featured view is registered for DynamicPageRow.""" view = getMultiAdapter( - (self.row, self.portal.REQUEST), - name="cs_dynamicpages-featured-view", + (self.portal["other-folder"], self.portal.REQUEST), name="featured-view" ) self.assertTrue(IFeaturedView.providedBy(view)) - def test_featured_view_not_found_for_document(self): - """Test that featured view is not registered for Document.""" - doc = api.content.create(self.portal, "Document", "front-page") + def test_featured_view_not_matching_interface(self): view_found = True try: - getMultiAdapter( - (doc, self.portal.REQUEST), - name="cs_dynamicpages-featured-view", + view = getMultiAdapter( + (self.portal["front-page"], self.portal.REQUEST), name="featured-view" ) except ComponentLookupError: view_found = False + else: + view_found = IFeaturedView.providedBy(view) self.assertFalse(view_found) -class FeaturedViewsFunctionalTest(unittest.TestCase): +class ViewsFunctionalTest(unittest.TestCase): layer = CS_DYNAMICPAGES_FUNCTIONAL_TESTING def setUp(self): self.portal = self.layer["portal"] - self.request = self.layer["request"] setRoles(self.portal, TEST_USER_ID, ["Manager"]) - - # Create content structure - self.folder = api.content.create(self.portal, "Folder", "test-folder-featured") - self.dpf = api.content.create( - self.folder, "DynamicPageFolder", "rows", title="Rows" - ) - self.row = api.content.create( - self.dpf, - "DynamicPageRow", - "test-row-featured", - title="Test Row", - ) - self.row.row_type = "cs_dynamicpages-featured-view" - - def test_featured_view_renders_without_error(self): - """Test that featured view renders without raising an error.""" - # Set required attributes to avoid None errors - self.row.link_url = "" - self.row.link_text = "" - self.row.image_position = "left" - - view = getMultiAdapter( - (self.row, self.request), - name="cs_dynamicpages-featured-view", - ) - html = view() - self.assertIsInstance(html, str) - - def test_featured_view_renders_row_structure(self): - """Test that featured view renders Bootstrap row structure.""" - self.row.link_url = "" - self.row.link_text = "" - self.row.image_position = "left" - - view = getMultiAdapter( - (self.row, self.request), - name="cs_dynamicpages-featured-view", - ) - html = view() - self.assertIn('class="row"', html) - self.assertIn("col-md-6", html) - - def test_featured_view_renders_title(self): - """Test that featured view renders the row title.""" - self.row.link_url = "" - self.row.link_text = "" - self.row.image_position = "left" - - view = getMultiAdapter( - (self.row, self.request), - name="cs_dynamicpages-featured-view", - ) - html = view() - self.assertIn("Test Row", html) diff --git a/src/cs_dynamicpages/tests/test_view_horizontal_rule_view.py b/src/cs_dynamicpages/tests/test_view_horizontal_rule_view.py index f2c8000..85618ba 100644 --- a/src/cs_dynamicpages/tests/test_view_horizontal_rule_view.py +++ b/src/cs_dynamicpages/tests/test_view_horizontal_rule_view.py @@ -1,5 +1,6 @@ from cs_dynamicpages.testing import CS_DYNAMICPAGES_FUNCTIONAL_TESTING from cs_dynamicpages.testing import CS_DYNAMICPAGES_INTEGRATION_TESTING +from cs_dynamicpages.views.horizontal_rule_view import IHorizontalRuleView from plone import api from plone.app.testing import setRoles from plone.app.testing import TEST_USER_ID @@ -9,83 +10,39 @@ import unittest -class HorizontalRuleViewsIntegrationTest(unittest.TestCase): +class ViewsIntegrationTest(unittest.TestCase): layer = CS_DYNAMICPAGES_INTEGRATION_TESTING def setUp(self): self.portal = self.layer["portal"] setRoles(self.portal, TEST_USER_ID, ["Manager"]) - - # Create a DynamicPageFolder with a DynamicPageRow - self.folder = api.content.create(self.portal, "Folder", "test-folder") - self.dpf = api.content.create( - self.folder, "DynamicPageFolder", "rows", title="Rows" - ) - self.row = api.content.create( - self.dpf, - "DynamicPageRow", - "test-row", - title="Test Row", - ) - self.row.row_type = "cs_dynamicpages-horizontal-rule-view" + api.content.create(self.portal, "Folder", "other-folder") + api.content.create(self.portal, "Document", "front-page") def test_horizontal_rule_view_is_registered(self): - """Test that horizontal-rule-view is registered for DynamicPageRow.""" view = getMultiAdapter( - (self.row, self.portal.REQUEST), - name="cs_dynamicpages-horizontal-rule-view", + (self.portal["other-folder"], self.portal.REQUEST), + name="horizontal-rule-view", ) - self.assertIsNotNone(view) + self.assertTrue(IHorizontalRuleView.providedBy(view)) - def test_horizontal_rule_view_not_found_for_document(self): - """Test that horizontal-rule-view is not registered for Document.""" - doc = api.content.create(self.portal, "Document", "front-page") + def test_horizontal_rule_view_not_matching_interface(self): view_found = True try: - getMultiAdapter( - (doc, self.portal.REQUEST), - name="cs_dynamicpages-horizontal-rule-view", + view = getMultiAdapter( + (self.portal["front-page"], self.portal.REQUEST), + name="horizontal-rule-view", ) except ComponentLookupError: view_found = False + else: + view_found = IHorizontalRuleView.providedBy(view) self.assertFalse(view_found) -class HorizontalRuleViewsFunctionalTest(unittest.TestCase): +class ViewsFunctionalTest(unittest.TestCase): layer = CS_DYNAMICPAGES_FUNCTIONAL_TESTING def setUp(self): self.portal = self.layer["portal"] - self.request = self.layer["request"] setRoles(self.portal, TEST_USER_ID, ["Manager"]) - - # Create content structure - self.folder = api.content.create(self.portal, "Folder", "test-folder-hr") - self.dpf = api.content.create( - self.folder, "DynamicPageFolder", "rows", title="Rows" - ) - self.row = api.content.create( - self.dpf, - "DynamicPageRow", - "test-row-hr", - title="Test Row", - ) - self.row.row_type = "cs_dynamicpages-horizontal-rule-view" - - def test_horizontal_rule_view_renders_without_error(self): - """Test that horizontal rule view renders without raising an error.""" - view = getMultiAdapter( - (self.row, self.request), - name="cs_dynamicpages-horizontal-rule-view", - ) - html = view() - self.assertIsInstance(html, str) - - def test_horizontal_rule_view_renders_hr_element(self): - """Test that horizontal rule view renders an hr element.""" - view = getMultiAdapter( - (self.row, self.request), - name="cs_dynamicpages-horizontal-rule-view", - ) - html = view() - self.assertIn(" 0) - - def test_vocab_row_type_terms_start_with_prefix(self): - """Test that all row type terms start with cs_dynamicpages- prefix.""" - vocab_name = "cs_dynamicpages.RowType" - factory = getUtility(IVocabularyFactory, vocab_name) - vocabulary = factory(self.portal) - for term in vocabulary: - self.assertTrue( - term.value.startswith("cs_dynamicpages-"), - f"Term {term.value} does not start with cs_dynamicpages-", - ) + self.assertEqual( + vocabulary.getTerm("sony-a7r-iii").title, + _("Sony Aplha 7R III"), + ) diff --git a/src/cs_dynamicpages/tests/test_vocab_row_vertical_spacing.py b/src/cs_dynamicpages/tests/test_vocab_row_vertical_spacing.py deleted file mode 100644 index 31e5d8c..0000000 --- a/src/cs_dynamicpages/tests/test_vocab_row_vertical_spacing.py +++ /dev/null @@ -1,92 +0,0 @@ -from cs_dynamicpages.testing import CS_DYNAMICPAGES_INTEGRATION_TESTING -from plone.app.testing import setRoles -from plone.app.testing import TEST_USER_ID -from zope.component import getUtility -from zope.schema.interfaces import IVocabularyFactory -from zope.schema.vocabulary import SimpleVocabulary - -import unittest - - -class RowPaddingTopVocabularyIntegrationTest(unittest.TestCase): - """Integration tests for RowPaddingTop vocabulary.""" - - layer = CS_DYNAMICPAGES_INTEGRATION_TESTING - - def setUp(self): - self.portal = self.layer["portal"] - setRoles(self.portal, TEST_USER_ID, ["Manager"]) - - def test_vocab_row_padding_top_registered(self): - """Test that the vocabulary is registered.""" - factory = getUtility(IVocabularyFactory, "cs_dynamicpages.RowPaddingTop") - self.assertIsNotNone(factory) - - def test_vocab_row_padding_top_returns_vocabulary(self): - """Test that the factory returns a SimpleVocabulary.""" - factory = getUtility(IVocabularyFactory, "cs_dynamicpages.RowPaddingTop") - vocabulary = factory(self.portal) - self.assertIsInstance(vocabulary, SimpleVocabulary) - - -class RowPaddingBottomVocabularyIntegrationTest(unittest.TestCase): - """Integration tests for RowPaddingBottom vocabulary.""" - - layer = CS_DYNAMICPAGES_INTEGRATION_TESTING - - def setUp(self): - self.portal = self.layer["portal"] - setRoles(self.portal, TEST_USER_ID, ["Manager"]) - - def test_vocab_row_padding_bottom_registered(self): - """Test that the vocabulary is registered.""" - factory = getUtility(IVocabularyFactory, "cs_dynamicpages.RowPaddingBottom") - self.assertIsNotNone(factory) - - def test_vocab_row_padding_bottom_returns_vocabulary(self): - """Test that the factory returns a SimpleVocabulary.""" - factory = getUtility(IVocabularyFactory, "cs_dynamicpages.RowPaddingBottom") - vocabulary = factory(self.portal) - self.assertIsInstance(vocabulary, SimpleVocabulary) - - -class RowMarginTopVocabularyIntegrationTest(unittest.TestCase): - """Integration tests for RowMarginTop vocabulary.""" - - layer = CS_DYNAMICPAGES_INTEGRATION_TESTING - - def setUp(self): - self.portal = self.layer["portal"] - setRoles(self.portal, TEST_USER_ID, ["Manager"]) - - def test_vocab_row_margin_top_registered(self): - """Test that the vocabulary is registered.""" - factory = getUtility(IVocabularyFactory, "cs_dynamicpages.RowMarginTop") - self.assertIsNotNone(factory) - - def test_vocab_row_margin_top_returns_vocabulary(self): - """Test that the factory returns a SimpleVocabulary.""" - factory = getUtility(IVocabularyFactory, "cs_dynamicpages.RowMarginTop") - vocabulary = factory(self.portal) - self.assertIsInstance(vocabulary, SimpleVocabulary) - - -class RowMarginBottomVocabularyIntegrationTest(unittest.TestCase): - """Integration tests for RowMarginBottom vocabulary.""" - - layer = CS_DYNAMICPAGES_INTEGRATION_TESTING - - def setUp(self): - self.portal = self.layer["portal"] - setRoles(self.portal, TEST_USER_ID, ["Manager"]) - - def test_vocab_row_margin_bottom_registered(self): - """Test that the vocabulary is registered.""" - factory = getUtility(IVocabularyFactory, "cs_dynamicpages.RowMarginBottom") - self.assertIsNotNone(factory) - - def test_vocab_row_margin_bottom_returns_vocabulary(self): - """Test that the factory returns a SimpleVocabulary.""" - factory = getUtility(IVocabularyFactory, "cs_dynamicpages.RowMarginBottom") - vocabulary = factory(self.portal) - self.assertIsInstance(vocabulary, SimpleVocabulary) diff --git a/src/cs_dynamicpages/tests/test_vocab_row_width.py b/src/cs_dynamicpages/tests/test_vocab_row_width.py index 9af947a..21ae37c 100644 --- a/src/cs_dynamicpages/tests/test_vocab_row_width.py +++ b/src/cs_dynamicpages/tests/test_vocab_row_width.py @@ -1,3 +1,4 @@ +from cs_dynamicpages import _ from cs_dynamicpages.testing import CS_DYNAMICPAGES_INTEGRATION_TESTING from plone.app.testing import setRoles from plone.app.testing import TEST_USER_ID @@ -16,34 +17,14 @@ def setUp(self): self.portal = self.layer["portal"] setRoles(self.portal, TEST_USER_ID, ["Manager"]) - def test_vocab_row_width_registered(self): - """Test that RowWidth vocabulary is registered.""" + def test_vocab_row_width(self): vocab_name = "cs_dynamicpages.RowWidth" factory = getUtility(IVocabularyFactory, vocab_name) self.assertTrue(IVocabularyFactory.providedBy(factory)) - def test_vocab_row_width_returns_tokenized_vocabulary(self): - """Test that vocabulary returns tokenized vocabulary.""" - vocab_name = "cs_dynamicpages.RowWidth" - factory = getUtility(IVocabularyFactory, vocab_name) vocabulary = factory(self.portal) self.assertTrue(IVocabularyTokenized.providedBy(vocabulary)) - - def test_vocab_row_width_has_terms(self): - """Test that vocabulary has terms from registry defaults.""" - vocab_name = "cs_dynamicpages.RowWidth" - factory = getUtility(IVocabularyFactory, vocab_name) - vocabulary = factory(self.portal) - # Default registry has terms like "col-md-6 offset-md-3" (Narrow) - self.assertTrue(len(vocabulary) > 0) - - def test_vocab_row_width_term_structure(self): - """Test that vocabulary terms have correct structure.""" - vocab_name = "cs_dynamicpages.RowWidth" - factory = getUtility(IVocabularyFactory, vocab_name) - vocabulary = factory(self.portal) - if len(vocabulary) > 0: - term = next(iter(vocabulary)) - self.assertIsNotNone(term.value) - self.assertIsNotNone(term.token) - self.assertIsNotNone(term.title) + self.assertEqual( + vocabulary.getTerm("sony-a7r-iii").title, + _("Sony Aplha 7R III"), + ) diff --git a/src/cs_dynamicpages/views/configure.zcml b/src/cs_dynamicpages/views/configure.zcml index 82a7904..f9c6501 100644 --- a/src/cs_dynamicpages/views/configure.zcml +++ b/src/cs_dynamicpages/views/configure.zcml @@ -2,6 +2,7 @@ xmlns="http://namespaces.zope.org/zope" xmlns:browser="http://namespaces.zope.org/browser" xmlns:plone="http://namespaces.plone.org/plone" + xmlns:zcml="http://namespaces.zope.org/zcml" i18n_domain="cs_dynamicpages" > @@ -78,15 +79,18 @@ @@ -126,6 +131,7 @@ diff --git a/src/cs_dynamicpages/views/dynamic_view.py b/src/cs_dynamicpages/views/dynamic_view.py index 90ccb7d..76d8252 100644 --- a/src/cs_dynamicpages/views/dynamic_view.py +++ b/src/cs_dynamicpages/views/dynamic_view.py @@ -65,8 +65,7 @@ def available_views_for_row(self): def normalize_title(self, title): return ( - title - .replace("cs_dynamicpages-", " ") + title.replace("cs_dynamicpages-", " ") .replace("-", " ") .replace("_", " ") .replace("view", "")