def setUpOaiRecord(self, **kwargs): self.oaiRecord = OaiRecord(**kwargs) self.observer = CallTrace('Observer') self.oaiRecord.addObserver(self.observer) def retrieveData(**kwargs): raise StopIteration('<data/>') yield self.observer.methods['retrieveData'] = retrieveData self.observer.returnValues['provenance'] = (f for f in [])
def __init__(self, repositoryName, adminEmail, repositoryIdentifier=None, batchSize=OaiList.DEFAULT_BATCH_SIZE, supportXWait=False, fixIdentifyBaseURL=False): outside = Transparent( ) if repositoryIdentifier == None else OaiIdentifierRename( repositoryIdentifier) self.addObserver = outside.addObserver self.addStrand = outside.addStrand self._internalObserverTree = be((Observable(), ( OaiError(), (OaiIdentify(repositoryName=repositoryName, adminEmail=adminEmail, repositoryIdentifier=repositoryIdentifier, fixIdentifyBaseURL=fixIdentifyBaseURL), (outside, )), (OaiList(batchSize=batchSize, supportXWait=supportXWait), (OaiRecord(), (outside, ))), (OaiGetRecord(), (OaiRecord(), (outside, ))), (OaiListMetadataFormats(), (outside, )), (OaiListSets(), (outside, )), )))
def testGetRecordDeletedInRequestedPrefix(self): oaijazz = OaiJazz(self.tempdir + '/jazz') storage = MultiSequentialStorage(self.tempdir + "/seq-store") oairecord = OaiRecord() class MyStorage(object): def getData(self, identifier, name): return 'data' oaigetrecord = be((OaiGetRecord(repository=OaiRepository()), (oaijazz, ), (oairecord, (MyStorage(), )))) oaijazz.addOaiRecord(identifier='id:0', metadataPrefixes=['A', 'B']) oaijazz.deleteOaiRecordInPrefixes(identifier='id:0', metadataPrefixes=['A']) response = oaigetrecord.getRecord(arguments=dict( verb=['GetRecord'], metadataPrefix=['A'], identifier=['id:0'], ), **self.httpkwargs) _, body = asString(response).split("\r\n\r\n") self.assertEqual( 'deleted', xpathFirst( XML(body.encode()), '/oai:OAI-PMH/oai:GetRecord/oai:record/oai:header/@status'), body) response = oaigetrecord.getRecord(arguments=dict( verb=['GetRecord'], metadataPrefix=['B'], identifier=['id:0'], ), **self.httpkwargs) _, body = asString(response).split("\r\n\r\n") self.assertEqual( "data", xpathFirst(XML(body.encode()), '//oai:metadata/text()')) response = oaigetrecord.getRecord(arguments=dict( verb=['GetRecord'], metadataPrefix=['C'], identifier=['id:0'], ), **self.httpkwargs) _, body = asString(response).split("\r\n\r\n") self.assertEqual( 'cannotDisseminateFormat', xpathFirst(XML(body.encode()), '/oai:OAI-PMH/oai:error/@code'))
def testGetRecordWithMultiSequentialStorage(self): oaijazz = OaiJazz(self.tempdir + '/jazz') oaijazz.updateMetadataFormat(prefix="oai_dc", schema="", namespace="") storage = MultiSequentialStorage(self.tempdir + "/seq-store") oairecord = OaiRecord() oaigetrecord = be( (OaiGetRecord(repository=OaiRepository()), (oaijazz, ), (oairecord, (RetrieveToGetDataAdapter(), (storage, ))))) oaijazz.addOaiRecord(identifier="id0", metadataPrefixes=['oai_dc']) storage.addData(identifier="id0", name="oai_dc", data=b"data01") response = oaigetrecord.getRecord(arguments=dict( verb=['GetRecord'], metadataPrefix=['oai_dc'], identifier=['id0'], ), **self.httpkwargs) _, body = asString(response).split("\r\n\r\n") self.assertEqual( "data01", xpath(parse(BytesIO(body.encode())), '//oai:metadata')[0].text)
def setUpOaiRecord(self, **kwargs): self.oaiRecord = OaiRecord(**kwargs) self.observer = CallTrace('Observer') self.oaiRecord.addObserver(self.observer) self.observer.returnValues['provenance'] = (f for f in []) self.observer.returnValues['getData'] = '<data/>'
class OaiRecordTest(SeecrTestCase): def setUp(self): SeecrTestCase.setUp(self) self.setUpOaiRecord() def setUpOaiRecord(self, **kwargs): self.oaiRecord = OaiRecord(**kwargs) self.observer = CallTrace('Observer') self.oaiRecord.addObserver(self.observer) self.observer.returnValues['provenance'] = (f for f in []) self.observer.returnValues['getData'] = '<data/>' def testRecord(self): result = ''.join(compose(self.oaiRecord.oaiRecord(record=MockRecord('id'), metadataPrefix='oai_dc', fetchedRecords=None))) self.assertEqualsWS("""<record> <header> <identifier>id</identifier> <datestamp>2011-03-25T10:45:00Z</datestamp> <setSpec>set0</setSpec> <setSpec>set1</setSpec> </header> <metadata> <data/> </metadata> </record>""", result) self.assertEquals(["getData(identifier='id', name='oai_dc')", "provenance('id')"], [str(m) for m in self.observer.calledMethods]) def testRecordWithRetrieveData(self): def getData(*_, **__): raise DeclineMessage() def retrieveData(*_, **__): raise StopIteration('<retrieved/>') yield self.observer.methods['retrieveData'] = retrieveData self.observer.methods['getData'] = getData self.observer.returnValues.pop('getData') result = ''.join(compose(self.oaiRecord.oaiRecord(record=MockRecord('id'), metadataPrefix='oai_dc', fetchedRecords=None))) self.assertEqualsWS("""<record> <header> <identifier>id</identifier> <datestamp>2011-03-25T10:45:00Z</datestamp> <setSpec>set0</setSpec> <setSpec>set1</setSpec> </header> <metadata> <retrieved/> </metadata> </record>""", result) self.assertEquals([ "getData(identifier='id', name='oai_dc')", "retrieveData(identifier='id', name='oai_dc')", "provenance('id')" ], [str(m) for m in self.observer.calledMethods]) def testRecordWithFetchedRecords(self): record = MockRecord('id') result = ''.join(compose(self.oaiRecord.oaiRecord(record=record, metadataPrefix='oai_dc', fetchedRecords={record.identifier: "<the>data</the>", 'abc': '<some>other data</some>'}))) self.assertEqualsWS("""<record> <header> <identifier>id</identifier> <datestamp>2011-03-25T10:45:00Z</datestamp> <setSpec>set0</setSpec> <setSpec>set1</setSpec> </header> <metadata> <the>data</the> </metadata> </record>""", result) self.assertEquals(["provenance('id')"], [str(m) for m in self.observer.calledMethods]) def testPreciseDatestamp(self): self.setUpOaiRecord(preciseDatestamp=True) record = MockRecord('id') result = ''.join(compose(self.oaiRecord.oaiRecord(record=record, metadataPrefix='oai_dc', fetchedRecords={record.identifier: "<the>data</the>", 'abc': '<some>other data</some>'}))) self.assertEqualsWS("""<record> <header> <identifier>id</identifier> <datestamp>2011-03-25T10:45:00.123Z</datestamp> <setSpec>set0</setSpec> <setSpec>set1</setSpec> </header> <metadata> <the>data</the> </metadata> </record>""", result) def testRecordIsDeleted(self): result = ''.join(compose(self.oaiRecord.oaiRecord(record=MockRecord('id', deleted=True), metadataPrefix='oai_dc'))) self.assertEqualsWS("""<record> <header status="deleted"> <identifier>id</identifier> <datestamp>2011-03-25T10:45:00Z</datestamp> <setSpec>set0</setSpec> <setSpec>set1</setSpec> </header> </record>""", result) self.assertEquals([], [str(m) for m in self.observer.calledMethods]) def testRecordWithDeleteInSetsSupport(self): self.setUpOaiRecord(deleteInSets=True) result = ''.join(compose(self.oaiRecord.oaiRecord(record=MockRecord('id', sets={'set0', 'set1'}, deletedSets={'set1'}), metadataPrefix='oai_dc'))) self.assertEqualsWS("""<record> <header> <identifier>id</identifier> <datestamp>2011-03-25T10:45:00Z</datestamp> <setSpec>set0</setSpec> <setSpec status="deleted">set1</setSpec> </header> <metadata><data/></metadata> </record>""", result) def testRecordsWithoutSets(self): result = ''.join(compose(self.oaiRecord.oaiRecord(record=MockRecord('id', sets=[]), metadataPrefix='oai_dc'))) self.assertEqualsWS("""<record> <header> <identifier>id</identifier> <datestamp>2011-03-25T10:45:00Z</datestamp> </header> <metadata> <data/> </metadata> </record>""", result) self.assertEquals(["getData(identifier='id', name='oai_dc')", "provenance('id')"], [str(m) for m in self.observer.calledMethods]) def testRecordWithProvenance(self): self.observer.returnValues['provenance'] = (f for f in ['PROV','ENANCE']) result = ''.join(compose(self.oaiRecord.oaiRecord(record=MockRecord('id'), metadataPrefix='oai_dc'))) self.assertEqualsWS("""<record> <header> <identifier>id</identifier> <datestamp>2011-03-25T10:45:00Z</datestamp> <setSpec>set0</setSpec> <setSpec>set1</setSpec> </header> <metadata> <data/> </metadata> <about>PROVENANCE</about> </record>""", result) self.assertEquals(["getData(identifier='id', name='oai_dc')", "provenance('id')"], [str(m) for m in self.observer.calledMethods]) def testDeletedRecordWithProvenance(self): self.observer.returnValues['provenance'] = (f for f in ['PROV','ENANCE']) result = ''.join(compose(self.oaiRecord.oaiRecord(record=MockRecord('id&0', deleted=True), metadataPrefix='oai_dc'))) self.assertEqualsWS("""<record> <header status="deleted"> <identifier>id&0</identifier> <datestamp>2011-03-25T10:45:00Z</datestamp> <setSpec>set0</setSpec> <setSpec>set1</setSpec> </header> </record>""", result) self.assertEquals([], [str(m) for m in self.observer.calledMethods]) def testRecordForListIdentifiers(self): result = ''.join(compose(self.oaiRecord.oaiRecordHeader(record=MockRecord('id'), metadataPrefix='oai_dc', kwarg0="ignored"))) self.assertEqualsWS("""<header> <identifier>id</identifier> <datestamp>2011-03-25T10:45:00Z</datestamp> <setSpec>set0</setSpec> <setSpec>set1</setSpec> </header>""", result) self.assertEquals([], [str(m) for m in self.observer.calledMethods]) def testRecordWithRepositoryIdentifier(self): self.setUpOaiRecord(repository=OaiRepository(identifier='example.org')) result = ''.join(compose(self.oaiRecord.oaiRecord(record=MockRecord('id'), metadataPrefix='oai_dc', fetchedRecords=None))) self.assertEqualsWS("""<record> <header> <identifier>oai:example.org:id</identifier> <datestamp>2011-03-25T10:45:00Z</datestamp> <setSpec>set0</setSpec> <setSpec>set1</setSpec> </header> <metadata> <data/> </metadata> </record>""", result) self.assertEquals(["getData(identifier='id', name='oai_dc')", "provenance('id')"], [str(m) for m in self.observer.calledMethods]) def testRecordWithFetchedRecordsWithRepositoryIdentifier(self): self.setUpOaiRecord(repository=OaiRepository(identifier='example.org')) record = MockRecord('id') result = ''.join(compose(self.oaiRecord.oaiRecord(record=record, metadataPrefix='oai_dc', fetchedRecords={record.identifier: "<the>data</the>", 'abc': '<some>other data</some>'}))) self.assertEqualsWS("""<record> <header> <identifier>oai:example.org:id</identifier> <datestamp>2011-03-25T10:45:00Z</datestamp> <setSpec>set0</setSpec> <setSpec>set1</setSpec> </header> <metadata> <the>data</the> </metadata> </record>""", result) self.assertEquals(["provenance('id')"], [str(m) for m in self.observer.calledMethods])
class OaiRecordTest(SeecrTestCase): def setUp(self): SeecrTestCase.setUp(self) self.setUpOaiRecord() def setUpOaiRecord(self, **kwargs): self.oaiRecord = OaiRecord(**kwargs) self.observer = CallTrace('Observer') self.oaiRecord.addObserver(self.observer) self.observer.returnValues['provenance'] = (f for f in []) self.observer.returnValues['getData'] = '<data/>' def testRecord(self): result = ''.join( compose( self.oaiRecord.oaiRecord(record=MockRecord('id'), metadataPrefix='oai_dc', fetchedRecords=None))) self.assertEqualsWS( """<record> <header> <identifier>id</identifier> <datestamp>2011-03-25T10:45:00Z</datestamp> <setSpec>set0</setSpec> <setSpec>set1</setSpec> </header> <metadata> <data/> </metadata> </record>""", result) self.assertEqual( ["getData(identifier='id', name='oai_dc')", "provenance('id')"], [str(m) for m in self.observer.calledMethods]) def testRecordWithRetrieveData(self): def getData(*_, **__): raise DeclineMessage() def retrieveData(*_, **__): return '<retrieved/>' yield self.observer.methods['retrieveData'] = retrieveData self.observer.methods['getData'] = getData self.observer.returnValues.pop('getData') result = ''.join( compose( self.oaiRecord.oaiRecord(record=MockRecord('id'), metadataPrefix='oai_dc', fetchedRecords=None))) self.assertEqualsWS( """<record> <header> <identifier>id</identifier> <datestamp>2011-03-25T10:45:00Z</datestamp> <setSpec>set0</setSpec> <setSpec>set1</setSpec> </header> <metadata> <retrieved/> </metadata> </record>""", result) self.assertEqual([ "getData(identifier='id', name='oai_dc')", "retrieveData(identifier='id', name='oai_dc')", "provenance('id')" ], [str(m) for m in self.observer.calledMethods]) def testRecordWithFetchedRecords(self): record = MockRecord('id') result = ''.join( compose( self.oaiRecord.oaiRecord(record=record, metadataPrefix='oai_dc', fetchedRecords={ record.identifier: "<the>data</the>", 'abc': '<some>other data</some>' }))) self.assertEqualsWS( """<record> <header> <identifier>id</identifier> <datestamp>2011-03-25T10:45:00Z</datestamp> <setSpec>set0</setSpec> <setSpec>set1</setSpec> </header> <metadata> <the>data</the> </metadata> </record>""", result) self.assertEqual(["provenance('id')"], [str(m) for m in self.observer.calledMethods]) def testPreciseDatestamp(self): self.setUpOaiRecord(preciseDatestamp=True) record = MockRecord('id') result = ''.join( compose( self.oaiRecord.oaiRecord(record=record, metadataPrefix='oai_dc', fetchedRecords={ record.identifier: "<the>data</the>", 'abc': '<some>other data</some>' }))) self.assertEqualsWS( """<record> <header> <identifier>id</identifier> <datestamp>2011-03-25T10:45:00.123Z</datestamp> <setSpec>set0</setSpec> <setSpec>set1</setSpec> </header> <metadata> <the>data</the> </metadata> </record>""", result) def testRecordIsDeleted(self): result = ''.join( compose( self.oaiRecord.oaiRecord(record=MockRecord('id', deleted=True), metadataPrefix='oai_dc'))) self.assertEqualsWS( """<record> <header status="deleted"> <identifier>id</identifier> <datestamp>2011-03-25T10:45:00Z</datestamp> <setSpec>set0</setSpec> <setSpec>set1</setSpec> </header> </record>""", result) self.assertEqual([], [str(m) for m in self.observer.calledMethods]) def testRecordWithDeleteInSetsSupport(self): self.setUpOaiRecord(deleteInSets=True) result = ''.join( compose( self.oaiRecord.oaiRecord(record=MockRecord( 'id', sets={'set0', 'set1'}, deletedSets={'set1'}), metadataPrefix='oai_dc'))) self.assertEqualsWS( """<record> <header> <identifier>id</identifier> <datestamp>2011-03-25T10:45:00Z</datestamp> <setSpec>set0</setSpec> <setSpec status="deleted">set1</setSpec> </header> <metadata><data/></metadata> </record>""", result) def testRecordsWithoutSets(self): result = ''.join( compose( self.oaiRecord.oaiRecord(record=MockRecord('id', sets=[]), metadataPrefix='oai_dc'))) self.assertEqualsWS( """<record> <header> <identifier>id</identifier> <datestamp>2011-03-25T10:45:00Z</datestamp> </header> <metadata> <data/> </metadata> </record>""", result) self.assertEqual( ["getData(identifier='id', name='oai_dc')", "provenance('id')"], [str(m) for m in self.observer.calledMethods]) def testRecordWithProvenance(self): self.observer.returnValues['provenance'] = ( f for f in ['PROV', 'ENANCE']) result = ''.join( compose( self.oaiRecord.oaiRecord(record=MockRecord('id'), metadataPrefix='oai_dc'))) self.assertEqualsWS( """<record> <header> <identifier>id</identifier> <datestamp>2011-03-25T10:45:00Z</datestamp> <setSpec>set0</setSpec> <setSpec>set1</setSpec> </header> <metadata> <data/> </metadata> <about>PROVENANCE</about> </record>""", result) self.assertEqual( ["getData(identifier='id', name='oai_dc')", "provenance('id')"], [str(m) for m in self.observer.calledMethods]) def testDeletedRecordWithProvenance(self): self.observer.returnValues['provenance'] = ( f for f in ['PROV', 'ENANCE']) result = ''.join( compose( self.oaiRecord.oaiRecord(record=MockRecord('id&0', deleted=True), metadataPrefix='oai_dc'))) self.assertEqualsWS( """<record> <header status="deleted"> <identifier>id&0</identifier> <datestamp>2011-03-25T10:45:00Z</datestamp> <setSpec>set0</setSpec> <setSpec>set1</setSpec> </header> </record>""", result) self.assertEqual([], [str(m) for m in self.observer.calledMethods]) def testRecordForListIdentifiers(self): result = ''.join( compose( self.oaiRecord.oaiRecordHeader(record=MockRecord('id'), metadataPrefix='oai_dc', kwarg0="ignored"))) self.assertEqualsWS( """<header> <identifier>id</identifier> <datestamp>2011-03-25T10:45:00Z</datestamp> <setSpec>set0</setSpec> <setSpec>set1</setSpec> </header>""", result) self.assertEqual([], [str(m) for m in self.observer.calledMethods]) def testRecordWithRepositoryIdentifier(self): self.setUpOaiRecord(repository=OaiRepository(identifier='example.org')) result = ''.join( compose( self.oaiRecord.oaiRecord(record=MockRecord('id'), metadataPrefix='oai_dc', fetchedRecords=None))) self.assertEqualsWS( """<record> <header> <identifier>oai:example.org:id</identifier> <datestamp>2011-03-25T10:45:00Z</datestamp> <setSpec>set0</setSpec> <setSpec>set1</setSpec> </header> <metadata> <data/> </metadata> </record>""", result) self.assertEqual( ["getData(identifier='id', name='oai_dc')", "provenance('id')"], [str(m) for m in self.observer.calledMethods]) def testRecordWithFetchedRecordsWithRepositoryIdentifier(self): self.setUpOaiRecord(repository=OaiRepository(identifier='example.org')) record = MockRecord('id') result = ''.join( compose( self.oaiRecord.oaiRecord(record=record, metadataPrefix='oai_dc', fetchedRecords={ record.identifier: "<the>data</the>", 'abc': '<some>other data</some>' }))) self.assertEqualsWS( """<record> <header> <identifier>oai:example.org:id</identifier> <datestamp>2011-03-25T10:45:00Z</datestamp> <setSpec>set0</setSpec> <setSpec>set1</setSpec> </header> <metadata> <the>data</the> </metadata> </record>""", result) self.assertEqual(["provenance('id')"], [str(m) for m in self.observer.calledMethods])