Project

General

Profile

Statistics
| Branch: | Tag: | Revision:

vigiboard / vigiboard / tests / functional / test_search_form_service.py @ 0dcb87f7

History | View | Annotate | Download (7.57 KB)

1
# -*- coding: utf-8 -*-
2
"""
3
Teste le formulaire de recherche avec un nom de service.
4
"""
5
from nose.tools import assert_true, assert_equal
6
from datetime import datetime
7
import transaction
8

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

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

    
21
    hostgroup = SupItemGroup(name=u'foo')
22
    DBSession.add(hostgroup)
23

    
24
    DBSession.add(GroupHierarchy(
25
        parent=hostgroup,
26
        child=hostgroup,
27
        hops=0,
28
    ))
29
    DBSession.flush()
30

    
31
    host = Host(
32
        name=u'bar',
33
        checkhostcmd=u'',
34
        description=u'',
35
        hosttpl=u'',
36
        address=u'127.0.0.1',
37
        snmpport=42,
38
        snmpcommunity=u'public',
39
        snmpversion=u'3',
40
        weight=42,
41
    )
42
    DBSession.add(host)
43
    DBSession.flush()
44

    
45
    hostgroup.supitems.append(host)
46
    DBSession.flush()
47

    
48
    servicegroup = SupItemGroup(name=u'bar')
49
    DBSession.add(servicegroup)
50

    
51
    DBSession.add(GroupHierarchy(
52
        parent=servicegroup,
53
        child=servicegroup,
54
        hops=0,
55
    ))
56
    DBSession.flush()
57

    
58
    service = LowLevelService(
59
        host=host,
60
        command=u'',
61
        weight=42,
62
        servicename=u'baz',
63
        op_dep=u'&',
64
    )
65
    DBSession.add(service)
66
    DBSession.flush()
67

    
68
    servicegroup.supitems.append(service)
69
    DBSession.flush()
70

    
71
    event = Event(
72
        supitem=service,
73
        timestamp=timestamp,
74
        current_state=StateName.statename_to_value(u'WARNING'),
75
        message=u'Hello world',
76
    )
77
    DBSession.add(event)
78
    DBSession.flush()
79

    
80
    correvent = CorrEvent(
81
        impact=42,
82
        priority=42,
83
        trouble_ticket=None,
84
        status=u'None',
85
        occurrence=42,
86
        timestamp_active=timestamp,
87
        cause=event,
88
    )
89
    correvent.events.append(event)
90
    DBSession.add(correvent)
91
    DBSession.flush()
92
    return (hostgroup, servicegroup)
93

    
94
class TestSearchFormService(TestController):
95
    """Teste la récupération d'événements selon le groupe de services."""
96
    def setUp(self):
97
        super(TestSearchFormService, self).setUp()
98
        perm = Permission.by_permission_name(u'vigiboard-access')
99
        user = User(
100
            user_name=u'user',
101
            fullname=u'',
102
            email=u'some.random@us.er',
103
        )
104
        usergroup = UserGroup(
105
            group_name=u'users',
106
        )
107
        user.usergroups.append(usergroup)
108
        usergroup.permissions.append(perm)
109
        DBSession.add(user)
110
        DBSession.add(usergroup)
111
        DBSession.flush()
112

    
113
    def test_search_service_when_allowed_by_host(self):
114
        """
115
        Teste la recherche par service avec des droits implicites
116
        (droits accordés car l'utilisateur a les droits sur l'hôte).
117
        """
118
        # On crée un service avec une alerte.
119
        # Le service est rattaché à un hôte appartenant
120
        # à un groupe d'hôtes pour lesquels l'utilisateur
121
        # a les permissions.
122
        hostgroup = insert_deps()[0]
123
        usergroup = UserGroup.by_group_name(u'users')
124
        DBSession.add(DataPermission(
125
            group=hostgroup,
126
            usergroup=usergroup,
127
            access=u'r',
128
        ))
129
        DBSession.flush()
130
        transaction.commit()
131

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

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

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

    
147
    def test_search_service_when_allowed_by_service(self):
148
        """
149
        Teste la recherche par service avec des droits explicites
150
        (droits accordés car l'utilisateur a explicitement les droits
151
        sur ce service).
152
        """
153
        # On crée un service avec une alerte.
154
        # Le service est rattaché à un groupe de services
155
        # pour lesquel l'utilisateur a les permissions.
156
        servicegroup = insert_deps()[1]
157
        usergroup = UserGroup.by_group_name(u'users')
158
        DBSession.add(DataPermission(
159
            group=servicegroup,
160
            usergroup=usergroup,
161
            access=u'r',
162
        ))
163
        DBSession.flush()
164
        transaction.commit()
165

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

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

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

    
181
    def test_search_inexistent_service(self):
182
        """Teste la recherche par service sur un service inexistant."""
183
        transaction.commit()
184
        # On envoie une requête avec recherche sur un service
185
        # qui n'existe pas, on s'attend à n'obtenir aucun résultat.
186
        response = self.app.get('/?service=bad',
187
            extra_environ={'REMOTE_USER': 'user'})
188

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

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

    
199
    def test_search_service_when_disallowed(self):
200
        """Teste la recherche par service SANS les droits."""
201
        # On NE DONNE PAS l'autorisation aux utilisateurs
202
        # de voir l'alerte, donc elle ne doit jamais apparaître.
203
        insert_deps()
204
        transaction.commit()
205

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

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

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