class TestROSRS_Session(unittest.TestCase): """ This test suite tests the ROSRS_Session client implementation of the ROSRS API """ def setUp(self): super(TestROSRS_Session, self).setUp() self.rosrs = ROSRS_Session(Config.ROSRS_API_URI, accesskey=Config.AUTHORIZATION) # Clean up from previous runs self.rosrs.deleteRO(Config.TEST_RO_PATH, purge=True) self.createdTestRO = None return def tearDown(self): super(TestROSRS_Session, self).tearDown() # Clean up self.rosrs.deleteRO(Config.TEST_RO_PATH) if self.createdTestRO: self.rosrs.deleteRO(self.createdTestRO, purge=True) self.rosrs.close() return def createTestRO(self): (status, reason, rouri, manifest) = self.rosrs.createRO(Config.TEST_RO_NAME, "Test RO for ROSRS_Session", "TestROSRS_Session.py", "2012-09-06") self.assertEqual(status, 201) self.createdTestRO = rouri return (status, reason, rouri, manifest) # Actual tests follow def testHelpers(self): testSplitValues() testParseLinks() return def testListROs(self): ros = self.rosrs.listROs() return def testCreateRO(self): (status, reason, rouri, manifest) = self.createTestRO() self.assertEqual(status, 201) self.assertEqual(reason, "Created") self.assertEqual(str(rouri)[:len(Config.TEST_RO_URI)-1]+"/", Config.TEST_RO_URI) self.assertIn((rouri, RDF.type, RO.ResearchObject), manifest) rolist = self.rosrs.listROs() self.assertIn(str(rouri), [ r["uri"] for r in rolist ]) return def testDeleteRO(self): (status, reason, rouri, manifest) = self.createTestRO() self.assertEqual(status, 201) # Test that new RO is in collection rolist = self.rosrs.listROs() self.assertIn(str(rouri), [ r["uri"] for r in rolist ]) # Delete RO (status, reason) = self.rosrs.deleteRO(rouri) self.assertEqual(status, 204) self.assertEqual(reason, "No Content") # Test that new RO is not in collection rolist = self.rosrs.listROs() self.assertNotIn(str(rouri), [ r["uri"] for r in rolist ]) # Delete again (status, reason) = self.rosrs.deleteRO(rouri) self.assertEqual(status, 404) self.assertEqual(reason, "Not Found") return def testGetROManifest(self): (status, reason, rouri, manifest) = self.createTestRO() self.assertEqual(status, 201) # Get manifest (status, reason, headers, manifesturi, manifest) = self.rosrs.getROManifest(rouri) self.assertEqual(status, 200) self.assertEqual(reason, "OK") self.assertEqual(headers["content-type"], "application/rdf+xml") # Check manifest RDF graph self.assertIn((rouri, RDF.type, RO.ResearchObject), manifest) self.assertIn((rouri, DCTERMS.creator, None), manifest) self.assertIn((rouri, DCTERMS.created, None), manifest) self.assertIn((rouri, ORE.isDescribedBy, manifesturi), manifest) return def testGetROPage(self): (status, reason, rouri, manifest) = self.createTestRO() self.assertEqual(status, 201) # Get landing page (status, reason, headers, pageuri, page) = self.rosrs.getROLandingPage(rouri) self.assertEqual(status, 200) self.assertEqual(reason, "OK") self.assertEqual(headers["content-type"], "text/html;charset=UTF-8") return def testGetROZip(self): (status, reason, rouri, manifest) = self.createTestRO() self.assertEqual(status, 201) # Get manifest (status, reason, headers, datauri, data) = self.rosrs.getROZip(rouri) self.assertEqual(status, 200) self.assertEqual(reason, "OK") self.assertEqual(headers["content-type"], "application/zip") # @@TODO test content of zip (data)? return def testAggregateResourceInt(self): (status, reason, rouri, manifest) = self.createTestRO() self.assertEqual(status, 201) # Aggregate internal resource rescontent = "Resource content\n" (status, reason, proxyuri, resuri) = self.rosrs.aggregateResourceInt( rouri, "test/path", ctype="text/plain", body=rescontent) self.assertEqual(status, 201) self.assertEqual(reason, "Created") self.assertEqual(str(resuri), str(rouri)+"test/path") # GET content (status, reason, headers, uri, data) = self.rosrs.getROResource( "test/path", rouri) self.assertEqual(status, 200) self.assertEqual(headers["content-type"], "text/plain") self.assertEqual(data, rescontent) # GET proxy (getproxyuri, manifest) = self.rosrs.getROResourceProxy( "test/path", rouri=rouri) self.assertEqual(getproxyuri, proxyuri) return def testDeleteResourceInt(self): (status, reason, rouri, manifest) = self.createTestRO() self.assertEqual(status, 201) # Create test resource rescontent = "Resource content\n" (status, reason, proxyuri, resuri) = self.rosrs.aggregateResourceInt( rouri, "test/path", ctype="text/plain", body=rescontent) self.assertEqual(status, 201) # GET content (status, reason, headers, uri, data) = self.rosrs.getROResource( "test/path", rouri) self.assertEqual(status, 200) # Delete resource (status, reason) = self.rosrs.removeResource(rouri, resuri) self.assertEqual(status, 204) self.assertEqual(reason, "No Content") # Check that resource is no longer available (status, reason, headers, uri, data) = self.rosrs.getROResource(resuri) self.assertEqual(status, 404) return def testAggregateResourceExt(self): (status, reason, rouri, manifest) = self.createTestRO() self.assertEqual(status, 201) # Aggregate external resource externaluri = rdflib.URIRef("http://example.com/external/resource.txt") (status, reason, proxyuri, resuri) = self.rosrs.aggregateResourceExt( rouri, externaluri) self.assertEqual(status, 201) self.assertEqual(reason, "Created") self.assertEqual(resuri, externaluri) # GET proxy (note: using rdflib.URIRef value for path) (getproxyuri, manifest) = self.rosrs.getROResourceProxy( externaluri, rouri) self.assertEqual(getproxyuri, proxyuri) return def testDeleteResourceExt(self): (status, reason, rouri, manifest) = self.createTestRO() self.assertEqual(status, 201) # Create test resource externaluri = rdflib.URIRef("http://example.com/external/resource.txt") (status, reason, proxyuri, resuri) = self.rosrs.aggregateResourceExt( rouri, externaluri) self.assertEqual(status, 201) self.assertEqual(resuri, externaluri) # GET proxy (note: using rdflib.URIRef for path) (getproxyuri, manifest) = self.rosrs.getROResourceProxy( externaluri, rouri) self.assertEqual(getproxyuri, proxyuri) # Delete resource (status, reason) = self.rosrs.removeResource(rouri, resuri) self.assertEqual(status, 204) self.assertEqual(reason, "No Content") (getproxyuri, manifest) = self.rosrs.getROResourceProxy( externaluri, rouri) self.assertIsNone(getproxyuri) self.assertIsNotNone(manifest) return def testGetROResource(self): (status, reason, rouri, manifest) = self.createTestRO() self.assertEqual(status, 201) # Create test resource rescontent = "Resource content\n" (status, reason, proxyuri, resuri) = self.rosrs.aggregateResourceInt( rouri, "test/path", ctype="text/plain", body=rescontent) self.assertEqual(status, 201) # GET content (status, reason, headers, uri, data) = self.rosrs.getROResource( "test/path", rouri) self.assertEqual(status, 200) self.assertEqual(reason, "OK") self.assertEqual(headers["content-type"], "text/plain") self.assertEqual(data, rescontent) return def testGetROResourceRDF(self): (status, reason, rouri, manifest) = self.createTestRO() self.assertEqual(status, 201) # Create internal test resource rescontent = """<?xml version="1.0" encoding="UTF-8"?> <rdf:RDF xmlns:dct="http://purl.org/dc/terms/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" > <rdf:Description rdf:about="http://example.org/file1.txt"> <dct:title>Title for file1.txt</dct:title> </rdf:Description> </rdf:RDF> """ (status, reason, proxyuri, resuri) = self.rosrs.aggregateResourceInt( rouri, "test/file1.rdf", ctype="application/rdf+xml", body=rescontent) self.assertEqual(status, 201) # Get resource content (status, reason, headers, uri, graph)= self.rosrs.getROResourceRDF( "test/file1.rdf", rouri=rouri) self.assertEqual(status, 200) self.assertEqual(reason, "OK") self.assertEqual(headers["content-type"], "application/rdf+xml") s = rdflib.URIRef("http://example.org/file1.txt") self.assertIn((s, DCTERMS.title, rdflib.Literal("Title for file1.txt")), graph) return def testGetROResourceProxy(self): (status, reason, rouri, manifest) = self.createTestRO() self.assertEqual(status, 201) # Create internal test resource rescontent = "Resource content\n" (status, reason, proxyuri, resuri) = self.rosrs.aggregateResourceInt( rouri, "test/path", ctype="text/plain", body=rescontent) self.assertEqual(status, 201) # Get resource proxy (getproxyuri, manifest) = self.rosrs.getROResourceProxy( "test/path", rouri=rouri) self.assertEqual(getproxyuri, proxyuri) return def testCreateROAnnotationInt(self): (status, reason, rouri, manifest) = self.createTestRO() self.assertEqual(status, 201) # Create internal test resource rescontent = "Resource content\n" (status, reason, proxyuri, resuri) = self.rosrs.aggregateResourceInt( rouri, "test/file.txt", ctype="text/plain", body=rescontent) self.assertEqual(status, 201) # Create internal annotation annbody = """<?xml version="1.0" encoding="UTF-8"?> <rdf:RDF xmlns:dct="http://purl.org/dc/terms/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xml:base="%s" > <rdf:Description rdf:about="test/file.txt"> <dct:title>Title for test/file.txt</dct:title> <rdfs:seeAlso rdf:resource="http://example.org/test" /> </rdf:Description> </rdf:RDF> """%(str(rouri)) agraph = rdflib.graph.Graph() agraph.parse(data=annbody, format="xml") (status, reason, annuri, bodyuri) = self.rosrs.createROAnnotationInt( rouri, resuri, agraph) self.assertEqual(status, 201) self.assertEqual(reason, "Created") # Retrieve annotation URIs auris = list(self.rosrs.getROAnnotationUris(rouri, resuri)) self.assertIn(annuri, auris) buris = list(self.rosrs.getROAnnotationBodyUris(rouri, resuri)) ### self.assertIn(bodyuri, buris) # Retrieve annotation (status, reason, bodyuri, anngr) = self.rosrs.getROAnnotation(annuri) self.assertEqual(status, 200) self.assertEqual(reason, "OK") self.assertIn((resuri, DCTERMS.title, rdflib.Literal("Title for test/file.txt")), anngr) self.assertIn((resuri, RDFS.seeAlso, rdflib.URIRef("http://example.org/test")), anngr) return def testGetROAnnotationGraph(self): (status, reason, rouri, manifest) = self.createTestRO() self.assertEqual(status, 201) # Create internal test resource rescontent = "Resource content\n" (status, reason, proxyuri, resuri) = self.rosrs.aggregateResourceInt( rouri, "test/file.txt", ctype="text/plain", body=rescontent) self.assertEqual(status, 201) # Create internal annotation annbody = """<?xml version="1.0" encoding="UTF-8"?> <rdf:RDF xmlns:dct="http://purl.org/dc/terms/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xml:base="%s" > <rdf:Description rdf:about="test/file.txt"> <dct:title>Title for test/file.txt</dct:title> <rdfs:seeAlso rdf:resource="http://example.org/test" /> </rdf:Description> </rdf:RDF> """%(str(rouri)) agraph = rdflib.graph.Graph() agraph.parse(data=annbody, format="xml") (status, reason, annuri, bodyuri) = self.rosrs.createROAnnotationInt( rouri, resuri, agraph) self.assertEqual(status, 201) self.assertEqual(reason, "Created") # Retrieve merged annotations anngr = self.rosrs.getROAnnotationGraph(rouri, resuri) annts = list(anngr.triples((None, None, None))) self.assertIn((resuri, DCTERMS.title, rdflib.Literal("Title for test/file.txt")), annts) self.assertIn((resuri, RDFS.seeAlso, rdflib.URIRef("http://example.org/test")), annts) return def testCreateROAnnotationExt(self): (status, reason, rouri, manifest) = self.createTestRO() self.assertEqual(status, 201) # Create external test resource (status, reason, proxyuri, resuri) = self.rosrs.aggregateResourceExt( rouri, rdflib.URIRef("http://example.org/ext")) self.assertEqual(status, 201) # Create annotation using external body reference bodyuri = rdflib.URIRef("http://example.org/ext/ann.rdf") (status, reason, annuri) = self.rosrs.createROAnnotationExt(rouri, resuri, bodyuri) self.assertEqual(status, 201) self.assertEqual(reason, "Created") # Retrieve annotation URIs auris = list(self.rosrs.getROAnnotationUris(rouri, resuri)) self.assertIn(annuri, auris) buris = list(self.rosrs.getROAnnotationBodyUris(rouri, resuri)) ### self.assertIn(bodyuri, buris) return def testUpdateROAnnotationInt(self): (status, reason, rouri, manifest) = self.createTestRO() self.assertEqual(status, 201) # Create internal test resource rescontent = "Resource content\n" (status, reason, proxyuri, resuri) = self.rosrs.aggregateResourceInt( rouri, "test/file.txt", ctype="text/plain", body=rescontent) self.assertEqual(status, 201) # Create internal annotation annbody1 = """<?xml version="1.0" encoding="UTF-8"?> <rdf:RDF xmlns:dct="http://purl.org/dc/terms/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xml:base="%s" > <rdf:Description rdf:about="test/file.txt"> <dct:title>Title 1</dct:title> <rdfs:seeAlso rdf:resource="http://example.org/test1" /> </rdf:Description> </rdf:RDF> """%(str(rouri)) agraph1 = rdflib.graph.Graph() agraph1.parse(data=annbody1, format="xml") (status, reason, annuri, bodyuri1) = self.rosrs.createROAnnotationInt( rouri, resuri, agraph1) self.assertEqual(status, 201) self.assertEqual(reason, "Created") # Retrieve annotation URIs auris1 = list(self.rosrs.getROAnnotationUris(rouri, resuri)) self.assertIn(annuri, auris1) buris1 = list(self.rosrs.getROAnnotationBodyUris(rouri, resuri)) ### self.assertIn(bodyuri1, buris1) # Retrieve annotation (status, reason, auri1, anngr1a) = self.rosrs.getROAnnotation(annuri) self.assertEqual(status, 200) self.assertEqual(reason, "OK") annts1a = list(anngr1a.triples((None, None, None))) self.assertIn((resuri, DCTERMS.title, rdflib.Literal("Title 1")), annts1a) self.assertIn((resuri, RDFS.seeAlso, rdflib.URIRef("http://example.org/test1")), annts1a) # Retrieve merged annotations anngr1b = self.rosrs.getROAnnotationGraph(rouri, resuri) annts1b = list(anngr1b.triples((None, None, None))) self.assertIn((resuri, DCTERMS.title, rdflib.Literal("Title 1")), annts1b) self.assertIn((resuri, RDFS.seeAlso, rdflib.URIRef("http://example.org/test1")), annts1b) # Update internal annotation annbody2 = """<?xml version="1.0" encoding="UTF-8"?> <rdf:RDF xmlns:dct="http://purl.org/dc/terms/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xml:base="%s" > <rdf:Description rdf:about="test/file.txt"> <dct:title>Title 2</dct:title> <rdfs:seeAlso rdf:resource="http://example.org/test2" /> </rdf:Description> </rdf:RDF> """%(str(rouri)) agraph2 = rdflib.graph.Graph() agraph2.parse(data=annbody2, format="xml") (status, reason, bodyuri2) = self.rosrs.updateROAnnotationInt( rouri, annuri, resuri, agraph2) self.assertEqual(status, 200) self.assertEqual(reason, "OK") # Retrieve annotation URIs auris2 = list(self.rosrs.getROAnnotationUris(rouri, resuri)) self.assertIn(annuri, auris2) buris2 = list(self.rosrs.getROAnnotationBodyUris(rouri, resuri)) ### self.assertIn(bodyuri2, buris2) # Retrieve annotation (status, reason, auri2a, anngr2a) = self.rosrs.getROAnnotation(annuri) annts2a = list(anngr2a.triples((None, None, None))) self.assertEqual(status, 200) self.assertEqual(reason, "OK") self.assertNotIn((resuri, DCTERMS.title, rdflib.Literal("Title 1")), annts2a) self.assertNotIn((resuri, RDFS.seeAlso, rdflib.URIRef("http://example.org/test1")), annts2a) self.assertIn((resuri, DCTERMS.title, rdflib.Literal("Title 2")), annts2a) self.assertIn((resuri, RDFS.seeAlso, rdflib.URIRef("http://example.org/test2")), annts2a) # Retrieve merged annotations anngr2b = self.rosrs.getROAnnotationGraph(rouri, resuri) annts2b = list(anngr2b.triples((None, None, None))) self.assertNotIn((resuri, DCTERMS.title, rdflib.Literal("Title 1")), annts2b) self.assertNotIn((resuri, RDFS.seeAlso, rdflib.URIRef("http://example.org/test1")), annts2b) self.assertIn((resuri, DCTERMS.title, rdflib.Literal("Title 2")), annts2b) self.assertIn((resuri, RDFS.seeAlso, rdflib.URIRef("http://example.org/test2")), annts2b) return def testUpdateROAnnotationExt(self): (status, reason, rouri, manifest) = self.createTestRO() self.assertEqual(status, 201) # Create external test resource (status, reason, proxyuri, resuri) = self.rosrs.aggregateResourceExt( rouri, rdflib.URIRef("http://example.org/ext")) self.assertEqual(status, 201) # Create annotation using external body reference bodyuri1 = rdflib.URIRef("http://example.org/ext/ann1.rdf") (status, reason, annuri) = self.rosrs.createROAnnotationExt(rouri, resuri, bodyuri1) self.assertEqual(status, 201) self.assertEqual(reason, "Created") # Retrieve annotation URIs auris1 = list(self.rosrs.getROAnnotationUris(rouri, resuri)) self.assertIn(annuri, auris1) buris1 = list(self.rosrs.getROAnnotationBodyUris(rouri, resuri)) self.assertIn(bodyuri1, buris1) # Update annotation using external body reference # @@TODO - this doesn't check that old annotation is removed. # @@TODO - currently, update is not fully implemented (2013-05). bodyuri2 = rdflib.URIRef("http://example.org/ext/ann2.rdf") (status, reason, annuri) = self.rosrs.createROAnnotationExt(rouri, resuri, bodyuri2) self.assertEqual(status, 201) self.assertEqual(reason, "Created") # Retrieve annotation URIs auris2 = list(self.rosrs.getROAnnotationUris(rouri, resuri)) self.assertIn(annuri, auris2) buris2 = list(self.rosrs.getROAnnotationBodyUris(rouri, resuri)) self.assertIn(bodyuri1, buris2) return def testRemoveROAnnotation(self): (status, reason, rouri, manifest) = self.createTestRO() self.assertEqual(status, 201) # Create internal test resource rescontent = "Resource content\n" (status, reason, proxyuri, resuri) = self.rosrs.aggregateResourceInt( rouri, "test/file.txt", ctype="text/plain", body=rescontent) self.assertEqual(status, 201) # Create internal annotation annbody = """<?xml version="1.0" encoding="UTF-8"?> <rdf:RDF xmlns:dct="http://purl.org/dc/terms/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xml:base="%s" > <rdf:Description rdf:about="test/file.txt"> <dct:title>Title for test/file.txt</dct:title> <rdfs:seeAlso rdf:resource="http://example.org/test" /> </rdf:Description> </rdf:RDF> """%(str(rouri)) agraph = rdflib.graph.Graph() agraph.parse(data=annbody, format="xml") (status, reason, annuri, bodyuri) = self.rosrs.createROAnnotationInt( rouri, resuri, agraph) self.assertEqual(status, 201) self.assertEqual(reason, "Created") # Retrieve annotation URIs auris = list(self.rosrs.getROAnnotationUris(rouri, resuri)) self.assertIn(annuri, auris) buris = list(self.rosrs.getROAnnotationBodyUris(rouri, resuri)) ### self.assertIn(bodyuri, buris) # Remove the annotation (status, reason) = self.rosrs.removeROAnnotation(rouri, annuri) self.assertEqual(status, 204) self.assertEqual(reason, "No Content") # Retrieve annotation URIs auris = list(self.rosrs.getROAnnotationUris(rouri, resuri)) self.assertNotIn(annuri, auris) buris = list(self.rosrs.getROAnnotationBodyUris(rouri, resuri)) ### self.assertNotIn(bodyuri, buris) return # Evolution tests def testCopyRO(self): return def testCancelCopyRO(self): return def testUpdateROStatus(self): return def testGetROEvolution(self): return # Sentinel/placeholder tests def testUnits(self): assert (True) def testComponents(self): assert (True) def testIntegration(self): assert (True) def testPending(self): assert (False), "Pending tests follow"