Project

General

Profile

Statistics
| Branch: | Tag: | Revision:

vigiboard / vigiboard / tests / functional / plugins / test_details_plugin.py @ cf3c2494

History | View | Annotate | Download (7.43 KB)

1 911069bc Francois POIROTTE
# -*- coding: utf-8 -*-
2
"""
3
Teste le formulaire donnant les liens vers les outils extérieurs
4
et les données de l'historique.
5
"""
6
from nose.tools import assert_true, assert_equal
7
from datetime import datetime
8
import transaction
9
10
from vigiboard.tests import TestController
11 e7e3d45e Francois POIROTTE
from vigilo.models.session import DBSession
12 0bd9c069 Francois POIROTTE
from vigilo.models.tables import SupItemGroup, User, UserGroup, \
13 60d02e7f Francois POIROTTE
                            Permission, DataPermission, StateName, \
14
                            LowLevelService, Event, CorrEvent, Host
15 911069bc Francois POIROTTE
16
def insert_deps(return_service):
17 072f2a16 Francois POIROTTE
    """
18
    Insère les dépendances nécessaires aux tests.
19

20
    @param return_service: Indique si les événements générés
21
        concernent un hôte (False) ou un service de bas niveau (True).
22
    @type return_service: C{bool}
23
    @return: Renvoie un tuple avec le groupe d'hôte créé,
24
        l'identifiant du L{CorrEvent} généré et enfin,
25
        l'identifiant de l'L{Event} généré.
26
    @rtype: C{tuple}
27
    """
28 911069bc Francois POIROTTE
    timestamp = datetime.now()
29
30 0bd9c069 Francois POIROTTE
    hostgroup = SupItemGroup(name=u'foo')
31
    DBSession.add(hostgroup)
32 911069bc Francois POIROTTE
33
    host = Host(
34
        name=u'bar',
35
        checkhostcmd=u'',
36
        description=u'',
37
        hosttpl=u'',
38 0dcb87f7 Francois POIROTTE
        address=u'127.0.0.1',
39 911069bc Francois POIROTTE
        snmpport=42,
40
        snmpcommunity=u'public',
41
        snmpversion=u'3',
42
        weight=42,
43
    )
44
    DBSession.add(host)
45
    DBSession.flush()
46
47 24d74687 Francois POIROTTE
    hostgroup.supitems.append(host)
48 911069bc Francois POIROTTE
    DBSession.flush()
49
50 0bd9c069 Francois POIROTTE
    servicegroup = SupItemGroup(name=u'bar')
51
    DBSession.add(servicegroup)
52 911069bc Francois POIROTTE
53 53fda08d Francois POIROTTE
    service = LowLevelService(
54 911069bc Francois POIROTTE
        host=host,
55
        command=u'',
56
        weight=42,
57
        servicename=u'baz',
58
    )
59
    DBSession.add(service)
60
    DBSession.flush()
61
62 24d74687 Francois POIROTTE
    servicegroup.supitems.append(service)
63 911069bc Francois POIROTTE
    DBSession.flush()
64
65
    event = Event(
66
        timestamp=timestamp,
67
        current_state=StateName.statename_to_value(u'WARNING'),
68
        message=u'Hello world',
69
    )
70
    if return_service:
71
        event.supitem = service
72
    else:
73
        event.supitem = host
74
    DBSession.add(event)
75
    DBSession.flush()
76
77
    correvent = CorrEvent(
78
        impact=42,
79
        priority=42,
80
        trouble_ticket=None,
81
        status=u'None',
82
        occurrence=42,
83
        timestamp_active=timestamp,
84
        cause=event,
85
    )
86
    correvent.events.append(event)
87
    DBSession.add(correvent)
88
    DBSession.flush()
89
90 60d02e7f Francois POIROTTE
    usergroup = UserGroup.by_group_name(u'users_with_access')
91
    DBSession.add(DataPermission(
92
        usergroup=usergroup,
93
        group=hostgroup,
94
        access=u'r',
95
    ))
96
    DBSession.flush()
97
98
    transaction.commit()
99
    correvent = DBSession.query(CorrEvent).first()
100
    event = DBSession.query(Event).first()
101
102 072f2a16 Francois POIROTTE
    return (hostgroup, correvent.idcorrevent, event.idevent)
103 911069bc Francois POIROTTE
104 072f2a16 Francois POIROTTE
class TestDetailsPlugin(TestController):
105 911069bc Francois POIROTTE
    """Teste le dialogue pour l'accès aux historiques."""
106 60d02e7f Francois POIROTTE
    def setUp(self):
107
        super(TestDetailsPlugin, self).setUp()
108
        perm = Permission.by_permission_name(u'vigiboard-access')
109
110
        user = User(
111
            user_name=u'access',
112
            fullname=u'',
113
            email=u'user.has@access',
114
        )
115
        usergroup = UserGroup(
116
            group_name=u'users_with_access',
117
        )
118
        usergroup.permissions.append(perm)
119
        user.usergroups.append(usergroup)
120
        DBSession.add(user)
121
        DBSession.add(usergroup)
122
        DBSession.flush()
123
124
        user = User(
125
            user_name=u'no_access',
126
            fullname=u'',
127
            email=u'user.has.no@access',
128
        )
129
        usergroup = UserGroup(
130
            group_name=u'users_without_access',
131
        )
132
        usergroup.permissions.append(perm)
133
        user.usergroups.append(usergroup)
134
        DBSession.add(user)
135
        DBSession.add(usergroup)
136
        DBSession.flush()
137
138
        transaction.commit()
139 911069bc Francois POIROTTE
140 072f2a16 Francois POIROTTE
    def test_details_plugin_LLS_alert_when_allowed(self):
141
        """Dialogue des détails avec un LLS et les bons droits."""
142
        hostgroup, idcorrevent, idcause = insert_deps(True)
143 911069bc Francois POIROTTE
144 cf3c2494 Vincent QUEMENER
        response = self.app.post('/plugin_json', {
145 15b98053 Francois POIROTTE
                'idcorrevent': idcorrevent,
146 072f2a16 Francois POIROTTE
                'plugin_name': 'details',
147 60d02e7f Francois POIROTTE
            }, extra_environ={'REMOTE_USER': 'access'})
148 911069bc Francois POIROTTE
        json = response.json
149
150
        # Le contenu de "eventdetails" varie facilement.
151
        # On le teste séparément.
152
        json.pop('eventdetails', None)
153
        assert_true('eventdetails' in response.json)
154
155
        assert_equal(json, {
156
            "idcorrevent": idcorrevent,
157 072f2a16 Francois POIROTTE
            "idcause": idcause,
158 911069bc Francois POIROTTE
            "service": "baz",
159
            "peak_state": "WARNING",
160
            "current_state": "WARNING",
161
            "host": "bar",
162
            "initial_state": "WARNING"
163
        })
164
165 072f2a16 Francois POIROTTE
    def test_details_plugin_host_alert_when_allowed(self):
166
        """Dialogue des détails avec un hôte et les bons droits."""
167
        hostgroup, idcorrevent, idcause = insert_deps(False)
168 911069bc Francois POIROTTE
169 cf3c2494 Vincent QUEMENER
        response = self.app.post('/plugin_json', {
170 15b98053 Francois POIROTTE
                'idcorrevent': idcorrevent,
171 072f2a16 Francois POIROTTE
                'plugin_name': 'details',
172 60d02e7f Francois POIROTTE
            }, extra_environ={'REMOTE_USER': 'access'})
173 911069bc Francois POIROTTE
        json = response.json
174
175
        # Le contenu de "eventdetails" varie facilement.
176
        # On le teste séparément.
177
        json.pop('eventdetails', None)
178
        assert_true('eventdetails' in response.json)
179
180
        assert_equal(json, {
181
            "idcorrevent": idcorrevent,
182 072f2a16 Francois POIROTTE
            "idcause": idcause,
183 911069bc Francois POIROTTE
            "service": None,
184
            "peak_state": "WARNING",
185
            "current_state": "WARNING",
186
            "host": "bar",
187
            "initial_state": "WARNING"
188
        })
189
190
191 072f2a16 Francois POIROTTE
    def test_details_plugin_LLS_when_forbidden(self):
192
        """Dialogue des détails avec un LLS et des droits insuffisants."""
193 911069bc Francois POIROTTE
        idcorrevent = insert_deps(True)[1]
194
195 072f2a16 Francois POIROTTE
        # Le contrôleur renvoie une erreur 404 (HTTPNotFound)
196
        # lorsque l'utilisateur n'a pas les permissions nécessaires sur
197
        # les données ou qu'aucun événement correspondant n'est trouvé.
198 cf3c2494 Vincent QUEMENER
        self.app.post('/plugin_json', {
199 15b98053 Francois POIROTTE
                'idcorrevent': idcorrevent,
200 072f2a16 Francois POIROTTE
                'plugin_name': 'details',
201 60d02e7f Francois POIROTTE
            }, extra_environ={'REMOTE_USER': 'no_access'},
202 072f2a16 Francois POIROTTE
            status=404)
203 911069bc Francois POIROTTE
204 072f2a16 Francois POIROTTE
    def test_details_plugin_host_when_forbidden(self):
205
        """Dialogue des détails avec un hôte et des droits insuffisants."""
206 911069bc Francois POIROTTE
        idcorrevent = insert_deps(False)[1]
207
208 072f2a16 Francois POIROTTE
        # Le contrôleur renvoie une erreur 404 (HTTPNotFound)
209
        # lorsque l'utilisateur n'a pas les permissions nécessaires sur
210
        # les données ou qu'aucun événement correspondant n'est trouvé.
211 cf3c2494 Vincent QUEMENER
        self.app.post('/plugin_json', {
212 15b98053 Francois POIROTTE
                'idcorrevent': idcorrevent,
213 072f2a16 Francois POIROTTE
                'plugin_name': 'details',
214 60d02e7f Francois POIROTTE
            }, extra_environ={'REMOTE_USER': 'no_access'},
215 072f2a16 Francois POIROTTE
            status=404)
216
217
    def test_details_plugin_LLS_anonymous(self):
218
        """Dialogue des détails avec un LLS et en anonyme."""
219
        idcorrevent = insert_deps(True)[1]
220
221
        # Le contrôleur renvoie une erreur 401 (HTTPUnauthorized)
222
        # lorsque l'utilisateur n'est pas authentifié.
223 cf3c2494 Vincent QUEMENER
        self.app.post('/plugin_json', {
224 072f2a16 Francois POIROTTE
                'idcorrevent': idcorrevent,
225
                'plugin_name': 'details',
226
            }, status=401)
227
228
    def test_details_plugin_host_anonymous(self):
229
        """Dialogue des détails avec un hôte et en anonyme."""
230
        idcorrevent = insert_deps(False)[1]
231
232
        # Le contrôleur renvoie une erreur 401 (HTTPUnauthorized)
233
        # lorsque l'utilisateur n'est pas authentifié.
234 cf3c2494 Vincent QUEMENER
        self.app.post('/plugin_json', {
235 072f2a16 Francois POIROTTE
                'idcorrevent': idcorrevent,
236
                'plugin_name': 'details',
237
            }, status=401)