@@ -398,4 +398,271 @@ public void MergeJsonStrings_MixedDataTypes_HandlesAllTypes()
398398 """ ;
399399 result . Is ( expected ) ;
400400 }
401+
402+ [ Test ]
403+ public void MergeJsonStrings_ColonDelimitedKeyInOverride_ExpandsToHierarchy ( )
404+ {
405+ // Arrange
406+ var baseJson = """
407+ {
408+ "Foo": {
409+ "Bar": "Hello"
410+ }
411+ }
412+ """ ;
413+ var overrideJson = """
414+ {
415+ "Foo:Bar": "World"
416+ }
417+ """ ;
418+
419+ // Act
420+ var result = UserSecretsExtensionStartupFilter . MergeJsonStrings ( baseJson , overrideJson ) ;
421+
422+ // Assert
423+ var expected = """
424+ {
425+ "Foo": {
426+ "Bar": "World"
427+ }
428+ }
429+ """ ;
430+ result . Is ( expected ) ;
431+ }
432+
433+ [ Test ]
434+ public void MergeJsonStrings_ColonDelimitedKeyInBase_ExpandsToHierarchy ( )
435+ {
436+ // Arrange
437+ var baseJson = """
438+ {
439+ "Foo:Bar": "Hello"
440+ }
441+ """ ;
442+ var overrideJson = """
443+ {
444+ "Foo": {
445+ "Bar": "World"
446+ }
447+ }
448+ """ ;
449+
450+ // Act
451+ var result = UserSecretsExtensionStartupFilter . MergeJsonStrings ( baseJson , overrideJson ) ;
452+
453+ // Assert
454+ var expected = """
455+ {
456+ "Foo": {
457+ "Bar": "World"
458+ }
459+ }
460+ """ ;
461+ result . Is ( expected ) ;
462+ }
463+
464+ [ Test ]
465+ public void MergeJsonStrings_BothColonDelimited_ExpandsToHierarchy ( )
466+ {
467+ // Arrange
468+ var baseJson = """
469+ {
470+ "Foo:Bar": "Hello"
471+ }
472+ """ ;
473+ var overrideJson = """
474+ {
475+ "Foo:Bar": "World"
476+ }
477+ """ ;
478+
479+ // Act
480+ var result = UserSecretsExtensionStartupFilter . MergeJsonStrings ( baseJson , overrideJson ) ;
481+
482+ // Assert
483+ var expected = """
484+ {
485+ "Foo": {
486+ "Bar": "World"
487+ }
488+ }
489+ """ ;
490+ result . Is ( expected ) ;
491+ }
492+
493+ [ Test ]
494+ public void MergeJsonStrings_DeepColonDelimitedKey_ExpandsToDeepHierarchy ( )
495+ {
496+ // Arrange
497+ var baseJson = """
498+ {
499+ "Database": {
500+ "Connection": {
501+ "Host": "localhost"
502+ }
503+ }
504+ }
505+ """ ;
506+ var overrideJson = """
507+ {
508+ "Database:Connection:Port": "5433"
509+ }
510+ """ ;
511+
512+ // Act
513+ var result = UserSecretsExtensionStartupFilter . MergeJsonStrings ( baseJson , overrideJson ) ;
514+
515+ // Assert
516+ var expected = """
517+ {
518+ "Database": {
519+ "Connection": {
520+ "Host": "localhost",
521+ "Port": "5433"
522+ }
523+ }
524+ }
525+ """ ;
526+ result . Is ( expected ) ;
527+ }
528+
529+ [ Test ]
530+ public void MergeJsonStrings_MultipleColonDelimitedKeys_ExpandsAllToHierarchy ( )
531+ {
532+ // Arrange
533+ var baseJson = """
534+ {
535+ "Foo": {
536+ "Bar": "Hello",
537+ "Baz": "Original"
538+ }
539+ }
540+ """ ;
541+ var overrideJson = """
542+ {
543+ "Foo:Bar": "World",
544+ "Foo:Qux": "New"
545+ }
546+ """ ;
547+
548+ // Act
549+ var result = UserSecretsExtensionStartupFilter . MergeJsonStrings ( baseJson , overrideJson ) ;
550+
551+ // Assert
552+ var expected = """
553+ {
554+ "Foo": {
555+ "Bar": "World",
556+ "Baz": "Original",
557+ "Qux": "New"
558+ }
559+ }
560+ """ ;
561+ result . Is ( expected ) ;
562+ }
563+
564+ [ Test ]
565+ public void MergeJsonStrings_ColonDelimitedKeyCreatesNewBranch_CreatesHierarchy ( )
566+ {
567+ // Arrange
568+ var baseJson = """
569+ {
570+ "Existing": "value"
571+ }
572+ """ ;
573+ var overrideJson = """
574+ {
575+ "New:Nested:Key": "value"
576+ }
577+ """ ;
578+
579+ // Act
580+ var result = UserSecretsExtensionStartupFilter . MergeJsonStrings ( baseJson , overrideJson ) ;
581+
582+ // Assert
583+ var expected = """
584+ {
585+ "Existing": "value",
586+ "New": {
587+ "Nested": {
588+ "Key": "value"
589+ }
590+ }
591+ }
592+ """ ;
593+ result . Is ( expected ) ;
594+ }
595+
596+ [ Test ]
597+ public void MergeJsonStrings_ColonDelimitedKeyReplacesObject_ReplacesWithScalar ( )
598+ {
599+ // Arrange
600+ var baseJson = """
601+ {
602+ "Foo": {
603+ "Bar": {
604+ "Nested": "value"
605+ }
606+ }
607+ }
608+ """ ;
609+ var overrideJson = """
610+ {
611+ "Foo:Bar": "SimpleValue"
612+ }
613+ """ ;
614+
615+ // Act
616+ var result = UserSecretsExtensionStartupFilter . MergeJsonStrings ( baseJson , overrideJson ) ;
617+
618+ // Assert
619+ var expected = """
620+ {
621+ "Foo": {
622+ "Bar": "SimpleValue"
623+ }
624+ }
625+ """ ;
626+ result . Is ( expected ) ;
627+ }
628+
629+ [ Test ]
630+ public void MergeJsonStrings_MixedColonAndRegularKeys_MergesCorrectly ( )
631+ {
632+ // Arrange
633+ var baseJson = """
634+ {
635+ "Regular": "value1",
636+ "Nested": {
637+ "Key": "value2"
638+ }
639+ }
640+ """ ;
641+ var overrideJson = """
642+ {
643+ "Regular": "updated",
644+ "Nested:Key": "overridden",
645+ "Another:Deep:Key": "new"
646+ }
647+ """ ;
648+
649+ // Act
650+ var result = UserSecretsExtensionStartupFilter . MergeJsonStrings ( baseJson , overrideJson ) ;
651+
652+ // Assert
653+ var expected = """
654+ {
655+ "Regular": "updated",
656+ "Nested": {
657+ "Key": "overridden"
658+ },
659+ "Another": {
660+ "Deep": {
661+ "Key": "new"
662+ }
663+ }
664+ }
665+ """ ;
666+ result . Is ( expected ) ;
667+ }
401668}
0 commit comments