Skip to content

Commit dad634c

Browse files
authored
tests: Add extensive tests for ArchivedPlugin.restore (#54)
1 parent 8dfd289 commit dad634c

File tree

7 files changed

+174
-2
lines changed

7 files changed

+174
-2
lines changed

djangocms_transfer/cms_toolbars.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@ class Media:
1414

1515
def populate(self):
1616
# always use draft if we have a page
17-
page = self.request.current_page
18-
17+
page = getattr(self.request, "current_page", None)
1918
if not page:
2019
return
2120

tests/settings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
"djangocms_text",
1919
"djangocms_link",
2020
"djangocms_transfer",
21+
"tests.test_app",
2122
]
2223

2324
MIDDLEWARE = [

tests/test_app/__init__.py

Whitespace-only changes.

tests/test_app/cms_plugins.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
from cms.plugin_base import CMSPluginBase
2+
from cms.plugin_pool import plugin_pool
3+
4+
from .models import Article, ArticlePluginModel
5+
6+
7+
class RandomPlugin(CMSPluginBase):
8+
model = Article
9+
render_plugin = False
10+
11+
12+
class ArticlePlugin(CMSPluginBase):
13+
model = ArticlePluginModel
14+
render_plugin = False
15+
16+
17+
plugin_pool.register_plugin(RandomPlugin)
18+
plugin_pool.register_plugin(ArticlePlugin)

tests/test_app/models.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from cms.models import CMSPlugin
2+
from django.db import models
3+
4+
5+
class Article(CMSPlugin):
6+
title = models.CharField(max_length=50)
7+
section = models.ForeignKey('Section', on_delete=models.CASCADE)
8+
9+
def __str__(self):
10+
return f"{self.title} -- {self.section}"
11+
12+
13+
class Section(models.Model):
14+
name = models.CharField(max_length=50)
15+
16+
def __str__(self):
17+
return self.name
18+
19+
20+
class ArticlePluginModel(CMSPlugin):
21+
title = models.CharField(max_length=50)
22+
sections = models.ManyToManyField('Section')
23+
24+
def __str__(self):
25+
return self.title

tests/test_import.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import json
2+
import unittest
23

34
from cms.models import CMSPlugin
45
from djangocms_text.utils import plugin_to_tag
@@ -11,9 +12,54 @@
1112
from djangocms_transfer.importer import import_plugins, import_plugins_to_page
1213

1314
from .abstract import FunctionalityBaseTestCase
15+
from .test_app.models import Section
1416

1517

1618
class ImportTest(FunctionalityBaseTestCase):
19+
def test_archivedplugin_restore_for_m2m_field(self):
20+
plugin = self._create_plugin(plugin_type="ArticlePlugin", title="Test")
21+
plugin.sections.set([
22+
Section.objects.create(name="body"),
23+
Section.objects.create(name="inner-body")
24+
])
25+
archived_plugin = ArchivedPlugin(**json.loads(export_plugin(plugin))[0])
26+
27+
placeholder = self.page_content.placeholders.create(slot="test")
28+
restored_plugin = archived_plugin.restore(placeholder, "en")
29+
self.assertEqual(restored_plugin.title, "Test")
30+
# second ArticlePluginModel instance in a new placeholder
31+
self.assertEqual(restored_plugin.position, 1)
32+
self.assertEqual(
33+
restored_plugin.sections.get(name="body"),
34+
plugin.sections.get(name="body")
35+
)
36+
37+
def test_archivedplugin_restore_for_existing_related_field(self):
38+
placeholder = self.page_content.placeholders.create(slot="test")
39+
article_data = {"title": "Test",
40+
"section": Section.objects.create(name="body")}
41+
plugin = self._create_plugin(plugin_type="RandomPlugin", **article_data)
42+
plugin_data = json.loads(export_plugin(plugin))[0]
43+
archived_plugin = ArchivedPlugin(**plugin_data)
44+
45+
restored_plugin = archived_plugin.restore(placeholder, "en")
46+
self.assertEqual(restored_plugin.title, "Test")
47+
self.assertEqual(restored_plugin.position, 1)
48+
self.assertEqual(restored_plugin.section, plugin.section)
49+
50+
@unittest.skip("TODO: fix 'field.related_model.DoesNotExist' on ArchivedPlugin.restore")
51+
def test_archivedplugin_restore_for_non_existing_related_field(self):
52+
placeholder = self.page_content.placeholders.create(slot="test")
53+
article_data = {"title": "Test",
54+
"section": Section.objects.create(name="body")}
55+
plugin = self._create_plugin(plugin_type="RandomPlugin", **article_data)
56+
plugin_data = json.loads(export_plugin(plugin))[0]
57+
plugin_data["data"].pop("section") # remove section from the plugin's data
58+
no_section_archived_plugin = ArchivedPlugin(**plugin_data)
59+
60+
no_section_restored_plugin = no_section_archived_plugin.restore(placeholder, "en")
61+
self.assertEqual(no_section_restored_plugin.section, None)
62+
1763
def test_import(self):
1864
pagecontent = self.page_content
1965
placeholder = pagecontent.get_placeholders().get(slot="content")

tests/test_toolbar.py

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
from cms.toolbar_pool import toolbar_pool
2+
3+
from .abstract import FunctionalityBaseTestCase
4+
5+
6+
class PluginImporterToolbarTestCase(FunctionalityBaseTestCase):
7+
def setUp(self):
8+
super().setUp()
9+
self.toolbars = toolbar_pool.get_toolbars()
10+
self.plugin_toolbar = next(
11+
(toolbar for toolbar in self.toolbars if toolbar.split(".")[-1] == "PluginImporter"),
12+
None
13+
)
14+
15+
def tearDown(self):
16+
toolbar_pool.clear()
17+
[toolbar_pool.register(toolbar) for _, toolbar in self.toolbars.items()]
18+
19+
def _only_plugin_importer_toolbar(self):
20+
toolbar_pool.clear()
21+
toolbar_pool.register(self.toolbars[self.plugin_toolbar])
22+
23+
def test_toolbar_populate_no_page(self):
24+
self._only_plugin_importer_toolbar()
25+
with self.login_user_context(self.get_staff_user_with_std_permissions()):
26+
response = self.client.get("/en/admin/cms/pagecontent/")
27+
self.assertEqual(response.status_code, 200)
28+
page_menu = response.wsgi_request.toolbar.get_menu("page")
29+
self.assertEqual(page_menu, None)
30+
31+
def test_toolbar_populate_user_cannot_change_page(self):
32+
self._only_plugin_importer_toolbar()
33+
with self.login_user_context(self.get_staff_user_with_no_permissions()):
34+
response = self.client.get(self.get_pages_root())
35+
self.assertEqual(response.status_code, 200)
36+
page_menu = response.wsgi_request.toolbar.get_menu("page")
37+
self.assertEqual(page_menu, None)
38+
39+
def test_toolbar_populate_page_menu_doesnot_exist(self):
40+
self._only_plugin_importer_toolbar()
41+
with self.login_user_context(self.get_staff_user_with_std_permissions()):
42+
response = self.client.get(self.get_pages_root())
43+
self.assertEqual(response.status_code, 200)
44+
page_menu = response.wsgi_request.toolbar.get_menu("page")
45+
self.assertEqual(page_menu, None)
46+
47+
def test_toolbar_populate_no_obj_in_toolbar(self):
48+
self._only_plugin_importer_toolbar()
49+
with self.login_user_context(self.get_staff_user_with_std_permissions()):
50+
response = self.client.get(self.get_pages_root())
51+
self.assertEqual(response.status_code, 200)
52+
response.wsgi_request.toolbar.obj = None
53+
page_menu = response.wsgi_request.toolbar.get_menu("page")
54+
self.assertEqual(page_menu, None)
55+
56+
def test_toolbar_populate_no_pagecontent_obj(self):
57+
with self.login_user_context(self.get_staff_user_with_std_permissions()):
58+
response = self.client.get(self.get_pages_root())
59+
self.assertEqual(response.status_code, 200)
60+
response.wsgi_request.toolbar.obj = "not page content"
61+
page_menu = response.wsgi_request.toolbar.get_menu("page")
62+
self.assertFalse([
63+
item for item in page_menu.items
64+
if getattr(item, "identifier", "") == "Page menu importer break"
65+
])
66+
67+
def test_toolbar_populate_pagecontent_obj(self):
68+
with self.login_user_context(self.get_staff_user_with_std_permissions()):
69+
response = self.client.get(self.get_pages_root())
70+
self.assertEqual(response.status_code, 200)
71+
page_menu = response.wsgi_request.toolbar.get_menu("page")
72+
self.assertTrue([
73+
item for item in page_menu.items
74+
if getattr(item, "identifier", "") == "Page menu importer break"
75+
])
76+
self.assertTrue([
77+
item for item in page_menu.items
78+
if getattr(item, "name", "") == "Export"
79+
])
80+
self.assertTrue([
81+
item for item in page_menu.items
82+
if getattr(item, "name", "").startswith("Import")
83+
])

0 commit comments

Comments
 (0)