def setUp(self): self.tempdir = mkdtemp() self.target = CallTrace("Target") self.target.path = self.tempdir self.target.oaiEnvelope = False logger = CallTrace("Logger") collection = None self.uploader = FileSystemUploader(self.target, logger, collection)
class FileSystemUploaderTest(SeecrTestCase): def setUp(self): self.tempdir = mkdtemp() self.target = CallTrace("Target") self.target.path = self.tempdir self.target.oaiEnvelope = False logger = CallTrace("Logger") collection = None self.uploader = FileSystemUploader(self.target, logger, collection) def tearDown(self): shutil.rmtree(self.tempdir, ignore_errors=True) def testFilenameForId(self): def getFilename(anId): repository = CallTrace('Repository') repository.repositoryGroupId = 'groupId' repository.id = 'repositoryId' upload = Upload(repository=repository) upload.id = anId return self.uploader._filenameFor(upload) self.assertEquals(self.tempdir + '/groupId/repositoryId/aa:bb_SLASH_cc.dd.record', getFilename('aa:bb/cc.dd')) self.assertTrue(getFilename('.').startswith(self.tempdir + '/groupId/repositoryId/_malformed_id.')) self.assertTrue(getFilename('..').startswith(self.tempdir + '/groupId/repositoryId/_malformed_id.')) self.assertTrue(getFilename('').startswith(self.tempdir + '/groupId/repositoryId/_malformed_id.')) self.assertTrue(getFilename('a'*256).startswith(self.tempdir + '/groupId/repositoryId/_malformed_id.')) def testDeleteWithoutOaiEnvelope(self): recordFile = join(self.tempdir, 'id.record') os.system('touch ' + recordFile) self.assertTrue(isfile(recordFile)) self.uploader._filenameFor = lambda *args: recordFile self.target.oaiEnvelope = False repository = CallTrace('Repository') repository.repositoryGroupId = 'groupId' repository.id = 'repositoryId' upload = Upload(repository=repository) upload.id = 'id' self.uploader.delete(upload) DELETED_RECORDS = join(self.tempdir, 'deleted_records') self.assertTrue(isfile(DELETED_RECORDS)) self.assertEquals(['id\n'], open(DELETED_RECORDS).readlines()) self.assertFalse(isfile(recordFile)) upload.id = 'second:id' self.uploader.delete(upload) self.assertEquals(['id\n', 'second:id\n'], open(DELETED_RECORDS).readlines()) def testDeleteWithOaiEnvelope(self): RECORD_FILENAME = join(self.tempdir, 'id.record') self.uploader._filenameFor = lambda *args: RECORD_FILENAME self.uploader.tznow = lambda: "VANDAAG_EN_NU" self.target.oaiEnvelope = True repository = CallTrace('Repository') repository.repositoryGroupId = 'groupId' repository.metadataPrefix = 'oai_dc' repository.baseurl = "http://repository" repository.id = 'repositoryId' upload = Upload(repository=repository, oaiResponse=oaiResponse(identifier='id.record', deleted=True)) self.assertFalse(isfile(RECORD_FILENAME)) self.uploader.delete(upload) self.assertTrue(isfile(RECORD_FILENAME)) self.assertEqualsWS("""<OAI-PMH xmlns="http://www.openarchives.org/OAI/2.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd"> <responseDate>VANDAAG_EN_NU</responseDate> <request verb="GetRecord" metadataPrefix="oai_dc" identifier="id.record">http://repository</request> <GetRecord> <record> <header status="deleted"> <identifier>id.record</identifier> <datestamp>2005-08-29T07:08:09Z</datestamp> </header> </record> </GetRecord> </OAI-PMH>""", open(RECORD_FILENAME).read()) def testSend(self): recordFile = self.tempdir + '/group/repo/id.record' self.uploader._filenameFor = lambda *args: recordFile upload = createUpload() self.uploader.send(upload) self.assertTrue(isfile(recordFile)) self.assertEqualsLxml(oaiResponse().record, parse(open(recordFile))) def testSendWithAbout(self): ABOUT = '<about xmlns="%(oai)s">abouttext</about>' % namespaces recordFile = self.tempdir + '/group/repo/id.record' self.uploader._filenameFor = lambda *args: recordFile upload = createUpload(about=ABOUT) self.uploader.send(upload) self.assertTrue(isfile(recordFile)) self.assertEquals(ABOUT, lxmltostring(xpathFirst(parse(open(recordFile)), '//oai:about'))) def testSendWithMultipleAbout(self): ABOUT = '<about xmlns="%(oai)s">about_1</about><about xmlns="%(oai)s">about_2</about>' % namespaces recordFile = self.tempdir + '/group/repo/id.record' self.uploader._filenameFor = lambda *args: recordFile upload = createUpload(about=ABOUT) self.uploader.send(upload) self.assertTrue(isfile(recordFile)) self.assertEquals(ABOUT, ''.join(lxmltostring(x) for x in xpath(parse(open(recordFile)), '//oai:about'))) def testSendRaisesError(self): def raiseError(*args, **kwargs): raise Exception('Catch me') self.uploader._filenameFor = raiseError try: upload = createUpload() self.uploader.send(upload) self.fail() except UploaderException: pass def testSendOaiEnvelope(self): self.target.oaiEnvelope = 'true' recordFile = self.tempdir + '/group/repo/id.record' self.uploader._filenameFor = lambda *args: recordFile upload = createUpload() upload.repository = CallTrace('Repository') upload.repository.baseurl = 'http://www.example.com' upload.repository.metadataPrefix = 'weird&strange' self.uploader.send(upload) self.assertTrue(isfile(recordFile)) xmlGetRecord = parse(open(recordFile)) self.assertEquals('oai:ident:321', xpathFirst(xmlGetRecord, '/oai:OAI-PMH/oai:GetRecord/oai:record/oai:header/oai:identifier/text()')) self.assertEquals('http://www.example.com', xpathFirst(xmlGetRecord, '/oai:OAI-PMH/oai:request/text()')) self.assertEquals('weird&strange', xpathFirst(xmlGetRecord, '/oai:OAI-PMH/oai:request/@metadataPrefix')) def testSendTwice(self): self.testSend() self.testSend()
class FileSystemUploaderTest(SeecrTestCase): def setUp(self): self.tempdir = mkdtemp() self.target = CallTrace("Target") self.target.path = self.tempdir self.target.oaiEnvelope = False logger = CallTrace("Logger") collection = None self.uploader = FileSystemUploader(self.target, logger, collection) def tearDown(self): shutil.rmtree(self.tempdir, ignore_errors=True) def testFilenameForId(self): def getFilename(anId): repository = CallTrace('Repository') repository.repositoryGroupId = 'groupId' repository.id = 'repositoryId' upload = Upload(repository=repository) upload.id = anId return self.uploader._filenameFor(upload) self.assertEqual( self.tempdir + '/groupId/repositoryId/aa:bb_SLASH_cc.dd.record', getFilename('aa:bb/cc.dd')) self.assertTrue( getFilename('.').startswith( self.tempdir + '/groupId/repositoryId/_malformed_id.')) self.assertTrue( getFilename('..').startswith( self.tempdir + '/groupId/repositoryId/_malformed_id.')) self.assertTrue( getFilename('').startswith(self.tempdir + '/groupId/repositoryId/_malformed_id.')) self.assertTrue( getFilename( 'a' * 256).startswith(self.tempdir + '/groupId/repositoryId/_malformed_id.')) def testDeleteWithoutOaiEnvelope(self): recordFile = join(self.tempdir, 'id.record') os.system('touch ' + recordFile) self.assertTrue(isfile(recordFile)) self.uploader._filenameFor = lambda *args: recordFile self.target.oaiEnvelope = False repository = CallTrace('Repository') repository.repositoryGroupId = 'groupId' repository.id = 'repositoryId' upload = Upload(repository=repository) upload.id = 'id' self.uploader.delete(upload) DELETED_RECORDS = join(self.tempdir, 'deleted_records') self.assertTrue(isfile(DELETED_RECORDS)) with open(DELETED_RECORDS) as fp: self.assertEqual(['id\n'], fp.readlines()) self.assertFalse(isfile(recordFile)) upload.id = 'second:id' self.uploader.delete(upload) with open(DELETED_RECORDS) as fp: self.assertEqual(['id\n', 'second:id\n'], fp.readlines()) def testDeleteWithOaiEnvelope(self): RECORD_FILENAME = join(self.tempdir, 'id.record') self.uploader._filenameFor = lambda *args: RECORD_FILENAME self.uploader.tznow = lambda: "VANDAAG_EN_NU" self.target.oaiEnvelope = True repository = CallTrace('Repository') repository.repositoryGroupId = 'groupId' repository.metadataPrefix = 'oai_dc' repository.baseurl = "http://repository" repository.id = 'repositoryId' upload = Upload(repository=repository, oaiResponse=oaiResponse(identifier='id.record', deleted=True)) self.assertFalse(isfile(RECORD_FILENAME)) self.uploader.delete(upload) self.assertTrue(isfile(RECORD_FILENAME)) with open(RECORD_FILENAME) as f: self.assertEqualsWS( """<OAI-PMH xmlns="http://www.openarchives.org/OAI/2.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd"> <responseDate>VANDAAG_EN_NU</responseDate> <request verb="GetRecord" metadataPrefix="oai_dc" identifier="id.record">http://repository</request> <GetRecord> <record> <header status="deleted"> <identifier>id.record</identifier> <datestamp>2005-08-29T07:08:09Z</datestamp> </header> </record> </GetRecord> </OAI-PMH>""", f.read()) def testSend(self): recordFile = self.tempdir + '/group/repo/id.record' self.uploader._filenameFor = lambda *args: recordFile upload = createUpload() self.uploader.send(upload) self.assertTrue(isfile(recordFile)) with open(recordFile) as fp: self.assertEqualsLxml(oaiResponse().record, parse(fp)) def testSendWithAbout(self): ABOUT = '<about xmlns="%(oai)s">abouttext</about>' % namespaces recordFile = self.tempdir + '/group/repo/id.record' self.uploader._filenameFor = lambda *args: recordFile upload = createUpload(about=ABOUT) self.uploader.send(upload) self.assertTrue(isfile(recordFile)) with open(recordFile) as fp: self.assertEqual( ABOUT, lxmltostring(xpathFirst(parse(fp), '//oai:about'))) def testSendWithMultipleAbout(self): ABOUT = '<about xmlns="%(oai)s">about_1</about><about xmlns="%(oai)s">about_2</about>' % namespaces recordFile = self.tempdir + '/group/repo/id.record' self.uploader._filenameFor = lambda *args: recordFile upload = createUpload(about=ABOUT) self.uploader.send(upload) self.assertTrue(isfile(recordFile)) with open(recordFile) as fp: self.assertEqual( ABOUT, ''.join( lxmltostring(x) for x in xpath(parse(fp), '//oai:about'))) def testSendRaisesError(self): def raiseError(*args, **kwargs): raise Exception('Catch me') self.uploader._filenameFor = raiseError try: upload = createUpload() self.uploader.send(upload) self.fail() except UploaderException: pass def testSendOaiEnvelope(self): self.target.oaiEnvelope = 'true' recordFile = self.tempdir + '/group/repo/id.record' self.uploader._filenameFor = lambda *args: recordFile upload = createUpload() upload.repository = CallTrace('Repository') upload.repository.baseurl = 'http://www.example.com' upload.repository.metadataPrefix = 'weird&strange' self.uploader.send(upload) self.assertTrue(isfile(recordFile)) with open(recordFile) as fp: xmlGetRecord = parse(fp) self.assertEqual( 'oai:ident:321', xpathFirst( xmlGetRecord, '/oai:OAI-PMH/oai:GetRecord/oai:record/oai:header/oai:identifier/text()' )) self.assertEqual( 'http://www.example.com', xpathFirst(xmlGetRecord, '/oai:OAI-PMH/oai:request/text()')) self.assertEqual( 'weird&strange', xpathFirst(xmlGetRecord, '/oai:OAI-PMH/oai:request/@metadataPrefix')) def testSendTwice(self): self.testSend() self.testSend()