import unittest
from mapper import Mapper,MatchNotFound

class TestRecognition(unittest.TestCase):

    def test_simple(self):
        m = Mapper('django.views.generic',(
            ('^article/(?P<year>\d{4})/(?P<month>\d{1,2})/(?P<day>\d{1,2})/','article_detail'),
        ))
        self.assertEqual(m.match('article/2007/6/12/'),
                ('django.views.generic.article_detail',{'year':'2007','month':'6','day':'12'}))

    def test_sub_route(self):
        article_url = Mapper('django.views.generic',(
            ('^(?P<year>\d{4})/(?P<month>\d{1,2})/(?P<day>\d{1,2})/','object_by_date'),
            ('^(?P<id>\d+)/$','object_by_id'),
            ('^(?P<name>\w+)/$','object_by_name'),
        ))
        site_url = Mapper('',(
            ('^(?P<object_name>\w+)/',article_url),
        ))
        self.assertEqual(site_url.match('article/2007/6/12/'),
                ('django.views.generic.object_by_date',{'object_name':'article','year':'2007','month':'6','day':'12'}))
        self.assertEqual(site_url.match('article/12/'),
                ('django.views.generic.object_by_id',{'object_name':'article','id':'12'}))
        self.assertEqual(site_url.match('article/test/'),
                ('django.views.generic.object_by_name',{'object_name':'article','name':'test'}))

    def test_no_match(self):
        m = Mapper('',(
            ('^news/$','news_view'),
            ('^blog/$','blog_view'),
            ('^digg/$','digg_view'),
        ))
        try:
            m.match('test/')
        except MatchNotFound,e:
            self.assertEqual(set(e.args[0]['tried']),
                    set(['^news/$','^blog/$','^digg/$']))
        else:
            assert False

    def test_sub_route_no_match(self):
        article_mapper = Mapper('',(
            ('^(?P<id>\d+)/$','article_view'),
        ))
        m = Mapper('',(
            ('^news/$','news_view'),
            ('^blog/',article_mapper),
            ('^digg/$','digg_view'),
        ))

        try:
            m.match('test/')
        except MatchNotFound,e:
            self.assertEqual(set(e.args[0]['tried']),
                    set(['^news/$','^blog/','^digg/$']))

        try:
            m.match('blog/abc/')
        except MatchNotFound,e:
            self.assertEqual(set(e.args[0]['tried']),
                    set(['^news/$','^blog/ ^(?P<id>\d+)/$','^digg/$']))

    def test_kwarg_named_view(self):
        m = Mapper('path.to.app', (
            ('^(?P<view>\w+)/(?P<action>\w+)/(?P<id>\d+)/',''),
        ))
        self.assertEqual(m.match('article/delete/3/'),
                ('path.to.app.article',{'action':'delete','id':'3'}))

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