Project

General

Profile

Statistics
| Branch: | Tag: | Revision:

vigiboard / vigiboard / tests / functional / plugins / test_details_plugin.py @ 0dcb87f7

History | View | Annotate | Download (7.76 KB)

1
# -*- 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
from vigilo.models.session import DBSession
12
from vigilo.models.tables import SupItemGroup, User, UserGroup, \
13
                            Permission, DataPermission, StateName, \
14
                            LowLevelService, Event, CorrEvent, Host
15
from vigilo.models.tables.grouphierarchy import GroupHierarchy
16

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

21
    @param return_service: Indique si les événements générés
22
        concernent un hôte (False) ou un service de bas niveau (True).
23
    @type return_service: C{bool}
24
    @return: Renvoie un tuple avec le groupe d'hôte créé,
25
        l'identifiant du L{CorrEvent} généré et enfin,
26
        l'identifiant de l'L{Event} généré.
27
    @rtype: C{tuple}
28
    """
29
    timestamp = datetime.now()
30

    
31
    hostgroup = SupItemGroup(name=u'foo')
32
    DBSession.add(hostgroup)
33

    
34
    DBSession.add(GroupHierarchy(
35
        parent=hostgroup,
36
        child=hostgroup,
37
        hops=0,
38
    ))
39

    
40
    host = Host(
41
        name=u'bar',
42
        checkhostcmd=u'',
43
        description=u'',
44
        hosttpl=u'',
45
        address=u'127.0.0.1',
46
        snmpport=42,
47
        snmpcommunity=u'public',
48
        snmpversion=u'3',
49
        weight=42,
50
    )
51
    DBSession.add(host)
52
    DBSession.flush()
53

    
54
    hostgroup.supitems.append(host)
55
    DBSession.flush()
56

    
57
    servicegroup = SupItemGroup(name=u'bar')
58
    DBSession.add(servicegroup)
59

    
60
    DBSession.add(GroupHierarchy(
61
        parent=servicegroup,
62
        child=servicegroup,
63
        hops=0,
64
    ))
65

    
66
    service = LowLevelService(
67
        host=host,
68
        command=u'',
69
        weight=42,
70
        servicename=u'baz',
71
        op_dep=u'&',
72
    )
73
    DBSession.add(service)
74
    DBSession.flush()
75

    
76
    servicegroup.supitems.append(service)
77
    DBSession.flush()
78

    
79
    event = Event(
80
        timestamp=timestamp,
81
        current_state=StateName.statename_to_value(u'WARNING'),
82
        message=u'Hello world',
83
    )
84
    if return_service:
85
        event.supitem = service
86
    else:
87
        event.supitem = host
88
    DBSession.add(event)
89
    DBSession.flush()
90

    
91
    correvent = CorrEvent(
92
        impact=42,
93
        priority=42,
94
        trouble_ticket=None,
95
        status=u'None',
96
        occurrence=42,
97
        timestamp_active=timestamp,
98
        cause=event,
99
    )
100
    correvent.events.append(event)
101
    DBSession.add(correvent)
102
    DBSession.flush()
103

    
104
    usergroup = UserGroup.by_group_name(u'users_with_access')
105
    DBSession.add(DataPermission(
106
        usergroup=usergroup,
107
        group=hostgroup,
108
        access=u'r',
109
    ))
110
    DBSession.flush()
111

    
112
    transaction.commit()
113
    correvent = DBSession.query(CorrEvent).first()
114
    event = DBSession.query(Event).first()
115

    
116
    return (hostgroup, correvent.idcorrevent, event.idevent)
117

    
118
class TestDetailsPlugin(TestController):
119
    """Teste le dialogue pour l'accès aux historiques."""
120
    def setUp(self):
121
        super(TestDetailsPlugin, self).setUp()
122
        perm = Permission.by_permission_name(u'vigiboard-access')
123

    
124
        user = User(
125
            user_name=u'access',
126
            fullname=u'',
127
            email=u'user.has@access',
128
        )
129
        usergroup = UserGroup(
130
            group_name=u'users_with_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
        user = User(
139
            user_name=u'no_access',
140
            fullname=u'',
141
            email=u'user.has.no@access',
142
        )
143
        usergroup = UserGroup(
144
            group_name=u'users_without_access',
145
        )
146
        usergroup.permissions.append(perm)
147
        user.usergroups.append(usergroup)
148
        DBSession.add(user)
149
        DBSession.add(usergroup)
150
        DBSession.flush()
151

    
152
        transaction.commit()
153

    
154
    def test_details_plugin_LLS_alert_when_allowed(self):
155
        """Dialogue des détails avec un LLS et les bons droits."""
156
        hostgroup, idcorrevent, idcause = insert_deps(True)
157

    
158
        response = self.app.post('/get_plugin_value', {
159
                'idcorrevent': idcorrevent,
160
                'plugin_name': 'details',
161
            }, extra_environ={'REMOTE_USER': 'access'})
162
        json = response.json
163

    
164
        # Le contenu de "eventdetails" varie facilement.
165
        # On le teste séparément.
166
        json.pop('eventdetails', None)
167
        assert_true('eventdetails' in response.json)
168

    
169
        assert_equal(json, {
170
            "idcorrevent": idcorrevent,
171
            "idcause": idcause,
172
            "service": "baz",
173
            "peak_state": "WARNING",
174
            "current_state": "WARNING",
175
            "host": "bar",
176
            "initial_state": "WARNING"
177
        })
178

    
179
    def test_details_plugin_host_alert_when_allowed(self):
180
        """Dialogue des détails avec un hôte et les bons droits."""
181
        hostgroup, idcorrevent, idcause = insert_deps(False)
182

    
183
        response = self.app.post('/get_plugin_value', {
184
                'idcorrevent': idcorrevent,
185
                'plugin_name': 'details',
186
            }, extra_environ={'REMOTE_USER': 'access'})
187
        json = response.json
188

    
189
        # Le contenu de "eventdetails" varie facilement.
190
        # On le teste séparément.
191
        json.pop('eventdetails', None)
192
        assert_true('eventdetails' in response.json)
193

    
194
        assert_equal(json, {
195
            "idcorrevent": idcorrevent,
196
            "idcause": idcause,
197
            "service": None,
198
            "peak_state": "WARNING",
199
            "current_state": "WARNING",
200
            "host": "bar",
201
            "initial_state": "WARNING"
202
        })
203

    
204

    
205
    def test_details_plugin_LLS_when_forbidden(self):
206
        """Dialogue des détails avec un LLS et des droits insuffisants."""
207
        idcorrevent = insert_deps(True)[1]
208

    
209
        # Le contrôleur renvoie une erreur 404 (HTTPNotFound)
210
        # lorsque l'utilisateur n'a pas les permissions nécessaires sur
211
        # les données ou qu'aucun événement correspondant n'est trouvé.
212
        self.app.post('/get_plugin_value', {
213
                'idcorrevent': idcorrevent,
214
                'plugin_name': 'details',
215
            }, extra_environ={'REMOTE_USER': 'no_access'},
216
            status=404)
217

    
218
    def test_details_plugin_host_when_forbidden(self):
219
        """Dialogue des détails avec un hôte et des droits insuffisants."""
220
        idcorrevent = insert_deps(False)[1]
221

    
222
        # Le contrôleur renvoie une erreur 404 (HTTPNotFound)
223
        # lorsque l'utilisateur n'a pas les permissions nécessaires sur
224
        # les données ou qu'aucun événement correspondant n'est trouvé.
225
        self.app.post('/get_plugin_value', {
226
                'idcorrevent': idcorrevent,
227
                'plugin_name': 'details',
228
            }, extra_environ={'REMOTE_USER': 'no_access'},
229
            status=404)
230

    
231
    def test_details_plugin_LLS_anonymous(self):
232
        """Dialogue des détails avec un LLS et en anonyme."""
233
        idcorrevent = insert_deps(True)[1]
234

    
235
        # Le contrôleur renvoie une erreur 401 (HTTPUnauthorized)
236
        # lorsque l'utilisateur n'est pas authentifié.
237
        self.app.post('/get_plugin_value', {
238
                'idcorrevent': idcorrevent,
239
                'plugin_name': 'details',
240
            }, status=401)
241

    
242
    def test_details_plugin_host_anonymous(self):
243
        """Dialogue des détails avec un hôte et en anonyme."""
244
        idcorrevent = insert_deps(False)[1]
245

    
246
        # Le contrôleur renvoie une erreur 401 (HTTPUnauthorized)
247
        # lorsque l'utilisateur n'est pas authentifié.
248
        self.app.post('/get_plugin_value', {
249
                'idcorrevent': idcorrevent,
250
                'plugin_name': 'details',
251
            }, status=401)
252