@@ -483,6 +483,104 @@ describe('mergeMessage', () => {
483483 expect ( newRegularField ! . number ) . toBe ( 6 ) ;
484484 expect ( newOneofField ! . number ) . toBe ( 7 ) ;
485485 } ) ;
486+
487+ it ( 'should rename oneof field in-place when type is unique and name is formatted from type' , ( ) => {
488+ const source : ProtoMessage = {
489+ name : 'TestMessage' ,
490+ fields : [ ] ,
491+ oneofs : [ {
492+ name : 'variant' ,
493+ fields : [
494+ field ( 'terms_aggregation' , 'TermsAggregation' , 1 ) ,
495+ field ( 'avg_aggregation' , 'AvgAggregation' , 2 )
496+ ]
497+ } ]
498+ } ;
499+ const upcoming : ProtoMessage = {
500+ name : 'TestMessage' ,
501+ fields : [ ] ,
502+ oneofs : [ {
503+ name : 'variant' ,
504+ fields : [
505+ field ( 'terms' , 'TermsAggregation' , 1 ) ,
506+ field ( 'average' , 'AvgAggregation' , 2 )
507+ ]
508+ } ]
509+ } ;
510+
511+ const result = mergeMessage ( source , upcoming ) ;
512+
513+ expect ( result . oneofs ! [ 0 ] . fields ) . toHaveLength ( 2 ) ;
514+ expect ( result . oneofs ! [ 0 ] . fields [ 0 ] . name ) . toBe ( 'terms' ) ;
515+ expect ( result . oneofs ! [ 0 ] . fields [ 0 ] . type ) . toBe ( 'TermsAggregation' ) ;
516+ expect ( result . oneofs ! [ 0 ] . fields [ 0 ] . number ) . toBe ( 1 ) ;
517+ expect ( result . oneofs ! [ 0 ] . fields [ 1 ] . name ) . toBe ( 'average' ) ;
518+ expect ( result . oneofs ! [ 0 ] . fields [ 1 ] . type ) . toBe ( 'AvgAggregation' ) ;
519+ expect ( result . oneofs ! [ 0 ] . fields [ 1 ] . number ) . toBe ( 2 ) ;
520+ } ) ;
521+
522+ it ( 'should not rename in-place when source name is not formatted from type' , ( ) => {
523+ const source : ProtoMessage = {
524+ name : 'TestMessage' ,
525+ fields : [ ] ,
526+ oneofs : [ {
527+ name : 'variant' ,
528+ fields : [
529+ field ( 'my_custom_name' , 'TermsAggregation' , 1 )
530+ ]
531+ } ]
532+ } ;
533+ const upcoming : ProtoMessage = {
534+ name : 'TestMessage' ,
535+ fields : [ ] ,
536+ oneofs : [ {
537+ name : 'variant' ,
538+ fields : [
539+ field ( 'terms' , 'TermsAggregation' , 1 )
540+ ]
541+ } ]
542+ } ;
543+
544+ const result = mergeMessage ( source , upcoming ) ;
545+
546+ expect ( result . oneofs ! [ 0 ] . fields ) . toHaveLength ( 2 ) ;
547+ expect ( result . oneofs ! [ 0 ] . fields [ 0 ] . name ) . toBe ( 'my_custom_name' ) ;
548+ expect ( result . oneofs ! [ 0 ] . fields [ 0 ] . annotations ) . toContainEqual ( { name : 'deprecated' , value : 'true' } ) ;
549+ expect ( result . oneofs ! [ 0 ] . fields [ 1 ] . name ) . toBe ( 'terms' ) ;
550+ } ) ;
551+
552+ it ( 'should not rename in-place when types are not unique' , ( ) => {
553+ const source : ProtoMessage = {
554+ name : 'TestMessage' ,
555+ fields : [ ] ,
556+ oneofs : [ {
557+ name : 'variant' ,
558+ fields : [
559+ field ( 'first_string' , 'string' , 1 ) ,
560+ field ( 'second_string' , 'string' , 2 )
561+ ]
562+ } ]
563+ } ;
564+ const upcoming : ProtoMessage = {
565+ name : 'TestMessage' ,
566+ fields : [ ] ,
567+ oneofs : [ {
568+ name : 'variant' ,
569+ fields : [
570+ field ( 'renamed_first' , 'string' , 1 ) ,
571+ field ( 'renamed_second' , 'string' , 2 )
572+ ]
573+ } ]
574+ } ;
575+
576+ const result = mergeMessage ( source , upcoming ) ;
577+
578+ expect ( result . oneofs ! [ 0 ] . fields ) . toHaveLength ( 4 ) ;
579+ expect ( result . oneofs ! [ 0 ] . fields [ 0 ] . name ) . toBe ( 'first_string' ) ;
580+ expect ( result . oneofs ! [ 0 ] . fields [ 0 ] . annotations ) . toContainEqual ( { name : 'deprecated' , value : 'true' } ) ;
581+ expect ( result . oneofs ! [ 0 ] . fields [ 1 ] . name ) . toBe ( 'second_string' ) ;
582+ expect ( result . oneofs ! [ 0 ] . fields [ 1 ] . annotations ) . toContainEqual ( { name : 'deprecated' , value : 'true' } ) ;
583+ } ) ;
486584 } ) ;
487585
488586 describe ( 'oneof structure changes (breaking)' , ( ) => {
0 commit comments