24
24
class TagTest(MAASServerTestCase):
26
def test_factory_make_tag(self):
26
def test_factory_make_Tag(self):
28
28
The generated system_id looks good.
31
tag = factory.make_tag('tag-name', '//node[@id=display]')
31
tag = factory.make_Tag('tag-name', '//node[@id=display]')
32
32
self.assertEqual('tag-name', tag.name)
33
33
self.assertEqual('//node[@id=display]', tag.definition)
34
34
self.assertEqual('', tag.comment)
36
36
self.assertIsNot(None, tag.updated)
37
37
self.assertIsNot(None, tag.created)
39
def test_factory_make_tag_with_hardware_details(self):
40
tag = factory.make_tag('a-tag', 'true', kernel_opts="console=ttyS0")
39
def test_factory_make_Tag_with_hardware_details(self):
40
tag = factory.make_Tag('a-tag', 'true', kernel_opts="console=ttyS0")
41
41
self.assertEqual('a-tag', tag.name)
42
42
self.assertEqual('true', tag.definition)
43
43
self.assertEqual('', tag.comment)
46
46
self.assertIsNot(None, tag.created)
48
48
def test_add_tag_to_node(self):
49
node = factory.make_node()
50
tag = factory.make_tag()
49
node = factory.make_Node()
50
tag = factory.make_Tag()
53
53
self.assertEqual([tag.id], [t.id for t in node.tags.all()])
56
56
def test_valid_tag_names(self):
57
57
for valid in ['valid-dash', 'under_score', 'long' * 50]:
58
tag = factory.make_tag(name=valid)
58
tag = factory.make_Tag(name=valid)
59
59
self.assertEqual(valid, tag.name)
61
61
def test_validate_traps_invalid_tag_name(self):
62
62
for invalid in ['invalid:name', 'no spaces', 'no\ttabs',
63
63
'no&ersand', 'no!shouting', '',
64
64
'too-long' * 33, '\xb5']:
65
self.assertRaises(ValidationError, factory.make_tag, name=invalid)
65
self.assertRaises(ValidationError, factory.make_Tag, name=invalid)
67
67
def test_applies_tags_to_nodes(self):
68
node1 = factory.make_node()
68
node1 = factory.make_Node()
69
69
inject_lshw_result(node1, b'<node><child /></node>')
70
node2 = factory.make_node()
70
node2 = factory.make_Node()
71
71
inject_lshw_result(node2, b'<node />')
72
tag = factory.make_tag(definition='//node/child')
72
tag = factory.make_Tag(definition='//node/child')
73
73
self.assertItemsEqual([tag.name], node1.tag_names())
74
74
self.assertItemsEqual([], node2.tag_names())
76
76
def test_removes_old_values(self):
77
node1 = factory.make_node()
77
node1 = factory.make_Node()
78
78
inject_lshw_result(node1, b'<node><foo /></node>')
79
node2 = factory.make_node()
79
node2 = factory.make_Node()
80
80
inject_lshw_result(node2, b'<node><bar /></node>')
81
tag = factory.make_tag(definition='//node/foo')
81
tag = factory.make_Tag(definition='//node/foo')
82
82
self.assertItemsEqual([tag.name], node1.tag_names())
83
83
self.assertItemsEqual([], node2.tag_names())
84
84
tag.definition = '//node/bar'
92
92
self.assertItemsEqual([], node2.tag_names())
94
94
def test_doesnt_touch_other_tags(self):
95
node1 = factory.make_node()
95
node1 = factory.make_Node()
96
96
inject_lshw_result(node1, b'<node><foo /></node>')
97
node2 = factory.make_node()
97
node2 = factory.make_Node()
98
98
inject_lshw_result(node2, b'<node><bar /></node>')
99
tag1 = factory.make_tag(definition='//node/foo')
99
tag1 = factory.make_Tag(definition='//node/foo')
100
100
self.assertItemsEqual([tag1.name], node1.tag_names())
101
101
self.assertItemsEqual([], node2.tag_names())
102
tag2 = factory.make_tag(definition='//node/bar')
102
tag2 = factory.make_Tag(definition='//node/bar')
103
103
self.assertItemsEqual([tag1.name], node1.tag_names())
104
104
self.assertItemsEqual([tag2.name], node2.tag_names())
106
106
def test_rollsback_invalid_xpath(self):
107
node = factory.make_node()
107
node = factory.make_Node()
108
108
inject_lshw_result(node, b'<node><foo /></node>')
109
tag = factory.make_tag(definition='//node/foo')
109
tag = factory.make_Tag(definition='//node/foo')
110
110
self.assertItemsEqual([tag.name], node.tag_names())
111
111
tag.definition = 'invalid::tag'
112
112
self.assertRaises(ValidationError, tag.save)