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)
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())