33import inspect
44import typing
55from collections .abc import AsyncIterator
6- from typing import Any , Optional , TypeVar , Union
6+ from typing import Any , Literal , Optional , TypeVar , Union
77
88import pytest
99from pydantic import ValidationError
2525from guidellm .utils import StandardBaseModel
2626
2727
28+ @MeasuredRequestTimings .register ("test_request_timings" )
29+ class ConcreteMeasuredRequestTimings (MeasuredRequestTimings ):
30+ """Concrete test implementation of MeasuredRequestTimings for testing."""
31+
32+ timings_type : Literal ["test_request_timings" ] = "test_request_timings"
33+
34+
2835def test_request_t ():
2936 """Validate that RequestT is a TypeVar usable for generics and isn't bound."""
3037 assert isinstance (RequestT , TypeVar )
@@ -400,19 +407,23 @@ class TestRequestTimings:
400407
401408 @pytest .fixture (
402409 params = [
403- {},
410+ {"timings_type" : "test_request_timings" },
404411 {
412+ "timings_type" : "test_request_timings" ,
405413 "request_start" : None ,
406414 "request_end" : None ,
407415 },
408416 {
417+ "timings_type" : "test_request_timings" ,
409418 "request_start" : 1000.0 ,
410419 "request_end" : 1100.0 ,
411420 },
412421 {
422+ "timings_type" : "test_request_timings" ,
413423 "request_start" : 1000.0 ,
414424 },
415425 {
426+ "timings_type" : "test_request_timings" ,
416427 "request_start" : 0.0 ,
417428 "request_end" : 0.0 ,
418429 },
@@ -428,7 +439,7 @@ class TestRequestTimings:
428439 def valid_instances (self , request ):
429440 """Creates various valid configurations of MeasuredRequestTimings."""
430441 constructor_args = request .param
431- instance = MeasuredRequestTimings ( ** constructor_args )
442+ instance = MeasuredRequestTimings . model_validate ( constructor_args )
432443 return instance , constructor_args
433444
434445 @pytest .mark .smoke
@@ -446,7 +457,13 @@ def test_class_signatures(self):
446457 assert field_info .default is None
447458
448459 @pytest .mark .smoke
449- def test_initialization (self , valid_instances ):
460+ def test_initialization (self ):
461+ """Base class initialization should fail."""
462+ with pytest .raises (TypeError ):
463+ MeasuredRequestTimings ()
464+
465+ @pytest .mark .smoke
466+ def test_validation (self , valid_instances ):
450467 """Test initialization with valid configurations."""
451468 instance , constructor_args = valid_instances
452469 assert isinstance (instance , MeasuredRequestTimings )
@@ -467,9 +484,9 @@ def test_initialization(self, valid_instances):
467484 )
468485 def test_invalid_initialization (self , field , value ):
469486 """Test invalid initialization scenarios."""
470- kwargs = {field : value }
487+ kwargs = {"timings_type" : "test_request_timings" , field : value }
471488 with pytest .raises (ValidationError ):
472- MeasuredRequestTimings ( ** kwargs )
489+ MeasuredRequestTimings . model_validate ( kwargs )
473490
474491 @pytest .mark .smoke
475492 def test_marshalling (self , valid_instances ):
@@ -533,6 +550,7 @@ class TestScheduledRequestInfo:
533550 "finalized" : 2150.0 ,
534551 },
535552 "request_timings" : {
553+ "timings_type" : "test_request_timings" ,
536554 "request_start" : 2060.0 ,
537555 "request_end" : 2110.0 ,
538556 },
@@ -585,8 +603,8 @@ def valid_instances(self, request):
585603 ** constructor_args ["scheduler_timings" ]
586604 )
587605 if "request_timings" in constructor_args :
588- constructor_args ["request_timings" ] = MeasuredRequestTimings (
589- ** constructor_args ["request_timings" ]
606+ constructor_args ["request_timings" ] = MeasuredRequestTimings . model_validate (
607+ constructor_args ["request_timings" ]
590608 )
591609
592610 instance = ScheduledRequestInfo (** constructor_args )
@@ -596,7 +614,6 @@ def valid_instances(self, request):
596614 def test_class_signatures (self ):
597615 """Test ScheduledRequestInfo inheritance and type relationships."""
598616 assert issubclass (ScheduledRequestInfo , StandardBaseModel )
599- assert issubclass (ScheduledRequestInfo , typing .Generic )
600617 assert hasattr (ScheduledRequestInfo , "model_dump" )
601618 assert hasattr (ScheduledRequestInfo , "model_validate" )
602619
@@ -606,18 +623,6 @@ def test_class_signatures(self):
606623 assert isinstance (ScheduledRequestInfo .started_at , property )
607624 assert isinstance (ScheduledRequestInfo .completed_at , property )
608625
609- # Check that it's properly generic
610- orig_bases = getattr (ScheduledRequestInfo , "__orig_bases__" , ())
611- generic_base = next (
612- (
613- base
614- for base in orig_bases
615- if hasattr (base , "__origin__" ) and base .__origin__ is typing .Generic
616- ),
617- None ,
618- )
619- assert generic_base is not None
620-
621626 # Check required fields
622627 fields = ScheduledRequestInfo .model_fields
623628 for key in self .CHECK_KEYS :
@@ -719,7 +724,9 @@ def test_started_at_property(self):
719724 scheduler_process_id = 0 ,
720725 scheduler_start_time = 1000.0 ,
721726 scheduler_timings = RequestSchedulerTimings (resolve_start = 2000.0 ),
722- request_timings = MeasuredRequestTimings (request_start = 2100.0 ),
727+ request_timings = MeasuredRequestTimings .model_validate (
728+ {"timings_type" : "test_request_timings" , "request_start" : 2100.0 }
729+ ),
723730 )
724731 assert instance .started_at == 2100.0
725732
@@ -755,7 +762,9 @@ def test_completed_at_property(self):
755762 scheduler_process_id = 0 ,
756763 scheduler_start_time = 1000.0 ,
757764 scheduler_timings = RequestSchedulerTimings (resolve_end = 2000.0 ),
758- request_timings = MeasuredRequestTimings (request_end = 2100.0 ),
765+ request_timings = MeasuredRequestTimings .model_validate (
766+ {"timings_type" : "test_request_timings" , "request_end" : 2100.0 }
767+ ),
759768 )
760769 assert instance .completed_at == 2100.0
761770
0 commit comments