@@ -108,6 +108,35 @@ func TestMerge_ErrorCases(t *testing.T) {
108108 require .Nil (t , result )
109109 require .Contains (t , err .Error (), "requires at least one endorsement" )
110110 })
111+
112+ t .Run ("conflicting namespace writes" , func (t * testing.T ) {
113+ t .Parallel ()
114+
115+ tx1 := createTestTx ([]string {"ns1" }, map [string ][]string {"ns1" : {"Org1MSP" }})
116+ tx2 := createTestTx ([]string {"ns1" }, map [string ][]string {"ns1" : {"Org2MSP" }})
117+
118+ tx1 .Namespaces [0 ].ReadWrites = []* applicationpb.ReadWrite {{
119+ Key : []byte ("asset-1" ),
120+ Value : []byte ("value-a" ),
121+ }}
122+ tx2 .Namespaces [0 ].ReadWrites = []* applicationpb.ReadWrite {{
123+ Key : []byte ("asset-1" ),
124+ Value : []byte ("value-b" ),
125+ }}
126+
127+ result , err := Merge ([]* applicationpb.Tx {tx1 , tx2 })
128+ require .Error (t , err )
129+ require .Nil (t , result )
130+ require .Contains (t , err .Error (), "content mismatch" )
131+ })
132+ }
133+
134+ func TestMerge_NilTransaction (t * testing.T ) {
135+ t .Parallel ()
136+
137+ result , err := Merge ([]* applicationpb.Tx {nil , nil })
138+ require .Error (t , err )
139+ require .Nil (t , result )
111140}
112141
113142func TestMerge_SingleNamespace (t * testing.T ) {
@@ -321,3 +350,33 @@ func TestMerge_PreservesTransactionContent(t *testing.T) {
321350 require .Len (t , result .Endorsements [0 ].EndorsementsWithIdentity , 2 )
322351 })
323352}
353+
354+ func TestMerge_EmptyReadWriteSetIsValid (t * testing.T ) {
355+ t .Parallel ()
356+
357+ tx1 := createTestTx ([]string {"ns1" }, map [string ][]string {"ns1" : {"Org1MSP" }})
358+ tx2 := createTestTx ([]string {"ns1" }, map [string ][]string {"ns1" : {"Org2MSP" }})
359+
360+ result , err := Merge ([]* applicationpb.Tx {tx1 , tx2 })
361+ require .NoError (t , err )
362+ require .NotNil (t , result )
363+ require .Len (t , result .Namespaces , 1 )
364+ require .Empty (t , result .Namespaces [0 ].ReadWrites )
365+ require .Len (t , result .Endorsements [0 ].EndorsementsWithIdentity , 2 )
366+ }
367+
368+ func TestMerge_DuplicateEndorsements (t * testing.T ) {
369+ t .Parallel ()
370+
371+ tx1 := createTestTx ([]string {"ns1" }, map [string ][]string {"ns1" : {"Org1MSP" , "Org1MSP" , "Org2MSP" }})
372+ tx2 := createTestTx ([]string {"ns1" }, map [string ][]string {"ns1" : {"Org2MSP" , "Org3MSP" }})
373+
374+ result , err := Merge ([]* applicationpb.Tx {tx1 , tx2 })
375+ require .NoError (t , err )
376+ require .NotNil (t , result )
377+ require .Len (t , result .Endorsements , 1 )
378+ require .Len (t , result .Endorsements [0 ].EndorsementsWithIdentity , 3 )
379+ require .Equal (t , "Org1MSP" , result .Endorsements [0 ].EndorsementsWithIdentity [0 ].Identity .GetMspId ())
380+ require .Equal (t , "Org2MSP" , result .Endorsements [0 ].EndorsementsWithIdentity [1 ].Identity .GetMspId ())
381+ require .Equal (t , "Org3MSP" , result .Endorsements [0 ].EndorsementsWithIdentity [2 ].Identity .GetMspId ())
382+ }
0 commit comments