Skip to content

Commit 03d9155

Browse files
authored
Merge pull request #8 from codesyntax/fix-and-expand-tests
Fix and expand test coverage
2 parents d96f09b + a8cf61e commit 03d9155

31 files changed

+2142
-132
lines changed

Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ i18n: $(VENV_FOLDER) ## Update locales
124124
.PHONY: test
125125
test: $(VENV_FOLDER) ## run tests
126126
@$(BIN_FOLDER)/pytest
127+
@if [ -d "src/cs_dynamicpages/tests" ]; then $(BIN_FOLDER)/pytest src/cs_dynamicpages/tests; fi
127128

128129
.PHONY: test-coverage
129130
test-coverage: $(VENV_FOLDER) ## run tests with coverage

news/+tests.internal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
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

src/cs_dynamicpages/testing.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,8 @@ def setUpPloneSite(self, portal):
4444
),
4545
name="CsDynamicpagesLayer:AcceptanceTesting",
4646
)
47+
48+
# Aliases for backward compatibility with bobtemplates.plone naming
49+
CS_DYNAMICPAGES_INTEGRATION_TESTING = INTEGRATION_TESTING
50+
CS_DYNAMICPAGES_FUNCTIONAL_TESTING = FUNCTIONAL_TESTING
51+
CS_DYNAMICPAGES_ACCEPTANCE_TESTING = ACCEPTANCE_TESTING
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
from cs_dynamicpages.behaviors.extra_class import IExtraClassMarker
2+
from cs_dynamicpages.testing import CS_DYNAMICPAGES_INTEGRATION_TESTING
3+
from plone.app.testing import setRoles
4+
from plone.app.testing import TEST_USER_ID
5+
from plone.behavior.interfaces import IBehavior
6+
from zope.component import getUtility
7+
8+
import unittest
9+
10+
11+
class ExtraClassIntegrationTest(unittest.TestCase):
12+
"""Integration tests for the extra_class behavior."""
13+
14+
layer = CS_DYNAMICPAGES_INTEGRATION_TESTING
15+
16+
def setUp(self):
17+
self.portal = self.layer["portal"]
18+
setRoles(self.portal, TEST_USER_ID, ["Manager"])
19+
20+
def test_behavior_extra_class_registered(self):
21+
"""Test that the behavior is properly registered."""
22+
behavior = getUtility(IBehavior, "cs_dynamicpages.extra_class")
23+
self.assertEqual(
24+
behavior.marker,
25+
IExtraClassMarker,
26+
)
27+
28+
def test_behavior_extra_class_interface_name(self):
29+
"""Test the behavior interface name."""
30+
behavior = getUtility(IBehavior, "cs_dynamicpages.extra_class")
31+
self.assertEqual(
32+
behavior.interface.__name__,
33+
"IExtraClass",
34+
)
35+
36+
def test_behavior_extra_class_title(self):
37+
"""Test that the behavior has a title."""
38+
behavior = getUtility(IBehavior, "cs_dynamicpages.extra_class")
39+
self.assertIsNotNone(behavior.title)
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
from cs_dynamicpages.behaviors.fetchpriority_image import IFetchPriorityImageMarker
2+
from cs_dynamicpages.testing import CS_DYNAMICPAGES_INTEGRATION_TESTING
3+
from plone.app.testing import setRoles
4+
from plone.app.testing import TEST_USER_ID
5+
from plone.behavior.interfaces import IBehavior
6+
from zope.component import getUtility
7+
8+
import unittest
9+
10+
11+
class FetchPriorityImageIntegrationTest(unittest.TestCase):
12+
"""Integration tests for the fetchpriority_image behavior."""
13+
14+
layer = CS_DYNAMICPAGES_INTEGRATION_TESTING
15+
16+
def setUp(self):
17+
self.portal = self.layer["portal"]
18+
setRoles(self.portal, TEST_USER_ID, ["Manager"])
19+
20+
def test_behavior_fetchpriority_image_registered(self):
21+
"""Test that the behavior is properly registered."""
22+
behavior = getUtility(IBehavior, "cs_dynamicpages.fetchpriority_image")
23+
self.assertEqual(
24+
behavior.marker,
25+
IFetchPriorityImageMarker,
26+
)
27+
28+
def test_behavior_fetchpriority_image_interface_name(self):
29+
"""Test the behavior interface name."""
30+
behavior = getUtility(IBehavior, "cs_dynamicpages.fetchpriority_image")
31+
self.assertEqual(
32+
behavior.interface.__name__,
33+
"IFetchPriorityImage",
34+
)
35+
36+
def test_behavior_fetchpriority_image_title(self):
37+
"""Test that the behavior has a title."""
38+
behavior = getUtility(IBehavior, "cs_dynamicpages.fetchpriority_image")
39+
self.assertIsNotNone(behavior.title)
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
from cs_dynamicpages.behaviors.row_vertical_spacing import IRowVerticalSpacingMarker
2+
from cs_dynamicpages.testing import CS_DYNAMICPAGES_INTEGRATION_TESTING
3+
from plone.app.testing import setRoles
4+
from plone.app.testing import TEST_USER_ID
5+
from plone.behavior.interfaces import IBehavior
6+
from zope.component import getUtility
7+
8+
import unittest
9+
10+
11+
class RowVerticalSpacingIntegrationTest(unittest.TestCase):
12+
"""Integration tests for the row_vertical_spacing behavior."""
13+
14+
layer = CS_DYNAMICPAGES_INTEGRATION_TESTING
15+
16+
def setUp(self):
17+
self.portal = self.layer["portal"]
18+
setRoles(self.portal, TEST_USER_ID, ["Manager"])
19+
20+
def test_behavior_row_vertical_spacing_registered(self):
21+
"""Test that the behavior is properly registered."""
22+
behavior = getUtility(IBehavior, "cs_dynamicpages.row_vertical_spacing")
23+
self.assertEqual(
24+
behavior.marker,
25+
IRowVerticalSpacingMarker,
26+
)
27+
28+
def test_behavior_row_vertical_spacing_interface_name(self):
29+
"""Test the behavior interface name."""
30+
behavior = getUtility(IBehavior, "cs_dynamicpages.row_vertical_spacing")
31+
self.assertEqual(
32+
behavior.interface.__name__,
33+
"IRowVerticalSpacing",
34+
)
35+
36+
def test_behavior_row_vertical_spacing_title(self):
37+
"""Test that the behavior has a title."""
38+
behavior = getUtility(IBehavior, "cs_dynamicpages.row_vertical_spacing")
39+
self.assertIsNotNone(behavior.title)
40+
41+
def test_behavior_has_padding_top_field(self):
42+
"""Test that the behavior schema has padding_top field."""
43+
behavior = getUtility(IBehavior, "cs_dynamicpages.row_vertical_spacing")
44+
self.assertIn("padding_top", behavior.interface.names())
45+
46+
def test_behavior_has_padding_bottom_field(self):
47+
"""Test that the behavior schema has padding_bottom field."""
48+
behavior = getUtility(IBehavior, "cs_dynamicpages.row_vertical_spacing")
49+
self.assertIn("padding_bottom", behavior.interface.names())
50+
51+
def test_behavior_has_margin_top_field(self):
52+
"""Test that the behavior schema has margin_top field."""
53+
behavior = getUtility(IBehavior, "cs_dynamicpages.row_vertical_spacing")
54+
self.assertIn("margin_top", behavior.interface.names())
55+
56+
def test_behavior_has_margin_bottom_field(self):
57+
"""Test that the behavior schema has margin_bottom field."""
58+
behavior = getUtility(IBehavior, "cs_dynamicpages.row_vertical_spacing")
59+
self.assertIn("margin_bottom", behavior.interface.names())
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
from cs_dynamicpages.browser.body_class import DynamicViewFolderClasses
2+
from cs_dynamicpages.testing import CS_DYNAMICPAGES_INTEGRATION_TESTING
3+
from plone import api
4+
from plone.app.testing import setRoles
5+
from plone.app.testing import TEST_USER_ID
6+
from unittest.mock import Mock
7+
8+
import unittest
9+
10+
11+
class DynamicViewFolderClassesIntegrationTest(unittest.TestCase):
12+
"""Integration tests for the DynamicViewFolderClasses body class adapter."""
13+
14+
layer = CS_DYNAMICPAGES_INTEGRATION_TESTING
15+
16+
def setUp(self):
17+
self.portal = self.layer["portal"]
18+
self.request = self.layer["request"]
19+
setRoles(self.portal, TEST_USER_ID, ["Manager"])
20+
21+
def test_adapter_instantiation(self):
22+
"""Test that the adapter can be instantiated."""
23+
adapter = DynamicViewFolderClasses(self.portal, self.request)
24+
self.assertIsNotNone(adapter)
25+
self.assertEqual(adapter.context, self.portal)
26+
self.assertEqual(adapter.request, self.request)
27+
28+
def test_returns_can_edit_for_dynamic_view_template(self):
29+
"""Test that get_classes returns 'can_edit' for dynamic_view template."""
30+
folder = api.content.create(
31+
container=self.portal,
32+
type="Folder",
33+
id="test-folder-body-class",
34+
title="Test Folder",
35+
)
36+
37+
adapter = DynamicViewFolderClasses(folder, self.request)
38+
39+
# Mock template with id="dynamic_view.pt"
40+
mock_template = Mock()
41+
mock_template.id = "dynamic_view.pt"
42+
mock_view = Mock()
43+
44+
classes = adapter.get_classes(mock_template, mock_view)
45+
self.assertIn("can_edit", classes)
46+
47+
api.content.delete(obj=folder)
48+
49+
def test_returns_empty_for_non_dynamic_view_template(self):
50+
"""Test that get_classes returns empty list for other templates."""
51+
folder = api.content.create(
52+
container=self.portal,
53+
type="Folder",
54+
id="test-folder-other-template",
55+
title="Test Folder",
56+
)
57+
58+
adapter = DynamicViewFolderClasses(folder, self.request)
59+
60+
# Mock template with different id
61+
mock_template = Mock()
62+
mock_template.id = "folder_listing.pt"
63+
mock_view = Mock()
64+
65+
classes = adapter.get_classes(mock_template, mock_view)
66+
self.assertEqual(classes, [])
67+
68+
api.content.delete(obj=folder)
69+
70+
def test_returns_empty_for_user_without_edit_permission(self):
71+
"""Test that get_classes returns empty for user without edit permission."""
72+
folder = api.content.create(
73+
container=self.portal,
74+
type="Folder",
75+
id="test-folder-no-permission",
76+
title="Test Folder",
77+
)
78+
79+
# Remove local Owner role and set global role to Member (no edit permission)
80+
folder.manage_delLocalRoles([TEST_USER_ID])
81+
setRoles(self.portal, TEST_USER_ID, ["Member"])
82+
83+
adapter = DynamicViewFolderClasses(folder, self.request)
84+
85+
mock_template = Mock()
86+
mock_template.id = "dynamic_view.pt"
87+
mock_view = Mock()
88+
89+
classes = adapter.get_classes(mock_template, mock_view)
90+
self.assertEqual(classes, [])
91+
92+
# Restore Manager role for cleanup
93+
setRoles(self.portal, TEST_USER_ID, ["Manager"])
94+
api.content.delete(obj=folder)
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
from cs_dynamicpages.controlpanels.dynamic_pages_control_panel.controlpanel import (
2+
IDynamicPagesControlPanel,
3+
)
4+
from cs_dynamicpages.testing import CS_DYNAMICPAGES_INTEGRATION_TESTING
5+
from plone import api
6+
from plone.app.testing import setRoles
7+
from plone.app.testing import TEST_USER_ID
8+
from plone.registry.interfaces import IRegistry
9+
from zope.component import getUtility
10+
11+
import unittest
12+
13+
14+
class DynamicPagesControlPanelIntegrationTest(unittest.TestCase):
15+
"""Integration tests for the Dynamic Pages Control Panel."""
16+
17+
layer = CS_DYNAMICPAGES_INTEGRATION_TESTING
18+
19+
def setUp(self):
20+
self.portal = self.layer["portal"]
21+
setRoles(self.portal, TEST_USER_ID, ["Manager"])
22+
self.registry = getUtility(IRegistry)
23+
24+
def test_controlpanel_schema_registered(self):
25+
"""Test that the control panel schema is registered in the registry."""
26+
records = self.registry.records
27+
self.assertIn(
28+
"cs_dynamicpages.dynamic_pages_control_panel.row_type_fields",
29+
records,
30+
)
31+
32+
def test_row_type_fields_record_exists(self):
33+
"""Test that row_type_fields registry record exists."""
34+
value = api.portal.get_registry_record(
35+
"cs_dynamicpages.dynamic_pages_control_panel.row_type_fields"
36+
)
37+
self.assertIsInstance(value, list)
38+
39+
def test_row_widths_record_exists(self):
40+
"""Test that row_widths registry record exists."""
41+
value = api.portal.get_registry_record(
42+
"cs_dynamicpages.dynamic_pages_control_panel.row_widths"
43+
)
44+
self.assertIsInstance(value, list)
45+
46+
def test_spacer_padding_top_record_exists(self):
47+
"""Test that spacer_padding_top registry record exists."""
48+
value = api.portal.get_registry_record(
49+
"cs_dynamicpages.dynamic_pages_control_panel.spacer_padding_top"
50+
)
51+
self.assertIsInstance(value, list)
52+
53+
def test_spacer_padding_bottom_record_exists(self):
54+
"""Test that spacer_padding_bottom registry record exists."""
55+
value = api.portal.get_registry_record(
56+
"cs_dynamicpages.dynamic_pages_control_panel.spacer_padding_bottom"
57+
)
58+
self.assertIsInstance(value, list)
59+
60+
def test_spacer_margin_top_record_exists(self):
61+
"""Test that spacer_margin_top registry record exists."""
62+
value = api.portal.get_registry_record(
63+
"cs_dynamicpages.dynamic_pages_control_panel.spacer_margin_top"
64+
)
65+
self.assertIsInstance(value, list)
66+
67+
def test_spacer_margin_bottom_record_exists(self):
68+
"""Test that spacer_margin_bottom registry record exists."""
69+
value = api.portal.get_registry_record(
70+
"cs_dynamicpages.dynamic_pages_control_panel.spacer_margin_bottom"
71+
)
72+
self.assertIsInstance(value, list)
73+
74+
def test_row_type_fields_has_default_values(self):
75+
"""Test that row_type_fields has default row types configured."""
76+
value = api.portal.get_registry_record(
77+
"cs_dynamicpages.dynamic_pages_control_panel.row_type_fields"
78+
)
79+
row_types = [item["row_type"] for item in value]
80+
81+
# Check for some expected default row types
82+
self.assertIn("cs_dynamicpages-horizontal-rule-view", row_types)
83+
self.assertIn("cs_dynamicpages-spacer-view", row_types)
84+
85+
def test_row_widths_has_default_values(self):
86+
"""Test that row_widths has default width options."""
87+
value = api.portal.get_registry_record(
88+
"cs_dynamicpages.dynamic_pages_control_panel.row_widths"
89+
)
90+
self.assertTrue(len(value) > 0)
91+
92+
# Check structure of first item
93+
first_item = value[0]
94+
self.assertIn("row_width_label", first_item)
95+
self.assertIn("row_width_class", first_item)
96+
97+
def test_spacer_values_have_correct_structure(self):
98+
"""Test that spacer values have correct structure."""
99+
for record_name in [
100+
"spacer_padding_top",
101+
"spacer_padding_bottom",
102+
"spacer_margin_top",
103+
"spacer_margin_bottom",
104+
]:
105+
value = api.portal.get_registry_record(
106+
f"cs_dynamicpages.dynamic_pages_control_panel.{record_name}"
107+
)
108+
self.assertTrue(len(value) > 0, f"{record_name} should have values")
109+
110+
# Check structure of first item
111+
first_item = value[0]
112+
self.assertIn("spacer_label", first_item)
113+
self.assertIn("spacer_class", first_item)
114+
115+
116+
class DynamicPagesControlPanelSchemaTest(unittest.TestCase):
117+
"""Tests for the control panel schema interface."""
118+
119+
def test_schema_has_row_type_fields(self):
120+
"""Test that schema has row_type_fields field."""
121+
self.assertIn("row_type_fields", IDynamicPagesControlPanel.names())
122+
123+
def test_schema_has_row_widths(self):
124+
"""Test that schema has row_widths field."""
125+
self.assertIn("row_widths", IDynamicPagesControlPanel.names())
126+
127+
def test_schema_has_spacer_fields(self):
128+
"""Test that schema has all spacer fields."""
129+
names = IDynamicPagesControlPanel.names()
130+
self.assertIn("spacer_padding_top", names)
131+
self.assertIn("spacer_padding_bottom", names)
132+
self.assertIn("spacer_margin_top", names)
133+
self.assertIn("spacer_margin_bottom", names)

0 commit comments

Comments
 (0)