Skip to content

Commit 8aa0f5d

Browse files
committed
Increate test coverage.
1 parent 0bc037f commit 8aa0f5d

File tree

3 files changed

+140
-62
lines changed

3 files changed

+140
-62
lines changed

tests/behaviors/conftest.py

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
from plone.app.testing import setRoles
2+
from plone.app.testing import SITE_OWNER_NAME
3+
from plone.app.testing import SITE_OWNER_PASSWORD
4+
from plone.app.testing import TEST_USER_ID
5+
from plone.dexterity.fti import DexterityFTI
6+
from plone.restapi.testing import RelativeSession
7+
from zope.component.hooks import setSite
8+
9+
import pytest
10+
import transaction
11+
12+
13+
@pytest.fixture()
14+
def request_factory(portal):
15+
def factory(mimetype: str = "application/json") -> RelativeSession:
16+
url = portal.absolute_url()
17+
api_session = RelativeSession(url)
18+
api_session.headers.update({"Accept": mimetype})
19+
return api_session
20+
21+
return factory
22+
23+
24+
@pytest.fixture()
25+
def anon_request(request_factory) -> RelativeSession:
26+
return request_factory()
27+
28+
29+
@pytest.fixture()
30+
def manager_request(request_factory):
31+
request = request_factory()
32+
request.auth = (SITE_OWNER_NAME, SITE_OWNER_PASSWORD)
33+
yield request
34+
request.auth = ()
35+
36+
37+
@pytest.fixture()
38+
def manager_html_request(request_factory):
39+
request = request_factory("text/html")
40+
request.auth = (SITE_OWNER_NAME, SITE_OWNER_PASSWORD)
41+
yield request
42+
request.auth = ()
43+
44+
45+
@pytest.fixture
46+
def portal(functional):
47+
return functional["portal"]
48+
49+
50+
@pytest.fixture
51+
def portal_factory(functional):
52+
def func(behavior: str):
53+
portal = functional["portal"]
54+
setRoles(portal, TEST_USER_ID, ["Manager"])
55+
fti = DexterityFTI("DummyType")
56+
fti.behaviors = (behavior,)
57+
portal.portal_types._setObject("DummyType", fti)
58+
setSite(portal)
59+
transaction.commit()
60+
return portal
61+
62+
return func
63+
64+
65+
@pytest.fixture
66+
def dummy_type_schema(manager_request):
67+
def func():
68+
url = "/@types/DummyType"
69+
response = manager_request.get(url)
70+
data = response.json()
71+
return data
72+
73+
return func
74+
75+
76+
@pytest.fixture
77+
def create_dummy_content(manager_request):
78+
def func(payload: dict):
79+
payload["@type"] = "DummyType"
80+
response = manager_request.post("/", json=payload)
81+
return response
82+
83+
return func

tests/behaviors/test_behavior.py

Lines changed: 57 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,57 @@
1-
def test_seo_behavior_fields(manager_plone_client):
2-
# Enable behavior for pages
3-
manager_plone_client.patch(
4-
"++api++/@controlpanels/dexterity-types/Document",
5-
json={"kitconcept.seo": True},
6-
)
7-
8-
# Check schema
9-
schema = manager_plone_client.get("++api++/@types/Document").json()
10-
assert schema["fieldsets"][-1] == {
11-
"behavior": "plone",
12-
"description": "",
13-
"fields": [
14-
"seo_title",
15-
"seo_description",
16-
"seo_noindex",
17-
"seo_canonical_url",
18-
"opengraph_title",
19-
"opengraph_description",
20-
"opengraph_image",
21-
],
22-
"id": "seo",
23-
"title": "SEO",
24-
}
25-
26-
27-
def test_noindex_sets_response_header(manager_plone_client):
28-
# Enable behavior for pages
29-
manager_plone_client.patch(
30-
"++api++/@controlpanels/dexterity-types/Document",
31-
json={"kitconcept.seo": True},
32-
)
33-
34-
# Add page
35-
resp = manager_plone_client.post(
36-
"++api++/",
37-
json={"@type": "Document", "title": "Test page", "seo_noindex": True},
38-
)
39-
assert resp.status_code == 201
40-
41-
# Confirm the page is served with X-Robots-Tag header
42-
resp = manager_plone_client.get("/test-page")
43-
assert resp.status_code == 200
44-
assert resp.headers["X-Robots-Tag"] == "noindex"
45-
46-
# Confirm views of the page are served with X-Robots-Tag header
47-
resp = manager_plone_client.get("/test-page/@@view")
48-
assert resp.status_code == 200
49-
assert resp.headers["X-Robots-Tag"] == "noindex"
1+
from copy import deepcopy
2+
from kitconcept.seo import PACKAGE_NAME
3+
4+
import pytest
5+
6+
7+
PAYLOAD = {
8+
"seo_title": "Foo Bar",
9+
"seo_description": "Lorem ipsum dolor sit amet",
10+
"seo_noindex": False,
11+
"seo_canonical_url": "https://example.com/canonical-url",
12+
"opengraph_title": "Open Graph Title",
13+
"opengraph_description": "Open Graph Description",
14+
"opengraph_image": None,
15+
}
16+
17+
18+
@pytest.fixture
19+
def payload() -> dict:
20+
data = deepcopy(PAYLOAD)
21+
return data
22+
23+
24+
class TestBehaviorContato:
25+
name: str = f"{PACKAGE_NAME}"
26+
27+
@pytest.fixture(autouse=True)
28+
def _setup(self, portal_factory, dummy_type_schema, manager_html_request):
29+
self.portal = portal_factory(behavior=self.name)
30+
self.schema = dummy_type_schema()
31+
self.request = manager_html_request
32+
33+
@pytest.mark.parametrize("key", PAYLOAD.keys())
34+
def test_behavior_schema(self, key: str):
35+
assert key in self.schema["properties"]
36+
37+
def test_behavior_data(self, payload: dict, create_dummy_content):
38+
response = create_dummy_content(payload)
39+
assert response.status_code == 201
40+
41+
def test_noindex_sets_response_header(self):
42+
# Add page
43+
resp = self.request.post(
44+
"++api++/",
45+
json={"@type": "DummyType", "title": "Test page", "seo_noindex": True},
46+
)
47+
assert resp.status_code == 201
48+
49+
# Confirm the page is served with X-Robots-Tag header
50+
resp = self.request.get("/test-page")
51+
assert resp.status_code == 200
52+
assert resp.headers["X-Robots-Tag"] == "noindex"
53+
54+
# Confirm views of the page are served with X-Robots-Tag header
55+
resp = self.request.get("/test-page/@@view")
56+
assert resp.status_code == 200
57+
assert resp.headers["X-Robots-Tag"] == "noindex"

tests/conftest.py

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,7 @@
11
from kitconcept.seo.testing import FUNCTIONAL_TESTING
22
from kitconcept.seo.testing import INTEGRATION_TESTING
3-
from plone.app.testing import SITE_OWNER_NAME
4-
from plone.app.testing import SITE_OWNER_PASSWORD
5-
from plone.restapi.testing import RelativeSession
63
from pytest_plone import fixtures_factory
74

8-
import pytest
9-
105

116
pytest_plugins = ["pytest_plone"]
127

@@ -17,11 +12,3 @@
1712
(INTEGRATION_TESTING, "integration"),
1813
))
1914
)
20-
21-
22-
@pytest.fixture
23-
def manager_plone_client(functional):
24-
portal = functional["portal"]
25-
api_session = RelativeSession(f"{portal.absolute_url()}")
26-
api_session.auth = (SITE_OWNER_NAME, SITE_OWNER_PASSWORD)
27-
return api_session

0 commit comments

Comments
 (0)