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")
 def setUp(self):
     SeecrTestCase.setUp(self)
     self.dashboard = Dashboard()
     self.env = Environment(root=self.tempdir)
     self.dashboard.addObserver(self.env)
class DashboardTest(SeecrTestCase):
    def setUp(self):
        SeecrTestCase.setUp(self)
        self.dashboard = Dashboard()
        self.env = Environment(root=self.tempdir)
        self.dashboard.addObserver(self.env)

    def testRedirectOnGet(self):
        result = joco(self.dashboard.handleRequest(path='/whatever', Client=('127.0.0.1', 3451), Method='GET', session={}))
        header, body = result.split(CRLF*2)
        self.assertTrue('302' in header)
        self.assertTrue('Location: /' in header, header)

    def testCreateNotLoggedIn(self):
        result = joco(self.dashboard.handleRequest(path="/create", Client=('127.0.0.1', 1234), Method='POST', session={}))
        header, body = result.split(CRLF*2)
        self.assertTrue('302' in header)
        self.assertTrue('Location: /' in header, header)

    def testCreateLoggedIn(self):
        session = {
            'user': User('admin'),
        }
        Body = urlencode(dict(repository='repoId1', formUrl='/harvester_dashboard?repository=%(repository)s'))
        result = joco(self.dashboard.handleRequest(path="/create", Client=('127.0.0.1', 1234), Method='POST', session=session, Body=Body))
        header, body = result.split(CRLF*2)
        self.assertTrue('302' in header)
        self.assertTrue('Location: /harvester_dashboard?repository=repoId1' in header, header)

        self.assertEquals("repoId1", list(self.env.getRepositories())[0].name)

    def testEditRepository(self):
        session = dict(user=User('admin'))
        
        joco(self.dashboard.handleRequest(
            path="/create", 
            Client=('127.0.0.1', 1234), 
            Method='POST', 
            session=session, 
            Body=urlencode(dict(repository='repoId1', formUrl='/harvester_dashboard'))))

        self.assertEquals("", list(self.env.getRepositories())[0].baseUrl)
        self.assertEquals("", list(self.env.getRepositories())[0].metadataPrefix)
        self.assertEquals("", list(self.env.getRepositories())[0].setSpec)
        self.assertEquals("", list(self.env.getRepositories())[0].apiKey)
        self.assertEquals(False, list(self.env.getRepositories())[0].active)
        joco(self.dashboard.handleRequest(
            path="/something/update", 
            Client=('127.0.0.1', 1234), 
            Method='POST', 
            session=session, 
            Body=urlencode(dict(
                repository='repoId1', 
                baseUrl='http://localhost/oai',
                metadataPrefix='aprefix',
                setSpec='aset',
                apiKey='an api key',
                active='on',
                formUrl='/harvester_dashboard'))))
        self.assertEquals("http://localhost/oai", list(self.env.getRepositories())[0].baseUrl)
        self.assertEquals("aprefix", list(self.env.getRepositories())[0].metadataPrefix)
        self.assertEquals("aset", list(self.env.getRepositories())[0].setSpec)
        self.assertEquals("an api key", list(self.env.getRepositories())[0].apiKey)
        self.assertEquals(True, list(self.env.getRepositories())[0].active)

        joco(self.dashboard.handleRequest(
            path="/something/update", 
            Client=('127.0.0.1', 1234), 
            Method='POST', 
            session=session, 
            Body=urlencode(dict(
                repository='repoId1', 
                baseUrl='http://localhost/oai',
                metadataPrefix='aprefix',
                setSpec='aset',
                apiKey='an api key',
                formUrl='/harvester_dashboard'))))
        self.assertEquals(False, list(self.env.getRepositories())[0].active)

    def testDeleteRepository(self):
        session = dict(user=User('admin'))
        
        joco(self.dashboard.handleRequest(
            path="/create", 
            Client=('127.0.0.1', 1234), 
            Method='POST', 
            session=session, 
            Body=urlencode(dict(repository='repoId1', formUrl='/harvester_dashboard'))))
        self.assertEquals(1, len(list(self.env.getRepositories())))
        result = joco(self.dashboard.handleRequest(
            path="/delete", 
            Client=('127.0.0.1', 1234), 
            Method='POST', 
            session=session, 
            Body=urlencode(dict(repository='repoId1', formUrl='/harvester_dashboard'))))
        self.assertEquals(0, len(list(self.env.getRepositories())))
        header, body = result.split(CRLF*2)

        self.assertTrue('302' in header)
        self.assertTrue('Location: /harvester_dashboard' in header, header)
 def setUp(self):
     SeecrTestCase.setUp(self)
     self.env = Environment(root=join(self.tempdir, 'db'))
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())