Skip to content

Commit 4fcd836

Browse files
committed
Add unit tests for MergeHeaderMap method and update its behavior to handle overwrite conflicts
Fixed formatting issues Added [JsonRequired] attribute.
1 parent 4de0088 commit 4fcd836

File tree

4 files changed

+231
-152
lines changed

4 files changed

+231
-152
lines changed

CoseSign1.Headers.Tests/Extensions/CoseHeaderExtensionsTests.cs

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -537,6 +537,71 @@ public void MergeHeaderMap_WithNullTargetMap_ShouldThrowArgumentNullException()
537537
Assert.Throws<ArgumentNullException>(() => targetMap!.MergeHeaderMap(sourceMap));
538538
}
539539

540+
[Test]
541+
public void MergeHeaderMap_WithOverwriteConflictsFalse_ShouldPreserveTargetValues()
542+
{
543+
// Arrange
544+
var targetMap = new CoseHeaderMap();
545+
targetMap.Add(new CoseHeaderLabel("shared-key"), CoseHeaderValue.FromString("target-value"));
546+
targetMap.Add(new CoseHeaderLabel("target-only"), CoseHeaderValue.FromInt32(100));
547+
548+
var sourceMap = new CoseHeaderMap();
549+
sourceMap.Add(new CoseHeaderLabel("shared-key"), CoseHeaderValue.FromString("source-value"));
550+
sourceMap.Add(new CoseHeaderLabel("source-only"), CoseHeaderValue.FromInt32(200));
551+
552+
// Act
553+
CoseHeaderMap result = targetMap.MergeHeaderMap(sourceMap, overwriteConflicts: false);
554+
555+
// Assert
556+
Assert.That(result, Is.SameAs(targetMap));
557+
Assert.That(result.Count, Is.EqualTo(3));
558+
Assert.That(result[new CoseHeaderLabel("shared-key")].GetValueAsString(), Is.EqualTo("target-value"));
559+
Assert.That(result[new CoseHeaderLabel("target-only")].GetValueAsInt32(), Is.EqualTo(100));
560+
Assert.That(result[new CoseHeaderLabel("source-only")].GetValueAsInt32(), Is.EqualTo(200));
561+
}
562+
563+
[Test]
564+
public void MergeHeaderMap_WithOverwriteConflictsTrue_ShouldReplaceTargetValues()
565+
{
566+
// Arrange
567+
var targetMap = new CoseHeaderMap();
568+
targetMap.Add(new CoseHeaderLabel("shared-key"), CoseHeaderValue.FromString("target-value"));
569+
targetMap.Add(new CoseHeaderLabel("target-only"), CoseHeaderValue.FromInt32(100));
570+
571+
var sourceMap = new CoseHeaderMap();
572+
sourceMap.Add(new CoseHeaderLabel("shared-key"), CoseHeaderValue.FromString("source-value"));
573+
sourceMap.Add(new CoseHeaderLabel("source-only"), CoseHeaderValue.FromInt32(200));
574+
575+
// Act
576+
CoseHeaderMap result = targetMap.MergeHeaderMap(sourceMap, overwriteConflicts: true);
577+
578+
// Assert
579+
Assert.That(result, Is.SameAs(targetMap));
580+
Assert.That(result.Count, Is.EqualTo(3));
581+
Assert.That(result[new CoseHeaderLabel("shared-key")].GetValueAsString(), Is.EqualTo("source-value"));
582+
Assert.That(result[new CoseHeaderLabel("target-only")].GetValueAsInt32(), Is.EqualTo(100));
583+
Assert.That(result[new CoseHeaderLabel("source-only")].GetValueAsInt32(), Is.EqualTo(200));
584+
}
585+
586+
[Test]
587+
public void MergeHeaderMap_WithDefaultParameter_ShouldOverwriteConflicts()
588+
{
589+
// Arrange
590+
var targetMap = new CoseHeaderMap();
591+
targetMap.Add(new CoseHeaderLabel("key"), CoseHeaderValue.FromString("target-value"));
592+
593+
var sourceMap = new CoseHeaderMap();
594+
sourceMap.Add(new CoseHeaderLabel("key"), CoseHeaderValue.FromString("source-value"));
595+
596+
// Act - Using default parameter (should overwrite)
597+
CoseHeaderMap result = targetMap.MergeHeaderMap(sourceMap);
598+
599+
// Assert
600+
Assert.That(result, Is.SameAs(targetMap));
601+
Assert.That(result.Count, Is.EqualTo(1));
602+
Assert.That(result[new CoseHeaderLabel("key")].GetValueAsString(), Is.EqualTo("source-value"));
603+
}
604+
540605
[Test]
541606
public void ToCoseHeaderMap_WithHeadersContainingNullLabel_ShouldSkipThem()
542607
{

CoseSign1.Headers/Extensions/CoseHeaderExtensions.cs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,18 @@ public static CoseHeaderMap ToCoseHeaderMap<T>(this IEnumerable<CoseHeader<T>> h
7676
/// </summary>
7777
/// <param name="targetMap">The target map to merge into.</param>
7878
/// <param name="sourceMap">The source map to merge from. If null, returns the target map unchanged.</param>
79+
/// <param name="overwriteConflicts">
80+
/// If true (default), source map values will overwrite target map values when keys conflict.
81+
/// If false, existing target map values are preserved and conflicting source values are ignored.
82+
/// </param>
7983
/// <returns>The target map with merged headers.</returns>
84+
/// <remarks>
85+
/// When <paramref name="overwriteConflicts"/> is true, any header keys that exist in both maps
86+
/// will have their values replaced by the source map values. When false, the target map values
87+
/// are preserved and the conflicting source values are silently ignored.
88+
/// </remarks>
8089
/// <exception cref="ArgumentNullException">Thrown when targetMap is null.</exception>
81-
public static CoseHeaderMap MergeHeaderMap(this CoseHeaderMap targetMap, CoseHeaderMap? sourceMap)
90+
public static CoseHeaderMap MergeHeaderMap(this CoseHeaderMap targetMap, CoseHeaderMap? sourceMap, bool overwriteConflicts = true)
8291
{
8392
if (targetMap == null)
8493
{
@@ -92,7 +101,10 @@ public static CoseHeaderMap MergeHeaderMap(this CoseHeaderMap targetMap, CoseHea
92101

93102
foreach (var kvp in sourceMap)
94103
{
95-
targetMap[kvp.Key] = kvp.Value;
104+
if (overwriteConflicts || !targetMap.ContainsKey(kvp.Key))
105+
{
106+
targetMap[kvp.Key] = kvp.Value;
107+
}
96108
}
97109

98110
return targetMap;

CoseSign1.Headers/Local/CoseHeader.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,14 @@ public class CoseHeader<TypeV>
1212
/// <summary>
1313
/// Gets or sets the Header label.
1414
/// </summary>
15+
[JsonRequired]
1516
[JsonPropertyName("label")]
1617
public string Label { get; set; }
1718

1819
/// <summary>
1920
/// Gets or sets the Header value.
2021
/// </summary>
22+
[JsonRequired]
2123
[JsonPropertyName("value")]
2224
public TypeV Value { get; set; }
2325

0 commit comments

Comments
 (0)