@@ -48,6 +48,7 @@ def generate_random_value(
4848 context : CheckContext ,
4949 obj : Resource [Any ],
5050 field_name : str ,
51+ ref_objs : dict [str , Resource [Any ]],
5152) -> Any :
5253 field_type = obj .get_field_root_type (field_name )
5354
@@ -71,6 +72,17 @@ def generate_random_value(
7172 elif field_name == "value" and "phone" in obj .__class__ .__name__ .lower ():
7273 value = "" .join (str (random .choice (range (10 ))) for _ in range (10 ))
7374
75+ elif field_name == "value" and obj .__class__ .__name__ .lower () in ref_objs :
76+ value = ref_objs [obj .__class__ .__name__ .lower ()].id
77+
78+ elif field_name == "type" and obj .__class__ .__name__ .lower () in ref_objs :
79+ value = ref_objs [obj .__class__ .__name__ .lower ()].meta .resource_type
80+
81+ elif (
82+ field_name == "display" or field_name == "display_name"
83+ ) and obj .__class__ .__name__ .lower () in ref_objs :
84+ value = ref_objs [obj .__class__ .__name__ .lower ()].display_name
85+
7486 elif field_type is int :
7587 value = uuid .uuid4 ().int
7688
@@ -80,9 +92,8 @@ def generate_random_value(
8092 elif get_origin (field_type ) is Reference and get_args (field_type )[0 ] != Any :
8193 ref_type = get_args (field_type )[0 ]
8294 if ref_type not in (ExternalReference , URIReference ):
83- model = model_from_ref_type (context , ref_type , different_than = obj .__class__ )
84- ref_obj = context .resource_manager .create_and_register (model )
85- value = ref_obj .meta .location
95+ if obj .__class__ .__name__ .lower () in ref_objs :
96+ value = ref_objs [obj .__class__ .__name__ .lower ()].meta .location
8697
8798 else :
8899 value = f"https://{ str (uuid .uuid4 ())} .test"
@@ -102,6 +113,21 @@ def generate_random_value(
102113 return value
103114
104115
116+ def create_ref_object (
117+ context : CheckContext ,
118+ obj : Resource [Any ],
119+ field_name : str ,
120+ ) -> dict [str , Resource [Any ]] | None :
121+ field_type = obj .get_field_root_type (field_name )
122+ if get_origin (field_type ) is Reference and get_args (field_type )[0 ] != Any :
123+ ref_type = get_args (field_type )[0 ]
124+ if ref_type not in (ExternalReference , URIReference ):
125+ model = model_from_ref_type (context , ref_type , different_than = obj .__class__ )
126+ return context .resource_manager .create_and_register (model )
127+
128+ return None
129+
130+
105131def fill_with_random_values (
106132 context : CheckContext ,
107133 obj : Resource [Any ],
@@ -114,6 +140,21 @@ def fill_with_random_values(
114140 :param field_names: Optional list of field names to fill (defaults to all)
115141 :returns: The filled object or None if the object ends up empty
116142 """
143+ ref_objs = {}
144+ for field_name in (
145+ field_names if field_names is not None else obj .__class__ .model_fields .keys ()
146+ ):
147+ if field_name not in obj .__class__ .model_fields :
148+ continue
149+
150+ field = obj .__class__ .model_fields [field_name ]
151+ if field .default :
152+ continue
153+
154+ ref_obj = create_ref_object (context , obj , field_name )
155+ if ref_obj is not None :
156+ ref_objs [obj .__class__ .__name__ .lower ()] = ref_obj
157+
117158 for field_name in (
118159 field_names if field_names is not None else obj .__class__ .model_fields .keys ()
119160 ):
@@ -124,7 +165,7 @@ def fill_with_random_values(
124165 if field .default :
125166 continue
126167
127- value = generate_random_value (context , obj , field_name )
168+ value = generate_random_value (context , obj , field_name , ref_objs )
128169
129170 is_multiple = obj .get_field_multiplicity (field_name )
130171 if is_multiple :
0 commit comments