def testLogError(self):
        env = Environment(root=self.tempdir)
        repository = env.addRepository(name="test", active=True)

        self.harvest._urlopen = lambda url: StringIO(OAIPMH_ERROR_OUTPUT)

        lico(self.dna.all.process(repository))
        self.assertEquals('errorCode: error text', repository.readErrorLog())
    def testAddDeleteWithoutResumption(self):
        env = Environment(root=self.tempdir)
        repository = env.addRepository(name="test", active=True)

        self.harvest._urlopen = lambda url: StringIO(OAIPMH_OUTPUT)

        lico(self.dna.all.process(repository))
        self.assertEquals(['add', 'delete'], [m.name for m in self.observer.calledMethods])
        self.assertEquals('', repository.resumptionToken)
        self.assertFalse(repository.active)
 def testInvalidUrl(self):
     env = Environment(root=self.harvesterDataDir)
     repository = env.addRepository(name="repo-1", 
         baseUrl="http://some.weird.url.that.does.not.work",
         metadataPrefix="rdf", 
         setSpec="aset", 
         active=True, 
         apiKey=self.apiKeyForTestUser)
     process(self.config) 
     self.assertEquals("<urlopen error [Errno -2] Name or service not known>", open(repository.errorLogPath).readlines()[-1])
    def testOne(self):
        env = Environment(root=self.harvesterDataDir)
        open(join(self.httpDataDir, 'oai-repo1'), 'w').write(REPO1_RECORD)
        env.addRepository(name="repo-1", 
            baseUrl="http://localhost:%s/oai-repo1" % self.httpPortNumber, 
            metadataPrefix="rdf", 
            setSpec="aset", 
            active=True, 
            apiKey=self.apiKeyForTestUser)
        open(join(self.httpDataDir, 'oai-repo2'), 'w').write(REPO2_RECORD)
        env.addRepository(name="repo-2", 
            baseUrl="http://localhost:%s/oai-repo2" % self.httpPortNumber, 
            metadataPrefix="rdf", 
            active=False, 
            apiKey=self.apiKeyForAnotherTestUser)

        self.assertQuery(0, "repo1")
        self.assertQuery(0, "repo2")
        process(self.config) 
        self.assertQuery(1, "repo1")
        self.assertQuery(0, "repo2")
    def testAddDelete(self):
        env = Environment(root=self.harvesterDataDir)
        open(join(self.httpDataDir, 'oai-testAddDelete'), 'w').write(TESTADDDELETE_ADD)

        repo = env.addRepository(name="repo-addDelete", 
            baseUrl="http://localhost:%s/oai-testAddDelete" % self.httpPortNumber, 
            metadataPrefix="rdf", 
            setSpec="aset", 
            active=True, 
            apiKey=self.apiKeyForTestUser)
        self.assertTrue(repo.active)

        self.assertQuery(0, "testAddDelete")
        process(self.config) 

        repo = env.getRepository(name=repo.name)  # reload for state change
        self.assertFalse(repo.active)
        repo.active = True
        repo.save()
        self.assertQuery(1, "testAddDelete")

        open(join(self.httpDataDir, 'oai-testAddDelete'), 'w').write(TESTADDDELETE_DELETE)
        process(self.config) 
        self.assertQuery(0, "testAddDelete")
class EnvironmentTest(SeecrTestCase):
    
    def setUp(self):
        SeecrTestCase.setUp(self)
        self.env = Environment(root=join(self.tempdir, 'db'))

    def testCreateDir(self):
        self.assertTrue(isdir(self.env._root))

    def testWriteFile(self):
        self.assertFalse(isfile(join(self.env._root, "example_repo", 'config.json')))
        self.env.addRepository(name="example_repo", baseUrl="http://example.org/oai", metadataPrefix="oai_dc", setSpec="aset", active=True, apiKey="an api key")
        self.assertTrue(isfile(join(self.env._root, "example_repo", 'config.json')))

    def testGetReadFile(self):
        repo = self.env.addRepository(name="example_repo", baseUrl="http://example.org/oai", metadataPrefix="oai_dc", setSpec="aset", active=True, apiKey="an api key")
        repo2 = self.env.getRepository(name='example_repo')

        self.assertEquals(repo, repo2)
        self.assertEquals(repo.active, repo2.active)

    def testRepositories(self):
        self.assertEquals([], list(self.env.getRepositories()))
        repository = self.env.addRepository(name="test", baseUrl="test", metadataPrefix="test", setSpec="test", active=True, apiKey="inspiration")
        repositories = list(self.env.getRepositories())
        self.assertEquals([repository], repositories)

    def testRepositoriesOnlyWhenThereIsAConfig(self):
        self.assertEquals([], list(self.env.getRepositories()))
        open(join(self.tempdir, "db", "junk"), 'w').write("")
        self.assertEquals([], list(self.env.getRepositories()))

    def testDefaultValues(self):
        repository = self.env.addRepository(name="test")
        self.assertEquals('', repository.baseUrl)
        self.assertEquals('', repository.metadataPrefix)
        self.assertEquals('', repository.setSpec)
        self.assertEquals('', repository.apiKey)
        self.assertEquals(False, repository.active)

    def testDeleteRepository(self):
        repository = self.env.addRepository(name="test")
        repositories = list(self.env.getRepositories())
        self.assertEquals([repository], repositories)
        self.env.deleteRepository(name="test")
        repositories = list(self.env.getRepositories())
        self.assertEquals([], repositories)

    def testHarvestStatePersistent(self):
        repository = self.env.addRepository(name='test')
        repository.resumptionToken = 'xyz'
        repository.lastHarvest = 12345
        repository.save()
        repositoryRevisited = self.env.getRepository(name='test')
        self.assertEquals('xyz', repositoryRevisited.resumptionToken)
        self.assertEquals(12345, repositoryRevisited.lastHarvest)

    def testErrorLog(self):
        repository = self.env.addRepository(name='test')
        self.assertEquals("", repository.readErrorLog())

        repository.logException(Exception("boo"))
        self.assertEquals("boo", repository.readErrorLog())