Project

General

Profile

Statistics
| Branch: | Tag: | Revision:

vigiboard / vigiboard / tests / functional / test_search_form_service.py @ 03059edd

History | View | Annotate | Download (7.25 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

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

    
20
    hostgroup = SupItemGroup(name=u'foo', parent=None)
21
    DBSession.add(hostgroup)
22

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

    
37
    hostgroup.supitems.append(host)
38
    DBSession.flush()
39

    
40
    servicegroup = SupItemGroup(name=u'bar', parent=None)
41
    DBSession.add(servicegroup)
42
    DBSession.flush()
43

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

    
53
    servicegroup.supitems.append(service)
54
    DBSession.flush()
55

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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