~launchpad-pqm/launchpad/devel

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# Copyright 2010 Canonical Ltd.  This software is licensed under the
# GNU Affero General Public License version 3 (see the file LICENSE).

"""Tests for the InlineMultiCheckboxWidget."""

__metaclass__ = type

import simplejson

from zope.interface import Interface
from zope.schema import List
from zope.schema._field import Choice
from zope.schema.vocabulary import getVocabularyRegistry

from lazr.enum import EnumeratedType, Item

from canonical.launchpad.webapp.publisher import canonical_url
from canonical.testing.layers import DatabaseFunctionalLayer
from lp.app.browser.lazrjs import InlineMultiCheckboxWidget
from lp.testing import (
    TestCaseWithFactory,
    )


class Alphabet(EnumeratedType):
    """A vocabulary for testing."""
    A = Item("A", "Letter A")
    B = Item("B", "Letter B")


class TestInlineMultiCheckboxWidget(TestCaseWithFactory):

    layer = DatabaseFunctionalLayer

    def _getWidget(self, **kwargs):

        class ITest(Interface):
            test_field = List(
                Choice(vocabulary='BuildableDistroSeries'))
        return InlineMultiCheckboxWidget(
            None, ITest['test_field'], "Label", edit_url='fake', **kwargs)

    def _makeExpectedItems(self, vocab, selected=list(), value_fn=None):
        if value_fn is None:
            value_fn = lambda item: item.value.name
        expected_items = []
        style = 'font-weight: normal;'
        for item in vocab:
            new_item = {
                'name': item.title,
                'token': item.token,
                'style': style,
                'checked': (item.value in selected),
                'value': value_fn(item)}
            expected_items.append(new_item)
        return expected_items

    def test_items_for_field_vocabulary(self):
        widget = self._getWidget(attribute_type="reference")
        vocab = getVocabularyRegistry().get(None, 'BuildableDistroSeries')
        value_fn = lambda item: canonical_url(
            item.value, force_local_path=True)
        expected_items = self._makeExpectedItems(vocab, value_fn=value_fn)
        self.assertEqual(simplejson.dumps(expected_items), widget.json_items)

    def test_items_for_custom_vocabulary(self):
        widget = self._getWidget(vocabulary=Alphabet)
        expected_items = self._makeExpectedItems(Alphabet)
        self.assertEqual(simplejson.dumps(expected_items), widget.json_items)

    def test_items_for_custom_vocabulary_name(self):
        widget = self._getWidget(vocabulary="CountryName")
        vocab = getVocabularyRegistry().get(None, "CountryName")
        expected_items = self._makeExpectedItems(vocab)
        self.assertEqual(simplejson.dumps(expected_items), widget.json_items)

    def test_selected_items_checked(self):
        widget = self._getWidget(
            vocabulary=Alphabet, selected_items=[Alphabet.A])
        expected_items = self._makeExpectedItems(
            Alphabet, selected=[Alphabet.A])
        self.assertEqual(simplejson.dumps(expected_items), widget.json_items)