3
3
import inspect
4
4
import typing
5
5
from collections .abc import AsyncIterator
6
- from typing import Any , Optional , TypeVar , Union
6
+ from typing import Any , Literal , Optional , TypeVar , Union
7
7
8
8
import pytest
9
9
from pydantic import ValidationError
25
25
from guidellm .utils import StandardBaseModel
26
26
27
27
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
+
28
35
def test_request_t ():
29
36
"""Validate that RequestT is a TypeVar usable for generics and isn't bound."""
30
37
assert isinstance (RequestT , TypeVar )
@@ -400,19 +407,23 @@ class TestRequestTimings:
400
407
401
408
@pytest .fixture (
402
409
params = [
403
- {},
410
+ {"timings_type" : "test_request_timings" },
404
411
{
412
+ "timings_type" : "test_request_timings" ,
405
413
"request_start" : None ,
406
414
"request_end" : None ,
407
415
},
408
416
{
417
+ "timings_type" : "test_request_timings" ,
409
418
"request_start" : 1000.0 ,
410
419
"request_end" : 1100.0 ,
411
420
},
412
421
{
422
+ "timings_type" : "test_request_timings" ,
413
423
"request_start" : 1000.0 ,
414
424
},
415
425
{
426
+ "timings_type" : "test_request_timings" ,
416
427
"request_start" : 0.0 ,
417
428
"request_end" : 0.0 ,
418
429
},
@@ -428,7 +439,7 @@ class TestRequestTimings:
428
439
def valid_instances (self , request ):
429
440
"""Creates various valid configurations of MeasuredRequestTimings."""
430
441
constructor_args = request .param
431
- instance = MeasuredRequestTimings ( ** constructor_args )
442
+ instance = MeasuredRequestTimings . model_validate ( constructor_args )
432
443
return instance , constructor_args
433
444
434
445
@pytest .mark .smoke
@@ -446,7 +457,13 @@ def test_class_signatures(self):
446
457
assert field_info .default is None
447
458
448
459
@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 ):
450
467
"""Test initialization with valid configurations."""
451
468
instance , constructor_args = valid_instances
452
469
assert isinstance (instance , MeasuredRequestTimings )
@@ -467,9 +484,9 @@ def test_initialization(self, valid_instances):
467
484
)
468
485
def test_invalid_initialization (self , field , value ):
469
486
"""Test invalid initialization scenarios."""
470
- kwargs = {field : value }
487
+ kwargs = {"timings_type" : "test_request_timings" , field : value }
471
488
with pytest .raises (ValidationError ):
472
- MeasuredRequestTimings ( ** kwargs )
489
+ MeasuredRequestTimings . model_validate ( kwargs )
473
490
474
491
@pytest .mark .smoke
475
492
def test_marshalling (self , valid_instances ):
@@ -533,6 +550,7 @@ class TestScheduledRequestInfo:
533
550
"finalized" : 2150.0 ,
534
551
},
535
552
"request_timings" : {
553
+ "timings_type" : "test_request_timings" ,
536
554
"request_start" : 2060.0 ,
537
555
"request_end" : 2110.0 ,
538
556
},
@@ -585,8 +603,8 @@ def valid_instances(self, request):
585
603
** constructor_args ["scheduler_timings" ]
586
604
)
587
605
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" ]
590
608
)
591
609
592
610
instance = ScheduledRequestInfo (** constructor_args )
@@ -596,7 +614,6 @@ def valid_instances(self, request):
596
614
def test_class_signatures (self ):
597
615
"""Test ScheduledRequestInfo inheritance and type relationships."""
598
616
assert issubclass (ScheduledRequestInfo , StandardBaseModel )
599
- assert issubclass (ScheduledRequestInfo , typing .Generic )
600
617
assert hasattr (ScheduledRequestInfo , "model_dump" )
601
618
assert hasattr (ScheduledRequestInfo , "model_validate" )
602
619
@@ -606,18 +623,6 @@ def test_class_signatures(self):
606
623
assert isinstance (ScheduledRequestInfo .started_at , property )
607
624
assert isinstance (ScheduledRequestInfo .completed_at , property )
608
625
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
-
621
626
# Check required fields
622
627
fields = ScheduledRequestInfo .model_fields
623
628
for key in self .CHECK_KEYS :
@@ -719,7 +724,9 @@ def test_started_at_property(self):
719
724
scheduler_process_id = 0 ,
720
725
scheduler_start_time = 1000.0 ,
721
726
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
+ ),
723
730
)
724
731
assert instance .started_at == 2100.0
725
732
@@ -755,7 +762,9 @@ def test_completed_at_property(self):
755
762
scheduler_process_id = 0 ,
756
763
scheduler_start_time = 1000.0 ,
757
764
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
+ ),
759
768
)
760
769
assert instance .completed_at == 2100.0
761
770
0 commit comments