11namespace ServiceControl . AcceptanceTests . Recoverability
22{
33 using System ;
4- using System . Collections . Generic ;
54 using System . Linq ;
65 using System . Text . Json ;
76 using System . Threading . Tasks ;
87 using AcceptanceTesting ;
98 using AcceptanceTesting . EndpointTemplates ;
109 using AcceptanceTests ;
11- using ExternalIntegration ;
10+ using Contracts . MessageFailures ;
1211 using NServiceBus ;
1312 using NServiceBus . AcceptanceTesting ;
1413 using NUnit . Framework ;
@@ -20,9 +19,21 @@ class When_edited_message_fails_to_process : AcceptanceTest
2019 [ Test ]
2120 public async Task A_new_message_failure_is_created ( )
2221 {
22+ CustomConfiguration = config => config . OnEndpointSubscribed < EditMessageFailureContext > ( ( s , ctx ) =>
23+ {
24+ ctx . ExternalProcessorSubscribed = s . SubscriberReturnAddress . Contains ( nameof ( FailingEditedMessageReceiver ) ) ;
25+ } ) ;
26+
2327 var context = await Define < EditMessageFailureContext > ( )
24- . WithEndpoint < FailingEditedMessageReceiver > ( e => e
25- . When ( c => c . SendLocal ( new FailingMessage ( ) ) )
28+ . WithEndpoint < FailingEditedMessageReceiver > ( b => b . When ( async ( bus , c ) =>
29+ {
30+ await bus . Subscribe < MessageFailed > ( ) ;
31+
32+ if ( c . HasNativePubSubSupport )
33+ {
34+ c . ExternalProcessorSubscribed = true ;
35+ }
36+ } ) . When ( c => c . SendLocal ( new FailingMessage ( ) ) )
2637 . DoNotFailOnErrorMessages ( ) )
2738 . Done ( async ctx =>
2839 {
@@ -62,7 +73,7 @@ public async Task A_new_message_failure_is_created()
6273 return false ;
6374 }
6475
65- if ( ! ctx . EditedMessageHandled )
76+ if ( ! ctx . EditedMessageHandled || ! ctx . MessageFailedHandled )
6677 {
6778 return false ;
6879 }
@@ -112,14 +123,18 @@ class EditMessageFailureContext : ScenarioContext
112123 public string OriginalMessageFailureId { get ; set ; }
113124 public string EditedMessageFailureId { get ; set ; }
114125 public string EditedMessageInternalId { get ; set ; }
126+ public bool ExternalProcessorSubscribed { get ; set ; }
127+ public string FirstMessageFailedId { get ; set ; }
128+ public string SecondMessageFailedId { get ; set ; }
129+ public bool MessageFailedHandled { get ; set ; }
115130 }
116131
117132 class FailingEditedMessageReceiver : EndpointConfigurationBuilder
118133 {
119134 public FailingEditedMessageReceiver ( ) => EndpointSetup < DefaultServerWithoutAudit > ( c => { c . NoRetries ( ) ; } ) ;
120135
121136 class FailingMessageHandler ( EditMessageFailureContext testContext )
122- : IHandleMessages < FailingMessage >
137+ : IHandleMessages < FailingMessage > , IHandleMessages < MessageFailed >
123138 {
124139 public Task Handle ( FailingMessage message , IMessageHandlerContext context )
125140 {
@@ -134,6 +149,20 @@ public Task Handle(FailingMessage message, IMessageHandlerContext context)
134149
135150 throw new SimulatedException ( ) ;
136151 }
152+
153+ public Task Handle ( MessageFailed message , IMessageHandlerContext context )
154+ {
155+ if ( testContext . FirstMessageFailedId == null )
156+ {
157+ testContext . FirstMessageFailedId = message . FailedMessageId ;
158+ }
159+ else
160+ {
161+ testContext . SecondMessageFailedId = message . FailedMessageId ;
162+ testContext . MessageFailedHandled = true ;
163+ }
164+ return Task . CompletedTask ;
165+ }
137166 }
138167 }
139168
0 commit comments