def test_get_no_login(self): self.client.logout() r = self.client.get(self.uri) self.assertFalse(r.context["auth_create"]) self.assertFalse(r.context["auth_update"]) self.assertFalse(r.context["auth_delete"]) colls = r.context['collections'] self.assertEqual(len(colls), len(init_collection_keys)) for id in init_collections: self.assertEqual(colls[id]["annal:id"], id) self.assertEqual(colls[id]["annal:url"], init_collections[id]["annal:url"]) self.assertEqual(colls[id]["rdfs:label"], init_collections[id]["rdfs:label"]) # Check returned HTML (checks template logic) # (Don't need to keep doing this as logic can be tested through context as above) # (See: http://stackoverflow.com/questions/2257958/) s = BeautifulSoup(r.content, "html.parser") self.assertEqual(s.html.title.string, site_title()) homelink = s.find(class_="title-area").find(class_="name").h1.a self.assertEqual(homelink.string, "Home") self.assertEqual(homelink['href'], self.uri) menuitems = s.find(class_="top-bar-section").find(class_="right").find_all("li") self.assertEqualIgnoreWS(menuitems[0].a.string, "Login") self.assertEqual(menuitems[0].a['href'], self.profileuri) # Check displayed collections trows = s.form.find_all("div", class_="tbody") self.assertEqual(len(trows), len(init_collection_keys)) self.assertEqual(trows[0].div.div('div')[1].a.string, "_annalist_site") self.assertEqual(trows[0].div.div('div')[1].a['href'], collection_view_url("_annalist_site")) self.assertEqual(trows[1].div.div('div')[1].a.string, "coll1") self.assertEqual(trows[1].div.div('div')[1].a['href'], collection_view_url("coll1")) self.assertEqual(trows[2].div.div('div')[1].a.string, "coll2") self.assertEqual(trows[2].div.div('div')[1].a['href'], collection_view_url("coll2")) self.assertEqual(trows[3].div.div('div')[1].a.string, "coll3") self.assertEqual(trows[3].div.div('div')[1].a['href'], collection_view_url("coll3")) return
def test_get_view_no_collection(self): u = collection_view_url(coll_id="no_collection") r = self.client.get(u) self.assertEqual(r.status_code, 404) self.assertEqual(r.reason_phrase, "Not found") self.assertContains(r, "<p>Collection no_collection does not exist</p>", status_code=404) return
def test_get_view_newer_version(self): collmeta = collection_create_values(coll_id="newer_version") self.testsite.add_collection("newer_version", collmeta, annal_ver="99.99.99") u = collection_view_url(coll_id="newer_version") r = self.client.get(u) self.assertEqual(r.status_code, 500) self.assertEqual(r.reason_phrase, "Server error") self.assertContains(r, "created by software version 99.99.99", status_code=500) return
def test_get_view_no_collection(self): u = collection_view_url(coll_id="no_collection") r = self.client.get(u) self.assertEqual(r.reason_phrase, "FOUND") self.assertEqual(r.content, "") u1 = TestHostUri + entitydata_list_all_url(coll_id="no_collection") self.assertEqual(r['location'], u1) r1 = self.client.get(u1) self.assertEqual(r1.status_code, 404) self.assertEqual(r1.reason_phrase, "Not found") return
def _check_collection_data_values(self, coll_id=None): """ Helper function checks content of annalist collection data """ self.assertTrue(Collection.exists(self.testsite, coll_id)) t = Collection.load(self.testsite, coll_id) self.assertEqual(t.get_id(), coll_id) self.assertEqual(t.get_view_url_path(), collection_view_url(coll_id="testcoll")) v = collectiondata_values(coll_id=coll_id) self.assertDictionaryMatch(t.get_values(), v) return t
def test_collection_init(self): log.debug("test_collection_init: TestBaseUri %s, TestBaseDir %s"%(TestBaseUri,TestBaseDir)) s = Site(TestBaseUri, TestBaseDir) c = Collection(s, "testcoll") self.assertEqual(c._entitytype, ANNAL.CURIE.Collection) self.assertEqual(c._entityfile, layout.COLL_META_REF) self.assertEqual(c._entityref, layout.META_COLL_REF) self.assertEqual(c._entityid, "testcoll") self.assertEqual(c._entityurl, TestHostUri + collection_view_url(coll_id="testcoll")) self.assertEqual(c._entitydir, collection_dir(coll_id="testcoll")) self.assertEqual(c._values, None) return
def setUp(self): init_annalist_test_site() self.testsite = Site(TestBaseUri, TestBaseDir) self.coll1 = Collection.load(self.testsite, "coll1") self.view_url = collection_view_url(coll_id="coll1") self.edit_url = collection_edit_url(coll_id="coll1") self.continuation = "?" + continuation_url_param(self.edit_url) # Login and permissions create_test_user(self.coll1, "testuser", "testpassword") self.client = Client(HTTP_HOST=TestHost) loggedin = self.client.login(username="******", password="******") self.assertTrue(loggedin) return
def test_post_close_no_continuation(self): # 'Close' button on list view with no continuation URI given in form f = entitylist_form_data("close", entities=["testtype/entity1", "testtype/entity2"], continuation_url="" ) u = entitydata_list_type_url("testcoll", "testtype") r = self.client.post(u, f) self.assertEqual(r.status_code, 302) self.assertEqual(r.reason_phrase, "FOUND") self.assertEqual(r.content, "") v = TestHostUri + collection_view_url(coll_id="testcoll") self.assertEqual(v, r['location']) return
def test_get_collection_data_json(self): """ Request collection data as JSON-LD """ collection_url = collection_view_url(coll_id="testcoll") u = collectiondata_url(coll_id="testcoll") r = self.client.get(u, HTTP_ACCEPT="application/ld+json") self.assertEqual(r.status_code, 302) self.assertEqual(r.reason_phrase, "FOUND") v = r['Location'] self.assertEqual(v, TestHostUri+collection_url+layout.COLL_META_REF) r = self.client.get(v) self.assertEqual(r.status_code, 200) self.assertEqual(r.reason_phrase, "OK") return
def test_post_new_all_entity(self): # Also tests continuation_url parameter handling #@@ s = site_view_url() s = collection_view_url(coll_id="testcoll") f = entitylist_form_data("new", list_id="Field_list", continuation_url=s) u = entitydata_list_all_url("testcoll", list_id="Field_list") r = self.client.post(u, f) self.assertEqual(r.status_code, 302) self.assertEqual(r.reason_phrase, "FOUND") self.assertEqual(r.content, "") v = TestHostUri + entitydata_edit_url( "new", "testcoll", layout.FIELD_TYPEID, view_id="Field_view" ) c = continuation_url_param(u, continuation_url_param(s)) self.assertIn(v, r['location']) self.assertIn(c, r['location']) return
def test_edit_collection_metadata(self): # This test performs a GET to retrieve values used in a form, # then a POST to save updated collection metadata. # This test is intended to test a problem encountered with updated # entity copying logic that needs to take special account of collection # entities being presented as offspring of the site while being stored # as part of a collection. # coll_id = "testcoll" self.assertTrue(Collection.exists(self.testsite, coll_id)) c = Collection.load(self.testsite, coll_id) self.assertEqual(c.get_id(), coll_id) self.assertEqual(c.get_view_url_path(), collection_view_url(coll_id="testcoll")) # GET collection metadata form data, and test values u = collectiondata_url(coll_id="testcoll") r = self.client.get(u) self.assertEqual(r.status_code, 200) self.assertEqual(r.reason_phrase, "OK") self.assertEqual(r.context['coll_id'], layout.SITEDATA_ID) self.assertEqual(r.context['type_id'], layout.COLL_TYPEID) self.assertEqual(r.context['entity_id'], "testcoll") self.assertEqual(r.context['orig_id'], "testcoll") self.assertEqual(r.context['orig_coll'], layout.SITEDATA_ID) self.assertEqual(r.context['action'], "view") self.assertEqual(r.context['continuation_url'], "") orig_coll = r.context['orig_coll'] # Assemble and POST form data to =updated collection metadata new_label = "Updated collection metadata" f = coll_view_form_data( coll_id="testcoll", action="edit", coll_label=new_label, # orig_coll="None" orig_coll=layout.SITEDATA_ID ) u = collectiondata_view_url(coll_id="testcoll", action="edit") r = self.client.post(u, f) self.assertEqual(r.status_code, 302) self.assertEqual(r.reason_phrase, "FOUND") self.assertEqual(r.content, "") self.assertEqual(r['location'], TestBaseUri+"/c/_annalist_site/d/_coll/") # Check updated collection data self._check_collection_data_values(coll_id="testcoll", coll_label=new_label) return
def test_get_collection_data_view(self): collection_url = collection_view_url(coll_id="testcoll") u = collectiondata_url(coll_id="testcoll") r = self.client.get(u) self.assertEqual(r.status_code, 200) self.assertEqual(r.reason_phrase, "OK") self.assertEqual(r.context['coll_id'], layout.SITEDATA_ID) self.assertEqual(r.context['type_id'], layout.COLL_TYPEID) self.assertEqual(r.context['entity_id'], "testcoll") self.assertEqual(r.context['orig_id'], "testcoll") self.assertEqual(r.context['action'], "view") self.assertEqual(r.context['continuation_url'], "") self.assertEqual( r.context['entity_data_ref'], collection_url+layout.COLL_META_REF ) self.assertEqual( r.context['entity_data_ref_json'], collection_url+layout.COLL_META_REF+"?type=application/json" ) return
def default_fields(coll_id=None, type_id=None, entity_id=None, width=12, **kwargs): """ Returns a function that accepts a field width and returns a dictionary of entity values for testing. The goal is to isolate default entity value settings from the test cases. """ def_label = kwargs.get( "default_label", default_label(coll_id=coll_id, type_id=type_id, entity_id=entity_id)) def_comment = kwargs.get( "default_comment", default_comment(coll_id=coll_id, type_id=type_id, entity_id=entity_id)) def_label_esc = def_label.replace("'", "'") def_comment_esc = def_comment.replace("'", "'") def_entity_url = collection_entity_view_url(coll_id=coll_id, type_id=type_id, entity_id=entity_id) collection_url = collection_view_url(coll_id).rstrip("/") def def_fields(width=12): fields = layout_classes(width=width) fields.update({ 'coll_id': coll_id, 'type_id': type_id, 'entity_id': entity_id, 'default_label': def_label, 'default_comment': def_comment, 'default_label_esc': def_label_esc, 'default_comment_esc': def_comment_esc, 'default_entity_url': def_entity_url, 'collection_url': collection_url }) if kwargs: fields.update(kwargs) return fields return def_fields
def test_post_default_form_default_view(self): # Set default entity view, then ensure collection view redirects to it self._create_entity_data("entitydefaultview") f = entitydata_default_view_form_data( entity_id="entitydefaultview", action="view", default_view="default_view", ) f.pop('entity_id', None) u = entitydata_edit_url(action="view", view_id="Default_view", coll_id="testcoll", type_id="testtype", entity_id="entitydefaultview") r = self.client.post(u, f) self.assertEqual(r.status_code, 302) self.assertEqual(r.reason_phrase, "FOUND") self.assertEqual(r.content, "") v = TestHostUri + u self.assertIn(v, r['location']) ih = "info_head=Action%20completed" im = ( "info_message=" + "Default%20view%20for%20collection%20testcoll%20changed%20to%20" + "Default_view/testtype/entitydefaultview") self.assertIn(ih, r['location']) self.assertIn(im, r['location']) # Get collection root and check redirect to entity view u2 = collection_view_url(coll_id="testcoll") r2 = self.client.get(u2) self.assertEqual(r2.status_code, 302) self.assertEqual(r2.reason_phrase, "FOUND") self.assertEqual(r2.content, "") v2 = TestHostUri + entitydata_edit_url(coll_id="testcoll", view_id="Default_view", type_id="testtype", entity_id="entitydefaultview") self.assertEqual(v2, r2['location']) return
def test_post_default_form_default_view(self): # Set default entity view, then ensure collection view redirects to it self._create_entity_data("entitydefaultview") f = default_view_form_data( entity_id="entitydefaultview", action="view", default_view="default_view", ) f.pop('entity_id', None) u = entitydata_edit_url(action="view", view_id="Default_view", coll_id="testcoll", type_id="testtype", entity_id="entitydefaultview") r = self.client.post(u, f) self.assertEqual(r.status_code, 302) self.assertEqual(r.reason_phrase, "FOUND") self.assertEqual(r.content, "") v = TestHostUri + u self.assertIn(v, r['location']) ih = "info_head=" + make_quoted_message(message.ACTION_COMPLETED) im = "info_message=" + make_quoted_message( message.DEFAULT_VIEW_UPDATED, view_id="Default_view", entity_id="entitydefaultview") self.assertIn(ih, r['location']) self.assertIn(im, r['location']) # Get collection root and check redirect to entity view u2 = collection_view_url(coll_id="testcoll") r2 = self.client.get(u2) self.assertEqual(r2.status_code, 302) self.assertEqual(r2.reason_phrase, "FOUND") self.assertEqual(r2.content, "") v2 = TestHostUri + entitydata_edit_url(coll_id="testcoll", view_id="Default_view", type_id="testtype", entity_id="entitydefaultview") self.assertEqual(v2, r2['location']) return
def test_post_default_form_default_view(self): # Set default entity view, then ensure collection view redirects to it self._create_entity_data("entitydefaultview") f = entitydata_default_view_form_data( entity_id="entitydefaultview", action="view", default_view="default_view", ) f.pop('entity_id', None) u = entitydata_edit_url( action="view", view_id="Default_view", coll_id="testcoll", type_id="testtype", entity_id="entitydefaultview" ) r = self.client.post(u, f) self.assertEqual(r.status_code, 302) self.assertEqual(r.reason_phrase, "FOUND") self.assertEqual(r.content, "") v = TestHostUri + u self.assertIn(v, r['location']) ih = "info_head=Action%20completed" im = ( "info_message="+ "Default%20view%20for%20collection%20testcoll%20changed%20to%20"+ "Default_view/testtype/entitydefaultview" ) self.assertIn(ih, r['location']) self.assertIn(im, r['location']) # Get collection root and check redirect to entity view u2 = collection_view_url(coll_id="testcoll") r2 = self.client.get(u2) self.assertEqual(r2.status_code, 302) self.assertEqual(r2.reason_phrase, "FOUND") self.assertEqual(r2.content, "") v2 = TestHostUri + entitydata_edit_url( coll_id="testcoll", view_id="Default_view", type_id="testtype", entity_id="entitydefaultview" ) self.assertEqual(v2, r2['location']) return
def test_get_with_login(self): r = self.client.get(self.uri) # Preferred way to test main view logic self.assertTrue(r.context["auth_create"]) self.assertTrue(r.context["auth_update"]) self.assertTrue(r.context["auth_delete"]) self.assertTrue(r.context["auth_create_coll"]) self.assertTrue(r.context["auth_delete_coll"]) colls = r.context['collections'] self.assertEqual(len(colls), len(init_collection_keys)) for id in init_collections: # First two here added in models.site.site_data() self.assertEqual(colls[id]["id"], id) self.assertEqual(colls[id]["url"], init_collections[id]["annal:url"]) self.assertEqual(colls[id]["annal:id"], id) self.assertEqual(colls[id]["annal:url"], init_collections[id]["annal:url"]) self.assertEqual(colls[id]["rdfs:label"], init_collections[id]["rdfs:label"]) # Check returned HTML (checks template logic) # (Don't need to keep doing this as logic can be tested through context as above) # (See: http://stackoverflow.com/questions/2257958/) s = BeautifulSoup(r.content, "html.parser") # title and top menu self.assertEqual(s.html.title.string, site_title()) homelink = s.find(class_="title-area").find(class_="name").h1.a self.assertEqual(homelink.string, "Home") self.assertEqual(homelink['href'], self.uri) menuitems = s.find(class_="top-bar-section").find(class_="right").find_all("li") self.assertEqualIgnoreWS(menuitems[0].a.string, "User testuser") self.assertEqual(menuitems[0].a['href'], TestBasePath+"/profile/") self.assertEqualIgnoreWS(menuitems[1].a.string, "Logout") self.assertEqual(menuitems[1].a['href'], TestBasePath+"/logout/") # Displayed colllections and check-buttons # trows = s.form.find_all("div", class_="tbody") trows = s.select("form > div > div > div") self.assertEqual(len(trows), len(init_collection_keys)+4) site_data = ( [ (1, "checkbox", "select", "_annalist_site") , (2, "checkbox", "select", "coll1") , (3, "checkbox", "select", "coll2") , (4, "checkbox", "select", "coll3") ]) for i, itype, iname, ivalue in site_data: # tcols = trows[i].find_all("div", class_="view-value") tcols = trows[i].select("div > div > div") self.assertEqual(tcols[0].input['type'], itype) self.assertEqual(tcols[0].input['name'], iname) self.assertEqual(tcols[0].input['value'], ivalue) self.assertEqual(tcols[1].a.string, ivalue) self.assertEqual(tcols[1].a['href'], collection_view_url(ivalue)) # buttons to view/edit/remove selected btn_view = trows[5].select("div > input")[0] self.assertEqual(btn_view["type"], "submit") self.assertEqual(btn_view["name"], "view") btn_edit = trows[5].select("div > input")[1] self.assertEqual(btn_edit["type"], "submit") self.assertEqual(btn_edit["name"], "edit") btn_remove = trows[5].select("div > input")[2] self.assertEqual(btn_remove["type"], "submit") self.assertEqual(btn_remove["name"], "remove") # Input fields for new collection add_fields = trows[6].select("div > div > div") field_id = add_fields[1].input field_label = add_fields[2].input self.assertEqual(field_id["type"], "text") self.assertEqual(field_id["name"], "new_id") self.assertEqual(field_label["type"], "text") self.assertEqual(field_label["name"], "new_label") # Button for new collection btn_new = trows[7].select("div > input")[0] self.assertEqual(btn_new["type"], "submit") self.assertEqual(btn_new["name"], "new") return
def test_get_with_login(self): r = self.client.get(self.uri) # Preferred way to test main view logic self.assertTrue(r.context["auth_create"]) self.assertTrue(r.context["auth_update"]) self.assertTrue(r.context["auth_delete"]) self.assertTrue(r.context["auth_create_coll"]) self.assertTrue(r.context["auth_delete_coll"]) colls = r.context['collections'] self.assertEqual(len(colls), 4) for id in init_collections: # First two here added in models.site.site_data() self.assertEqual(colls[id]["id"], id) self.assertEqual(colls[id]["url"], init_collections[id]["annal:url"]) self.assertEqual(colls[id]["annal:id"], id) self.assertEqual(colls[id]["annal:url"], init_collections[id]["annal:url"]) self.assertEqual(colls[id]["rdfs:label"], init_collections[id]["rdfs:label"]) # Check returned HTML (checks template logic) # (Don't need to keep doing this as logic can be tested through context as above) # (See: http://stackoverflow.com/questions/2257958/) s = BeautifulSoup(r.content) # title and top menu self.assertEqual(s.html.title.string, site_title()) homelink = s.find(class_="title-area").find(class_="name").h1.a self.assertEqual(homelink.string, "Home") self.assertEqual(homelink['href'], self.uri) menuitems = s.find(class_="top-bar-section").find( class_="right").find_all("li") self.assertEqual(menuitems[0].a.string, "User testuser") self.assertEqual(menuitems[0].a['href'], TestBasePath + "/profile/") self.assertEqual(menuitems[1].a.string, "Logout") self.assertEqual(menuitems[1].a['href'], TestBasePath + "/logout/") # Displayed colllections and check-buttons trows = s.form.find_all("div", class_="row") self.assertEqual(len(trows), 7) tcols1 = trows[1].find_all("div") self.assertEqual(tcols1[0].a.string, "coll1") self.assertEqual(tcols1[0].a['href'], collection_view_url("coll1")) self.assertEqual(tcols1[2].input['type'], "checkbox") self.assertEqual(tcols1[2].input['name'], "select") self.assertEqual(tcols1[2].input['value'], "coll1") tcols2 = trows[2].find_all("div") self.assertEqual(tcols2[0].a.string, "coll2") self.assertEqual(tcols2[0].a['href'], collection_view_url("coll2")) self.assertEqual(tcols2[2].input['type'], "checkbox") self.assertEqual(tcols2[2].input['name'], "select") self.assertEqual(tcols2[2].input['value'], "coll2") tcols3 = trows[3].find_all("div") self.assertEqual(tcols3[0].a.string, "coll3") self.assertEqual(tcols3[0].a['href'], collection_view_url("coll3")) self.assertEqual(tcols3[2].input['type'], "checkbox") self.assertEqual(tcols3[2].input['name'], "select") self.assertEqual(tcols3[2].input['value'], "coll3") tcols4 = trows[4].find_all("div") self.assertEqual(tcols4[0].a.string, "testcoll") self.assertEqual(tcols4[0].a['href'], collection_view_url("testcoll")) self.assertEqual(tcols4[2].input['type'], "checkbox") self.assertEqual(tcols4[2].input['name'], "select") self.assertEqual(tcols4[2].input['value'], "testcoll") # Remove/new collection buttons btn_remove = trows[5].find("div", class_="right") self.assertEqual(btn_remove.input["type"], "submit") self.assertEqual(btn_remove.input["name"], "remove") # Input fields and button for new collection field_id = trows[6].find_all("div")[0] self.assertEqual(field_id.input["type"], "text") self.assertEqual(field_id.input["name"], "new_id") field_id = trows[6].find_all("div")[1] self.assertEqual(field_id.input["type"], "text") self.assertEqual(field_id.input["name"], "new_label") btn_new = trows[6].find_all("div")[2] self.assertEqual(btn_new.input["type"], "submit") self.assertEqual(btn_new.input["name"], "new") return