Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@ 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
Expand Down
1 change: 1 addition & 0 deletions news/+tests.internal
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- 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
5 changes: 5 additions & 0 deletions src/cs_dynamicpages/testing.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,3 +44,8 @@ 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
39 changes: 39 additions & 0 deletions src/cs_dynamicpages/tests/test_behavior_extra_class.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
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)
39 changes: 39 additions & 0 deletions src/cs_dynamicpages/tests/test_behavior_fetchpriority_image.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
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)
59 changes: 59 additions & 0 deletions src/cs_dynamicpages/tests/test_behavior_row_vertical_spacing.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
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())
94 changes: 94 additions & 0 deletions src/cs_dynamicpages/tests/test_browser_body_class.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
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)
133 changes: 133 additions & 0 deletions src/cs_dynamicpages/tests/test_controlpanel.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
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)
Loading