18574: Initial vocabulary loading support & tests.
[arvados.git] / sdk / python / tests / test_vocabulary.py
1 # Copyright (C) The Arvados Authors. All rights reserved.
2 #
3 # SPDX-License-Identifier: Apache-2.0
4
5 import arvados
6 import unittest
7 import mock
8
9 from arvados import api, vocabulary
10
11 class VocabularyTest(unittest.TestCase):
12     EXAMPLE_VOC = {
13         'tags': {
14             'IDTAGANIMALS': {
15                 'strict': False,
16                 'labels': [
17                     {'label': 'Animal'},
18                     {'label': 'Creature'},
19                 ],
20                 'values': {
21                     'IDVALANIMAL1': {
22                         'labels': [
23                             {'label': 'Human'},
24                             {'label': 'Homo sapiens'},
25                         ],
26                     },
27                     'IDVALANIMAL2': {
28                         'labels': [
29                             {'label': 'Elephant'},
30                             {'label': 'Loxodonta'},
31                         ],
32                     },
33                 },
34             },
35             'IDTAGIMPORTANCE': {
36                 'strict': True,
37                 'labels': [
38                     {'label': 'Importance'},
39                     {'label': 'Priority'},
40                 ],
41                 'values': {
42                     'IDVALIMPORTANCE1': {
43                         'labels': [
44                             {'label': 'High'},
45                             {'label': 'High priority'},
46                         ],
47                     },
48                     'IDVALIMPORTANCE2': {
49                         'labels': [
50                             {'label': 'Medium'},
51                             {'label': 'Medium priority'},
52                         ],
53                     },
54                     'IDVALIMPORTANCE3': {
55                         'labels': [
56                             {'label': 'Low'},
57                             {'label': 'Low priority'},
58                         ],
59                     },
60                 },
61             },
62         },
63     }
64
65     def perform_vocabulary_tests(self, voc):
66         self.assertEqual(voc.strict_keys, False)
67         self.assertEqual(voc.key_aliases.keys(), set(['IDTAGANIMALS', 'IDTAGIMPORTANCE']))
68
69         self.assertEqual(voc.key_aliases['IDTAGANIMALS'].strict, False)
70         self.assertEqual(set(voc.key_aliases['IDTAGANIMALS'].aliases), set(['animal', 'creature']))
71         self.assertEqual(voc.key_aliases['IDTAGANIMALS'].values.keys(), set(['IDVALANIMAL1', 'IDVALANIMAL2']))
72         self.assertEqual(voc.key_aliases['IDTAGANIMALS'].values['IDVALANIMAL1'].aliases, set(['human', 'homo sapiens']))
73
74     def test_empty_vocabulary(self):
75         voc = vocabulary.Vocabulary()
76         self.assertEqual(voc.strict_keys, False)
77         self.assertEqual(voc.key_aliases, {})
78
79     def test_load_vocabulary(self):
80         voc = vocabulary.Vocabulary(self.EXAMPLE_VOC)
81         self.perform_vocabulary_tests(voc)
82
83     @mock.patch('arvados.api')
84     def test_load_vocabulary_with_api(self, api_mock):
85         api_mock.return_value = mock.MagicMock()
86         api_mock.return_value.vocabulary.return_value = self.EXAMPLE_VOC
87
88         voc = vocabulary.load_vocabulary(arvados.api('v1'))
89         self.perform_vocabulary_tests(voc)