Project

General

Profile

Statistics
| Branch: | Tag: | Revision:

vigiboard / vigiboard / tests / functional / test_search_form_service.py @ b373a5de

History | View | Annotate | Download (7.35 KB)

1
# -*- coding: utf-8 -*-
2
# Copyright (C) 2006-2011 CS-SI
3
# License: GNU GPL v2 <http://www.gnu.org/licenses/gpl-2.0.html>
4

    
5
"""
6
Teste le formulaire de recherche avec un nom de service.
7
"""
8
from nose.tools import assert_true, assert_equal
9
from datetime import datetime
10
import transaction
11

    
12
from vigiboard.tests import TestController
13
from vigilo.models.session import DBSession
14
from vigilo.models.tables import SupItemGroup, Host, Permission, \
15
                                    StateName, LowLevelService, \
16
                                    Event, CorrEvent, User, UserGroup, \
17
                                    DataPermission
18

    
19
def insert_deps():
20
    """Insère les dépendances nécessaires aux tests."""
21
    timestamp = datetime.now()
22

    
23
    hostgroup = SupItemGroup(name=u'foo', parent=None)
24
    DBSession.add(hostgroup)
25

    
26
    host = Host(
27
        name=u'bar',
28
        checkhostcmd=u'',
29
        description=u'',
30
        hosttpl=u'',
31
        address=u'127.0.0.1',
32
        snmpport=42,
33
        snmpcommunity=u'public',
34
        snmpversion=u'3',
35
        weight=42,
36
    )
37
    DBSession.add(host)
38
    DBSession.flush()
39

    
40
    hostgroup.supitems.append(host)
41
    DBSession.flush()
42

    
43
    servicegroup = SupItemGroup(name=u'bar', parent=None)
44
    DBSession.add(servicegroup)
45
    DBSession.flush()
46

    
47
    service = LowLevelService(
48
        host=host,
49
        command=u'',
50
        weight=42,
51
        servicename=u'baz',
52
    )
53
    DBSession.add(service)
54
    DBSession.flush()
55

    
56
    servicegroup.supitems.append(service)
57
    DBSession.flush()
58

    
59
    event = Event(
60
        supitem=service,
61
        timestamp=timestamp,
62
        current_state=StateName.statename_to_value(u'WARNING'),
63
        message=u'Hello world',
64
    )
65
    DBSession.add(event)
66
    DBSession.flush()
67

    
68
    correvent = CorrEvent(
69
        impact=42,
70
        priority=42,
71
        trouble_ticket=None,
72
        status=u'None',
73
        occurrence=42,
74
        timestamp_active=timestamp,
75
        cause=event,
76
    )
77
    correvent.events.append(event)
78
    DBSession.add(correvent)
79
    DBSession.flush()
80
    return (hostgroup, servicegroup)
81

    
82
class TestSearchFormService(TestController):
83
    """Teste la récupération d'événements selon le groupe de services."""
84
    def setUp(self):
85
        super(TestSearchFormService, self).setUp()
86
        perm = Permission.by_permission_name(u'vigiboard-access')
87
        user = User(
88
            user_name=u'user',
89
            fullname=u'',
90
            email=u'some.random@us.er',
91
        )
92
        usergroup = UserGroup(group_name=u'users')
93
        user.usergroups.append(usergroup)
94
        usergroup.permissions.append(perm)
95
        DBSession.add(user)
96
        DBSession.add(usergroup)
97
        DBSession.flush()
98

    
99
    def test_search_service_when_allowed_by_host(self):
100
        """
101
        Teste la recherche par service avec des droits implicites
102
        (droits accordés car l'utilisateur a les droits sur l'hôte).
103
        """
104
        # On crée un service avec une alerte.
105
        # Le service est rattaché à un hôte appartenant
106
        # à un groupe d'hôtes pour lesquels l'utilisateur
107
        # a les permissions.
108
        hostgroup = insert_deps()[0]
109
        usergroup = UserGroup.by_group_name(u'users')
110
        DBSession.add(DataPermission(
111
            group=hostgroup,
112
            usergroup=usergroup,
113
            access=u'r',
114
        ))
115
        DBSession.flush()
116
        transaction.commit()
117

    
118
        # On envoie une requête avec recherche sur le service créé,
119
        # on s'attend à recevoir 1 résultat.
120
        response = self.app.get('/?service=baz',
121
            extra_environ={'REMOTE_USER': 'user'})
122

    
123
        # Il doit y avoir 1 seule ligne de résultats.
124
        rows = response.lxml.xpath('//table[@class="vigitable"]/tbody/tr')
125
        print "There are %d rows in the result set" % len(rows)
126
        assert_equal(len(rows), 1)
127

    
128
        # Il doit y avoir plusieurs colonnes dans la ligne de résultats.
129
        cols = response.lxml.xpath('//table[@class="vigitable"]/tbody/tr/td')
130
        print "There are %d columns in the result set" % len(cols)
131
        assert_true(len(cols) > 1)
132

    
133
    def test_search_service_when_allowed_by_service(self):
134
        """
135
        Teste la recherche par service avec des droits explicites
136
        (droits accordés car l'utilisateur a explicitement les droits
137
        sur ce service).
138
        """
139
        # On crée un service avec une alerte.
140
        # Le service est rattaché à un groupe de services
141
        # pour lesquel l'utilisateur a les permissions.
142
        servicegroup = insert_deps()[1]
143
        usergroup = UserGroup.by_group_name(u'users')
144
        DBSession.add(DataPermission(
145
            group=servicegroup,
146
            usergroup=usergroup,
147
            access=u'r',
148
        ))
149
        DBSession.flush()
150
        transaction.commit()
151

    
152
        # On envoie une requête avec recherche sur le service créé,
153
        # on s'attend à recevoir 1 résultat.
154
        response = self.app.get('/?service=baz',
155
            extra_environ={'REMOTE_USER': 'user'})
156

    
157
        # Il doit y avoir 1 seule ligne de résultats.
158
        rows = response.lxml.xpath('//table[@class="vigitable"]/tbody/tr')
159
        print "There are %d rows in the result set" % len(rows)
160
        assert_equal(len(rows), 1)
161

    
162
        # Il doit y avoir plusieurs colonnes dans la ligne de résultats.
163
        cols = response.lxml.xpath('//table[@class="vigitable"]/tbody/tr/td')
164
        print "There are %d columns in the result set" % len(cols)
165
        assert_true(len(cols) > 1)
166

    
167
    def test_search_inexistent_service(self):
168
        """Teste la recherche par service sur un service inexistant."""
169
        transaction.commit()
170
        # On envoie une requête avec recherche sur un service
171
        # qui n'existe pas, on s'attend à n'obtenir aucun résultat.
172
        response = self.app.get('/?service=bad',
173
            extra_environ={'REMOTE_USER': 'user'})
174

    
175
        # Il doit y avoir 1 seule ligne de résultats.
176
        rows = response.lxml.xpath('//table[@class="vigitable"]/tbody/tr')
177
        print "There are %d rows in the result set" % len(rows)
178
        assert_equal(len(rows), 1)
179

    
180
        # Il doit y avoir 1 seule colonne dans la ligne de résultats.
181
        # (la colonne contient le texte "Il n'y a aucun événément", traduit)
182
        cols = response.lxml.xpath('//table[@class="vigitable"]/tbody/tr/td')
183
        assert_equal(len(cols), 1)
184

    
185
    def test_search_service_when_disallowed(self):
186
        """Teste la recherche par service SANS les droits."""
187
        # On NE DONNE PAS l'autorisation aux utilisateurs
188
        # de voir l'alerte, donc elle ne doit jamais apparaître.
189
        insert_deps()
190
        transaction.commit()
191

    
192
        # On envoie une requête avec recherche sur le service créé,
193
        # mais avec un utilisateur ne disposant pas des permissions adéquates.
194
        # On s'attend à n'obtenir aucun résultat.
195
        response = self.app.get('/?service=baz',
196
            extra_environ={'REMOTE_USER': 'user'})
197

    
198
        # Il doit y avoir 1 seule ligne de résultats.
199
        rows = response.lxml.xpath('//table[@class="vigitable"]/tbody/tr')
200
        print "There are %d rows in the result set" % len(rows)
201
        assert_equal(len(rows), 1)
202

    
203
        # Il doit y avoir 1 seule colonne dans la ligne de résultats.
204
        # (la colonne contient le texte "Il n'y a aucun événément", traduit)
205
        cols = response.lxml.xpath('//table[@class="vigitable"]/tbody/tr/td')
206
        print "There are %d columns in the result set" % len(cols)
207
        assert_equal(len(cols), 1)