web/lib/tagging/tests/tests.py
author ymh <ymh.work@gmail.com>
Mon, 01 Feb 2010 14:54:05 +0100
changeset 21 28c536d35d6e
parent 11 f236caaceb43
permissions -rw-r--r--
Small corrections for blinkster
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
11
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
# -*- coding: utf-8 -*-
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
import os
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
from django import forms
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
from django.db.models import Q
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
from django.test import TestCase
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
from tagging.forms import TagField
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
from tagging import settings
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
from tagging.models import Tag, TaggedItem
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
from tagging.tests.models import Article, Link, Perch, Parrot, FormTest
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
from tagging.utils import calculate_cloud, edit_string_for_tags, get_tag_list, get_tag, parse_tag_input
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
from tagging.utils import LINEAR
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
#############
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
# Utilities #
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
#############
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
class TestParseTagInput(TestCase):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
    def test_with_simple_space_delimited_tags(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
        """ Test with simple space-delimited tags. """
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
        self.assertEquals(parse_tag_input('one'), [u'one'])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
        self.assertEquals(parse_tag_input('one two'), [u'one', u'two'])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
        self.assertEquals(parse_tag_input('one two three'), [u'one', u'three', u'two'])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
        self.assertEquals(parse_tag_input('one one two two'), [u'one', u'two'])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
    
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
    def test_with_comma_delimited_multiple_words(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
        """ Test with comma-delimited multiple words.
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
            An unquoted comma in the input will trigger this. """
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
            
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
        self.assertEquals(parse_tag_input(',one'), [u'one'])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
        self.assertEquals(parse_tag_input(',one two'), [u'one two'])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
        self.assertEquals(parse_tag_input(',one two three'), [u'one two three'])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
        self.assertEquals(parse_tag_input('a-one, a-two and a-three'),
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
            [u'a-one', u'a-two and a-three'])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
    
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
    def test_with_double_quoted_multiple_words(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
        """ Test with double-quoted multiple words.
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
            A completed quote will trigger this.  Unclosed quotes are ignored. """
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
            
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
        self.assertEquals(parse_tag_input('"one'), [u'one'])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
        self.assertEquals(parse_tag_input('"one two'), [u'one', u'two'])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
        self.assertEquals(parse_tag_input('"one two three'), [u'one', u'three', u'two'])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
        self.assertEquals(parse_tag_input('"one two"'), [u'one two'])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
        self.assertEquals(parse_tag_input('a-one "a-two and a-three"'),
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
            [u'a-one', u'a-two and a-three'])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
    
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
    def test_with_no_loose_commas(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
        """ Test with no loose commas -- split on spaces. """
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
        self.assertEquals(parse_tag_input('one two "thr,ee"'), [u'one', u'thr,ee', u'two'])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
    def test_with_loose_commas(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
        """ Loose commas - split on commas """
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
        self.assertEquals(parse_tag_input('"one", two three'), [u'one', u'two three'])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
    def test_tags_with_double_quotes_can_contain_commas(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
        """ Double quotes can contain commas """
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
        self.assertEquals(parse_tag_input('a-one "a-two, and a-three"'),
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
            [u'a-one', u'a-two, and a-three'])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
        self.assertEquals(parse_tag_input('"two", one, one, two, "one"'),
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
            [u'one', u'two'])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
    
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
    def test_with_naughty_input(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
        """ Test with naughty input. """
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
        # Bad users! Naughty users!
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
        self.assertEquals(parse_tag_input(None), [])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
        self.assertEquals(parse_tag_input(''), [])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
        self.assertEquals(parse_tag_input('"'), [])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
        self.assertEquals(parse_tag_input('""'), [])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
        self.assertEquals(parse_tag_input('"' * 7), [])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
        self.assertEquals(parse_tag_input(',,,,,,'), [])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
        self.assertEquals(parse_tag_input('",",",",",",","'), [u','])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
        self.assertEquals(parse_tag_input('a-one "a-two" and "a-three'),
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
            [u'a-one', u'a-three', u'a-two', u'and'])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
class TestNormalisedTagListInput(TestCase):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
    def setUp(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
        self.cheese = Tag.objects.create(name='cheese')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
        self.toast = Tag.objects.create(name='toast')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
    def test_single_tag_object_as_input(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
        self.assertEquals(get_tag_list(self.cheese), [self.cheese])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
    
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
    def test_space_delimeted_string_as_input(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
        ret = get_tag_list('cheese toast')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
        self.assertEquals(len(ret), 2)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
        self.failUnless(self.cheese in ret)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
        self.failUnless(self.toast in ret)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
    def test_comma_delimeted_string_as_input(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
        ret = get_tag_list('cheese,toast')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
        self.assertEquals(len(ret), 2)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
        self.failUnless(self.cheese in ret)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
        self.failUnless(self.toast in ret)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
    
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
    def test_with_empty_list(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
        self.assertEquals(get_tag_list([]), [])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
    
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
    def test_list_of_two_strings(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
        ret = get_tag_list(['cheese', 'toast'])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
        self.assertEquals(len(ret), 2)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
        self.failUnless(self.cheese in ret)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
        self.failUnless(self.toast in ret)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
    
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
    def test_list_of_tag_primary_keys(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
        ret = get_tag_list([self.cheese.id, self.toast.id])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
        self.assertEquals(len(ret), 2)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
        self.failUnless(self.cheese in ret)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
        self.failUnless(self.toast in ret)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
    
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
    def test_list_of_strings_with_strange_nontag_string(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
        ret = get_tag_list(['cheese', 'toast', 'ŠĐĆŽćžšđ'])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
        self.assertEquals(len(ret), 2)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
        self.failUnless(self.cheese in ret)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
        self.failUnless(self.toast in ret)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
    
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
    def test_list_of_tag_instances(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
        ret = get_tag_list([self.cheese, self.toast])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
        self.assertEquals(len(ret), 2)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
        self.failUnless(self.cheese in ret)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
        self.failUnless(self.toast in ret)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
    
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
    def test_tuple_of_instances(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
        ret = get_tag_list((self.cheese, self.toast))
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
        self.assertEquals(len(ret), 2)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
        self.failUnless(self.cheese in ret)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
        self.failUnless(self.toast in ret)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
    
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
    def test_with_tag_filter(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
        ret = get_tag_list(Tag.objects.filter(name__in=['cheese', 'toast']))
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
        self.assertEquals(len(ret), 2)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
        self.failUnless(self.cheese in ret)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
        self.failUnless(self.toast in ret)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
    def test_with_invalid_input_mix_of_string_and_instance(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
        try:
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
            get_tag_list(['cheese', self.toast])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
        except ValueError, ve:
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
            self.assertEquals(str(ve),
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
                'If a list or tuple of tags is provided, they must all be tag names, Tag objects or Tag ids.')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
        except Exception, e:
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
            raise self.failureException('the wrong type of exception was raised: type [%s] value [%]' %\
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
                (str(type(e)), str(e)))
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
        else:
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
            raise self.failureException('a ValueError exception was supposed to be raised!')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
    
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
    def test_with_invalid_input(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
        try:
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
            get_tag_list(29)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
        except ValueError, ve:
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
            self.assertEquals(str(ve), 'The tag input given was invalid.')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
        except Exception, e:
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
            raise self.failureException('the wrong type of exception was raised: type [%s] value [%s]' %\
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
                (str(type(e)), str(e)))
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
        else:
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
            raise self.failureException('a ValueError exception was supposed to be raised!')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
    def test_with_tag_instance(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
        self.assertEquals(get_tag(self.cheese), self.cheese)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
    
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
    def test_with_string(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   163
        self.assertEquals(get_tag('cheese'), self.cheese)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
    
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
    def test_with_primary_key(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
        self.assertEquals(get_tag(self.cheese.id), self.cheese)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
    
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
    def test_nonexistent_tag(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   169
        self.assertEquals(get_tag('mouse'), None)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   170
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   171
class TestCalculateCloud(TestCase):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   172
    def setUp(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   173
        self.tags = []
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   174
        for line in open(os.path.join(os.path.dirname(__file__), 'tags.txt')).readlines():
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   175
            name, count = line.rstrip().split()
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   176
            tag = Tag(name=name)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   177
            tag.count = int(count)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   178
            self.tags.append(tag)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   179
    
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   180
    def test_default_distribution(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   181
        sizes = {}
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   182
        for tag in calculate_cloud(self.tags, steps=5):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   183
            sizes[tag.font_size] = sizes.get(tag.font_size, 0) + 1
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   184
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   185
        # This isn't a pre-calculated test, just making sure it's consistent
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   186
        self.assertEquals(sizes[1], 48)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   187
        self.assertEquals(sizes[2], 30)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   188
        self.assertEquals(sizes[3], 19)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   189
        self.assertEquals(sizes[4], 15)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   190
        self.assertEquals(sizes[5], 10)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   191
    
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   192
    def test_linear_distribution(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   193
        sizes = {}
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   194
        for tag in calculate_cloud(self.tags, steps=5, distribution=LINEAR):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   195
            sizes[tag.font_size] = sizes.get(tag.font_size, 0) + 1
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   196
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   197
        # This isn't a pre-calculated test, just making sure it's consistent
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   198
        self.assertEquals(sizes[1], 97)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   199
        self.assertEquals(sizes[2], 12)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   200
        self.assertEquals(sizes[3], 7)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   201
        self.assertEquals(sizes[4], 2)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   202
        self.assertEquals(sizes[5], 4)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   203
    
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   204
    def test_invalid_distribution(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   205
        try:
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   206
            calculate_cloud(self.tags, steps=5, distribution='cheese')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   207
        except ValueError, ve:
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   208
            self.assertEquals(str(ve), 'Invalid distribution algorithm specified: cheese.')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   209
        except Exception, e:
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   210
            raise self.failureException('the wrong type of exception was raised: type [%s] value [%s]' %\
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   211
                (str(type(e)), str(e)))
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   212
        else:
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   213
            raise self.failureException('a ValueError exception was supposed to be raised!')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   214
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   215
###########
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   216
# Tagging #
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   217
###########
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   218
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   219
class TestBasicTagging(TestCase):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   220
    def setUp(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   221
        self.dead_parrot = Parrot.objects.create(state='dead')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   222
    
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   223
    def test_update_tags(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   224
        Tag.objects.update_tags(self.dead_parrot, 'foo,bar,"ter"')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   225
        tags = Tag.objects.get_for_object(self.dead_parrot)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   226
        self.assertEquals(len(tags), 3)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   227
        self.failUnless(get_tag('foo') in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   228
        self.failUnless(get_tag('bar') in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   229
        self.failUnless(get_tag('ter') in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   230
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   231
        Tag.objects.update_tags(self.dead_parrot, '"foo" bar "baz"')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   232
        tags = Tag.objects.get_for_object(self.dead_parrot)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   233
        self.assertEquals(len(tags), 3)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   234
        self.failUnless(get_tag('bar') in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   235
        self.failUnless(get_tag('baz') in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   236
        self.failUnless(get_tag('foo') in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   237
    
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   238
    def test_add_tag(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   239
        # start off in a known, mildly interesting state
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   240
        Tag.objects.update_tags(self.dead_parrot, 'foo bar baz')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   241
        tags = Tag.objects.get_for_object(self.dead_parrot)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   242
        self.assertEquals(len(tags), 3)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   243
        self.failUnless(get_tag('bar') in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   244
        self.failUnless(get_tag('baz') in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   245
        self.failUnless(get_tag('foo') in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   246
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   247
        # try to add a tag that already exists
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   248
        Tag.objects.add_tag(self.dead_parrot, 'foo')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   249
        tags = Tag.objects.get_for_object(self.dead_parrot)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   250
        self.assertEquals(len(tags), 3)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   251
        self.failUnless(get_tag('bar') in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   252
        self.failUnless(get_tag('baz') in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   253
        self.failUnless(get_tag('foo') in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   254
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   255
        # now add a tag that doesn't already exist
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   256
        Tag.objects.add_tag(self.dead_parrot, 'zip')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   257
        tags = Tag.objects.get_for_object(self.dead_parrot)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   258
        self.assertEquals(len(tags), 4)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   259
        self.failUnless(get_tag('zip') in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   260
        self.failUnless(get_tag('bar') in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   261
        self.failUnless(get_tag('baz') in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   262
        self.failUnless(get_tag('foo') in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   263
    
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   264
    def test_add_tag_invalid_input_no_tags_specified(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   265
        # start off in a known, mildly interesting state
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   266
        Tag.objects.update_tags(self.dead_parrot, 'foo bar baz')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   267
        tags = Tag.objects.get_for_object(self.dead_parrot)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   268
        self.assertEquals(len(tags), 3)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   269
        self.failUnless(get_tag('bar') in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   270
        self.failUnless(get_tag('baz') in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   271
        self.failUnless(get_tag('foo') in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   272
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   273
        try:
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   274
            Tag.objects.add_tag(self.dead_parrot, '    ')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   275
        except AttributeError, ae:
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   276
            self.assertEquals(str(ae), 'No tags were given: "    ".')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   277
        except Exception, e:
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   278
            raise self.failureException('the wrong type of exception was raised: type [%s] value [%s]' %\
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   279
                (str(type(e)), str(e)))
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   280
        else:
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   281
            raise self.failureException('an AttributeError exception was supposed to be raised!')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   282
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   283
    def test_add_tag_invalid_input_multiple_tags_specified(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   284
        # start off in a known, mildly interesting state
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   285
        Tag.objects.update_tags(self.dead_parrot, 'foo bar baz')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   286
        tags = Tag.objects.get_for_object(self.dead_parrot)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   287
        self.assertEquals(len(tags), 3)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   288
        self.failUnless(get_tag('bar') in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   289
        self.failUnless(get_tag('baz') in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   290
        self.failUnless(get_tag('foo') in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   291
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   292
        try:
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   293
            Tag.objects.add_tag(self.dead_parrot, 'one two')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   294
        except AttributeError, ae:
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   295
            self.assertEquals(str(ae), 'Multiple tags were given: "one two".')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   296
        except Exception, e:
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   297
            raise self.failureException('the wrong type of exception was raised: type [%s] value [%s]' %\
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   298
                (str(type(e)), str(e)))
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   299
        else:
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   300
            raise self.failureException('an AttributeError exception was supposed to be raised!')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   301
    
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   302
    def test_update_tags_exotic_characters(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   303
        # start off in a known, mildly interesting state
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   304
        Tag.objects.update_tags(self.dead_parrot, 'foo bar baz')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   305
        tags = Tag.objects.get_for_object(self.dead_parrot)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   306
        self.assertEquals(len(tags), 3)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   307
        self.failUnless(get_tag('bar') in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   308
        self.failUnless(get_tag('baz') in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   309
        self.failUnless(get_tag('foo') in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   310
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   311
        Tag.objects.update_tags(self.dead_parrot, u'ŠĐĆŽćžšđ')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   312
        tags = Tag.objects.get_for_object(self.dead_parrot)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   313
        self.assertEquals(len(tags), 1)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   314
        self.assertEquals(tags[0].name, u'ŠĐĆŽćžšđ')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   315
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   316
        Tag.objects.update_tags(self.dead_parrot, u'你好')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   317
        tags = Tag.objects.get_for_object(self.dead_parrot)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   318
        self.assertEquals(len(tags), 1)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   319
        self.assertEquals(tags[0].name, u'你好')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   320
    
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   321
    def test_update_tags_with_none(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   322
        # start off in a known, mildly interesting state
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   323
        Tag.objects.update_tags(self.dead_parrot, 'foo bar baz')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   324
        tags = Tag.objects.get_for_object(self.dead_parrot)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   325
        self.assertEquals(len(tags), 3)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   326
        self.failUnless(get_tag('bar') in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   327
        self.failUnless(get_tag('baz') in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   328
        self.failUnless(get_tag('foo') in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   329
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   330
        Tag.objects.update_tags(self.dead_parrot, None)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   331
        tags = Tag.objects.get_for_object(self.dead_parrot)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   332
        self.assertEquals(len(tags), 0)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   333
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   334
class TestModelTagField(TestCase):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   335
    """ Test the 'tags' field on models. """
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   336
    
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   337
    def test_create_with_tags_specified(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   338
        f1 = FormTest.objects.create(tags=u'test3 test2 test1')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   339
        tags = Tag.objects.get_for_object(f1)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   340
        test1_tag = get_tag('test1')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   341
        test2_tag = get_tag('test2')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   342
        test3_tag = get_tag('test3')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   343
        self.failUnless(None not in (test1_tag, test2_tag, test3_tag))
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   344
        self.assertEquals(len(tags), 3)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   345
        self.failUnless(test1_tag in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   346
        self.failUnless(test2_tag in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   347
        self.failUnless(test3_tag in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   348
    
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   349
    def test_update_via_tags_field(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   350
        f1 = FormTest.objects.create(tags=u'test3 test2 test1')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   351
        tags = Tag.objects.get_for_object(f1)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   352
        test1_tag = get_tag('test1')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   353
        test2_tag = get_tag('test2')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   354
        test3_tag = get_tag('test3')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   355
        self.failUnless(None not in (test1_tag, test2_tag, test3_tag))
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   356
        self.assertEquals(len(tags), 3)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   357
        self.failUnless(test1_tag in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   358
        self.failUnless(test2_tag in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   359
        self.failUnless(test3_tag in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   360
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   361
        f1.tags = u'test4'
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   362
        f1.save()
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   363
        tags = Tag.objects.get_for_object(f1)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   364
        test4_tag = get_tag('test4')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   365
        self.assertEquals(len(tags), 1)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   366
        self.assertEquals(tags[0], test4_tag)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   367
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   368
        f1.tags = ''
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   369
        f1.save()
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   370
        tags = Tag.objects.get_for_object(f1)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   371
        self.assertEquals(len(tags), 0)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   372
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   373
class TestSettings(TestCase):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   374
    def setUp(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   375
        self.original_force_lower_case_tags = settings.FORCE_LOWERCASE_TAGS
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   376
        self.dead_parrot = Parrot.objects.create(state='dead')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   377
    
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   378
    def tearDown(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   379
        settings.FORCE_LOWERCASE_TAGS = self.original_force_lower_case_tags
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   380
    
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   381
    def test_force_lowercase_tags(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   382
        """ Test forcing tags to lowercase. """
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   383
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   384
        settings.FORCE_LOWERCASE_TAGS = True
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   385
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   386
        Tag.objects.update_tags(self.dead_parrot, 'foO bAr Ter')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   387
        tags = Tag.objects.get_for_object(self.dead_parrot)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   388
        self.assertEquals(len(tags), 3)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   389
        foo_tag = get_tag('foo')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   390
        bar_tag = get_tag('bar')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   391
        ter_tag = get_tag('ter')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   392
        self.failUnless(foo_tag in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   393
        self.failUnless(bar_tag in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   394
        self.failUnless(ter_tag in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   395
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   396
        Tag.objects.update_tags(self.dead_parrot, 'foO bAr baZ')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   397
        tags = Tag.objects.get_for_object(self.dead_parrot)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   398
        baz_tag = get_tag('baz')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   399
        self.assertEquals(len(tags), 3)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   400
        self.failUnless(bar_tag in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   401
        self.failUnless(baz_tag in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   402
        self.failUnless(foo_tag in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   403
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   404
        Tag.objects.add_tag(self.dead_parrot, 'FOO')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   405
        tags = Tag.objects.get_for_object(self.dead_parrot)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   406
        self.assertEquals(len(tags), 3)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   407
        self.failUnless(bar_tag in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   408
        self.failUnless(baz_tag in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   409
        self.failUnless(foo_tag in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   410
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   411
        Tag.objects.add_tag(self.dead_parrot, 'Zip')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   412
        tags = Tag.objects.get_for_object(self.dead_parrot)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   413
        self.assertEquals(len(tags), 4)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   414
        zip_tag = get_tag('zip')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   415
        self.failUnless(bar_tag in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   416
        self.failUnless(baz_tag in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   417
        self.failUnless(foo_tag in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   418
        self.failUnless(zip_tag in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   419
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   420
        f1 = FormTest.objects.create()
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   421
        f1.tags = u'TEST5'
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   422
        f1.save()
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   423
        tags = Tag.objects.get_for_object(f1)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   424
        test5_tag = get_tag('test5')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   425
        self.assertEquals(len(tags), 1)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   426
        self.failUnless(test5_tag in tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   427
        self.assertEquals(f1.tags, u'test5')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   428
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   429
class TestTagUsageForModelBaseCase(TestCase):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   430
    def test_tag_usage_for_model_empty(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   431
        self.assertEquals(Tag.objects.usage_for_model(Parrot), [])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   432
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   433
class TestTagUsageForModel(TestCase):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   434
    def setUp(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   435
        parrot_details = (
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   436
            ('pining for the fjords', 9, True,  'foo bar'),
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   437
            ('passed on',             6, False, 'bar baz ter'),
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   438
            ('no more',               4, True,  'foo ter'),
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   439
            ('late',                  2, False, 'bar ter'),
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   440
        )
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   441
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   442
        for state, perch_size, perch_smelly, tags in parrot_details:
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   443
            perch = Perch.objects.create(size=perch_size, smelly=perch_smelly)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   444
            parrot = Parrot.objects.create(state=state, perch=perch)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   445
            Tag.objects.update_tags(parrot, tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   446
    
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   447
    def test_tag_usage_for_model(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   448
        tag_usage = Tag.objects.usage_for_model(Parrot, counts=True)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   449
        relevant_attribute_list = [(tag.name, tag.count) for tag in tag_usage]
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   450
        self.assertEquals(len(relevant_attribute_list), 4)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   451
        self.failUnless((u'bar', 3) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   452
        self.failUnless((u'baz', 1) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   453
        self.failUnless((u'foo', 2) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   454
        self.failUnless((u'ter', 3) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   455
    
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   456
    def test_tag_usage_for_model_with_min_count(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   457
        tag_usage = Tag.objects.usage_for_model(Parrot, min_count = 2)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   458
        relevant_attribute_list = [(tag.name, tag.count) for tag in tag_usage]
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   459
        self.assertEquals(len(relevant_attribute_list), 3)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   460
        self.failUnless((u'bar', 3) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   461
        self.failUnless((u'foo', 2) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   462
        self.failUnless((u'ter', 3) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   463
    
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   464
    def test_tag_usage_with_filter_on_model_objects(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   465
        tag_usage = Tag.objects.usage_for_model(Parrot, counts=True, filters=dict(state='no more'))
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   466
        relevant_attribute_list = [(tag.name, tag.count) for tag in tag_usage]
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   467
        self.assertEquals(len(relevant_attribute_list), 2)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   468
        self.failUnless((u'foo', 1) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   469
        self.failUnless((u'ter', 1) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   470
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   471
        tag_usage = Tag.objects.usage_for_model(Parrot, counts=True, filters=dict(state__startswith='p'))
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   472
        relevant_attribute_list = [(tag.name, tag.count) for tag in tag_usage]
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   473
        self.assertEquals(len(relevant_attribute_list), 4)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   474
        self.failUnless((u'bar', 2) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   475
        self.failUnless((u'baz', 1) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   476
        self.failUnless((u'foo', 1) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   477
        self.failUnless((u'ter', 1) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   478
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   479
        tag_usage = Tag.objects.usage_for_model(Parrot, counts=True, filters=dict(perch__size__gt=4))
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   480
        relevant_attribute_list = [(tag.name, tag.count) for tag in tag_usage]
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   481
        self.assertEquals(len(relevant_attribute_list), 4)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   482
        self.failUnless((u'bar', 2) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   483
        self.failUnless((u'baz', 1) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   484
        self.failUnless((u'foo', 1) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   485
        self.failUnless((u'ter', 1) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   486
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   487
        tag_usage = Tag.objects.usage_for_model(Parrot, counts=True, filters=dict(perch__smelly=True))
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   488
        relevant_attribute_list = [(tag.name, tag.count) for tag in tag_usage]
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   489
        self.assertEquals(len(relevant_attribute_list), 3)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   490
        self.failUnless((u'bar', 1) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   491
        self.failUnless((u'foo', 2) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   492
        self.failUnless((u'ter', 1) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   493
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   494
        tag_usage = Tag.objects.usage_for_model(Parrot, min_count=2, filters=dict(perch__smelly=True))
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   495
        relevant_attribute_list = [(tag.name, tag.count) for tag in tag_usage]
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   496
        self.assertEquals(len(relevant_attribute_list), 1)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   497
        self.failUnless((u'foo', 2) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   498
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   499
        tag_usage = Tag.objects.usage_for_model(Parrot, filters=dict(perch__size__gt=4))
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   500
        relevant_attribute_list = [(tag.name, hasattr(tag, 'counts')) for tag in tag_usage]
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   501
        self.assertEquals(len(relevant_attribute_list), 4)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   502
        self.failUnless((u'bar', False) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   503
        self.failUnless((u'baz', False) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   504
        self.failUnless((u'foo', False) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   505
        self.failUnless((u'ter', False) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   506
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   507
        tag_usage = Tag.objects.usage_for_model(Parrot, filters=dict(perch__size__gt=99))
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   508
        relevant_attribute_list = [(tag.name, hasattr(tag, 'counts')) for tag in tag_usage]
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   509
        self.assertEquals(len(relevant_attribute_list), 0)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   510
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   511
class TestTagsRelatedForModel(TestCase):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   512
    def setUp(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   513
        parrot_details = (
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   514
            ('pining for the fjords', 9, True,  'foo bar'),
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   515
            ('passed on',             6, False, 'bar baz ter'),
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   516
            ('no more',               4, True,  'foo ter'),
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   517
            ('late',                  2, False, 'bar ter'),
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   518
        )
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   519
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   520
        for state, perch_size, perch_smelly, tags in parrot_details:
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   521
            perch = Perch.objects.create(size=perch_size, smelly=perch_smelly)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   522
            parrot = Parrot.objects.create(state=state, perch=perch)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   523
            Tag.objects.update_tags(parrot, tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   524
            
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   525
    def test_related_for_model_with_tag_query_sets_as_input(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   526
        related_tags = Tag.objects.related_for_model(Tag.objects.filter(name__in=['bar']), Parrot, counts=True)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   527
        relevant_attribute_list = [(tag.name, tag.count) for tag in related_tags]
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   528
        self.assertEquals(len(relevant_attribute_list), 3)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   529
        self.failUnless((u'baz', 1) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   530
        self.failUnless((u'foo', 1) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   531
        self.failUnless((u'ter', 2) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   532
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   533
        related_tags = Tag.objects.related_for_model(Tag.objects.filter(name__in=['bar']), Parrot, min_count=2)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   534
        relevant_attribute_list = [(tag.name, tag.count) for tag in related_tags]
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   535
        self.assertEquals(len(relevant_attribute_list), 1)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   536
        self.failUnless((u'ter', 2) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   537
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   538
        related_tags = Tag.objects.related_for_model(Tag.objects.filter(name__in=['bar']), Parrot, counts=False)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   539
        relevant_attribute_list = [tag.name for tag in related_tags]
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   540
        self.assertEquals(len(relevant_attribute_list), 3)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   541
        self.failUnless(u'baz' in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   542
        self.failUnless(u'foo' in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   543
        self.failUnless(u'ter' in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   544
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   545
        related_tags = Tag.objects.related_for_model(Tag.objects.filter(name__in=['bar', 'ter']), Parrot, counts=True)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   546
        relevant_attribute_list = [(tag.name, tag.count) for tag in related_tags]
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   547
        self.assertEquals(len(relevant_attribute_list), 1)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   548
        self.failUnless((u'baz', 1) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   549
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   550
        related_tags = Tag.objects.related_for_model(Tag.objects.filter(name__in=['bar', 'ter', 'baz']), Parrot, counts=True)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   551
        relevant_attribute_list = [(tag.name, tag.count) for tag in related_tags]
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   552
        self.assertEquals(len(relevant_attribute_list), 0)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   553
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   554
    def test_related_for_model_with_tag_strings_as_input(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   555
        # Once again, with feeling (strings)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   556
        related_tags = Tag.objects.related_for_model('bar', Parrot, counts=True)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   557
        relevant_attribute_list = [(tag.name, tag.count) for tag in related_tags]
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   558
        self.assertEquals(len(relevant_attribute_list), 3)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   559
        self.failUnless((u'baz', 1) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   560
        self.failUnless((u'foo', 1) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   561
        self.failUnless((u'ter', 2) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   562
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   563
        related_tags = Tag.objects.related_for_model('bar', Parrot, min_count=2)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   564
        relevant_attribute_list = [(tag.name, tag.count) for tag in related_tags]
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   565
        self.assertEquals(len(relevant_attribute_list), 1)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   566
        self.failUnless((u'ter', 2) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   567
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   568
        related_tags = Tag.objects.related_for_model('bar', Parrot, counts=False)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   569
        relevant_attribute_list = [tag.name for tag in related_tags]
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   570
        self.assertEquals(len(relevant_attribute_list), 3)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   571
        self.failUnless(u'baz' in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   572
        self.failUnless(u'foo' in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   573
        self.failUnless(u'ter' in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   574
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   575
        related_tags = Tag.objects.related_for_model(['bar', 'ter'], Parrot, counts=True)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   576
        relevant_attribute_list = [(tag.name, tag.count) for tag in related_tags]
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   577
        self.assertEquals(len(relevant_attribute_list), 1)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   578
        self.failUnless((u'baz', 1) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   579
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   580
        related_tags = Tag.objects.related_for_model(['bar', 'ter', 'baz'], Parrot, counts=True)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   581
        relevant_attribute_list = [(tag.name, tag.count) for tag in related_tags]
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   582
        self.assertEquals(len(relevant_attribute_list), 0)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   583
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   584
class TestGetTaggedObjectsByModel(TestCase):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   585
    def setUp(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   586
        parrot_details = (
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   587
            ('pining for the fjords', 9, True,  'foo bar'),
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   588
            ('passed on',             6, False, 'bar baz ter'),
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   589
            ('no more',               4, True,  'foo ter'),
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   590
            ('late',                  2, False, 'bar ter'),
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   591
        )
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   592
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   593
        for state, perch_size, perch_smelly, tags in parrot_details:
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   594
            perch = Perch.objects.create(size=perch_size, smelly=perch_smelly)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   595
            parrot = Parrot.objects.create(state=state, perch=perch)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   596
            Tag.objects.update_tags(parrot, tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   597
            
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   598
        self.foo = Tag.objects.get(name='foo')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   599
        self.bar = Tag.objects.get(name='bar')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   600
        self.baz = Tag.objects.get(name='baz')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   601
        self.ter = Tag.objects.get(name='ter')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   602
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   603
        self.pining_for_the_fjords_parrot = Parrot.objects.get(state='pining for the fjords')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   604
        self.passed_on_parrot = Parrot.objects.get(state='passed on')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   605
        self.no_more_parrot = Parrot.objects.get(state='no more')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   606
        self.late_parrot = Parrot.objects.get(state='late')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   607
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   608
    def test_get_by_model_simple(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   609
        parrots = TaggedItem.objects.get_by_model(Parrot, self.foo)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   610
        self.assertEquals(len(parrots), 2)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   611
        self.failUnless(self.no_more_parrot in parrots)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   612
        self.failUnless(self.pining_for_the_fjords_parrot in parrots)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   613
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   614
        parrots = TaggedItem.objects.get_by_model(Parrot, self.bar)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   615
        self.assertEquals(len(parrots), 3)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   616
        self.failUnless(self.late_parrot in parrots)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   617
        self.failUnless(self.passed_on_parrot in parrots)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   618
        self.failUnless(self.pining_for_the_fjords_parrot in parrots)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   619
    
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   620
    def test_get_by_model_intersection(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   621
        parrots = TaggedItem.objects.get_by_model(Parrot, [self.foo, self.baz])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   622
        self.assertEquals(len(parrots), 0)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   623
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   624
        parrots = TaggedItem.objects.get_by_model(Parrot, [self.foo, self.bar])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   625
        self.assertEquals(len(parrots), 1)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   626
        self.failUnless(self.pining_for_the_fjords_parrot in parrots)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   627
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   628
        parrots = TaggedItem.objects.get_by_model(Parrot, [self.bar, self.ter])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   629
        self.assertEquals(len(parrots), 2)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   630
        self.failUnless(self.late_parrot in parrots)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   631
        self.failUnless(self.passed_on_parrot in parrots)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   632
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   633
        # Issue 114 - Intersection with non-existant tags
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   634
        parrots = TaggedItem.objects.get_intersection_by_model(Parrot, [])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   635
        self.assertEquals(len(parrots), 0)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   636
    
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   637
    def test_get_by_model_with_tag_querysets_as_input(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   638
        parrots = TaggedItem.objects.get_by_model(Parrot, Tag.objects.filter(name__in=['foo', 'baz']))
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   639
        self.assertEquals(len(parrots), 0)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   640
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   641
        parrots = TaggedItem.objects.get_by_model(Parrot, Tag.objects.filter(name__in=['foo', 'bar']))
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   642
        self.assertEquals(len(parrots), 1)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   643
        self.failUnless(self.pining_for_the_fjords_parrot in parrots)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   644
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   645
        parrots = TaggedItem.objects.get_by_model(Parrot, Tag.objects.filter(name__in=['bar', 'ter']))
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   646
        self.assertEquals(len(parrots), 2)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   647
        self.failUnless(self.late_parrot in parrots)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   648
        self.failUnless(self.passed_on_parrot in parrots)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   649
    
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   650
    def test_get_by_model_with_strings_as_input(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   651
        parrots = TaggedItem.objects.get_by_model(Parrot, 'foo baz')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   652
        self.assertEquals(len(parrots), 0)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   653
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   654
        parrots = TaggedItem.objects.get_by_model(Parrot, 'foo bar')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   655
        self.assertEquals(len(parrots), 1)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   656
        self.failUnless(self.pining_for_the_fjords_parrot in parrots)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   657
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   658
        parrots = TaggedItem.objects.get_by_model(Parrot, 'bar ter')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   659
        self.assertEquals(len(parrots), 2)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   660
        self.failUnless(self.late_parrot in parrots)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   661
        self.failUnless(self.passed_on_parrot in parrots)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   662
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   663
    def test_get_by_model_with_lists_of_strings_as_input(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   664
        parrots = TaggedItem.objects.get_by_model(Parrot, ['foo', 'baz'])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   665
        self.assertEquals(len(parrots), 0)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   666
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   667
        parrots = TaggedItem.objects.get_by_model(Parrot, ['foo', 'bar'])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   668
        self.assertEquals(len(parrots), 1)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   669
        self.failUnless(self.pining_for_the_fjords_parrot in parrots)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   670
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   671
        parrots = TaggedItem.objects.get_by_model(Parrot, ['bar', 'ter'])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   672
        self.assertEquals(len(parrots), 2)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   673
        self.failUnless(self.late_parrot in parrots)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   674
        self.failUnless(self.passed_on_parrot in parrots)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   675
    
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   676
    def test_get_by_nonexistent_tag(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   677
        # Issue 50 - Get by non-existent tag
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   678
        parrots = TaggedItem.objects.get_by_model(Parrot, 'argatrons')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   679
        self.assertEquals(len(parrots), 0)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   680
    
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   681
    def test_get_union_by_model(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   682
        parrots = TaggedItem.objects.get_union_by_model(Parrot, ['foo', 'ter'])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   683
        self.assertEquals(len(parrots), 4)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   684
        self.failUnless(self.late_parrot in parrots)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   685
        self.failUnless(self.no_more_parrot in parrots)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   686
        self.failUnless(self.passed_on_parrot in parrots)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   687
        self.failUnless(self.pining_for_the_fjords_parrot in parrots)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   688
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   689
        parrots = TaggedItem.objects.get_union_by_model(Parrot, ['bar', 'baz'])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   690
        self.assertEquals(len(parrots), 3)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   691
        self.failUnless(self.late_parrot in parrots)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   692
        self.failUnless(self.passed_on_parrot in parrots)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   693
        self.failUnless(self.pining_for_the_fjords_parrot in parrots)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   694
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   695
        # Issue 114 - Union with non-existant tags
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   696
        parrots = TaggedItem.objects.get_union_by_model(Parrot, [])
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   697
        self.assertEquals(len(parrots), 0)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   698
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   699
class TestGetRelatedTaggedItems(TestCase):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   700
    def setUp(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   701
        parrot_details = (
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   702
            ('pining for the fjords', 9, True,  'foo bar'),
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   703
            ('passed on',             6, False, 'bar baz ter'),
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   704
            ('no more',               4, True,  'foo ter'),
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   705
            ('late',                  2, False, 'bar ter'),
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   706
        )
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   707
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   708
        for state, perch_size, perch_smelly, tags in parrot_details:
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   709
            perch = Perch.objects.create(size=perch_size, smelly=perch_smelly)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   710
            parrot = Parrot.objects.create(state=state, perch=perch)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   711
            Tag.objects.update_tags(parrot, tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   712
            
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   713
        self.l1 = Link.objects.create(name='link 1')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   714
        Tag.objects.update_tags(self.l1, 'tag1 tag2 tag3 tag4 tag5')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   715
        self.l2 = Link.objects.create(name='link 2')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   716
        Tag.objects.update_tags(self.l2, 'tag1 tag2 tag3')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   717
        self.l3 = Link.objects.create(name='link 3')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   718
        Tag.objects.update_tags(self.l3, 'tag1')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   719
        self.l4 = Link.objects.create(name='link 4')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   720
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   721
        self.a1 = Article.objects.create(name='article 1')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   722
        Tag.objects.update_tags(self.a1, 'tag1 tag2 tag3 tag4')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   723
    
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   724
    def test_get_related_objects_of_same_model(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   725
        related_objects = TaggedItem.objects.get_related(self.l1, Link)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   726
        self.assertEquals(len(related_objects), 2)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   727
        self.failUnless(self.l2 in related_objects)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   728
        self.failUnless(self.l3 in related_objects)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   729
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   730
        related_objects = TaggedItem.objects.get_related(self.l4, Link)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   731
        self.assertEquals(len(related_objects), 0)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   732
    
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   733
    def test_get_related_objects_of_same_model_limited_number_of_results(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   734
        # This fails on Oracle because it has no support for a 'LIMIT' clause.
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   735
        # See http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:127412348064
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   736
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   737
        # ask for no more than 1 result
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   738
        related_objects = TaggedItem.objects.get_related(self.l1, Link, num=1)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   739
        self.assertEquals(len(related_objects), 1)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   740
        self.failUnless(self.l2 in related_objects)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   741
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   742
    def test_get_related_objects_of_same_model_limit_related_items(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   743
        related_objects = TaggedItem.objects.get_related(self.l1, Link.objects.exclude(name='link 3'))
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   744
        self.assertEquals(len(related_objects), 1)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   745
        self.failUnless(self.l2 in related_objects)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   746
    
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   747
    def test_get_related_objects_of_different_model(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   748
        related_objects = TaggedItem.objects.get_related(self.a1, Link)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   749
        self.assertEquals(len(related_objects), 3)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   750
        self.failUnless(self.l1 in related_objects)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   751
        self.failUnless(self.l2 in related_objects)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   752
        self.failUnless(self.l3 in related_objects)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   753
            
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   754
        Tag.objects.update_tags(self.a1, 'tag6')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   755
        related_objects = TaggedItem.objects.get_related(self.a1, Link)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   756
        self.assertEquals(len(related_objects), 0)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   757
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   758
class TestTagUsageForQuerySet(TestCase):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   759
    def setUp(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   760
        parrot_details = (
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   761
            ('pining for the fjords', 9, True,  'foo bar'),
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   762
            ('passed on',             6, False, 'bar baz ter'),
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   763
            ('no more',               4, True,  'foo ter'),
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   764
            ('late',                  2, False, 'bar ter'),
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   765
        )
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   766
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   767
        for state, perch_size, perch_smelly, tags in parrot_details:
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   768
            perch = Perch.objects.create(size=perch_size, smelly=perch_smelly)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   769
            parrot = Parrot.objects.create(state=state, perch=perch)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   770
            Tag.objects.update_tags(parrot, tags)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   771
    
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   772
    def test_tag_usage_for_queryset(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   773
        tag_usage = Tag.objects.usage_for_queryset(Parrot.objects.filter(state='no more'), counts=True)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   774
        relevant_attribute_list = [(tag.name, tag.count) for tag in tag_usage]
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   775
        self.assertEquals(len(relevant_attribute_list), 2)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   776
        self.failUnless((u'foo', 1) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   777
        self.failUnless((u'ter', 1) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   778
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   779
        tag_usage = Tag.objects.usage_for_queryset(Parrot.objects.filter(state__startswith='p'), counts=True)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   780
        relevant_attribute_list = [(tag.name, tag.count) for tag in tag_usage]
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   781
        self.assertEquals(len(relevant_attribute_list), 4)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   782
        self.failUnless((u'bar', 2) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   783
        self.failUnless((u'baz', 1) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   784
        self.failUnless((u'foo', 1) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   785
        self.failUnless((u'ter', 1) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   786
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   787
        tag_usage = Tag.objects.usage_for_queryset(Parrot.objects.filter(perch__size__gt=4), counts=True)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   788
        relevant_attribute_list = [(tag.name, tag.count) for tag in tag_usage]
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   789
        self.assertEquals(len(relevant_attribute_list), 4)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   790
        self.failUnless((u'bar', 2) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   791
        self.failUnless((u'baz', 1) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   792
        self.failUnless((u'foo', 1) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   793
        self.failUnless((u'ter', 1) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   794
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   795
        tag_usage = Tag.objects.usage_for_queryset(Parrot.objects.filter(perch__smelly=True), counts=True)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   796
        relevant_attribute_list = [(tag.name, tag.count) for tag in tag_usage]
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   797
        self.assertEquals(len(relevant_attribute_list), 3)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   798
        self.failUnless((u'bar', 1) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   799
        self.failUnless((u'foo', 2) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   800
        self.failUnless((u'ter', 1) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   801
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   802
        tag_usage = Tag.objects.usage_for_queryset(Parrot.objects.filter(perch__smelly=True), min_count=2)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   803
        relevant_attribute_list = [(tag.name, tag.count) for tag in tag_usage]
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   804
        self.assertEquals(len(relevant_attribute_list), 1)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   805
        self.failUnless((u'foo', 2) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   806
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   807
        tag_usage = Tag.objects.usage_for_queryset(Parrot.objects.filter(perch__size__gt=4))
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   808
        relevant_attribute_list = [(tag.name, hasattr(tag, 'counts')) for tag in tag_usage]
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   809
        self.assertEquals(len(relevant_attribute_list), 4)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   810
        self.failUnless((u'bar', False) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   811
        self.failUnless((u'baz', False) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   812
        self.failUnless((u'foo', False) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   813
        self.failUnless((u'ter', False) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   814
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   815
        tag_usage = Tag.objects.usage_for_queryset(Parrot.objects.filter(perch__size__gt=99))
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   816
        relevant_attribute_list = [(tag.name, hasattr(tag, 'counts')) for tag in tag_usage]
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   817
        self.assertEquals(len(relevant_attribute_list), 0)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   818
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   819
        tag_usage = Tag.objects.usage_for_queryset(Parrot.objects.filter(Q(perch__size__gt=6) | Q(state__startswith='l')), counts=True)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   820
        relevant_attribute_list = [(tag.name, tag.count) for tag in tag_usage]
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   821
        self.assertEquals(len(relevant_attribute_list), 3)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   822
        self.failUnless((u'bar', 2) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   823
        self.failUnless((u'foo', 1) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   824
        self.failUnless((u'ter', 1) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   825
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   826
        tag_usage = Tag.objects.usage_for_queryset(Parrot.objects.filter(Q(perch__size__gt=6) | Q(state__startswith='l')), min_count=2)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   827
        relevant_attribute_list = [(tag.name, tag.count) for tag in tag_usage]
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   828
        self.assertEquals(len(relevant_attribute_list), 1)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   829
        self.failUnless((u'bar', 2) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   830
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   831
        tag_usage = Tag.objects.usage_for_queryset(Parrot.objects.filter(Q(perch__size__gt=6) | Q(state__startswith='l')))
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   832
        relevant_attribute_list = [(tag.name, hasattr(tag, 'counts')) for tag in tag_usage]
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   833
        self.assertEquals(len(relevant_attribute_list), 3)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   834
        self.failUnless((u'bar', False) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   835
        self.failUnless((u'foo', False) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   836
        self.failUnless((u'ter', False) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   837
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   838
        tag_usage = Tag.objects.usage_for_queryset(Parrot.objects.exclude(state='passed on'), counts=True)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   839
        relevant_attribute_list = [(tag.name, tag.count) for tag in tag_usage]
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   840
        self.assertEquals(len(relevant_attribute_list), 3)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   841
        self.failUnless((u'bar', 2) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   842
        self.failUnless((u'foo', 2) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   843
        self.failUnless((u'ter', 2) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   844
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   845
        tag_usage = Tag.objects.usage_for_queryset(Parrot.objects.exclude(state__startswith='p'), min_count=2)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   846
        relevant_attribute_list = [(tag.name, tag.count) for tag in tag_usage]
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   847
        self.assertEquals(len(relevant_attribute_list), 1)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   848
        self.failUnless((u'ter', 2) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   849
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   850
        tag_usage = Tag.objects.usage_for_queryset(Parrot.objects.exclude(Q(perch__size__gt=6) | Q(perch__smelly=False)), counts=True)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   851
        relevant_attribute_list = [(tag.name, tag.count) for tag in tag_usage]
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   852
        self.assertEquals(len(relevant_attribute_list), 2)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   853
        self.failUnless((u'foo', 1) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   854
        self.failUnless((u'ter', 1) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   855
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   856
        tag_usage = Tag.objects.usage_for_queryset(Parrot.objects.exclude(perch__smelly=True).filter(state__startswith='l'), counts=True)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   857
        relevant_attribute_list = [(tag.name, tag.count) for tag in tag_usage]
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   858
        self.assertEquals(len(relevant_attribute_list), 2)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   859
        self.failUnless((u'bar', 1) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   860
        self.failUnless((u'ter', 1) in relevant_attribute_list)
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   861
        
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   862
################
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   863
# Model Fields #
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   864
################
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   865
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   866
class TestTagFieldInForms(TestCase):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   867
    def test_tag_field_in_modelform(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   868
        # Ensure that automatically created forms use TagField
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   869
        class TestForm(forms.ModelForm):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   870
            class Meta:
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   871
                model = FormTest
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   872
                
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   873
        form = TestForm()
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   874
        self.assertEquals(form.fields['tags'].__class__.__name__, 'TagField')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   875
    
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   876
    def test_recreation_of_tag_list_string_representations(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   877
        plain = Tag.objects.create(name='plain')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   878
        spaces = Tag.objects.create(name='spa ces')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   879
        comma = Tag.objects.create(name='com,ma')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   880
        self.assertEquals(edit_string_for_tags([plain]), u'plain')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   881
        self.assertEquals(edit_string_for_tags([plain, spaces]), u'plain, spa ces')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   882
        self.assertEquals(edit_string_for_tags([plain, spaces, comma]), u'plain, spa ces, "com,ma"')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   883
        self.assertEquals(edit_string_for_tags([plain, comma]), u'plain "com,ma"')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   884
        self.assertEquals(edit_string_for_tags([comma, spaces]), u'"com,ma", spa ces')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   885
    
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   886
    def test_tag_d_validation(self):
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   887
        t = TagField()
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   888
        self.assertEquals(t.clean('foo'), u'foo')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   889
        self.assertEquals(t.clean('foo bar baz'), u'foo bar baz')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   890
        self.assertEquals(t.clean('foo,bar,baz'), u'foo,bar,baz')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   891
        self.assertEquals(t.clean('foo, bar, baz'), u'foo, bar, baz')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   892
        self.assertEquals(t.clean('foo qwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvb bar'),
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   893
            u'foo qwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvb bar')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   894
        try:
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   895
            t.clean('foo qwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbn bar')
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   896
        except forms.ValidationError, ve:
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   897
            self.assertEquals(str(ve), "[u'Each tag may be no more than 50 characters long.']")
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   898
        except Exception, e:
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   899
            raise e
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   900
        else:
f236caaceb43 add pois
ymh <ymh.work@gmail.com>
parents:
diff changeset
   901
            raise self.failureException('a ValidationError exception was supposed to have been raised.')