Project

General

Profile

Statistics
| Branch: | Tag: | Revision:

vigigraph / vigigraph / tests / functional / test_host_selection_form.py @ 3e3db819

History | View | Annotate | Download (20.6 KB)

1
# -*- coding: utf-8 -*-
2
"""
3
Suite de tests de l'arbre de sélection des hôtes et groupes d'hôtes.
4
"""
5
import transaction
6

    
7
from vigigraph.tests import TestController
8
from vigilo.models.session import DBSession
9
from vigilo.models.tables import Host, SupItemGroup, Permission
10
from vigilo.models.demo.functions import add_supitemgroup, \
11
    add_host, add_host2group, add_usergroup, add_user, \
12
    add_supitemgrouppermission, add_usergroup_permission
13

    
14

    
15
def populateDB():
16
    """
17
    Peuple la base de données en ajoutant :
18
     - 3 groupes d'hôtes ;
19
     - 3 hôtes ;
20
     - 3 utilisateurs.
21
    Affecte les permissions nécessaires aux utilisateurs en vue des tests.
22
    Retourne les 3 hôtes créés.
23

24
    @return: Tuple contenant les trois hôtes.
25
    @rtype:  C{tuple} of C{vigilo.models.tables.Host}
26
    """
27

    
28
    # Ajout d'un groupe d'hôtes principal
29
    mainhostgroup = add_supitemgroup(u'mhg', None)
30

    
31
    # Ajout d'un premier groupe d'hôtes de second niveau
32
    hostgroup1 = add_supitemgroup(u'hg1', mainhostgroup)
33

    
34
    # Ajout d'un second groupe d'hôtes de second niveau
35
    hostgroup2 = add_supitemgroup(u'hg2', mainhostgroup)
36

    
37
    # Ajout de trois hôtes
38
    host1 = add_host(u'host1')
39
    host2 = add_host(u'host2')
40
    host3 = add_host(u'host3')
41

    
42
    # Ajout du premier hôte dans le groupe d'hôtes principal.
43
    add_host2group(host1, mainhostgroup)
44
    # Ajout du deuxième hôte dans le premier
45
    # groupe d'hôtes de second niveau.
46
    add_host2group(host2, hostgroup1)
47
    # Ajout du troisième hôte dans le second
48
    # groupe d'hôtes de second niveau.
49
    add_host2group(host3, hostgroup2)
50

    
51
    # Ajout de trois groupes d'utilisateurs
52
    poweruser_group = add_usergroup(u'powerusers')
53
    user_group = add_usergroup(u'users')
54
    visitor_group = add_usergroup(u'visitor')
55

    
56
    # Ajout de trois utilisateurs
57
    add_user(u'poweruser', u'some.power@us.er',
58
        u'Power User', u'poweruserpass', u'powerusers')
59
    add_user(u'user', u'some.random@us.er',
60
        u'User', u'userpass', u'users')
61
    add_user(u'visitor', u'some.visiting@us.er',
62
        u'', u'visitorpass', u'visitor')
63

    
64
    # Ajout des permissions sur le groupe d'hôtes
65
    # principal pour le premier groupe d'utilisateurs
66
    add_supitemgrouppermission(mainhostgroup, poweruser_group)
67

    
68
    # Ajout des permissions sur le premier groupe d'hôtes
69
    # secondaire pour le second groupe d'utilisateurs
70
    add_supitemgrouppermission(hostgroup1, user_group)
71

    
72
    # Ajout de la permission 'vigigraph-access' aux groupes d'utilisateurs
73
    perm = Permission.by_permission_name(u'vigigraph-access')
74
    add_usergroup_permission(poweruser_group, perm)
75
    add_usergroup_permission(user_group, perm)
76
    add_usergroup_permission(visitor_group, perm)
77

    
78
    return (host1, host2, host3)
79

    
80

    
81
class TestHostTree(TestController):
82
    """
83
    Teste l'arbre de sélection des hôtes
84
    et groupes d'hôtes de Vigigraph.
85
    """
86

    
87
    def setUp(self):
88
        """Préparation de la base de données de tests."""
89

    
90
        # Initialisation de la base
91
        super(TestHostTree, self).setUp()
92

    
93
        # Ajout de données de tests dans la base
94
        populateDB()
95

    
96
        # Validation des ajouts dans la base
97
        DBSession.flush()
98
        transaction.commit()
99

    
100
##### Premier onglet déroulant du formulaire #####
101

    
102
    def test_get_root_host_groups_as_manager(self):
103
        """
104
        Récupération des groupes d'hôtes racines en tant que manager
105

106
        L'utilisateur "manager" appartient au groupe "managers",
107
        qui a accès à tout et doit donc pouvoir lister tous
108
        les groupes racines.
109
        """
110
        # Récupération du groupe d'hôtes 'mhg' dans la base de données
111
        mainhostgroup = DBSession.query(SupItemGroup).filter(
112
            SupItemGroup.name == u'mhg').first()
113

    
114
        # Récupération des groupes d'hôtes principaux
115
        # accessibles à l'utilisateur 'manager'
116
        response = self.app.post(
117
            '/rpc/hosttree', {
118
            }, extra_environ={'REMOTE_USER': 'manager'})
119
        json = response.json
120

    
121
        # On s'assure que la liste de groupes
122
        # d'hôtes retournée contient bien 'mhg'
123
        self.assertEqual(
124
            json, {
125
                'items': [], 'groups': [{
126
                    'id': mainhostgroup.idgroup,
127
                    'name': mainhostgroup.name,
128
                    'type': 'group',
129
                }]
130
            }
131
        )
132

    
133
    def test_get_main_host_groups_when_directly_allowed(self):
134
        """
135
        Récupération des groupes d'hôtes racines avec permissions directes
136

137
        L'utilisateur "poweruser" a les permissions sur le
138
        groupe racine "mhg" et peut donc le lister.
139
        """
140
        # Récupération du groupe d'hôtes 'mhg' dans la base de données
141
        mainhostgroup = DBSession.query(SupItemGroup).filter(
142
            SupItemGroup.name == u'mhg').first()
143

    
144
        # Récupération des groupes d'hôtes principaux
145
        # accessibles à l'utilisateur 'poweruser'
146
        response = self.app.post(
147
            '/rpc/hosttree', {
148
            }, extra_environ={'REMOTE_USER': 'poweruser'})
149
        json = response.json
150

    
151
        # On s'assure que la liste de groupes
152
        # d'hôtes retournée contient bien 'mhg'
153
        self.assertEqual(
154
            json, {
155
                'items': [], 'groups': [{
156
                    'id': mainhostgroup.idgroup,
157
                    'name': mainhostgroup.name,
158
                    'type': 'group',
159
                }]
160
            }
161
        )
162

    
163
    def test_get_root_host_groups_for_children(self):
164
        """
165
        Récupération des groupes d'hôtes racines pour un sous-groupe
166

167
        L'utilisateur "user" n'a pas les permissions sur "mhg",
168
        mais il a accès au sous-groupe "hg1". Il doit pouvoir
169
        lister le groupe racine "mhg" pour pouvoir accéder à "hg1".
170
        """
171
        # Récupération du groupe d'hôtes 'mhg' dans la base de données
172
        mainhostgroup = DBSession.query(SupItemGroup).filter(
173
            SupItemGroup.name == u'mhg').first()
174

    
175
        # Récupération des groupes d'hôtes principaux
176
        # accessibles à l'utilisateur 'user'
177
        response = self.app.post(
178
            '/rpc/hosttree', {
179
            }, extra_environ={'REMOTE_USER': 'user'})
180
        json = response.json
181

    
182
        # On s'assure que la liste de groupes
183
        # d'hôtes retournée contient bien 'mhg'
184
        self.assertEqual(
185
            json, {
186
                'items': [], 'groups': [{
187
                    'id': mainhostgroup.idgroup,
188
                    'name': mainhostgroup.name,
189
                    'type': 'group',
190
                }]
191
            }
192
        )
193

    
194
    def test_get_main_host_groups_when_not_allowed(self):
195
        """
196
        Récupération des groupes d'hôtes principaux sans les bons droits
197

198
        L'utilisateur "visitor" n'a accès à rien et ne doit donc
199
        pas pouvoir lister le groupe racine "mhg".
200
        """
201

    
202
        # Récupération des groupes d'hôtes principaux
203
        # accessibles à l'utilisateur 'visitor'
204
        response = self.app.post(
205
            '/rpc/hosttree', {
206
            }, extra_environ={'REMOTE_USER': 'visitor'})
207
        json = response.json
208

    
209
        # On s'assure que la liste de groupes d'hôtes retournée est bien vide
210
        self.assertEqual(
211
            json, {'items': [], 'groups': []}
212
        )
213

    
214
    def test_get_main_host_groups_as_anonymous(self):
215
        """
216
        Récupération des groupes d'hôtes principaux en tant qu'anonyme
217

218
        Une tentative de récupération des groupes racines
219
        sans être authentifié doit demander à l'utilisateur
220
        de s'authentifier.
221
        """
222

    
223
        # Récupération des groupes d'hôtes principaux
224
        # par un utilisateur anonyme : le contrôleur doit
225
        # retourner une erreur 401 (HTTPUnauthorized)
226
        self.app.post(
227
            '/rpc/hosttree', {
228
            }, status=401)
229

    
230
##### Deuxième onglet déroulant du formulaire #####
231

    
232
    def test_get_host_groups_when_allowed(self):
233
        """
234
        Récupération des groupes d'hôtes secondaires avec les bons droits
235
        """
236

    
237
        # Récupération du groupe d'hôtes 'mhg' dans la base de données
238
        mainhostgroup = DBSession.query(SupItemGroup).filter(
239
            SupItemGroup.name == u'mhg').first()
240

    
241
        # Récupération du groupe d'hôtes 'hg1' dans la base de données
242
        hostgroup1 = DBSession.query(SupItemGroup).filter(
243
            SupItemGroup.name == u'hg1').first()
244

    
245
        # Récupération du groupe d'hôtes 'hg2' dans la base de données
246
        hostgroup2 = DBSession.query(SupItemGroup).filter(
247
            SupItemGroup.name == u'hg2').first()
248

    
249
        # Récupération de l'hôte 'host1' dans la base de données
250
        host1 = DBSession.query(Host).filter(
251
            Host.name == u'host1').first()
252

    
253
        # Récupération des groupes d'hôtes
254
        # accessibles à l'utilisateur 'manager'
255
        response = self.app.post(
256
            '/rpc/hosttree?parent_id=%s' % (mainhostgroup.idgroup, ), {
257
            }, extra_environ={'REMOTE_USER': 'manager'})
258
        json = response.json
259

    
260
        # On s'assure que la liste de groupes d'hôtes retournée
261
        # contient bien 'No subgroup', 'hg1', et 'hg2'
262
        self.assertEqual(
263
            json, {
264
                'items': [
265
                    {'id': host1.idhost, 'name': host1.name, 'type': 'item'}
266
                ],
267
                'groups': [
268
                    {'id': hostgroup1.idgroup, 'name': hostgroup1.name, 'type': 'group'},
269
                    {'id': hostgroup2.idgroup, 'name': hostgroup2.name, 'type': 'group'},
270
                ]
271
            }
272
        )
273

    
274
        # Récupération des groupes d'hôtes
275
        # accessibles à l'utilisateur 'poweruser'
276
        response = self.app.post(
277
            '/rpc/hosttree?parent_id=%s' % (mainhostgroup.idgroup, ), {
278
            }, extra_environ={'REMOTE_USER': 'poweruser'})
279
        json = response.json
280

    
281
        # On s'assure que la liste de groupes d'hôtes retournée
282
        # contient bien 'No subgroup', 'hg1', et 'hg2'
283
        self.assertEqual(
284
            json, {
285
                'items': [
286
                    {'id': host1.idhost, 'name': host1.name, 'type': 'item'}
287
                ],
288
                'groups': [
289
                    {'id': hostgroup1.idgroup, 'name': hostgroup1.name, 'type': 'group'},
290
                    {'id': hostgroup2.idgroup, 'name': hostgroup2.name, 'type': 'group'},
291
                ]
292
            }
293
        )
294

    
295
        # Récupération des groupes d'hôtes
296
        # accessibles à l'utilisateur 'user'
297
        response = self.app.post(
298
            '/rpc/hosttree?parent_id=%s' % (mainhostgroup.idgroup, ), {
299
            }, extra_environ={'REMOTE_USER': 'user'})
300
        json = response.json
301

    
302
        # On s'assure que la liste de groupes
303
        # d'hôtes retournée contient bien 'hg1'
304
        self.assertEqual(
305
            json, {
306
                'items': [],
307
                'groups': [
308
                    {'id': hostgroup1.idgroup, 'name': hostgroup1.name, 'type': 'group'},
309
                ]
310
            }
311
        )
312

    
313
    def test_get_host_groups_when_not_allowed(self):
314
        """
315
        Récupération des groupes d'hôtes secondaires sans les bons droits
316
        """
317

    
318
        # Récupération du groupe d'hôtes 'mhg' dans la base de données
319
        mainhostgroup = DBSession.query(SupItemGroup).filter(
320
            SupItemGroup.name == u'mhg').first()
321

    
322
        # Récupération des groupes d'hôtes
323
        # accessibles à l'utilisateur 'visitor'
324
        response = self.app.post(
325
            '/rpc/hosttree?parent_id=%s' % (mainhostgroup.idgroup, ), {
326
            }, extra_environ={'REMOTE_USER': 'visitor'})
327
        json = response.json
328

    
329
        # On s'assure que la liste de groupes d'hôtes retournée est bien vide
330
        self.assertEqual(
331
            json, {'items': [], 'groups': []}
332
        )
333

    
334
    def test_get_host_groups_as_anonymous(self):
335
        """
336
        Récupération des groupes d'hôtes secondaires en tant qu'anonyme
337
        """
338

    
339
        # Récupération du groupe d'hôtes 'mhg' dans la base de données
340
        mainhostgroup = DBSession.query(SupItemGroup).filter(
341
            SupItemGroup.name == u'mhg').first()
342

    
343
        # Récupération des groupes d'hôtes par un
344
        # utilisateur anonyme : le contrôleur doit
345
        # retourner une erreur 401 (HTTPUnauthorized)
346
        self.app.post(
347
            '/rpc/hosttree?parent_id=%s' % (mainhostgroup.idgroup, ), {
348
            }, status=401)
349

    
350
    def test_get_host_groups_from_inexisting_main_group(self):
351
        """
352
        Récupération des groupes d'hôtes d'un groupe principal inexistant
353
        """
354

    
355
        # Récupération des groupes d'hôtes accessibles à l'utilisateur
356
        # 'manager' et appartenant à un groupe principal inexistant
357
        response = self.app.post(
358
            '/rpc/hosttree?parent_id=6666666', {
359
            }, extra_environ={'REMOTE_USER': 'manager'})
360
        json = response.json
361

    
362
        # On s'assure que la liste de groupes d'hôtes retournée est bien vide
363
        self.assertEqual(
364
            json, {'items': [], 'groups': []}
365
        )
366

    
367
##### Troisième onglet déroulant du formulaire #####
368

    
369
    def test_get_hosts_when_allowed(self):
370
        """
371
        Récupération des hôtes avec les bons droits
372
        """
373

    
374
        # Récupération du groupe d'hôtes 'mhg' dans la base de données
375
        mainhostgroup = DBSession.query(SupItemGroup).filter(
376
            SupItemGroup.name == u'mhg').first()
377

    
378
        # Récupération du groupe d'hôtes 'hg1' dans la base de données
379
        hostgroup1 = DBSession.query(SupItemGroup).filter(
380
            SupItemGroup.name == u'hg1').first()
381

    
382
        # Récupération du groupe d'hôtes 'hg2' dans la base de données
383
        hostgroup2 = DBSession.query(SupItemGroup).filter(
384
            SupItemGroup.name == u'hg2').first()
385

    
386
        # Récupération de l'hôte 'host1' dans la base de données
387
        host1 = DBSession.query(Host).filter(
388
            Host.name == u'host1').first()
389

    
390
        # Récupération de l'hôte 'host2' dans la base de données
391
        host2 = DBSession.query(Host).filter(
392
            Host.name == u'host2').first()
393

    
394
        # Récupération des hôtes du groupe 'mhg'
395
        # accessibles à l'utilisateur 'manager'
396
        response = self.app.post(
397
            '/rpc/hosttree?parent_id=%s' % (mainhostgroup.idgroup, ), {
398
            }, extra_environ={'REMOTE_USER': 'manager'})
399
        json = response.json
400

    
401
        # On s'assure que la liste d'hôtes retournée contient bien 'host1'
402
        self.assertEqual(
403
            json, {
404
                'items': [{'id': host1.idhost, 'name': host1.name, 'type': 'item'}],
405
                'groups': [
406
                    {'id': hostgroup1.idgroup, 'name': hostgroup1.name, 'type': 'group'},
407
                    {'id': hostgroup2.idgroup, 'name': hostgroup2.name, 'type': 'group'}
408
                ]
409
            }
410
        )
411

    
412
        # Récupération des hôtes du groupe 'hg1'
413
        # accessibles à l'utilisateur 'manager'
414
        response = self.app.post(
415
            '/rpc/hosttree?parent_id=%s' % (hostgroup1.idgroup, ), {
416
            }, extra_environ={'REMOTE_USER': 'manager'})
417
        json = response.json
418

    
419
        # On s'assure que la liste d'hotes retournée contient bien 'host2'
420
        self.assertEqual(
421
            json, {
422
                'items': [{'id': host2.idhost, 'name': host2.name, 'type': 'item'}],
423
                'groups': []
424
            }
425
        )
426

    
427
        # Récupération des hôtes du groupe 'mhg'
428
        # accessibles à l'utilisateur 'poweruser'
429
        response = self.app.post(
430
            '/rpc/hosttree?parent_id=%s' % (mainhostgroup.idgroup, ), {
431
            }, extra_environ={'REMOTE_USER': 'poweruser'})
432
        json = response.json
433

    
434
        # On s'assure que la liste d'hôtes retournée contient bien 'host1'
435
        self.assertEqual(
436
            json, {
437
                'items': [{'id': host1.idhost, 'name': host1.name, 'type': 'item'}],
438
                'groups': [
439
                    {'id': hostgroup1.idgroup, 'name': hostgroup1.name, 'type': 'group'},
440
                    {'id': hostgroup2.idgroup, 'name': hostgroup2.name, 'type': 'group'},
441
                ]
442
            }
443
        )
444

    
445
        # Récupération des hôtes du groupe 'hg1'
446
        # accessibles à l'utilisateur 'poweruser'
447
        response = self.app.post(
448
            '/rpc/hosttree?parent_id=%s' % (hostgroup1.idgroup, ), {
449
            }, extra_environ={'REMOTE_USER': 'poweruser'})
450
        json = response.json
451

    
452
        # On s'assure que la liste d'hotes retournée contient bien 'host2'
453
        self.assertEqual(
454
            json, {
455
                'items': [{'id': host2.idhost, 'name': host2.name, 'type': 'item'}],
456
                'groups': []
457
            }
458
        )
459

    
460
        # Récupération des hôtes du groupe 'hg1'
461
        # accessibles à l'utilisateur 'user'
462
        response = self.app.post(
463
            '/rpc/hosttree?parent_id=%s' % (hostgroup1.idgroup, ), {
464
            }, extra_environ={'REMOTE_USER': 'user'})
465
        json = response.json
466

    
467
        # On s'assure que la liste d'hôtes retournée contient bien 'host2'
468
        self.assertEqual(
469
            json, {
470
                'items': [{'id': host2.idhost, 'name': host2.name, 'type': 'item'}],
471
                'groups': []
472
            }
473
        )
474

    
475
    def test_get_hosts_when_not_allowed(self):
476
        """
477
        Récupération des hôtes sans les bons droits
478
        """
479

    
480
        # Récupération du groupe d'hôtes 'mhg' dans la base de données
481
        mainhostgroup = DBSession.query(SupItemGroup).filter(
482
            SupItemGroup.name == u'mhg').first()
483

    
484
        # Récupération du groupe d'hôtes
485
        # secondaire 'hg1' dans la base de données
486
        hostgroup1 = DBSession.query(SupItemGroup).filter(
487
            SupItemGroup.name == u'hg1').first()
488

    
489
        # Récupération du groupe d'hôtes
490
        # secondaire 'hg2' dans la base de données
491
        hostgroup2 = DBSession.query(SupItemGroup).filter(
492
            SupItemGroup.name == u'hg2').first()
493

    
494
        # Récupération des hôtes du groupe 'mhg'
495
        # accessibles à l'utilisateur 'user'
496
        response = self.app.post(
497
            '/rpc/hosttree?parent_id=%s' % (mainhostgroup.idgroup, ), {
498
            }, extra_environ={'REMOTE_USER': 'user'})
499
        json = response.json
500

    
501
        # On s'assure que la liste d'hôtes retournée est vide
502
        self.assertEqual(
503
            json, {
504
                'items': [],
505
                'groups': [{'name': hostgroup1.name, 'id': hostgroup1.idgroup, 'type': 'group'}]
506
            }
507
        )
508

    
509
        # Récupération des hôtes du groupe 'hg2'
510
        # accessibles à l'utilisateur 'user'
511
        response = self.app.post(
512
            '/rpc/hosttree?parent_id=%s' % (hostgroup2.idgroup, ), {
513
            }, extra_environ={'REMOTE_USER': 'user'})
514
        json = response.json
515

    
516
        # On s'assure que la liste d'hôtes retournée est vide
517
        self.assertEqual(
518
            json, {'items': [], 'groups': []}
519
        )
520

    
521
        # Récupération des hôtes du groupe 'mhg'
522
        # accessibles à l'utilisateur 'visitor'
523
        response = self.app.post(
524
            '/rpc/hosttree?parent_id=%s' % (mainhostgroup.idgroup, ), {
525
            }, extra_environ={'REMOTE_USER': 'visitor'})
526
        json = response.json
527

    
528
        # On s'assure que la liste d'hôtes retournée est vide
529
        self.assertEqual(
530
            json, {'items': [], 'groups': []}
531
        )
532

    
533
        # Récupération des hôtes du groupe 'hg1'
534
        # accessibles à l'utilisateur 'visitor'
535
        response = self.app.post(
536
            '/rpc/hosttree?parent_id=%s' % (hostgroup1.idgroup, ), {
537
            }, extra_environ={'REMOTE_USER': 'visitor'})
538
        json = response.json
539

    
540
        # On s'assure que la liste d'hôtes retournée est vide
541
        self.assertEqual(
542
            json, {'items': [], 'groups': []}
543
        )
544

    
545
    def test_get_hosts_as_anonymous(self):
546
        """
547
        Récupération des hôtes en tant qu'anonyme
548
        """
549

    
550
        # Récupération du groupe d'hôtes 'mhg' dans la base de données
551
        mainhostgroup = DBSession.query(SupItemGroup).filter(
552
            SupItemGroup.name == u'mhg').first()
553

    
554
        # Récupération des hôtes du groupe 'mhg' par
555
        # un utilisateur anonyme : le contrôleur doit
556
        # retourner une erreur 401 (HTTPUnauthorized)
557
        self.app.post(
558
            '/rpc/hosttree?parent_id=%s' % (mainhostgroup.idgroup, ), {
559
            }, status=401)
560

    
561
    def test_get_hosts_from_inexisting_secondary_group(self):
562
        """
563
        Récupération des hôtes d'un groupe secondaire inexistant
564
        """
565

    
566
        # Récupération des hôtes accessibles à l'utilisateur
567
        # 'manager' et appartenant à un groupe secondaire inexistant
568
        response = self.app.post(
569
            '/rpc/hosttree?parent_id=6666666', {
570
            }, extra_environ={'REMOTE_USER': 'manager'})
571
        json = response.json
572

    
573
        # On s'assure que la liste retournée est vide
574
        self.assertEqual(
575
            json, {'items': [], 'groups': []}
576
        )