~lutostag/ubuntu/trusty/maas/1.5.4+keystone

« back to all changes in this revision

Viewing changes to src/maasserver/tests/test_views_tags.py

  • Committer: Package Import Robot
  • Author(s): Andres Rodriguez
  • Date: 2014-02-15 12:08:23 UTC
  • mto: This revision was merged to the branch mainline in revision 48.
  • Revision ID: package-import@ubuntu.com-20140215120823-u7dkitfy0h8tbruh
Tags: upstream-1.5+bzr1948
ImportĀ upstreamĀ versionĀ 1.5+bzr1948

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright 2012-2014 Canonical Ltd.  This software is licensed under the
2
 
# GNU Affero General Public License version 3 (see the file LICENSE).
3
 
 
4
 
"""Test maasserver nodes views."""
5
 
 
6
 
from __future__ import (
7
 
    absolute_import,
8
 
    print_function,
9
 
    unicode_literals,
10
 
    )
11
 
 
12
 
str = None
13
 
 
14
 
__metaclass__ = type
15
 
__all__ = []
16
 
 
17
 
from django.core.urlresolvers import reverse
18
 
from lxml.etree import XPath
19
 
from lxml.html import fromstring
20
 
from maasserver.testing import get_content_links
21
 
from maasserver.testing.factory import factory
22
 
from maasserver.testing.testcase import MAASServerTestCase
23
 
from maasserver.views import tags as tags_views
24
 
from maastesting.djangotestcase import count_queries
25
 
from testtools.matchers import ContainsAll
26
 
 
27
 
 
28
 
class TagViewsTest(MAASServerTestCase):
29
 
 
30
 
    def test_view_tag_displays_tag_info(self):
31
 
        # The tag page features the basic information about the tag.
32
 
        self.client_log_in()
33
 
        tag = factory.make_tag(
34
 
            name='the-named-tag',
35
 
            comment='Human description of the tag',
36
 
            definition='//xpath')
37
 
        tag_link = reverse('tag-view', args=[tag.name])
38
 
        response = self.client.get(tag_link)
39
 
        doc = fromstring(response.content)
40
 
        content_text = doc.cssselect('#content')[0].text_content()
41
 
        self.assertThat(
42
 
            content_text, ContainsAll([tag.comment, tag.definition]))
43
 
 
44
 
    def test_view_tag_includes_node_links(self):
45
 
        self.client_log_in()
46
 
        tag = factory.make_tag()
47
 
        node = factory.make_node()
48
 
        node.tags.add(tag)
49
 
        mac = factory.make_mac_address(node=node).mac_address
50
 
        tag_link = reverse('tag-view', args=[tag.name])
51
 
        node_link = reverse('node-view', args=[node.system_id])
52
 
        response = self.client.get(tag_link)
53
 
        doc = fromstring(response.content)
54
 
        content_text = doc.cssselect('#content')[0].text_content()
55
 
        self.assertThat(
56
 
            content_text, ContainsAll([unicode(mac), '%s' % node.hostname]))
57
 
        self.assertNotIn(node.system_id, content_text)
58
 
        self.assertIn(node_link, get_content_links(response))
59
 
 
60
 
    def test_view_tag_num_queries_is_independent_of_num_nodes(self):
61
 
        self.client_log_in()
62
 
        tag = factory.make_tag()
63
 
        tag_link = reverse('tag-view', args=[tag.name])
64
 
        nodegroup = factory.make_node_group()
65
 
        nodes = [factory.make_node(nodegroup=nodegroup, mac=True)
66
 
                 for i in range(20)]
67
 
        for node in nodes[:10]:
68
 
            node.tags.add(tag)
69
 
        num_queries, response = count_queries(self.client.get, tag_link)
70
 
        self.assertEqual(
71
 
            10,
72
 
            len([link for link in get_content_links(response)
73
 
                if link.startswith('/nodes/node')]))
74
 
        # Need to get the tag, and the nodes, and the macs of the nodes
75
 
        self.assertTrue(num_queries > 3)
76
 
        for node in nodes[10:]:
77
 
            node.tags.add(tag)
78
 
        num_bonus_queries, response = count_queries(
79
 
            self.client.get, tag_link)
80
 
        self.assertEqual(num_queries, num_bonus_queries)
81
 
        self.assertEqual(
82
 
            20,
83
 
            len([link for link in get_content_links(response)
84
 
                if link.startswith('/nodes/node')]))
85
 
 
86
 
    def test_view_tag_hides_private_nodes(self):
87
 
        self.client_log_in()
88
 
        tag = factory.make_tag()
89
 
        node = factory.make_node()
90
 
        node2 = factory.make_node(owner=factory.make_user())
91
 
        node.tags.add(tag)
92
 
        node2.tags.add(tag)
93
 
        tag_link = reverse('tag-view', args=[tag.name])
94
 
        response = self.client.get(tag_link)
95
 
        doc = fromstring(response.content)
96
 
        content_text = doc.cssselect('#content')[0].text_content()
97
 
        self.assertIn(node.hostname, content_text)
98
 
        self.assertNotIn(node2.hostname, content_text)
99
 
 
100
 
    def test_view_tag_shows_kernel_params(self):
101
 
        self.client_log_in()
102
 
        tag = factory.make_tag(kernel_opts='--test tag params')
103
 
        node = factory.make_node()
104
 
        node.tags = [tag]
105
 
        tag_link = reverse('tag-view', args=[tag.name])
106
 
        response = self.client.get(tag_link)
107
 
        doc = fromstring(response.content)
108
 
        kernel_opts = doc.cssselect('.kernel-opts-tag')[0].text_content()
109
 
        self.assertIn('Kernel Parameters', kernel_opts)
110
 
        self.assertIn(tag.kernel_opts, kernel_opts)
111
 
 
112
 
    def test_view_tag_paginates_nodes(self):
113
 
        """Listing of nodes with tag is split across multiple pages
114
 
 
115
 
        Copy-coded from NodeViewsTest.test_node_list_paginates evilly.
116
 
        """
117
 
        self.client_log_in()
118
 
        # Set a very small page size to save creating lots of nodes
119
 
        page_size = 2
120
 
        self.patch(tags_views.TagView, 'paginate_by', page_size)
121
 
        tag = factory.make_tag()
122
 
        nodes = [
123
 
            factory.make_node(created="2012-10-12 12:00:%02d" % i)
124
 
            for i in range(page_size * 2 + 1)
125
 
        ]
126
 
        for node in nodes:
127
 
            node.tags = [tag]
128
 
        # Order node links with newest first as the view is expected to
129
 
        node_links = [
130
 
            reverse('node-view', args=[node.system_id])
131
 
            for node in reversed(nodes)
132
 
        ]
133
 
        expr_page_anchors = XPath("//div[@class='pagination']//a")
134
 
        # Fetch first page, should link newest two nodes and page 2
135
 
        response = self.client.get(reverse('tag-view', args=[tag.name]))
136
 
        page1 = fromstring(response.content)
137
 
        self.assertEqual(
138
 
            node_links[:page_size],
139
 
            get_content_links(response, '.node-column'))
140
 
        self.assertEqual(
141
 
            [("next", "?page=2"), ("last", "?page=3")],
142
 
            [(a.text.lower(), a.get("href"))
143
 
             for a in expr_page_anchors(page1)])
144
 
        # Fetch second page, should link next nodes and adjacent pages
145
 
        response = self.client.get(
146
 
            reverse('tag-view', args=[tag.name]), {"page": 2})
147
 
        page2 = fromstring(response.content)
148
 
        self.assertEqual(
149
 
            node_links[page_size:page_size * 2],
150
 
            get_content_links(response, '.node-column'))
151
 
        self.assertEqual(
152
 
            [("first", "."), ("previous", "."),
153
 
             ("next", "?page=3"), ("last", "?page=3")],
154
 
            [(a.text.lower(), a.get("href"))
155
 
             for a in expr_page_anchors(page2)])
156
 
        # Fetch third page, should link oldest node and node list page
157
 
        response = self.client.get(
158
 
            reverse('tag-view', args=[tag.name]), {"page": 3})
159
 
        page3 = fromstring(response.content)
160
 
        self.assertEqual(
161
 
            node_links[page_size * 2:],
162
 
            get_content_links(response, '.node-column'))
163
 
        self.assertEqual(
164
 
            [("first", "."), ("previous", "?page=2")],
165
 
            [(a.text.lower(), a.get("href"))
166
 
             for a in expr_page_anchors(page3)])