Ejemplo n.º 1
0
class TestBatchingDXBase(unittest.TestCase):

    layer = PLONE_RESTAPI_DX_FUNCTIONAL_TESTING

    def setUp(self):
        self.app = self.layer["app"]
        self.portal = self.layer["portal"]
        self.portal_url = self.portal.absolute_url()
        self.request = self.portal.REQUEST

        self.api_session = RelativeSession(self.portal_url)
        self.api_session.headers.update({"Accept": "application/json"})
        self.api_session.auth = (SITE_OWNER_NAME, SITE_OWNER_PASSWORD)

    def tearDown(self):
        self.api_session.close()

    def _create_doc(self, container, number):
        createContentInContainer(
            container,
            u"DXTestDocument",
            id="doc-%s" % str(number + 1),
            title=u"Document %s" % str(number + 1),
            created=DateTime(1975, 1, 1, 0, 0),
            effective=DateTime(2015, 1, 1, 0, 0),
            expires=DateTime(2020, 1, 1, 0, 0),
        )
class DropDownMenuServiceTest(unittest.TestCase):

    layer = VOLTO_DROPDOWNMENU_API_FUNCTIONAL_TESTING

    def setUp(self):
        self.app = self.layer["app"]
        self.portal = self.layer["portal"]
        self.request = self.layer["request"]
        self.portal_url = self.portal.absolute_url()
        self.controlpanel_url = "/@controlpanels/dropdown-menu-settings"
        setRoles(self.portal, TEST_USER_ID, ["Manager"])

        self.api_session = RelativeSession(self.portal_url)
        self.api_session.headers.update({"Accept": "application/json"})
        self.api_session.auth = (SITE_OWNER_NAME, SITE_OWNER_PASSWORD)

    def tearDown(self):
        self.api_session.close()

    def test_controlpanel_listed(self):
        response = self.api_session.get("/@controlpanels")

        titles = [x.get("title") for x in response.json()]
        self.assertIn("Dropdown Menu settings", titles)

    def test_route_exists(self):
        response = self.api_session.get(
            "/@controlpanels/dropdown-menu-settings")

        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.headers.get("Content-Type"),
                         "application/json")
Ejemplo n.º 3
0
class SubsitesControlpanelTest(unittest.TestCase):

    layer = VOLTO_SUBSITES_API_FUNCTIONAL_TESTING

    def setUp(self):
        self.app = self.layer["app"]
        self.portal = self.layer["portal"]
        self.portal_url = self.portal.absolute_url()

        self.api_session = RelativeSession(self.portal_url)
        self.api_session.headers.update({"Accept": "application/json"})
        self.api_session.auth = (SITE_OWNER_NAME, SITE_OWNER_PASSWORD)

        setRoles(self.portal, TEST_USER_ID, ["Manager"])

    def tearDown(self):
        self.api_session.close()

    def test_controlpanel_exists(self):
        response = self.api_session.get("/@controlpanels/subsites-settings")

        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.headers.get("Content-Type"),
                         "application/json")

    def test_controlpanel_listed(self):
        response = self.api_session.get("/@controlpanels")

        titles = [x.get("title") for x in response.json()]
        self.assertIn("Subsites Settings", titles)
Ejemplo n.º 4
0
class TestContentTypesSchema(unittest.TestCase):
    layer = REDTURTLE_VOLTO_API_FUNCTIONAL_TESTING

    def setUp(self):
        self.app = self.layer["app"]
        self.portal = self.layer["portal"]
        self.portal_url = self.portal.absolute_url()
        setRoles(self.portal, TEST_USER_ID, ["Manager"])

        self.api_session = RelativeSession(self.portal_url)
        self.api_session.headers.update({"Accept": "application/json"})
        self.api_session.auth = (SITE_OWNER_NAME, SITE_OWNER_PASSWORD)

    def tearDown(self):
        self.api_session.close()

    def test_link_remoteUrl_return_proper_widget(self):
        response = self.api_session.get("/@types/Link")
        res = response.json()

        self.assertEqual(res["properties"]["remoteUrl"]["widget"], "url")

    def test_link_remoteUrl_return_proper_description(self):
        response = self.api_session.get("/@types/Link")
        res = response.json()

        self.assertEqual(
            res["properties"]["remoteUrl"]["description"],
            "Insert an external link directly into the field,or select an internal link clicking on the icon.",  # noqa
        )
Ejemplo n.º 5
0
class TestHistoryVersioning(unittest.TestCase):

    layer = PLONE_RESTAPI_DX_FUNCTIONAL_TESTING

    def setUp(self):
        self.app = self.layer["app"]
        self.portal = self.layer["portal"]
        self.portal_url = self.portal.absolute_url()
        setRoles(self.portal, TEST_USER_ID, ["Manager"])

        self.api_session = RelativeSession(self.portal_url)
        self.api_session.headers.update({"Accept": "application/json"})
        self.api_session.auth = (SITE_OWNER_NAME, SITE_OWNER_PASSWORD)

        self.portal.invokeFactory("Document",
                                  id="doc_with_history",
                                  title="My Document")
        self.doc = self.portal.doc_with_history
        self.doc.setTitle("Current version")

        transaction.commit()

    def tearDown(self):
        self.api_session.close()

    def test_response(self):
        response = self.api_session.get(self.doc.absolute_url())
        self.assertIn("version", response.json())
Ejemplo n.º 6
0
class TestDatabaseServiceFunctional(unittest.TestCase):

    layer = PLONE_RESTAPI_DX_FUNCTIONAL_TESTING

    def setUp(self):
        self.app = self.layer["app"]
        self.portal = self.layer["portal"]
        self.portal_url = self.portal.absolute_url()
        self.request = self.portal.REQUEST
        self.catalog = getToolByName(self.portal, "portal_catalog")

        self.api_session = RelativeSession(self.portal_url)
        self.api_session.headers.update({"Accept": "application/json"})
        self.api_session.auth = (SITE_OWNER_NAME, SITE_OWNER_PASSWORD)

    def tearDown(self):
        self.api_session.close()

    def test_get_system(self):
        response = self.api_session.get("/@database")

        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.headers.get("Content-Type"),
                         "application/json")

        results = response.json()
        self.assertEqual(results[u"@id"],
                         self.portal.absolute_url() + "/@database")
        self.assertTrue("cache_length" in results.keys())
        self.assertTrue("cache_length_bytes" in results.keys())
        self.assertTrue("cache_detail_length" in results.keys())
        self.assertTrue("cache_size" in results.keys())
        self.assertTrue("database_size" in results.keys())
        self.assertTrue("db_name" in results.keys())
        self.assertTrue("db_size" in results.keys())
class TestServicesMultilingualBreadcrumbs(unittest.TestCase):

    layer = PLONE_RESTAPI_DX_PAM_FUNCTIONAL_TESTING

    def setUp(self):
        self.portal = self.layer["portal"]
        self.portal_url = self.portal.absolute_url()
        self.request = self.layer["request"]

        self.api_session = RelativeSession(self.portal_url, test=self)
        self.api_session.headers.update({"Accept": "application/json"})
        self.api_session.auth = (SITE_OWNER_NAME, SITE_OWNER_PASSWORD)

        alsoProvides(self.layer["request"], IPloneAppMultilingualInstalled)
        login(self.portal, SITE_OWNER_NAME)
        self.en_content = createContentInContainer(self.portal["en"],
                                                   "Document",
                                                   title="Test document")
        self.es_content = createContentInContainer(self.portal["es"],
                                                   "Document",
                                                   title="Test document")
        ITranslationManager(self.en_content).register_translation(
            "es", self.es_content)
        self.folder = createContentInContainer(self.portal["es"],
                                               "Folder",
                                               id="folder",
                                               title="Some Folder")
        createContentInContainer(self.folder,
                                 "Document",
                                 id="doc1",
                                 title="A document")
        transaction.commit()

    def tearDown(self):
        self.api_session.close()

    def test_breadcrumbs_multilingual(self):
        response = self.api_session.get("/es/folder/doc1/@breadcrumbs")

        self.assertEqual(response.status_code, 200)
        self.assertEqual(
            response.json(),
            {
                "@id":
                self.portal_url + "/es/folder/doc1/@breadcrumbs",
                "root":
                self.portal_url + "/es",
                "items": [
                    {
                        "@id": self.portal_url + "/es/folder",
                        "title": "Some Folder",
                    },
                    {
                        "@id": self.portal_url + "/es/folder/doc1",
                        "title": "A document",
                    },
                ],
            },
        )
    def test_anonymous_cant_get_other_vocabularies(self):
        api_session = RelativeSession(self.portal_url)
        api_session.headers.update({"Accept": "application/json"})
        response = api_session.get("/@vocabularies/plone.app.vocabularies.Users")

        self.assertEqual(response.status_code, 401)

        api_session.close()
    def test_list_users_without_being_manager(self):
        noam_api_session = RelativeSession(self.portal_url)
        noam_api_session.headers.update({'Accept': 'application/json'})
        noam_api_session.auth = ('noam', 'password')

        response = noam_api_session.get('/@users')
        self.assertEqual(response.status_code, 401)
        noam_api_session.close()
Ejemplo n.º 10
0
    def test_list_users_without_being_manager(self):
        noam_api_session = RelativeSession(self.portal_url)
        noam_api_session.headers.update({"Accept": "application/json"})
        noam_api_session.auth = ("noam", "password")

        response = noam_api_session.get("/@users")
        self.assertEqual(response.status_code, 401)
        noam_api_session.close()
    def test_get_other_user_info_when_logged_in(self):
        noam_api_session = RelativeSession(self.portal_url)
        noam_api_session.headers.update({'Accept': 'application/json'})
        noam_api_session.auth = ('noam', 'password')

        response = noam_api_session.get('/@users/otheruser')
        self.assertEqual(response.status_code, 401)
        noam_api_session.close()
Ejemplo n.º 12
0
    def test_get_other_user_info_when_logged_in(self):
        noam_api_session = RelativeSession(self.portal_url)
        noam_api_session.headers.update({"Accept": "application/json"})
        noam_api_session.auth = ("noam", "password")

        response = noam_api_session.get("/@users/otheruser")
        self.assertEqual(response.status_code, 401)
        noam_api_session.close()
class EmailNotificationEndpoint(unittest.TestCase):

    layer = PLONE_RESTAPI_DX_FUNCTIONAL_TESTING

    def setUp(self):
        self.app = self.layer['app']
        self.portal = self.layer['portal']
        self.portal_url = self.portal.absolute_url()
        setRoles(self.portal, TEST_USER_ID, ['Manager'])

        self.mailhost = getUtility(IMailHost)

        registry = getUtility(IRegistry)
        registry['plone.email_from_address'] = '*****@*****.**'
        registry['plone.email_from_name'] = u'Plone test site'

        self.api_session = RelativeSession(self.portal_url)
        self.api_session.headers.update({'Accept': 'application/json'})
        self.api_session.auth = (SITE_OWNER_NAME, SITE_OWNER_PASSWORD)
        self.anon_api_session = RelativeSession(self.portal_url)
        self.anon_api_session.headers.update({'Accept': 'application/json'})

        transaction.commit()

    def tearDown(self):
        self.api_session.close()

    def test_email_notification(self):
        response = self.api_session.post('/@email-notification',
                                         json={
                                             'from': '*****@*****.**',
                                             'message': 'Just want to say hi.'
                                         })
        transaction.commit()

        self.assertEqual(response.status_code, 204)
        self.assertTrue('Subject: [No Subject]' in self.mailhost.messages[0])
        self.assertTrue('To: [email protected]' in self.mailhost.messages[0])
        self.assertTrue('Reply-To: [email protected]' in self.mailhost.messages[0])
        self.assertTrue('Just want to say hi.' in self.mailhost.messages[0])

    def test_email_notification_all_parameters(self):
        response = self.api_session.post('/@email-notification',
                                         json={
                                             'from': '*****@*****.**',
                                             'message': 'Just want to say hi.',
                                             'name': 'John Doe',
                                             'subject': 'This is the subject.'
                                         })
        transaction.commit()

        self.assertEqual(response.status_code, 204)
        self.assertTrue(
            '=?utf-8?q?This_is_the_subject' in self.mailhost.messages[0])
        self.assertTrue('To: [email protected]' in self.mailhost.messages[0])
        self.assertTrue('John Doe' in self.mailhost.messages[0])
        self.assertTrue('Reply-To: [email protected]' in self.mailhost.messages[0])
        self.assertTrue('Just want to say hi.' in self.mailhost.messages[0])
Ejemplo n.º 14
0
class TestTUSWithAT(unittest.TestCase):

    layer = PLONE_RESTAPI_AT_FUNCTIONAL_TESTING

    def setUp(self):
        if not HAS_AT:
            raise unittest.SkipTest("Skip tests if Archetypes is not present")
        self.portal = self.layer["portal"]
        setRoles(self.portal, TEST_USER_ID, ["Manager"])
        login(self.portal, TEST_USER_NAME)

        self.folder = api.content.create(container=self.portal,
                                         type="Folder",
                                         id="testfolder",
                                         title="Testfolder")
        self.upload_url = "{}/@tus-upload".format(self.folder.absolute_url())
        transaction.commit()

        self.api_session = RelativeSession(self.portal.absolute_url())
        self.api_session.headers.update({"Accept": "application/json"})
        self.api_session.auth = (TEST_USER_NAME, TEST_USER_PASSWORD)

    def tearDown(self):
        self.api_session.close()

    def test_tus_can_upload_pdf_file(self):
        # initialize the upload with POST
        pdf_file_path = os.path.join(os.path.dirname(__file__),
                                     UPLOAD_PDF_FILENAME)
        pdf_file_size = os.path.getsize(pdf_file_path)
        metadata = _prepare_metadata(UPLOAD_PDF_FILENAME, UPLOAD_PDF_MIMETYPE)
        response = self.api_session.post(
            self.upload_url,
            headers={
                "Tus-Resumable": "1.0.0",
                "Upload-Length": str(pdf_file_size),
                "Upload-Metadata": metadata,
            },
        )
        self.assertEqual(response.status_code, 201)
        location = response.headers["Location"]

        # upload the data with PATCH
        with open(pdf_file_path, "rb") as pdf_file:
            response = self.api_session.patch(
                location,
                headers={
                    "Content-Type": "application/offset+octet-stream",
                    "Upload-Offset": "0",
                    "Tus-Resumable": "1.0.0",
                },
                data=pdf_file,
            )
        self.assertEqual(response.status_code, 204)

        transaction.commit()
        self.assertEqual([UPLOAD_PDF_FILENAME], self.folder.contentIds())
    def test_anonymous_can_get_list_of_vocabularies(self):
        api_session = RelativeSession(self.portal_url)
        api_session.headers.update({"Accept": "application/json"})
        # api_session.auth = (SITE_OWNER_NAME, SITE_OWNER_PASSWORD)
        response = api_session.get("/@vocabularies")

        self.assertEqual(response.status_code, 200)

        api_session.close()
Ejemplo n.º 16
0
class TestTranslationExpansionFunctional(unittest.TestCase):

    layer = PLONE_RESTAPI_DX_PAM_FUNCTIONAL_TESTING

    def setUp(self):
        self.app = self.layer["app"]
        self.portal = self.layer["portal"]
        self.portal_url = self.portal.absolute_url()
        setRoles(self.portal, TEST_USER_ID, ["Manager"])

        self.api_session = RelativeSession(self.portal_url, test=self)
        self.api_session.headers.update({"Accept": "application/json"})
        self.api_session.auth = (SITE_OWNER_NAME, SITE_OWNER_PASSWORD)

        alsoProvides(self.layer["request"], IPloneAppMultilingualInstalled)
        login(self.portal, SITE_OWNER_NAME)
        self.en_content = createContentInContainer(self.portal["en"],
                                                   "Document",
                                                   title="Test document")
        self.en_folder = createContentInContainer(self.portal["en"],
                                                  "Folder",
                                                  title="Test folder")
        self.es_content = createContentInContainer(self.portal["es"],
                                                   "Document",
                                                   title="Test document")
        ITranslationManager(self.en_content).register_translation(
            "es", self.es_content)

        transaction.commit()

    def tearDown(self):
        self.api_session.close()

    def test_translations_is_expandable(self):
        response = self.api_session.get("/en/test-document")

        self.assertEqual(response.status_code, 200)
        self.assertIn("translations", list(response.json().get("@components")))

    def test_translations_expanded(self):
        response = self.api_session.get("/en/test-document",
                                        params={"expand": "translations"})

        self.assertEqual(response.status_code, 200)
        translation_dict = {
            "@id": self.es_content.absolute_url(),
            "language": "es"
        }
        self.assertIn(translation_dict,
                      response.json()["@components"]["translations"]["items"])

    def test_expansions_no_fullobjects_do_not_modify_id(self):
        response = self.api_session.get("/en/test-folder",
                                        params={"expand": "translations"})

        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.json()["@id"], self.en_folder.absolute_url())
Ejemplo n.º 17
0
class TestTUSUploadWithCORS(unittest.TestCase):

    layer = PLONE_RESTAPI_DX_FUNCTIONAL_TESTING

    def setUp(self):
        provideAdapter(
            CORSTestPolicy,
            adapts=(Interface, IBrowserRequest),
            provides=ICORSPolicy,
        )
        self.portal = self.layer['portal']
        self.api_session = RelativeSession(self.portal.absolute_url())
        self.api_session.headers.update({'Accept': 'application/json'})
        self.api_session.auth = (SITE_OWNER_NAME, SITE_OWNER_PASSWORD)
        self.upload_url = '{}/@tus-upload'.format(self.portal.absolute_url())

    def test_cors_preflight_for_post_contains_tus_headers(self):
        response = self.api_session.options(
            self.upload_url, headers={
                'Origin': 'http://myhost.net',
                'Access-Control-Request-Method': 'POST',
                'Access-Control-Request-Headers':
                    'Tus-Resumable,Upload-Length',
            })
        self.assertIn('Tus-Resumable', response.headers)
        self.assertIn('Tus-Version', response.headers)
        self.assertIn('Tus-Extension', response.headers)

    def test_cors_preflight_for_patch_contains_tus_headers(self):
        response = self.api_session.options(
            self.upload_url, headers={
                'Origin': 'http://myhost.net',
                'Access-Control-Request-Method': 'PATCH',
                'Access-Control-Request-Headers':
                    'Content-Type,Tus-Resumable,Upload-Offset',
            })
        self.assertIn('Tus-Resumable', response.headers)
        self.assertIn('Tus-Version', response.headers)
        self.assertIn('Tus-Extension', response.headers)

    def test_cors_preflight_for_head_contains_tus_headers(self):
        response = self.api_session.options(
            self.upload_url, headers={
                'Origin': 'http://myhost.net',
                'Access-Control-Request-Method': 'HEAD',
                'Access-Control-Request-Headers':
                    'Tus-Resumable',
            })
        self.assertIn('Tus-Resumable', response.headers)
        self.assertIn('Tus-Version', response.headers)
        self.assertIn('Tus-Extension', response.headers)

    def tearDown(self):
        self.api_session.close()
        gsm = getGlobalSiteManager()
        gsm.unregisterAdapter(
            CORSTestPolicy, (Interface, IBrowserRequest), ICORSPolicy)
class TestHistoryEndpointTranslatedMessages(unittest.TestCase):
    layer = PLONE_RESTAPI_DX_FUNCTIONAL_TESTING

    def setUp(self):
        self.app = self.layer['app']
        self.portal = self.layer['portal']
        self.portal_url = self.portal.absolute_url()
        setRoles(self.portal, TEST_USER_ID, ['Manager'])

        self.api_session = RelativeSession(self.portal_url)
        self.api_session.headers.update({'Accept': 'application/json'})
        self.api_session.headers.update({'Accept-Language': 'es'})
        self.api_session.auth = (SITE_OWNER_NAME, SITE_OWNER_PASSWORD)

        self.portal.invokeFactory('Document',
                                  id='doc_with_history',
                                  title='My Document')
        self.doc = self.portal.doc_with_history
        self.doc.setTitle('Current version')

        api.content.transition(self.doc, 'publish')

        self.endpoint_url = '{}/@history'.format(self.doc.absolute_url())

        transaction.commit()

    def tearDown(self):
        self.api_session.close()

    def test_actions_are_translated(self):
        url = self.doc.absolute_url() + '/@history'
        response = self.api_session.get(url)
        first_action = response.json()[-1]
        self.assertEqual(
            u'Crear',
            first_action['action'],
        )

    def test_state_titles_are_translated(self):
        url = self.doc.absolute_url() + '/@history'
        response = self.api_session.get(url)
        first_action = response.json()[-1]
        self.assertEqual(
            u'Privado',
            first_action['state_title'],
        )

    def test_transition_titles_are_translated(self):
        url = self.doc.absolute_url() + '/@history'
        response = self.api_session.get(url)
        first_action = response.json()[-1]
        self.assertEqual(
            u'Crear',
            first_action['transition_title'],
        )
    def test_anonymous_can_get_allowed_vocabularies(self):
        api_session = RelativeSession(self.portal_url)
        api_session.headers.update({"Accept": "application/json"})
        response = api_session.get("/@vocabularies/plone.app.vocabularies.Keywords")

        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.json()["items_total"], 2)
        self.assertEqual(response.json()["items"][0]["title"], "bar")
        self.assertEqual(response.json()["items"][1]["title"], "foo")

        api_session.close()
Ejemplo n.º 20
0
class TestTUSWithAT(unittest.TestCase):

    layer = PLONE_RESTAPI_AT_FUNCTIONAL_TESTING

    def setUp(self):
        if not HAS_AT:
            raise unittest.SkipTest('Skip tests if Archetypes is not present')
        self.portal = self.layer['portal']
        setRoles(self.portal, TEST_USER_ID, ['Manager'])
        login(self.portal, TEST_USER_NAME)

        self.folder = api.content.create(container=self.portal,
                                         type='Folder',
                                         id='testfolder',
                                         title='Testfolder')
        self.upload_url = '{}/@tus-upload'.format(self.folder.absolute_url())
        transaction.commit()

        self.api_session = RelativeSession(self.portal.absolute_url())
        self.api_session.headers.update({'Accept': 'application/json'})
        self.api_session.auth = (TEST_USER_NAME, TEST_USER_PASSWORD)

    def tearDown(self):
        self.api_session.close()

    def test_tus_can_upload_pdf_file(self):
        # initialize the upload with POST
        pdf_file_path = os.path.join(os.path.dirname(__file__),
                                     UPLOAD_PDF_FILENAME)
        pdf_file_size = os.path.getsize(pdf_file_path)
        metadata = _prepare_metadata(UPLOAD_PDF_FILENAME, UPLOAD_PDF_MIMETYPE)
        response = self.api_session.post(
            self.upload_url,
            headers={'Tus-Resumable': '1.0.0',
                     'Upload-Length': str(pdf_file_size),
                     'Upload-Metadata': metadata}
        )
        self.assertEqual(response.status_code, 201)
        location = response.headers['Location']

        # upload the data with PATCH
        with open(pdf_file_path, 'rb') as pdf_file:
            response = self.api_session.patch(
                location,
                headers={
                    'Content-Type': 'application/offset+octet-stream',
                    'Upload-Offset': '0',
                    'Tus-Resumable': '1.0.0'
                },
                data=pdf_file)
        self.assertEqual(response.status_code, 204)

        transaction.commit()
        self.assertEqual([UPLOAD_PDF_FILENAME], self.folder.contentIds())
Ejemplo n.º 21
0
class TestTranslationExpansionFunctional(unittest.TestCase):

    layer = PLONE_RESTAPI_DX_PAM_FUNCTIONAL_TESTING

    def setUp(self):
        self.app = self.layer['app']
        self.portal = self.layer['portal']
        self.portal_url = self.portal.absolute_url()
        setRoles(self.portal, TEST_USER_ID, ['Manager'])

        self.api_session = RelativeSession(self.portal_url)
        self.api_session.headers.update({'Accept': 'application/json'})
        self.api_session.auth = (SITE_OWNER_NAME, SITE_OWNER_PASSWORD)

        alsoProvides(self.layer['request'], IPloneAppMultilingualInstalled)
        login(self.portal, SITE_OWNER_NAME)
        self.en_content = createContentInContainer(
            self.portal['en'], 'Document', title=u'Test document')
        self.es_content = createContentInContainer(
            self.portal['es'], 'Document', title=u'Test document')
        ITranslationManager(self.en_content).register_translation(
            'es', self.es_content)

        transaction.commit()

    def tearDown(self):
        self.api_session.close()

    def test_translations_is_expandable(self):
        response = self.api_session.get('/en/test-document')

        self.assertEqual(response.status_code, 200)
        self.assertIn(
            'translations',
            list(response.json().get('@components'))
        )

    def test_translations_expanded(self):
        response = self.api_session.get(
            '/en/test-document',
            params={
                "expand": "translations"
            }
        )

        self.assertEqual(response.status_code, 200)
        translation_dict = {
            '@id': self.es_content.absolute_url(),
            'language': 'es'
        }
        self.assertIn(
            translation_dict,
            response.json()['@components']['translations']['items']
        )
Ejemplo n.º 22
0
class RSSServiceTest(unittest.TestCase):

    layer = REDTURTLE_RSSSERVICE_API_FUNCTIONAL_TESTING

    def setUp(self):
        self.app = self.layer["app"]
        self.portal = self.layer["portal"]
        self.portal_url = self.portal.absolute_url()

        self.api_session = RelativeSession(self.portal_url)
        self.api_session.headers.update({"Accept": "application/rss+xml"})
        self.api_session.auth = (SITE_OWNER_NAME, SITE_OWNER_PASSWORD)

        setRoles(self.portal, TEST_USER_ID, ["Manager"])

    def tearDown(self):
        self.api_session.close()

    def test_feed_parameter_is_required(self):
        response = self.api_session.get("/@get_rss_feed")
        self.assertEqual(response.status_code, 400)
        self.assertEqual(response.text, 'Missing required parameter: feed')

    @mock.patch('requests.get', side_effect=mocked_requests_get)
    def test_feed_not_found(self, mock_get):
        response = self.api_session.get(
            "/@get_rss_feed?feed=http://test.com/notfound/RSS")
        self.assertEqual(response.status_code, 404)
        self.assertEqual(response.text, 'Not Found')

    @mock.patch('requests.get', side_effect=mocked_requests_get)
    def test_feed_error(self, mock_get):
        response = self.api_session.get(
            "/@get_rss_feed?feed=http://test.com/toomany/RSS")
        self.assertEqual(response.status_code, 429)
        self.assertEqual(response.text, 'Too Many Requests')

    @mock.patch('requests.get', side_effect=mocked_requests_get)
    def test_feed_result(self, mock_get):
        response = self.api_session.get(
            "/@get_rss_feed?feed=http://test.com/RSS")
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.text, EXAMPLE_FEED)

    @mock.patch('requests.get', side_effect=mocked_requests_get)
    def test_feed_timeout(self, mock_get):
        response = self.api_session.get(
            "/@get_rss_feed?feed=http://test.com/timeout/RSS")
        self.assertEqual(response.status_code, 408)
        self.assertEqual(
            response.text,
            'Unable to fetch RSS feed at this moment: timeout. Retry later.',
        )
Ejemplo n.º 23
0
class TestEventApi(unittest.TestCase):

    layer = DESIGN_PLONE_CONTENTTYPES_API_FUNCTIONAL_TESTING

    def setUp(self):
        self.app = self.layer["app"]
        self.portal = self.layer["portal"]
        self.portal_url = self.portal.absolute_url()
        setRoles(self.portal, TEST_USER_ID, ["Manager"])

        self.api_session = RelativeSession(self.portal_url)
        self.api_session.headers.update({"Accept": "application/json"})
        self.api_session.auth = (SITE_OWNER_NAME, SITE_OWNER_PASSWORD)
        self.event = api.content.create(container=self.portal,
                                        type="Event",
                                        title="Evento")
        provideAdapter(SchemaTweaks, (IFormFieldProvider, ),
                       name="schema.tweaks")
        transaction.commit()

    def tearDown(self):
        self.api_session.close()

    def test_event_substructure_created(self):
        event = self.portal["evento"]

        self.assertEqual(
            sorted(["multimedia", "documenti", "sponsor_evento"]),
            sorted(event.keys()),
        )

        self.assertEqual(event["multimedia"].portal_type, "Document")
        self.assertEqual(event["multimedia"].constrain_types_mode, 1)
        self.assertEqual(event["multimedia"].locally_allowed_types,
                         ("Image", "Link"))

        self.assertEqual(event["sponsor_evento"].portal_type, "Document")
        self.assertEqual(event["sponsor_evento"].constrain_types_mode, 1)
        self.assertEqual(event["sponsor_evento"].locally_allowed_types,
                         ("Link", ))

        self.assertEqual(event["documenti"].portal_type, "Document")
        self.assertEqual(event["documenti"].constrain_types_mode, 1)
        self.assertEqual(event["documenti"].locally_allowed_types, ("File", ))

        multimedia_wf = api.content.get_state(obj=event["multimedia"])
        sponsor_wf = api.content.get_state(obj=event["sponsor_evento"])
        documenti_wf = api.content.get_state(obj=event["documenti"])

        self.assertEqual(multimedia_wf, "published")
        self.assertEqual(sponsor_wf, "published")
        self.assertEqual(documenti_wf, "published")
Ejemplo n.º 24
0
class TestPermissions(unittest.TestCase):

    layer = PLONE_RESTAPI_DX_FUNCTIONAL_TESTING

    def setUp(self):
        self.app = self.layer["app"]
        self.portal = self.layer["portal"]
        self.portal_url = self.portal.absolute_url()

        self.api_session = RelativeSession(self.portal_url, test=self)
        self.api_session.headers.update({"Accept": "application/json"})
        self.api_session.auth = (TEST_USER_NAME, TEST_USER_PASSWORD)

    def tearDown(self):
        self.api_session.close()

    def test_anonymous_allowed_to_use_api_by_default(self):
        setRoles(self.portal, TEST_USER_ID, ["Anonymous"])
        transaction.commit()

        response = self.api_session.get(self.portal_url)
        self.assertEqual(response.status_code, 200)

    def test_authenticated_allowed_to_use_api_by_default(self):
        setRoles(self.portal, TEST_USER_ID, ["Authenticated"])
        transaction.commit()

        response = self.api_session.get(self.portal_url)
        self.assertEqual(response.status_code, 200)

    def test_manager_allowed_to_use_api_by_default(self):
        setRoles(self.portal, TEST_USER_ID, ["Manager"])
        transaction.commit()

        response = self.api_session.get(self.portal_url)
        self.assertEqual(response.status_code, 200)

    def test_unauthorized_if_missing_permission(self):
        # Unmap the 'plone.restapi: Use REST API'
        # permission from any roles
        self.portal.manage_permission(UseRESTAPI, roles=[])
        transaction.commit()

        response = self.api_session.get(self.portal_url)
        self.assertEqual(response.status_code, 401)
        self.assertDictContainsSubset(
            {
                "type": "Unauthorized",
                "message": "Missing 'plone.restapi: Use REST API' permission",
            },
            response.json(),
        )
Ejemplo n.º 25
0
    def test_gestore_comunicati_can_get_data(self):
        api_session = RelativeSession(self.portal_url)
        api_session.headers.update({"Accept": "application/json"})
        api_session.auth = ("memberuser", "secret")

        url = "{}/@subscriptions".format(self.portal_url)
        self.assertEqual(api_session.get(url).status_code, 401)

        setRoles(self.portal, "memberuser", ["Gestore Comunicati"])
        transaction.commit()
        self.assertEqual(api_session.get(url).status_code, 200)

        api_session.close()
    def test_authenticated_can_get_allowed_vocabularies(self):
        api_session = RelativeSession(self.portal_url)
        api_session.headers.update({"Accept": "application/json"})

        for username in ["member", "contributor", "editor"]:
            api_session.auth = (username, "secret")
            response = api_session.get("/@vocabularies/plone.app.vocabularies.Keywords")
            self.assertEqual(response.status_code, 200)
            self.assertEqual(response.json()["items_total"], 2)
            self.assertEqual(response.json()["items"][0]["title"], "bar")
            self.assertEqual(response.json()["items"][1]["title"], "foo")

        api_session.close()
class TestServicesBreadcrumbs(unittest.TestCase):

    layer = PLONE_RESTAPI_DX_FUNCTIONAL_TESTING

    def setUp(self):
        self.app = self.layer["app"]
        self.portal = self.layer["portal"]
        self.portal_url = self.portal.absolute_url()
        setRoles(self.portal, TEST_USER_ID, ["Manager"])

        self.api_session = RelativeSession(self.portal_url, test=self)
        self.api_session.headers.update({"Accept": "application/json"})
        self.api_session.auth = (SITE_OWNER_NAME, SITE_OWNER_PASSWORD)

        self.folder = createContentInContainer(self.portal,
                                               "Folder",
                                               id="folder",
                                               title="Some Folder")
        createContentInContainer(self.folder,
                                 "Document",
                                 id="doc1",
                                 title="A document")
        transaction.commit()

    def tearDown(self):
        self.api_session.close()

    def test_breadcrumbs(self):
        response = self.api_session.get("/folder/doc1/@breadcrumbs")

        self.assertEqual(response.status_code, 200)
        self.assertEqual(
            response.json(),
            {
                "@id":
                self.portal_url + "/folder/doc1/@breadcrumbs",
                "root":
                self.portal_url,
                "items": [
                    {
                        "@id": self.portal_url + "/folder",
                        "title": "Some Folder",
                    },
                    {
                        "@id": self.portal_url + "/folder/doc1",
                        "title": "A document",
                    },
                ],
            },
        )
Ejemplo n.º 28
0
    def test_gestore_comunicati_can_update_data(self):
        api_session = RelativeSession(self.portal_url)
        api_session.headers.update({"Accept": "application/json"})
        api_session.auth = ("memberuser", "secret")

        url = "{}/123".format(self.url)
        self.assertEqual(api_session.patch(url, json={}).status_code, 401)

        setRoles(self.portal, "memberuser", ["Gestore Comunicati"])
        transaction.commit()
        # 400 because it's a fake id
        self.assertEqual(api_session.patch(self.url, json={}).status_code, 400)

        api_session.close()
Ejemplo n.º 29
0
class TestSystemFunctional(unittest.TestCase):

    layer = PLONE_RESTAPI_DX_FUNCTIONAL_TESTING

    def setUp(self):
        self.app = self.layer["app"]
        self.portal = self.layer["portal"]
        self.portal_url = self.portal.absolute_url()
        self.request = self.portal.REQUEST
        self.catalog = getToolByName(self.portal, "portal_catalog")

        self.api_session = RelativeSession(self.portal_url, test=self)
        self.api_session.headers.update({"Accept": "application/json"})
        self.api_session.auth = (SITE_OWNER_NAME, SITE_OWNER_PASSWORD)
        overview_control_panel = OverviewControlPanel(self.portal,
                                                      self.request)
        self.core_versions = overview_control_panel.core_versions()

    def tearDown(self):
        self.api_session.close()

    def test_get_system(self):
        response = self.api_session.get("/@system")

        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.headers.get("Content-Type"),
                         "application/json")

        results = response.json()
        self.assertEqual(results["@id"],
                         self.portal.absolute_url() + "/@system")
        self.assertEqual(results["cmf_version"], self.core_versions.get("CMF"))
        self.assertEqual(results["debug_mode"],
                         self.core_versions.get("Debug mode"))
        self.assertEqual(results["pil_version"], self.core_versions.get("PIL"))
        self.assertEqual(results["python_version"],
                         self.core_versions.get("Python"))
        self.assertEqual(
            results["plone_gs_metadata_version_file_system"],
            self.core_versions.get("Plone File System"),
        )
        self.assertEqual(
            results["plone_gs_metadata_version_installed"],
            self.core_versions.get("Plone Instance"),
        )
        self.assertEqual(results["plone_version"],
                         self.core_versions.get("Plone"))
        self.assertEqual(results["zope_version"],
                         self.core_versions.get("Zope"))
    def test_get_search_user_with_filter_as_unauthorized_user(self):
        response = self.api_session.post(
            '/@users',
            json={
                "username": "******",
                "email": "*****@*****.**",
                "password": "******"
            },
        )
        transaction.commit()
        noam_api_session = RelativeSession(self.portal_url)
        noam_api_session.headers.update({'Accept': 'application/json'})
        noam_api_session.auth = ('noam', 'password')

        response = noam_api_session.get('/@users', params={'query': 'howa'})
        self.assertEqual(response.status_code, 401)
        noam_api_session.close()