vigiboard / vigiboard / tests / functional / test_history_table.py @ c25a3200
History | View | Annotate | Download (7.34 KB)
1 | 072f2a16 | Francois POIROTTE | # -*- coding: utf-8 -*-
|
---|---|---|---|
2 | # vim:set expandtab tabstop=4 shiftwidth=4:
|
||
3 | c25a3200 | Francois POIROTTE | # Copyright (C) 2006-2020 CS GROUP – France
|
4 | b373a5de | Aurelien BOMPARD | # License: GNU GPL v2 <http://www.gnu.org/licenses/gpl-2.0.html>
|
5 | |||
6 | 072f2a16 | Francois POIROTTE | """
|
7 | Vérifie que la page qui affiche l'historique des actions sur un événement
|
||
8 | brut fonctionne correctement.
|
||
9 | """
|
||
10 | |||
11 | from nose.tools import assert_true, assert_equal |
||
12 | from datetime import datetime |
||
13 | import transaction |
||
14 | |||
15 | e7e3d45e | Francois POIROTTE | from vigilo.models.session import DBSession |
16 | 9a05a743 | Francois POIROTTE | from vigilo.models.demo import functions |
17 | 8b2edebe | Aurelien BOMPARD | from vigilo.models.tables import EventHistory, Permission, UserGroup, \ |
18 | SupItemGroup, Permission, DataPermission, User |
||
19 | 072f2a16 | Francois POIROTTE | from vigiboard.tests import TestController |
20 | |||
21 | def populate_DB(): |
||
22 | """ Peuple la base de données. """
|
||
23 | # On ajoute un groupe d'hôtes et un groupe de services.
|
||
24 | 03059edd | Francois POIROTTE | supitemmanagers = SupItemGroup(name=u'managersgroup', parent=None) |
25 | 0bd9c069 | Francois POIROTTE | DBSession.add(supitemmanagers) |
26 | DBSession.flush() |
||
27 | 072f2a16 | Francois POIROTTE | |
28 | 60d02e7f | Francois POIROTTE | usergroup = UserGroup.by_group_name(u'users_with_access')
|
29 | DBSession.add(DataPermission( |
||
30 | group=supitemmanagers, |
||
31 | usergroup=usergroup, |
||
32 | access=u'r',
|
||
33 | )) |
||
34 | 072f2a16 | Francois POIROTTE | DBSession.flush() |
35 | |||
36 | # On crée un hôte de test, et on l'ajoute au groupe d'hôtes.
|
||
37 | 9a05a743 | Francois POIROTTE | managerhost = functions.add_host(u'managerhost')
|
38 | 24d74687 | Francois POIROTTE | supitemmanagers.supitems.append(managerhost) |
39 | 072f2a16 | Francois POIROTTE | DBSession.flush() |
40 | |||
41 | # On crée un services de bas niveau, et on l'ajoute au groupe de services.
|
||
42 | 9a05a743 | Francois POIROTTE | managerservice = functions.add_lowlevelservice( |
43 | managerhost, u'managerservice')
|
||
44 | 24d74687 | Francois POIROTTE | supitemmanagers.supitems.append(managerservice) |
45 | 072f2a16 | Francois POIROTTE | DBSession.flush() |
46 | 03059edd | Francois POIROTTE | |
47 | 072f2a16 | Francois POIROTTE | return (managerhost, managerservice)
|
48 | |||
49 | def add_correvent_caused_by(supitem): |
||
50 | """
|
||
51 | 03059edd | Francois POIROTTE | Ajoute dans la base de données un évènement corrélé causé
|
52 | 072f2a16 | Francois POIROTTE | par un incident survenu sur l'item passé en paramètre.
|
53 | Génère un historique pour les tests.
|
||
54 | """
|
||
55 | |||
56 | 9a05a743 | Francois POIROTTE | # Ajout d'un événement et de ses entrées dans l'historique.
|
57 | event = functions.add_event(supitem, u'WARNING', u'foo') |
||
58 | 072f2a16 | Francois POIROTTE | DBSession.add(EventHistory( |
59 | type_action=u'Nagios update state',
|
||
60 | 03059edd | Francois POIROTTE | idevent=event.idevent, |
61 | 1c5486c7 | Francois POIROTTE | timestamp=datetime.utcnow())) |
62 | 072f2a16 | Francois POIROTTE | DBSession.add(EventHistory( |
63 | type_action=u'Acknowlegement change state',
|
||
64 | 03059edd | Francois POIROTTE | idevent=event.idevent, |
65 | 1c5486c7 | Francois POIROTTE | timestamp=datetime.utcnow())) |
66 | 072f2a16 | Francois POIROTTE | DBSession.flush() |
67 | |||
68 | 8b2edebe | Aurelien BOMPARD | functions.add_correvent([event]) |
69 | 072f2a16 | Francois POIROTTE | return event.idevent
|
70 | 03059edd | Francois POIROTTE | |
71 | 072f2a16 | Francois POIROTTE | |
72 | class TestHistoryTable(TestController): |
||
73 | """
|
||
74 | 0c8b0e15 | Francois POIROTTE | Teste la table qui affiche l'historique des actions
|
75 | sur un événement brut.
|
||
76 | 072f2a16 | Francois POIROTTE | """
|
77 | 60d02e7f | Francois POIROTTE | def setUp(self): |
78 | super(TestHistoryTable, self).setUp() |
||
79 | perm = Permission.by_permission_name(u'vigiboard-access')
|
||
80 | |||
81 | user = User( |
||
82 | user_name=u'access',
|
||
83 | fullname=u'',
|
||
84 | email=u'user.has@access',
|
||
85 | ) |
||
86 | 03059edd | Francois POIROTTE | usergroup = UserGroup(group_name=u'users_with_access')
|
87 | 60d02e7f | Francois POIROTTE | usergroup.permissions.append(perm) |
88 | user.usergroups.append(usergroup) |
||
89 | DBSession.add(user) |
||
90 | DBSession.add(usergroup) |
||
91 | DBSession.flush() |
||
92 | |||
93 | user = User( |
||
94 | user_name=u'limited_access',
|
||
95 | fullname=u'',
|
||
96 | email=u'user.has.no@access',
|
||
97 | ) |
||
98 | 03059edd | Francois POIROTTE | usergroup = UserGroup(group_name=u'users_with_limited_access')
|
99 | 60d02e7f | Francois POIROTTE | usergroup.permissions.append(perm) |
100 | user.usergroups.append(usergroup) |
||
101 | DBSession.add(user) |
||
102 | DBSession.add(usergroup) |
||
103 | DBSession.flush() |
||
104 | |||
105 | 072f2a16 | Francois POIROTTE | |
106 | def test_cause_host_history(self): |
||
107 | """Historique de la cause d'un événement corrélé sur un hôte."""
|
||
108 | |||
109 | # On peuple la BDD avec un hôte, un service de bas niveau,
|
||
110 | # et un groupe d'hôtes et de services associés à ces items.
|
||
111 | 8b2edebe | Aurelien BOMPARD | (managerhost, _managerservice) = populate_DB() |
112 | 03059edd | Francois POIROTTE | |
113 | 072f2a16 | Francois POIROTTE | # On ajoute un évènement corrélé causé par l'hôte
|
114 | idevent = add_correvent_caused_by(managerhost) |
||
115 | transaction.commit() |
||
116 | |||
117 | # L'utilisateur n'est pas authentifié.
|
||
118 | # On s'attend à ce qu'une erreur 401 soit renvoyée,
|
||
119 | # demandant à l'utilisateur de s'authentifier.
|
||
120 | response = self.app.get(
|
||
121 | '/event/%d' % idevent,
|
||
122 | status = 401)
|
||
123 | |||
124 | # L'utilisateur N'A PAS les bonnes permissions.
|
||
125 | 60d02e7f | Francois POIROTTE | environ = {'REMOTE_USER': 'limited_access'} |
126 | 03059edd | Francois POIROTTE | |
127 | 072f2a16 | Francois POIROTTE | # On s'attend à ce qu'une erreur 302 soit renvoyée, et à
|
128 | # ce qu'un message d'erreur précise à l'utilisateur qu'il
|
||
129 | # n'a pas accès aux informations concernant cet évènement.
|
||
130 | response = self.app.get(
|
||
131 | '/event/%d' % idevent,
|
||
132 | 03059edd | Francois POIROTTE | status = 302,
|
133 | 072f2a16 | Francois POIROTTE | extra_environ = environ) |
134 | |||
135 | # On suit la redirection.
|
||
136 | response = response.follow(status = 200, extra_environ = environ)
|
||
137 | assert_true(len(response.lxml.xpath(
|
||
138 | '//div[@id="flash"]/div[@class="error"]')))
|
||
139 | |||
140 | # L'utilisateur a les bonnes permissions.
|
||
141 | 60d02e7f | Francois POIROTTE | environ = {'REMOTE_USER': 'access'} |
142 | 03059edd | Francois POIROTTE | |
143 | 072f2a16 | Francois POIROTTE | # On s'attend à ce que le statut de la requête soit 200.
|
144 | response = self.app.get(
|
||
145 | '/event/%d' % idevent,
|
||
146 | 03059edd | Francois POIROTTE | status = 200,
|
147 | 072f2a16 | Francois POIROTTE | extra_environ = environ) |
148 | |||
149 | # Il doit y avoir 2 lignes de résultats.
|
||
150 | 9211ef65 | Francois POIROTTE | # NB: la requête XPath est approchante, car XPath 1.0 ne permet pas
|
151 | # de rechercher directement une valeur dans une liste. Elle devrait
|
||
152 | # néanmoins suffire pour les besoins des tests.
|
||
153 | df25ac35 | Francois POIROTTE | rows = response.lxml.xpath( |
154 | '//table[contains(@class, "vigitable")]/tbody/tr')
|
||
155 | 072f2a16 | Francois POIROTTE | assert_equal(len(rows), 2) |
156 | |||
157 | def test_cause_service_history(self): |
||
158 | """Historique de la cause d'un événement corrélé sur un LLS."""
|
||
159 | |||
160 | # On peuple la BDD avec un hôte, un service de bas niveau,
|
||
161 | # et un groupe d'hôtes et de services associés à ces items.
|
||
162 | 8b2edebe | Aurelien BOMPARD | (_managerhost, managerservice) = populate_DB() |
163 | 03059edd | Francois POIROTTE | |
164 | 072f2a16 | Francois POIROTTE | # On ajoute un évènement corrélé causé par le service
|
165 | idevent = add_correvent_caused_by(managerservice) |
||
166 | 03059edd | Francois POIROTTE | |
167 | 072f2a16 | Francois POIROTTE | transaction.commit() |
168 | |||
169 | # L'utilisateur n'est pas authentifié.
|
||
170 | # On s'attend à ce qu'une erreur 401 soit renvoyée,
|
||
171 | # demandant à l'utilisateur de s'authentifier.
|
||
172 | response = self.app.get(
|
||
173 | '/event/%d' % idevent,
|
||
174 | status = 401)
|
||
175 | |||
176 | # L'utilisateur N'A PAS les bonnes permissions.
|
||
177 | 60d02e7f | Francois POIROTTE | environ = {'REMOTE_USER': 'limited_access'} |
178 | 03059edd | Francois POIROTTE | |
179 | 072f2a16 | Francois POIROTTE | # On s'attend à ce qu'une erreur 302 soit renvoyée, et à
|
180 | # ce qu'un message d'erreur précise à l'utilisateur qu'il
|
||
181 | # n'a pas accès aux informations concernant cet évènement.
|
||
182 | response = self.app.get(
|
||
183 | '/event/%d' % idevent,
|
||
184 | 03059edd | Francois POIROTTE | status = 302,
|
185 | 072f2a16 | Francois POIROTTE | extra_environ = environ) |
186 | |||
187 | # On suit la redirection.
|
||
188 | response = response.follow(status = 200, extra_environ = environ)
|
||
189 | assert_true(len(response.lxml.xpath(
|
||
190 | '//div[@id="flash"]/div[@class="error"]')))
|
||
191 | |||
192 | # L'utilisateur a les bonnes permissions.
|
||
193 | 60d02e7f | Francois POIROTTE | environ = {'REMOTE_USER': 'access'} |
194 | 03059edd | Francois POIROTTE | |
195 | 072f2a16 | Francois POIROTTE | # On s'attend à ce que le statut de la requête soit 200.
|
196 | response = self.app.get(
|
||
197 | '/event/%d' % idevent,
|
||
198 | 03059edd | Francois POIROTTE | status = 200,
|
199 | 072f2a16 | Francois POIROTTE | extra_environ = environ) |
200 | |||
201 | # Il doit y avoir 2 lignes de résultats.
|
||
202 | 9211ef65 | Francois POIROTTE | # NB: la requête XPath est approchante, car XPath 1.0 ne permet pas
|
203 | # de rechercher directement une valeur dans une liste. Elle devrait
|
||
204 | # néanmoins suffire pour les besoins des tests.
|
||
205 | df25ac35 | Francois POIROTTE | rows = response.lxml.xpath( |
206 | '//table[contains(@class,"vigitable")]/tbody/tr')
|
||
207 | 072f2a16 | Francois POIROTTE | assert_equal(len(rows), 2) |