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")
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)
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 )
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())
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()
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()
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])
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()
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())
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()
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())
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'] )
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.', )
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")
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(), )
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", }, ], }, )
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()
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()