##############################################################################
#
# Copyright (c) 2004 Zope Corporation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
"""Static Tree Tests

$Id: tests.py 68950 2006-07-02 13:00:23Z philikon $
"""

import unittest
import zope.component
from zope.component import getMultiAdapter
from zope.publisher.browser import TestRequest
from zope.interface import alsoProvides
from zope.traversing.interfaces import IContainmentRoot
from zope.location.traversing import LocationPhysicallyLocatable
from zope.app.testing import ztapi
from zope.app.component.interfaces import ISite

from zope.app.tree.utils import TreeStateEncoder
from zope.app.tree.browser import StatefulTreeView
from zope.app.tree.browser.cookie import CookieTreeView
from zope.app.tree.tests.basetest import BaseTestCase

class StatefulTreeViewTest(BaseTestCase):

    def setUp(self):
        super(StatefulTreeViewTest, self).setUp()
        self.makeItems()
        # provide the view for all objects (None)
        ztapi.browserView(None, 'stateful_tree', StatefulTreeView)

    def makeRequest(self):
        request = self.request = TestRequest()

    # TODO: test stateful tree view

class CookieTreeViewTest(StatefulTreeViewTest):

    def setUp(self):
        super(CookieTreeViewTest, self).setUp()
        ztapi.browserView(None, 'cookie_tree', CookieTreeView)
        zope.component.provideAdapter(LocationPhysicallyLocatable)

    def makeRequestWithVar(self):
        varname = CookieTreeView.request_variable 
        encoder = TreeStateEncoder()
        tree_state = encoder.encodeTreeState(self.expanded_nodes)
        environ = {varname: tree_state}
        request = TestRequest(environ=environ)
        return request

    def test_cookie_tree_pre_expanded(self):
        request = self.makeRequestWithVar()
        view = getMultiAdapter((self.root_obj, request),
                                    name='cookie_tree')
        cookie_tree = view.cookieTree()
        self.assert_(self.root_node.expanded)
        for node in self.root_node.getFlatNodes():
            self.assertEqual(node.expanded, node.getId() in self.expanded_nodes)

    def test_cookie_tree_sets_cookie(self):
        request = self.makeRequestWithVar()
        view = getMultiAdapter((self.root_obj, request),
                               name='cookie_tree')
        cookie_tree = view.cookieTree()
        self.failIf(request.response.getCookie(view.request_variable) is None)

    def test_cookie_tree_site_tree(self):
        request = self.makeRequestWithVar()
        alsoProvides(self.items['a'], IContainmentRoot)
        alsoProvides(self.items['c'], ISite)
        view = getMultiAdapter((self.items['f'], request),
                               name='cookie_tree')
        cookie_tree = view.siteTree()
        self.assert_(cookie_tree.context is self.items['c'])

    def test_cookie_tree_root_tree(self):
        request = self.makeRequestWithVar()
        alsoProvides(self.items['c'], IContainmentRoot)
        view = getMultiAdapter((self.items['f'], request),
                               name='cookie_tree')
        cookie_tree = view.rootTree()
        self.assert_(cookie_tree.context is self.items['c'])
        

def test_suite():
    suite = unittest.makeSuite(StatefulTreeViewTest)
    suite.addTest(unittest.makeSuite(CookieTreeViewTest))
    return suite

if __name__ == '__main__':
    unittest.main(defaultTest='test_suite')
