import unittest2 as unittest
from plone.testing import zca
from plone.resource.testing import DEMO_TRAVERSER_INTEGRATION_TESTING

import os.path
from zope.component import provideUtility
from Products.BTreeFolder2.BTreeFolder2 import BTreeFolder2
from plone.resource.interfaces import IResourceDirectory
from plone.resource.directory import PersistentResourceDirectory
from plone.resource.directory import FilesystemResourceDirectory

base_path = os.path.dirname(__file__)
test_dir_path = os.path.join(base_path, 'resources')


class TraversalTestCase(unittest.TestCase):
    layer = DEMO_TRAVERSER_INTEGRATION_TESTING

    def setUp(self):
        self.app = self.layer.get('app')
        zca.pushGlobalRegistry()

        # set up all three types of directory
        package_dir_path = os.path.join(test_dir_path, 'demo', 'foo')
        self.package_dir = dir = FilesystemResourceDirectory(package_dir_path)
        provideUtility(dir, provides=IResourceDirectory, name=u'++demo++foo')

        self.global_dir = dir = FilesystemResourceDirectory(test_dir_path)
        provideUtility(dir, provides=IResourceDirectory, name=u'')

        root = BTreeFolder2('portal_resources')
        self.app._setOb('portal_resources', root)
        root._setOb('demo', BTreeFolder2('demo'))
        root.demo._setOb('foo', BTreeFolder2('foo'))
        self.zodb_dir = dir = PersistentResourceDirectory(root)
        provideUtility(dir, provides=IResourceDirectory, name=u'persistent')

        # We don't want a false positive for the following.
        provideUtility(dir, provides=IResourceDirectory, name=u'++bogus++foo')

    def tearDown(self):
        zca.popGlobalRegistry()

    def test_iterDirectoriesOfType(self):
        from plone.resource.utils import iterDirectoriesOfType
        dirs = list(iterDirectoriesOfType('demo'))
        self.assertEqual(2, len(dirs))
        self.assertTrue(dirs[0].context.aq_base is
                        self.zodb_dir['demo']['foo'].context.aq_base)
        self.assertTrue(dirs[1].directory ==
                        self.global_dir['demo']['manifest-test'].directory)

    def test_iterDirectoriesOfType_dont_filter_duplicates(self):
        from plone.resource.utils import iterDirectoriesOfType
        dirs = list(iterDirectoriesOfType('demo', filter_duplicates=False))
        self.assertEqual(4, len(dirs))
        self.assertTrue(dirs[0].context.aq_base is
                        self.zodb_dir['demo']['foo'].context.aq_base)
        unordered_entries = [
            self.global_dir['demo']['foo'].directory,
            self.global_dir['demo']['manifest-test'].directory
        ]
        self.assertIn(dirs[1].directory, unordered_entries)
        self.assertIn(dirs[2].directory, unordered_entries)
        self.assertNotEqual(dirs[1].directory, dirs[2].directory)
        self.assertTrue(dirs[3].directory == self.package_dir.directory)

    def test_cloneDirectory(self):
        from plone.resource.directory import PersistentResourceDirectory
        from plone.resource.utils import cloneResourceDirectory

        root = BTreeFolder2('portal_resources')
        root._setOb('demo', BTreeFolder2('demo'))
        root['demo']._setOb('foo', BTreeFolder2('foo'))
        root['demo']._setOb('bar', BTreeFolder2('bar'))

        source = PersistentResourceDirectory(root['demo']['foo'])
        target = PersistentResourceDirectory(root['demo']['bar'])

        source.writeFile('file1.txt', 'file1')
        source.writeFile('subdir1/file2.txt', 'file2')
        source.makeDirectory('subdir2')

        cloneResourceDirectory(source, target)

        self.assertEqual(source.listDirectory(), target.listDirectory())
        self.assertEqual(source['subdir1'].listDirectory(), target['subdir1'].listDirectory())
        self.assertEqual(source['subdir2'].listDirectory(), target['subdir2'].listDirectory())
        self.assertEqual(source.readFile('file1.txt'), target.readFile('file1.txt'))
        self.assertEqual(source.readFile('subdir1/file2.txt'), target.readFile('subdir1/file2.txt'))
