@@ -532,6 +532,135 @@ class ConfidenceProviderTest: XCTestCase {
532532 error. localizedDescription. contains ( " error " ) )
533533 }
534534 }
535+
536+ // swiftlint:disable:next function_body_length
537+ func testProviderResolveStructAllValueTypes( ) async throws {
538+ let context = MutableContext ( targetingKey: " user2 " )
539+ let storage = StorageMock ( )
540+
541+ let testDate = Date ( timeIntervalSince1970: 1640995200 ) // 2022-01-01 00:00:00 UTC
542+
543+ let resolvedValue = createResolvedValue (
544+ structure: [
545+ " booleanValue " : . init( boolean: true ) ,
546+ " stringValue " : . init( string: " resolved string " ) ,
547+ " integerValue " : . init( integer: 42 ) ,
548+ " doubleValue " : . init( double: 3.14159 ) ,
549+ " dateValue " : . init( timestamp: testDate) ,
550+ " booleanList " : . init( booleanList: [ true , false , true ] ) ,
551+ " stringList " : . init( stringList: [ " a " , " b " , " c " ] ) ,
552+ " integerList " : . init( integerList: [ 1 , 2 , 3 ] ) ,
553+ " doubleList " : . init( doubleList: [ 1.1 , 2.2 , 3.3 ] ) ,
554+ " timestampList " : . init( timestampList: [ testDate, testDate] ) ,
555+ " nestedStruct " : . init( structure: [
556+ " nestedString " : . init( string: " nested value " ) ,
557+ " nestedInteger " : . init( integer: 100 ) ,
558+ " nestedBoolean " : . init( boolean: false )
559+ ] )
560+ ]
561+ )
562+ let client = createFakeClient ( resolvedValues: [ resolvedValue] )
563+
564+ let confidence = Confidence . Builder ( clientSecret: " test " )
565+ . withContext ( initialContext: [ " targeting_key " : . init( string: " user2 " ) ] )
566+ . withFlagResolverClient ( flagResolver: client)
567+ . withStorage ( storage: storage)
568+ . build ( )
569+
570+ let cancellable = await setupProviderAndWaitForReady ( confidence: confidence)
571+ cancellable. cancel ( )
572+
573+ let provider = ConfidenceFeatureProvider ( confidence: confidence, initializationStrategy: . fetchAndActivate)
574+ let evaluation = try provider. getObjectEvaluation (
575+ key: " flag " ,
576+ defaultValue: Value . structure ( [
577+ " booleanValue " : . boolean( false ) ,
578+ " stringValue " : . string( " default string " ) ,
579+ " integerValue " : . integer( 0 ) ,
580+ " doubleValue " : . double( 0.0 ) ,
581+ " dateValue " : . date( testDate) ,
582+ " booleanList " : . list( [ . boolean( false ) ] ) ,
583+ " stringList " : . list( [ . string( " default " ) ] ) ,
584+ " integerList " : . list( [ . integer( 0 ) ] ) ,
585+ " doubleList " : . list( [ . double( 0.0 ) ] ) ,
586+ " timestampList " : . list( [ . date( testDate) ] ) ,
587+ " nestedStruct " : . structure( [
588+ " nestedString " : . string( " default nested " ) ,
589+ " nestedInteger " : . integer( 0 ) ,
590+ " nestedBoolean " : . boolean( true )
591+ ] )
592+ ] ) ,
593+ context: context)
594+
595+ guard case let . structure( resultMap) = evaluation. value else {
596+ XCTFail ( " Expected structure value " )
597+ return
598+ }
599+
600+ XCTAssertEqual ( resultMap [ " booleanValue " ] , . boolean( true ) )
601+ XCTAssertEqual ( resultMap [ " stringValue " ] , . string( " resolved string " ) )
602+ XCTAssertEqual ( resultMap [ " integerValue " ] , . integer( 42 ) )
603+ XCTAssertEqual ( resultMap [ " doubleValue " ] , . double( 3.14159 ) )
604+ XCTAssertEqual ( resultMap [ " dateValue " ] , . date( testDate) )
605+
606+ // Test lists
607+ guard case let . list( booleanList) = resultMap [ " booleanList " ] else {
608+ XCTFail ( " Expected boolean list " )
609+ return
610+ }
611+ XCTAssertEqual ( booleanList. count, 3 )
612+ XCTAssertEqual ( booleanList [ 0 ] , . boolean( true ) )
613+ XCTAssertEqual ( booleanList [ 1 ] , . boolean( false ) )
614+ XCTAssertEqual ( booleanList [ 2 ] , . boolean( true ) )
615+
616+ guard case let . list( stringList) = resultMap [ " stringList " ] else {
617+ XCTFail ( " Expected string list " )
618+ return
619+ }
620+ XCTAssertEqual ( stringList. count, 3 )
621+ XCTAssertEqual ( stringList [ 0 ] , . string( " a " ) )
622+ XCTAssertEqual ( stringList [ 1 ] , . string( " b " ) )
623+ XCTAssertEqual ( stringList [ 2 ] , . string( " c " ) )
624+
625+ guard case let . list( integerList) = resultMap [ " integerList " ] else {
626+ XCTFail ( " Expected integer list " )
627+ return
628+ }
629+ XCTAssertEqual ( integerList. count, 3 )
630+ XCTAssertEqual ( integerList [ 0 ] , . integer( 1 ) )
631+ XCTAssertEqual ( integerList [ 1 ] , . integer( 2 ) )
632+ XCTAssertEqual ( integerList [ 2 ] , . integer( 3 ) )
633+
634+ guard case let . list( doubleList) = resultMap [ " doubleList " ] else {
635+ XCTFail ( " Expected double list " )
636+ return
637+ }
638+ XCTAssertEqual ( doubleList. count, 3 )
639+ XCTAssertEqual ( doubleList [ 0 ] , . double( 1.1 ) )
640+ XCTAssertEqual ( doubleList [ 1 ] , . double( 2.2 ) )
641+ XCTAssertEqual ( doubleList [ 2 ] , . double( 3.3 ) )
642+
643+ guard case let . list( timestampList) = resultMap [ " timestampList " ] else {
644+ XCTFail ( " Expected timestamp list " )
645+ return
646+ }
647+ XCTAssertEqual ( timestampList. count, 2 )
648+ XCTAssertEqual ( timestampList [ 0 ] , . date( testDate) )
649+ XCTAssertEqual ( timestampList [ 1 ] , . date( testDate) )
650+
651+ guard case let . structure( nestedStruct) = resultMap [ " nestedStruct " ] else {
652+ XCTFail ( " Expected nested structure value " )
653+ return
654+ }
655+ XCTAssertEqual ( nestedStruct [ " nestedString " ] , . string( " nested value " ) )
656+ XCTAssertEqual ( nestedStruct [ " nestedInteger " ] , . integer( 100 ) )
657+ XCTAssertEqual ( nestedStruct [ " nestedBoolean " ] , . boolean( false ) )
658+
659+ XCTAssertEqual ( evaluation. variant, " control " )
660+ XCTAssertEqual ( evaluation. reason, " RESOLVE_REASON_MATCH " )
661+ XCTAssertNil ( evaluation. errorCode)
662+ XCTAssertNil ( evaluation. errorMessage)
663+ }
535664}
536665
537666private class StorageMock : Storage {
0 commit comments