11namespace ServiceControl . AcceptanceTests . Recoverability
22{
3+ using System ;
4+ using System . Collections . Generic ;
35 using System . Linq ;
46 using System . Text . Json ;
57 using System . Threading . Tasks ;
68 using AcceptanceTesting ;
79 using AcceptanceTesting . EndpointTemplates ;
810 using AcceptanceTests ;
9- using Infrastructure ;
1011 using NServiceBus ;
1112 using NServiceBus . AcceptanceTesting ;
1213 using NServiceBus . Settings ;
@@ -22,27 +23,40 @@ public async Task A_new_message_failure_is_created()
2223 var context = await Define < EditMessageFailureContext > ( )
2324 . WithEndpoint < FailingEditedMessageReceiver > ( e => e
2425 . When ( c => c . SendLocal ( new FailingMessage ( ) ) )
25- . DoNotFailOnErrorMessages ( ) )
26+ . DoNotFailOnErrorMessages ( ) )
2627 . Done ( async ctx =>
2728 {
28- if ( ctx . OriginalMessageFailureId == null )
29+ if ( ! ctx . OrignalMessageHandled )
2930 {
3031 return false ;
3132 }
3233
3334 if ( ! ctx . EditedMessage )
3435 {
35- var failedMessage = await this . TryGet < FailedMessage > ( $ "/api/errors/{ ctx . OriginalMessageFailureId } ") ;
36- if ( ! failedMessage . HasResult )
36+ var allFailedMessages = await this . TryGet < IList < FailedMessageView > > ( $ "/api/errors/?status=unresolved") ;
37+ if ( ! allFailedMessages . HasResult )
38+ {
39+ return false ;
40+ }
41+
42+ if ( allFailedMessages . Item . Count != 1 )
3743 {
3844 return false ;
3945 }
4046
47+ ctx . OriginalMessageFailureId = allFailedMessages . Item . First ( ) . Id ;
48+
4149 ctx . EditedMessage = true ;
50+ var editedMessageInternalId = Guid . NewGuid ( ) . ToString ( ) ;
51+ ctx . EditedMessageInternalId = editedMessageInternalId ;
4252 var editedMessage = JsonSerializer . Serialize ( new FailingMessage
4353 {
44- HasBeenEdited = true
54+ HasBeenEdited = true ,
55+ MessageInternalId = editedMessageInternalId
4556 } ) ;
57+
58+ var failedMessage = await this . TryGet < FailedMessage > ( $ "/api/errors/{ ctx . OriginalMessageFailureId } ") ;
59+
4660 var editModel = new EditMessageModel
4761 {
4862 MessageBody = editedMessage ,
@@ -53,23 +67,32 @@ public async Task A_new_message_failure_is_created()
5367 return false ;
5468 }
5569
56- if ( ctx . EditedMessageFailureId == null )
70+ if ( ! ctx . EditedMessageHandled )
71+ {
72+ return false ;
73+ }
74+
75+ var allFailedMessagesAfterEdit = await this . TryGet < IList < FailedMessageView > > ( $ "/api/errors/?status=unresolved") ;
76+ if ( ! allFailedMessagesAfterEdit . HasResult )
5777 {
5878 return false ;
5979 }
6080
61- var failedEditedMessage = await this . TryGet < FailedMessage > ( $ "/api/errors/{ ctx . EditedMessageFailureId } ") ;
62- if ( ! failedEditedMessage . HasResult )
81+ if ( allFailedMessagesAfterEdit . Item . Count != 1 )
6382 {
6483 return false ;
6584 }
6685
86+ ctx . EditedMessageFailureId = allFailedMessagesAfterEdit . Item . First ( ) . Id ;
87+
6788 ctx . OriginalMessageFailure = ( await this . TryGet < FailedMessage > ( $ "/api/errors/{ ctx . OriginalMessageFailureId } ") ) . Item ;
6889 ctx . EditedMessageFailure = ( await this . TryGet < FailedMessage > ( $ "/api/errors/{ ctx . EditedMessageFailureId } ") ) . Item ;
6990 return true ;
7091 } )
7192 . Run ( ) ;
7293
94+ var editedMessageBody = JsonSerializer . Deserialize < FailingMessage > ( context . EditedMessageFailure . ProcessingAttempts . Last ( ) . MessageMetadata [ "MsgFullText" ] . ToString ( ) ) ;
95+
7396 Assert . Multiple ( ( ) =>
7497 {
7598 Assert . That ( context . OriginalMessageFailure . Id , Is . Not . EqualTo ( context . EditedMessageFailure . Id ) ) ;
@@ -79,16 +102,21 @@ public async Task A_new_message_failure_is_created()
79102 Assert . That (
80103 "FailedMessages/" + context . EditedMessageFailure . ProcessingAttempts . Last ( ) . Headers [ "ServiceControl.EditOf" ] ,
81104 Is . EqualTo ( context . OriginalMessageFailure . Id ) ) ;
105+ Assert . That ( editedMessageBody . MessageInternalId , Is . EqualTo ( context . EditedMessageInternalId ) ) ;
82106 } ) ;
83107 }
84108
85109 class EditMessageFailureContext : ScenarioContext
86110 {
87- public string OriginalMessageFailureId { get ; set ; }
111+ public bool OrignalMessageHandled { get ; set ; }
88112 public bool EditedMessage { get ; set ; }
89- public string EditedMessageFailureId { get ; set ; }
113+ public bool EditedMessageHandled { get ; set ; }
90114 public FailedMessage OriginalMessageFailure { get ; set ; }
91115 public FailedMessage EditedMessageFailure { get ; set ; }
116+
117+ public string OriginalMessageFailureId { get ; set ; }
118+ public string EditedMessageFailureId { get ; set ; }
119+ public string EditedMessageInternalId { get ; set ; }
92120 }
93121
94122 class FailingEditedMessageReceiver : EndpointConfigurationBuilder
@@ -102,11 +130,11 @@ public Task Handle(FailingMessage message, IMessageHandlerContext context)
102130 {
103131 if ( message . HasBeenEdited )
104132 {
105- testContext . EditedMessageFailureId = DeterministicGuid . MakeId ( context . MessageId , settings . EndpointName ( ) ) . ToString ( ) ;
133+ testContext . EditedMessageHandled = true ;
106134 }
107135 else
108136 {
109- testContext . OriginalMessageFailureId = DeterministicGuid . MakeId ( context . MessageId , settings . EndpointName ( ) ) . ToString ( ) ;
137+ testContext . OrignalMessageHandled = true ;
110138 }
111139
112140 throw new SimulatedException ( ) ;
@@ -116,7 +144,8 @@ public Task Handle(FailingMessage message, IMessageHandlerContext context)
116144
117145 class FailingMessage : IMessage
118146 {
119- public bool HasBeenEdited { get ; set ; }
147+ public bool HasBeenEdited { get ; init ; }
148+ public string MessageInternalId { get ; init ; }
120149 }
121150 }
122151}
0 commit comments