@@ -448,5 +448,135 @@ public async Task ReloadTypes_across_data_sources([Values] bool async)
448448 Assert . DoesNotThrowAsync ( async ( ) => await connection2 . ExecuteScalarAsync ( $ "SELECT 'happy'::{ type } ") ) ;
449449 }
450450
451+ [ Test ]
452+ public async Task Resolve_type_mapping ( [ Values ] bool async )
453+ {
454+ var dataSource = DataSource;
455+
456+ var intClrTypeMapping = async
457+ ? await dataSource . TryGetMappingAsync < int > ( )
458+ : dataSource . TryGetMapping < int > ( ) ;
459+
460+ Assert . That ( intClrTypeMapping , Is . Not . Null ) ;
461+ Assert . That ( intClrTypeMapping ! . Type , Is . EqualTo ( typeof ( int ) ) ) ;
462+
463+ var int4DataTypeNameMapping = async
464+ ? await dataSource. TryGetMappingAsync( dataTypeName : "int4 ")
465+ : dataSource. TryGetMapping( dataTypeName: "int4") ;
466+
467+ Assert. That ( int4DataTypeNameMapping , Is . Not . Null ) ;
468+ Assert . That ( int4DataTypeNameMapping ! . Type , Is . EqualTo ( typeof ( int ) ) ) ;
469+ }
470+
471+ [ Test]
472+ public async Task Resolve_unknown_enum_type_mapping( [ Values] bool async )
473+ {
474+ await using var adminConnection = await OpenConnectionAsync( ) ;
475+ var type = await GetTempTypeName( adminConnection ) ;
476+ await adminConnection . ExecuteNonQueryAsync ( $"CREATE TYPE {type} AS ENUM ('sad', 'ok', 'happy')" ) ;
477+
478+ var dataSource = DataSource ;
479+ // Reload types to load the new enum from the database
480+ await dataSource . ReloadTypesAsync ( ) ;
481+
482+ var enumClrTypeMapping = async
483+ ? await dataSource . TryGetMappingAsync < Mood > ( )
484+ : dataSource . TryGetMapping < Mood > ( ) ;
485+
486+ Assert . That ( enumClrTypeMapping , Is . Null ) ;
487+
488+ var enumDataTypeNameMapping = async
489+ ? await dataSource . TryGetMappingAsync ( dataTypeName : type )
490+ : dataSource . TryGetMapping ( dataTypeName : type ) ;
491+
492+ // We support mapping unknown enums to text
493+ Assert . That ( enumDataTypeNameMapping , Is . Not . Null ) ;
494+ Assert . That ( enumDataTypeNameMapping ! . Type , Is . EqualTo ( typeof ( string ) ) ) ;
495+ }
496+
497+ [ Test ]
498+ public async Task Resolve_registered_enum_type_mapping ( [ Values ] bool async )
499+ {
500+ await using var adminConnection = await OpenConnectionAsync ( ) ;
501+ var type = await GetTempTypeName ( adminConnection ) ;
502+ await adminConnection . ExecuteNonQueryAsync ( $ "CREATE TYPE { type } AS ENUM ('sad', 'ok', 'happy')") ;
503+
504+ await using var dataSource = CreateDataSource ( dataSourceBuilder =>
505+ {
506+ dataSourceBuilder . MapEnum < Mood > ( type ) ;
507+ } ) ;
508+
509+ var enumClrTypeMapping = async
510+ ? await dataSource . TryGetMappingAsync < Mood > ( )
511+ : dataSource . TryGetMapping < Mood > ( ) ;
512+
513+ Assert . That ( enumClrTypeMapping , Is . Not . Null ) ;
514+ Assert . That ( enumClrTypeMapping ! . Type , Is . EqualTo ( typeof ( Mood ) ) ) ;
515+
516+ var enumDataTypeNameMapping = async
517+ ? await dataSource . TryGetMappingAsync ( dataTypeName : type )
518+ : dataSource . TryGetMapping ( dataTypeName : type ) ;
519+
520+ Assert . That ( enumDataTypeNameMapping , Is . Not . Null ) ;
521+ Assert . That ( enumDataTypeNameMapping ! . Type , Is . EqualTo ( typeof ( Mood ) ) ) ;
522+ }
523+
524+ [ Test ]
525+ public async Task Resolve_unknown_composite_type_mapping ( [ Values ] bool async )
526+ {
527+ await using var adminConnection = await OpenConnectionAsync ( ) ;
528+ var type = await GetTempTypeName ( adminConnection ) ;
529+ await adminConnection . ExecuteNonQueryAsync ( $ "CREATE TYPE { type } AS (x int, some_text text)") ;
530+
531+ var dataSource = DataSource ;
532+ // Reload types to load the new enum from the database
533+ await dataSource . ReloadTypesAsync ( ) ;
534+
535+ var compositeClrTypeMapping = async
536+ ? await dataSource . TryGetMappingAsync < SomeComposite > ( )
537+ : dataSource . TryGetMapping < SomeComposite > ( ) ;
538+
539+ Assert . That ( compositeClrTypeMapping , Is . Null ) ;
540+
541+ var compositeDataTypeNameMapping = async
542+ ? await dataSource . TryGetMappingAsync ( dataTypeName : type )
543+ : dataSource . TryGetMapping ( dataTypeName : type ) ;
544+
545+ Assert . That ( compositeDataTypeNameMapping , Is . Null ) ;
546+ }
547+
548+ [ Test ]
549+ public async Task Resolve_registered_composite_type_mapping ( [ Values ] bool async )
550+ {
551+ await using var adminConnection = await OpenConnectionAsync ( ) ;
552+ var type = await GetTempTypeName ( adminConnection ) ;
553+ await adminConnection . ExecuteNonQueryAsync ( $ "CREATE TYPE { type } AS (x int, some_text text)") ;
554+
555+ await using var dataSource = CreateDataSource ( dataSourceBuilder =>
556+ {
557+ dataSourceBuilder . MapComposite < SomeComposite > ( type ) ;
558+ } ) ;
559+
560+ var compositeClrTypeMapping = async
561+ ? await dataSource . TryGetMappingAsync < SomeComposite > ( )
562+ : dataSource . TryGetMapping < SomeComposite > ( ) ;
563+
564+ Assert . That ( compositeClrTypeMapping , Is . Not . Null ) ;
565+ Assert . That ( compositeClrTypeMapping ! . Type , Is . EqualTo ( typeof ( SomeComposite ) ) ) ;
566+
567+ var compositeDataTypeNameMapping = async
568+ ? await dataSource . TryGetMappingAsync ( dataTypeName : type )
569+ : dataSource . TryGetMapping ( dataTypeName : type ) ;
570+
571+ Assert . That ( compositeDataTypeNameMapping , Is . Not . Null ) ;
572+ Assert . That ( compositeDataTypeNameMapping ! . Type , Is . EqualTo ( typeof ( SomeComposite ) ) ) ;
573+ }
574+
451575 enum Mood { Sad , Ok , Happy }
576+
577+ record SomeComposite
578+ {
579+ public int X { get ; set ; }
580+ public string SomeText { get ; set ; } = null ! ;
581+ }
452582}
0 commit comments