1
# Copyright 2014 Canonical Ltd. This software is licensed under the
2
# GNU Affero General Public License version 3 (see the file LICENSE).
4
"""Tests for the Registry"""
6
from __future__ import (
17
from maastesting.testcase import MAASTestCase
18
from mock import sentinel
19
from provisioningserver.utils.registry import (
23
from provisioningserver.utils.testing import RegistryFixture
26
class TestRegistry(MAASTestCase):
29
super(TestRegistry, self).setUp()
30
# Ensure the global registry is empty for each test run.
31
self.useFixture(RegistryFixture())
33
def test_register_and_get_item(self):
34
name = self.getUniqueString()
35
item = self.getUniqueString()
36
Registry.register_item(name, item)
37
self.assertEqual(item, Registry.get_item(name))
39
def test_register_and_unregister_item(self):
40
name = self.getUniqueString()
41
Registry.register_item(name, sentinel.item)
42
Registry.unregister_item(name)
43
self.assertIsNone(Registry.get_item(name))
44
self.assertNotIn(name, Registry)
46
def test_is_singleton_over_multiple_imports(self):
47
Registry.register_item("resource1", sentinel.resource1)
48
from provisioningserver.driver import Registry as Registry2
49
Registry2.register_item("resource2", sentinel.resource2)
50
self.assertItemsEqual(
51
[("resource1", sentinel.resource1),
52
("resource2", sentinel.resource2)],
55
def test___getitem__(self):
56
Registry.register_item("resource", sentinel.resource)
57
self.assertEqual(sentinel.resource, Registry["resource"])
59
def test___getitem__raises_KeyError_when_name_is_not_registered(self):
60
self.assertRaises(KeyError, lambda: Registry["resource"])
62
def test_get_item(self):
63
Registry.register_item("resource", sentinel.resource)
64
self.assertEqual(sentinel.resource, Registry.get_item("resource"))
66
def test_get_item_returns_default_if_value_not_present(self):
69
Registry.get_item("resource", sentinel.default))
71
def test_get_item_returns_None_default(self):
72
self.assertIsNone(Registry.get_item("resource"))
74
def test__contains__(self):
75
Registry.register_item("resource", sentinel.resource)
76
self.assertIn("resource", Registry)
78
def test_registered_items_are_stored_separately_by_registry(self):
80
class RegistryOne(Registry):
81
"""A registry distinct from the base `Registry`."""
83
class RegistryTwo(Registry):
84
"""A registry distinct from the base `Registry`."""
86
name = self.getUniqueString()
87
Registry.register_item(name, sentinel.item)
88
RegistryOne.register_item(name, sentinel.item_in_one)
89
RegistryTwo.register_item(name, sentinel.item_in_two)
91
# Items stored in separate registries are stored separately;
92
# names do not clash between registries.
93
self.assertEqual(sentinel.item, Registry.get_item(name))
94
self.assertEqual(sentinel.item_in_one, RegistryOne.get_item(name))
95
self.assertEqual(sentinel.item_in_two, RegistryTwo.get_item(name))