1# -*- coding: utf-8 -*-
2import copy
3
4from django.contrib.sites.models import Site
5
6from cms.api import create_page
7from cms.models import Page
8from cms.test_utils.testcases import CMSTestCase, URL_CMS_PAGE
9from cms.utils.conf import get_cms_setting
10from cms.utils.urlutils import admin_reverse
11
12
13class SiteTestCase(CMSTestCase):
14    """Site framework specific test cases.
15
16    All stuff which is changing settings.SITE_ID for tests should come here.
17    """
18
19    def setUp(self):
20        self.assertEqual(Site.objects.all().count(), 1)
21        with self.settings(SITE_ID=1):
22            u = self._create_user("test", True, True)
23
24            # setup sites
25            self.site2 = Site.objects.create(domain="sample2.com", name="sample2.com", pk=2)
26            self.site3 = Site.objects.create(domain="sample3.com", name="sample3.com", pk=3)
27
28        self._login_context = self.login_user_context(u)
29        self._login_context.__enter__()
30
31    def tearDown(self):
32        self._login_context.__exit__(None, None, None)
33
34    def test_site_framework(self):
35        #Test the site framework, and test if it's possible to disable it
36        with self.settings(SITE_ID=self.site2.pk):
37            create_page("page_2a", "nav_playground.html", "de", site=self.site2)
38
39            response = self.client.get("%s?site__exact=%s" % (URL_CMS_PAGE, self.site3.pk))
40            self.assertEqual(response.status_code, 200)
41            create_page("page_3b", "nav_playground.html", "de", site=self.site3)
42
43        with self.settings(SITE_ID=self.site3.pk):
44            create_page("page_3a", "nav_playground.html", "nl", site=self.site3)
45
46            # with param
47            self.assertEqual(Page.objects.on_site(self.site2.pk).count(), 1)
48            self.assertEqual(Page.objects.on_site(self.site3.pk).count(), 2)
49
50            self.assertEqual(Page.objects.drafts().on_site().count(), 2)
51
52        with self.settings(SITE_ID=self.site2.pk):
53            # without param
54            self.assertEqual(Page.objects.drafts().on_site().count(), 1)
55
56    def test_site_preview(self):
57        page = create_page("page", "nav_playground.html", "de", site=self.site2, published=True)
58        page_edit_url_on = self.get_edit_on_url(page.get_absolute_url('de'))
59
60        with self.login_user_context(self.get_superuser()):
61            # set the current site on changelist
62            response = self.client.post(admin_reverse('cms_page_changelist'), {'site': self.site2.pk})
63            self.assertEqual(response.status_code, 200)
64            # simulate user clicks on preview icon
65            response = self.client.get(admin_reverse('cms_page_preview_page', args=[page.pk, 'de']))
66            self.assertEqual(response.status_code, 302)
67            self.assertEqual(response._headers['location'][1], 'http://sample2.com{}&language=de'.format(page_edit_url_on))
68
69    def test_site_publish(self):
70        self._login_context.__exit__(None, None, None)
71        pages = {"2": list(range(0, 5)), "3": list(range(0, 5))}
72        lang_settings = copy.deepcopy(get_cms_setting('LANGUAGES'))
73        lang_settings[3][1]['public'] = True
74
75        with self.settings(CMS_LANGUAGES=lang_settings, LANGUAGE_CODE="de"):
76            with self.settings(SITE_ID=self.site2.pk):
77                pages["2"][0] = create_page("page_2", "nav_playground.html", "de",
78                                            site=self.site2, published=True)
79                pages["2"][1] = create_page("page_2_1", "nav_playground.html", "de",
80                                            parent=pages["2"][0], site=self.site2, published=True)
81                pages["2"][2] = create_page("page_2_2", "nav_playground.html", "de",
82                                            parent=pages["2"][0], site=self.site2, published=True)
83                pages["2"][3] = create_page("page_2_1_1", "nav_playground.html", "de",
84                                            parent=pages["2"][1], site=self.site2, published=True)
85                pages["2"][4] = create_page("page_2_1_2", "nav_playground.html", "de",
86                                            parent=pages["2"][1], site=self.site2, published=True)
87
88                for page in pages["2"]:
89                    page_url = page.get_absolute_url(language='de')
90                    response = self.client.get(page_url)
91                    self.assertEqual(response.status_code, 200)
92
93            with self.settings(SITE_ID=self.site3.pk):
94                pages["3"][0] = create_page("page_3", "nav_playground.html", "de",
95                                            site=self.site3)
96                pages["3"][0].publish('de')
97                pages["3"][1] = create_page("page_3_1", "nav_playground.html", "de",
98                                            parent=pages["3"][0], site=self.site3, published=True)
99                pages["3"][2] = create_page("page_3_2", "nav_playground.html", "de",
100                                            parent=pages["3"][0], site=self.site3, published=True)
101                pages["3"][3] = create_page("page_3_1_1", "nav_playground.html", "de",
102                                            parent=pages["3"][1], site=self.site3, published=True)
103                pages["3"][4] = create_page("page_3_1_2", "nav_playground.html", "de",
104                                            parent=pages["3"][1], site=self.site3, published=True)
105
106                for page in pages["3"]:
107                    if page.is_home:
108                        page_url = "/de/"
109                    else:
110                        page_url = page.get_absolute_url(language='de')
111                    response = self.client.get(page_url)
112                    self.assertEqual(response.status_code, 200)
113
114
115class TestSiteBoundStaticPlaceholder(SiteTestCase):
116    def setUp(self):
117        super(TestSiteBoundStaticPlaceholder, self).setUp()
118        with self.settings(
119            CMS_TEMPLATES=(('placeholder_tests/static_with_site.html', 'tpl'), ),
120        ):
121            self.test_page = create_page('page', 'placeholder_tests/static_with_site.html', language='de')
122
123    def tearDown(self):
124        self.test_page.delete()
125        super(TestSiteBoundStaticPlaceholder, self).tearDown()
126
127    def test_create_site_specific_placeholder(self):
128            response = self.client.get(self.test_page.get_absolute_url(language='de') + '?structure')
129            self.assertEqual(response.status_code, 200)
130