#!/usr/bin/env python
from __future__ import with_statement

import sys, os
sys.path = ([os.path.dirname(os.path.dirname(os.path.realpath(__file__)))]
            + sys.path)
    
__requires__='Bazki'
import pkg_resources
pkg_resources.require('Bazki')

import unittest, warnings

import pylons, webob

from bazbase import db, testing, structure, conversion, custom
from bazbase.conversion import invalidate_cache
from bazbase.dependencies import Dependencies
import bazki

class TestEdit(unittest.TestCase):

    def setUp(self):
        bazki.custom.set_up()
        testing.set_up_for_tests()
        invalidate_cache()
        
        db.begin_transaction()
        try:
            structure.clear_database()
            root = structure.create_root_element(u'Root')
            root.set_prop(u'comment', 'cheese')
            kid = root.create_child(u'Kid')
            structure.flush_database_for_test()

            pylons.request._push_object(webob.Request({}))
            pylons.response._push_object(webob.Response({}))

            pylons.request.environ['repoze.what.credentials'] = {'groups':
                                                                 u'Admin'}
        except:
            db.abort_transaction()
            raise

    def tearDown(self):
        db.abort_transaction()

    def test_basic(self):
        ret = bazki.Edit()._default('Root')
        self.assertEqual(u'Root', ret['element'].ename)

    def test_new(self):
        try:
            bazki.Edit().new('Fish', u'Root')
        except webob.exc.HTTPFound, e:
            self.assertEqual('./Fish', e.location)
        else:
            assert False, "No redirect"

        fish = structure.get_element(u'Fish')
        self.assertEqual(u'Root', fish.get_parent().ename)

    def test_precache(self):
        db.commit_transaction()
        bazki.Edit().precache_stuff(u'Root')
        db.begin_transaction()

class TestCustom(unittest.TestCase):

    def setUp(self):
        bazki.custom.set_up()
        testing.set_up_for_tests()
        invalidate_cache()

        self.getter = bazki.Getter()
        
        db.begin_transaction()
        try:
            structure.clear_database()
            structure.create_prop(u'image', u'blob')
            root = structure.create_root_element(u'Root')
            root.set_prop(u'comment', 'cheese')
            root.set_prop(u'name', 'Origin')
            structure.flush_database_for_test()
        except:
            db.abort_transaction()
            raise

    def tearDown(self):
        db.abort_transaction()

    def test_get_url(self):
        deps = Dependencies()
        root = structure.get_element(u'Root')
        self.assertEqual('/Origin', self.getter.get_url_for(root, deps))

class TestGetting(unittest.TestCase):

    def setUp(self):
        bazki.custom.set_up()
        testing.set_up_for_tests()
        invalidate_cache()

        self.getter = bazki.Getter()
        
        db.begin_transaction()
        try:
            structure.clear_database()
            structure.create_prop(u'image', u'blob')
            root = structure.create_root_element(u'Root')
            root.set_prop(u'comment', 'cheese')
            root.set_prop(u'name', 'Origin')
            root.set_prop(u'image', '')
            structure.flush_database_for_test()
        except:
            db.abort_transaction()
            raise

    def tearDown(self):
        db.abort_transaction()

    def test_product_link(self):
        deps = Dependencies()
        self.assertEqual('/_/Root/comment',
                         custom.product_link(u'Root', u'comment', deps,
                                             conversion.render)[1]['url'])

        self.assertEqual('/_/Root/image',
                         custom.product_link(u'Root', u'image', deps,
                                             conversion.render)[1]['url'])

if __name__ == "__main__":
    warnings.simplefilter("error")
    warnings.filterwarnings('ignore', "cgi.parse_qsl is deprecated")
    warnings.filterwarnings('ignore', "Raise HTTP exceptions directly")
    unittest.main()
