def test_proper_property_access(self): cls = murano_class.MuranoClass(None, self.resolver, ROOT_CLASS) cls.add_property('someProperty', typespec.PropertySpec({'Default': 0}, self.resolver)) obj = cls.new(None, None, None, {}) self.assertEqual(0, obj.someProperty)
def test_fails_internal_property_access(self): cls = murano_class.MuranoClass(None, self.resolver, ROOT_CLASS) cls.add_property('__hidden', typespec.PropertySpec({'Default': 10}, self.resolver)) obj = murano_object.MuranoObject(cls, None, None, None) self.assertRaises(AttributeError, lambda: obj.__hidden)
def test_fails_on_parents_property_collision(self): root = murano_class.MuranoClass(None, self.resolver, ROOT_CLASS) mother = murano_class.MuranoClass(None, self.resolver, 'Mother', [root]) father = murano_class.MuranoClass(None, self.resolver, 'Father', [root]) child = murano_class.MuranoClass(None, self.resolver, 'Child', [mother, father]) mother.add_property( 'conflictProp', typespec.PropertySpec({'Default': 0}, self.resolver)) father.add_property( 'conflictProp', typespec.PropertySpec({'Default': 0}, self.resolver)) obj = child.new(None, None, None, {}) self.assertRaises(LookupError, lambda: obj.conflictProp)
def test_parent_class_property_access(self): cls = murano_class.MuranoClass(None, self.resolver, ROOT_CLASS) child_cls = murano_class.MuranoClass(None, self.resolver, 'Child', [cls]) cls.add_property('anotherProperty', typespec.PropertySpec({'Default': 0}, self.resolver)) obj = child_cls.new(None, None, None, {}) self.assertEqual(0, obj.anotherProperty)
def test_add_property_to_class(self): prop = typespec.PropertySpec({'Default': 1}, self.resolver) cls = murano_class.MuranoClass(None, self.resolver, ROOT_CLASS, None) cls.add_property('firstPrime', prop) class_properties = cls.properties class_property = cls.get_property('firstPrime') self.assertEqual(['firstPrime'], class_properties) self.assertEqual(prop, class_property)
def test_set_property(self): cls = murano_class.MuranoClass(None, self.resolver, ROOT_CLASS) cls.add_property('someProperty', typespec.PropertySpec({'Default': 0}, self.resolver)) obj = cls.new(None, None, None, {}) with mock.patch('yaql.context.Context'): with mock.patch('muranoapi.engine.helpers') as helpers_mock: helpers_mock.evaluate = lambda val, ctx, _: val obj.set_property('someProperty', 10) self.assertEqual(10, obj.someProperty)
def test_fails_forbidden_set_property(self): cls = murano_class.MuranoClass(None, self.resolver, ROOT_CLASS) cls.add_property('someProperty', typespec.PropertySpec({'Default': 0}, self.resolver)) cls.is_compatible = mock.Mock(return_value=False) obj = cls.new(None, None, None, {}) self.assertRaises(exceptions.NoWriteAccess, obj.set_property, 'someProperty', 10, caller_class=cls)
def test_class_property_search(self): void_prop = typespec.PropertySpec({'Default': 'Void'}, self.resolver) mother_prop = typespec.PropertySpec({'Default': 'Mother'}, self.resolver) father_prop = typespec.PropertySpec({'Default': 'Father'}, self.resolver) child_prop = typespec.PropertySpec({'Default': 'Child'}, self.resolver) root = murano_class.MuranoClass(None, self.resolver, ROOT_CLASS) mother = murano_class.MuranoClass(None, self.resolver, 'Mother', [root]) father = murano_class.MuranoClass(None, self.resolver, 'Father', [root]) child = murano_class.MuranoClass(None, self.resolver, 'Child', [mother, father]) root.add_property('Void', void_prop) mother.add_property('Mother', mother_prop) father.add_property('Father', father_prop) child.add_property('Child', child_prop) self.assertEqual(child_prop, child.find_property('Child')) self.assertEqual(father_prop, child.find_property('Father')) self.assertEqual(mother_prop, child.find_property('Mother')) self.assertEqual(void_prop, child.find_property('Void'))
def get_class(self, name, create_missing=False): if name in self._loaded_types: return self._loaded_types[name] try: data = self.load_definition(name) package = self._get_package(name) except (exceptions.NoPackageForClassFound, exceptions.NoClassFound): if create_missing: data = {'Name': name} package = None else: raise namespaces = data.get('Namespaces', {}) ns_resolver = namespace_resolver.NamespaceResolver(namespaces) class_parents = data.get('Extends') if class_parents: if not isinstance(class_parents, types.ListType): class_parents = [class_parents] for i, parent_name in enumerate(class_parents): full_name = ns_resolver.resolve_name(parent_name) class_parents[i] = self.get_class(full_name) type_obj = murano_class.MuranoClass(self, ns_resolver, name, package, class_parents) properties = data.get('Properties', {}) for property_name, property_spec in properties.iteritems(): spec = typespec.PropertySpec(property_spec, ns_resolver) type_obj.add_property(property_name, spec) for method_name, payload in data.get('Workflow', {}).iteritems(): type_obj.add_method(method_name, payload) self._loaded_types[name] = type_obj return type_obj