def inject_lshw_result(self): # inject_lshw_result() just calls through to inject_result(). inject_result = self.patch(cs_module, "inject_result", create_autospec(cs_module.inject_result)) inject_lshw_result(sentinel.node, sentinel.output, sentinel.status) inject_result.assert_called_once_with(sentinel.node, LSHW_OUTPUT_NAME, sentinel.output, sentinel.status)
def inject_lshw_result(self): # inject_lshw_result() just calls through to inject_result(). inject_result = self.patch( cs_module, "inject_result", create_autospec(cs_module.inject_result)) inject_lshw_result(sentinel.node, sentinel.output, sentinel.status) inject_result.assert_called_once_with( sentinel.node, LSHW_OUTPUT_NAME, sentinel.output, sentinel.status)
def test_applies_tags_to_nodes(self): node1 = factory.make_node() inject_lshw_result(node1, b'<node><child /></node>') node2 = factory.make_node() inject_lshw_result(node2, b'<node />') tag = factory.make_tag(definition='//node/child') self.assertItemsEqual([tag.name], node1.tag_names()) self.assertItemsEqual([], node2.tag_names())
def test_rollsback_invalid_xpath(self): node = factory.make_node() inject_lshw_result(node, b'<node><foo /></node>') tag = factory.make_tag(definition='//node/foo') self.assertItemsEqual([tag.name], node.tag_names()) tag.definition = 'invalid::tag' self.assertRaises(ValidationError, tag.save) self.assertItemsEqual([tag.name], node.tag_names())
def test_doesnt_touch_other_tags(self): node1 = factory.make_node() inject_lshw_result(node1, b'<node><foo /></node>') node2 = factory.make_node() inject_lshw_result(node2, b'<node><bar /></node>') tag1 = factory.make_tag(definition='//node/foo') self.assertItemsEqual([tag1.name], node1.tag_names()) self.assertItemsEqual([], node2.tag_names()) tag2 = factory.make_tag(definition='//node/bar') self.assertItemsEqual([tag1.name], node1.tag_names()) self.assertItemsEqual([tag2.name], node2.tag_names())
def test_PUT_invalid_definition(self): self.become_admin() node = factory.make_node() inject_lshw_result(node, b'<node ><child/></node>') tag = factory.make_tag(definition='//child') self.assertItemsEqual([tag.name], node.tag_names()) response = self.client_put( self.get_tag_uri(tag), {'definition': 'invalid::tag'}) self.assertEqual(httplib.BAD_REQUEST, response.status_code) # The tag should not be modified tag = reload_object(tag) self.assertItemsEqual([tag.name], node.tag_names()) self.assertEqual('//child', tag.definition)
def test_PUT_invalid_definition(self): self.become_admin() node = factory.make_node() inject_lshw_result(node, b'<node ><child/></node>') tag = factory.make_tag(definition='//child') self.assertItemsEqual([tag.name], node.tag_names()) response = self.client_put(self.get_tag_uri(tag), {'definition': 'invalid::tag'}) self.assertEqual(httplib.BAD_REQUEST, response.status_code) # The tag should not be modified tag = reload_object(tag) self.assertItemsEqual([tag.name], node.tag_names()) self.assertEqual('//child', tag.definition)
def test_PUT_updates_node_associations(self): node1 = factory.make_node() inject_lshw_result(node1, b'<node><foo/></node>') node2 = factory.make_node() inject_lshw_result(node2, b'<node><bar/></node>') tag = factory.make_tag(definition='//node/foo') self.assertItemsEqual([tag.name], node1.tag_names()) self.assertItemsEqual([], node2.tag_names()) self.become_admin() response = self.client_put(self.get_tag_uri(tag), {'definition': '//node/bar'}) self.assertEqual(httplib.OK, response.status_code) self.assertItemsEqual([], node1.tag_names()) self.assertItemsEqual([tag.name], node2.tag_names())
def test_PUT_updates_node_associations(self): node1 = factory.make_node() inject_lshw_result(node1, b'<node><foo/></node>') node2 = factory.make_node() inject_lshw_result(node2, b'<node><bar/></node>') tag = factory.make_tag(definition='//node/foo') self.assertItemsEqual([tag.name], node1.tag_names()) self.assertItemsEqual([], node2.tag_names()) self.become_admin() response = self.client_put( self.get_tag_uri(tag), {'definition': '//node/bar'}) self.assertEqual(httplib.OK, response.status_code) self.assertItemsEqual([], node1.tag_names()) self.assertItemsEqual([tag.name], node2.tag_names())
def test_POST_rebuild_rebuilds_node_mapping(self): tag = factory.make_tag(definition='//foo/bar') # Only one node matches the tag definition, rebuilding should notice node_matching = factory.make_node() inject_lshw_result(node_matching, b'<foo><bar/></foo>') node_bogus = factory.make_node() inject_lshw_result(node_bogus, b'<foo/>') node_matching.tags.add(tag) node_bogus.tags.add(tag) self.assertItemsEqual([node_matching, node_bogus], tag.node_set.all()) self.become_admin() response = self.client.post(self.get_tag_uri(tag), {'op': 'rebuild'}) self.assertEqual(httplib.OK, response.status_code) parsed_result = json.loads(response.content) self.assertEqual({'rebuilding': tag.name}, parsed_result) self.assertItemsEqual([node_matching], tag.node_set.all())
def test_POST_rebuild_rebuilds_node_mapping(self): tag = factory.make_tag(definition='//foo/bar') # Only one node matches the tag definition, rebuilding should notice node_matching = factory.make_node() inject_lshw_result(node_matching, b'<foo><bar/></foo>') node_bogus = factory.make_node() inject_lshw_result(node_bogus, b'<foo/>') node_matching.tags.add(tag) node_bogus.tags.add(tag) self.assertItemsEqual( [node_matching, node_bogus], tag.node_set.all()) self.become_admin() response = self.client.post(self.get_tag_uri(tag), {'op': 'rebuild'}) self.assertEqual(httplib.OK, response.status_code) parsed_result = json.loads(response.content) self.assertEqual({'rebuilding': tag.name}, parsed_result) self.assertItemsEqual([node_matching], tag.node_set.all())
def test_removes_old_values(self): node1 = factory.make_node() inject_lshw_result(node1, b'<node><foo /></node>') node2 = factory.make_node() inject_lshw_result(node2, b'<node><bar /></node>') tag = factory.make_tag(definition='//node/foo') self.assertItemsEqual([tag.name], node1.tag_names()) self.assertItemsEqual([], node2.tag_names()) tag.definition = '//node/bar' tag.save() self.assertItemsEqual([], node1.tag_names()) self.assertItemsEqual([tag.name], node2.tag_names()) # And we notice if we change it *again* and then save. tag.definition = '//node/foo' tag.save() self.assertItemsEqual([tag.name], node1.tag_names()) self.assertItemsEqual([], node2.tag_names())
def test_GET_nodes_hides_invisible_nodes(self): user2 = factory.make_user() node1 = factory.make_node() inject_lshw_result(node1, b'<node><foo/></node>') node2 = factory.make_node(status=NODE_STATUS.ALLOCATED, owner=user2) inject_lshw_result(node2, b'<node><bar/></node>') tag = factory.make_tag(definition='//node') response = self.client.get(self.get_tag_uri(tag), {'op': 'nodes'}) self.assertEqual(httplib.OK, response.status_code) parsed_result = json.loads(response.content) self.assertEqual([node1.system_id], [r['system_id'] for r in parsed_result]) # However, for the other user, they should see the result client2 = OAuthAuthenticatedClient(user2) response = client2.get(self.get_tag_uri(tag), {'op': 'nodes'}) self.assertEqual(httplib.OK, response.status_code) parsed_result = json.loads(response.content) self.assertItemsEqual([node1.system_id, node2.system_id], [r['system_id'] for r in parsed_result])
def test_GET_nodes_hides_invisible_nodes(self): user2 = factory.make_user() node1 = factory.make_node() inject_lshw_result(node1, b'<node><foo/></node>') node2 = factory.make_node(status=NODE_STATUS.ALLOCATED, owner=user2) inject_lshw_result(node2, b'<node><bar/></node>') tag = factory.make_tag(definition='//node') response = self.client.get(self.get_tag_uri(tag), {'op': 'nodes'}) self.assertEqual(httplib.OK, response.status_code) parsed_result = json.loads(response.content) self.assertEqual([node1.system_id], [r['system_id'] for r in parsed_result]) # However, for the other user, they should see the result client2 = OAuthAuthenticatedClient(user2) response = client2.get(self.get_tag_uri(tag), {'op': 'nodes'}) self.assertEqual(httplib.OK, response.status_code) parsed_result = json.loads(response.content) self.assertItemsEqual([node1.system_id, node2.system_id], [r['system_id'] for r in parsed_result])
def test_POST_new_populates_nodes(self): self.become_admin() node1 = factory.make_node() inject_lshw_result(node1, b'<node><child/></node>') # Create another node that doesn't have a 'child' node2 = factory.make_node() inject_lshw_result(node2, b'<node/>') self.assertItemsEqual([], node1.tag_names()) self.assertItemsEqual([], node2.tag_names()) name = factory.getRandomString() definition = '//node/child' comment = factory.getRandomString() response = self.client.post( reverse('tags_handler'), { 'op': 'new', 'name': name, 'comment': comment, 'definition': definition, }) self.assertEqual(httplib.OK, response.status_code) self.assertItemsEqual([name], node1.tag_names()) self.assertItemsEqual([], node2.tag_names())
def test_POST_new_populates_nodes(self): self.become_admin() node1 = factory.make_node() inject_lshw_result(node1, b'<node><child/></node>') # Create another node that doesn't have a 'child' node2 = factory.make_node() inject_lshw_result(node2, b'<node/>') self.assertItemsEqual([], node1.tag_names()) self.assertItemsEqual([], node2.tag_names()) name = factory.getRandomString() definition = '//node/child' comment = factory.getRandomString() response = self.client.post( reverse('tags_handler'), { 'op': 'new', 'name': name, 'comment': comment, 'definition': definition, }) self.assertEqual(httplib.OK, response.status_code) self.assertItemsEqual([name], node1.tag_names()) self.assertItemsEqual([], node2.tag_names())