Project

General

Profile

Statistics
| Branch: | Tag: | Revision:

vigiboard / vigiboard / tests / functional / test_search_form_misc.py @ 02c4a1e7

History | View | Annotate | Download (8.78 KB)

1
# -*- coding: utf-8 -*-
2
# Copyright (C) 2006-2016 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 divers champs.
7
"""
8
from nose.tools import assert_true, assert_equal
9
from datetime import datetime
10
from datetime import timedelta
11
import transaction
12

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

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

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

    
35
    hostgroup = SupItemGroup(name=u'foo', parent=None)
36
    hostgroup.supitems.append(host)
37
    DBSession.add(hostgroup)
38
    DBSession.flush()
39

    
40
    event = Event(
41
        supitem=host,
42
        timestamp=timestamp,
43
        current_state=StateName.statename_to_value(u'WARNING'),
44
        message=u'Hello world',
45
    )
46
    DBSession.add(event)
47
    DBSession.flush()
48

    
49
    correvent = CorrEvent(
50
        priority=42,
51
        trouble_ticket=u'FOO BAR BAZ éçà',
52
        ack=CorrEvent.ACK_NONE,
53
        occurrence=42,
54
        timestamp_active=timestamp,
55
        cause=event,
56
    )
57
    correvent.events.append(event)
58
    DBSession.add(correvent)
59
    DBSession.flush()
60

    
61
    # On donne l'accès aux données.
62
    usergroup = UserGroup.by_group_name(u'users')
63
    DBSession.add(DataPermission(
64
        group=hostgroup,
65
        usergroup=usergroup,
66
        access=u'r',
67
    ))
68
    DBSession.flush()
69
    return timestamp
70

    
71
class TestSearchFormMisc(TestController):
72
    """Teste la récupération d'événements selon le nom d'hôte."""
73
    def setUp(self):
74
        super(TestSearchFormMisc, self).setUp()
75
        perm = Permission.by_permission_name(u'vigiboard-access')
76
        user = User(
77
            user_name=u'user',
78
            fullname=u'',
79
            email=u'some.random@us.er',
80
        )
81
        usergroup = UserGroup(group_name=u'users')
82
        user.usergroups.append(usergroup)
83
        usergroup.permissions.append(perm)
84
        DBSession.add(user)
85
        DBSession.add(usergroup)
86
        DBSession.flush()
87

    
88
    def get_number_of_rows(self, from_date, to_date):
89
        """Détermine le nombre de lignes parmi les résultats d'une recherche sur le formulaire."""
90
        response = self.app.get(
91
            '/?from_date=%(from_date)s&to_date=%(to_date)s' % {
92
                'from_date': from_date,
93
                'to_date': to_date,
94
            },
95
            extra_environ={'REMOTE_USER': 'user'})
96
        rows = self.get_rows(response)
97
        print "There are %d rows in the result set" % len(rows)
98
        return len(rows)
99

    
100
    def test_search_by_output(self):
101
        """Teste la recherche sur le message issu de Nagios."""
102
        insert_deps()
103
        transaction.commit()
104

    
105
        # Permet également de vérifier que la recherche est
106
        # insensible à la casse.
107
        response = self.app.get('/?output=hello*',
108
            extra_environ={'REMOTE_USER': 'user'})
109

    
110
        # Il doit y avoir 1 seule ligne de résultats.
111
        rows = self.get_rows(response)
112
        print "There are %d rows in the result set" % len(rows)
113
        assert_equal(len(rows), 1)
114

    
115
        # Il doit y avoir plusieurs colonnes dans la ligne de résultats.
116
        cols = self.get_cells(response)
117
        print "There are %d columns in the result set" % len(cols)
118
        assert_true(len(cols) > 1)
119

    
120
    def test_search_by_trouble_ticket(self):
121
        """Teste la recherche sur le ticket d'incident."""
122
        insert_deps()
123
        transaction.commit()
124

    
125
        # Permet également de vérifier que la recherche est
126
        # insensible à la casse.
127
        response = self.app.get('/?trouble_ticket=*bar*',
128
            extra_environ={'REMOTE_USER': 'user'})
129
        transaction.commit()
130

    
131
        # Il doit y avoir 1 seule ligne de résultats.
132
        rows = self.get_rows(response)
133
        print "There are %d rows in the result set" % len(rows)
134
        assert_equal(len(rows), 1)
135

    
136
        # Il doit y avoir plusieurs colonnes dans la ligne de résultats.
137
        cols = self.get_cells(response)
138
        print "There are %d columns in the result set" % len(cols)
139
        assert_true(len(cols) > 1)
140

    
141
    def test_search_by_dates(self):
142
        """Teste la recherche par dates."""
143
        timestamp = insert_deps()
144
        transaction.commit()
145

    
146
        # Préparation des dates/heures.
147
        from_date = timestamp.strftime("%Y-%m-%d %I:%M:%S %p")
148
        to_date = datetime.now().strftime("%Y-%m-%d %I:%M:%S %p")
149

    
150
        # Permet également de vérifier que la recherche
151
        # par date est inclusive.
152
        response = self.app.get(
153
            '/?from_date=%(from_date)s&to_date=%(to_date)s' % {
154
                'from_date': from_date,
155
                'to_date': to_date,
156
            },
157
            extra_environ={'REMOTE_USER': 'user'})
158

    
159
        # Il doit y avoir 1 seule ligne de résultats.
160
        rows = self.get_rows(response)
161
        print "There are %d rows in the result set" % len(rows)
162
        assert_equal(len(rows), 1)
163

    
164
        # Il doit y avoir plusieurs colonnes dans la ligne de résultats.
165
        cols = self.get_cells(response)
166
        print "There are %d columns in the result set" % len(cols)
167
        assert_true(len(cols) > 1)
168

    
169
    def test_future_begin_date(self):
170
        """Contrôle des dates. Vérifie que date de début < date courante."""
171
        timestamp = insert_deps()
172
        transaction.commit()
173

    
174
        # Préparation des dates/heures.
175
        from_date = datetime.now() + timedelta(seconds=60)
176
        from_date = from_date.strftime("%Y-%m-%d %I:%M:%S %p")
177
        to_date = datetime.now().strftime("%Y-%m-%d %I:%M:%S %p")
178

    
179
        # La recherche en utilisant une date de début supérieure
180
        # à la date actuelle doit générer une erreur/redirection.
181
        environ = {'REMOTE_USER': 'user'}
182
        resp = self.app.get(
183
            '/?from_date=%(from_date)s&to_date=%(to_date)s' % {
184
                'from_date': from_date,
185
                'to_date': to_date,
186
            },
187
            extra_environ=environ,
188
            status=302)
189

    
190
        # Après redirection, le message d'erreur apparait dans la page.
191
        resp = resp.follow(extra_environ=environ)
192
        error = '<div id="flash"><div class="error">%s</div></div>' % \
193
            'Start date cannot be greater than current date'
194
        assert_true(error in resp.body)
195

    
196
    def test_future_end_date(self):
197
        """Contrôle des dates. Vérifie que date de fin < date courante."""
198
        timestamp = insert_deps()
199
        transaction.commit()
200

    
201
        # Préparation des dates/heures.
202
        from_date = timestamp.strftime("%Y-%m-%d %I:%M:%S %p")
203
        to_date = datetime.now() + timedelta(seconds=60)
204
        to_date = to_date.strftime("%Y-%m-%d %I:%M:%S %p")
205

    
206
        # La recherche en utilisant une date de fin supérieure
207
        # à la date courante doit générer une erreur/redirection.
208
        environ = {'REMOTE_USER': 'user'}
209
        resp = self.app.get(
210
            '/?from_date=%(from_date)s&to_date=%(to_date)s' % {
211
                'from_date': from_date,
212
                'to_date': to_date,
213
            },
214
            extra_environ=environ,
215
            status=302)
216

    
217
        # Après redirection, le message d'erreur apparait dans la page.
218
        resp = resp.follow(extra_environ=environ)
219
        error = '<div id="flash"><div class="error">%s</div></div>' % \
220
            'End date cannot be greater than current date'
221
        assert_true(error in resp.body)
222

    
223
    def test_dates_inconsistency(self):
224
        """Contrôle des dates. Vérifie date de début <= date de fin."""
225
        timestamp = insert_deps()
226
        transaction.commit()
227

    
228
        # Préparation des dates/heures.
229
        from_date = timestamp + timedelta(seconds=5)
230
        from_date = from_date.strftime("%Y-%m-%d %I:%M:%S %p")
231
        to_date = timestamp.strftime("%Y-%m-%d %I:%M:%S %p")
232

    
233
        # La recherche en utilisant une date de début supérieure
234
        # à la date de fin doit générer une erreur/redirection.
235
        environ = {'REMOTE_USER': 'user'}
236
        resp = self.app.get(
237
            '/?from_date=%(from_date)s&to_date=%(to_date)s' % {
238
                'from_date': from_date,
239
                'to_date': to_date,
240
            },
241
            extra_environ=environ,
242
            status=302)
243

    
244
        # Après redirection, le message d'erreur apparait dans la page.
245
        resp = resp.follow(extra_environ=environ)
246
        error = '<div id="flash"><div class="error">%s</div></div>' % \
247
            'Start date cannot be greater than end date'
248
        assert_true(error in resp.body)
249