Project

General

Profile

Statistics
| Branch: | Tag: | Revision:

vigiboard / vigiboard / tests / functional / test_search_form_misc.py @ 011743be

History | View | Annotate | Download (8.85 KB)

1
# -*- coding: utf-8 -*-
2
# Copyright (C) 2006-2020 CS GROUP - France
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 __future__ import print_function
9
from nose.tools import assert_true, assert_equal
10
from datetime import datetime
11
from datetime import timedelta
12
import transaction
13

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

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

    
24
    host = Host(
25
        name=u'bar',
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
    )
33
    DBSession.add(host)
34
    DBSession.flush()
35

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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