using System.Collections.Generic; using Newtonsoft.Json; using LCU.Library.Internal.ApiResponse.Models; using LCU.Library.Internal.DispatcherModels.Enums; using LCU.Api.Internal.Dispatcher.Services; using LCU.Api.Internal.Dispatcher.Services.DispatcherOperationServices; using LCU.Api.Internal.Dispatcher.Services.QueueServices; namespace LCU.Api.Internal.DispatcherTests.ServiceTests.DispatcherOperationServices; public class CompletionServiceTest { private readonly CompletionService _completionService; private readonly Mock _mockJobService; private readonly Mock _mockWorkItemService; private readonly Mock _mockExecutionMessageService; private readonly Mock _mockQueueJobFailureService; private readonly Mock _mockQueueDetermineOperationService; public CompletionServiceTest() { _mockJobService = new Mock(); _mockWorkItemService = new Mock(); _mockExecutionMessageService = new Mock(); _mockQueueJobFailureService = new Mock(); _mockQueueDetermineOperationService = new Mock(); _completionService = new CompletionService(_mockJobService.Object, _mockWorkItemService.Object, _mockExecutionMessageService.Object, _mockQueueJobFailureService.Object, _mockQueueDetermineOperationService.Object); } [Fact] public async Task HandleCompletionRequest_CurrentWorkItemExecution_Null() { var dispatcherReturnResponse = new DispatcherReturnResponse { WorkItemId = 1 }; var response = new Response { ResponsePayload = JsonConvert.SerializeObject(dispatcherReturnResponse), Successful = true }; var workItem = new WorkItem { WorkItemExecutions = new List { new WorkItemExecution { WorkItemId = 1, WorkItemExecutionId = 1, CompletedTimestamp = Convert.ToDateTime("1/1/2022") } } }; var job = new Job() { JobId = 1, Name = "JobOne" }; _mockJobService.Setup(x => x.GetByWorkItemIdExcludingWorkItemsAsync(It.IsAny())).ReturnsAsync(job); _mockWorkItemService.Setup(x => x.GetByIdAsync(It.IsAny())).ReturnsAsync(workItem); await _completionService.HandleCompletionRequest(response); _mockJobService.Verify(x => x.GetByWorkItemIdExcludingWorkItemsAsync(It.IsAny()), Times.Once); _mockQueueJobFailureService.Verify(x => x.QueueJobFailure(It.IsAny(), It.IsAny(), It.IsAny>()), Times.Never); _mockWorkItemService.Verify(x => x.GetByIdAsync(It.IsAny()), Times.Once); _mockExecutionMessageService.Verify(x => x.SaveExecutionMessages(It.IsAny(), It.IsAny>()), Times.Never); _mockWorkItemService.Verify(x => x.ResetCanceledJobCounter(It.IsAny()), Times.Never); _mockJobService.Verify(x => x.UpdateAsync(It.IsAny()), Times.Never); _mockQueueDetermineOperationService.Verify(x => x.QueueDetermineOperation(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); } [Fact] public async Task HandleCompletionRequest_Successful_False() { var dispatcherReturnResponse = new DispatcherReturnResponse { WorkItemId = 1 }; var response = new Response { ResponsePayload = JsonConvert.SerializeObject(dispatcherReturnResponse), Successful = false }; var workItemExecution = new WorkItemExecution { WorkItemExecutionId = 1, WorkItemId = 1, CompletedTimestamp = null, Status = StatusType.Processing }; var workItem = new WorkItem { WorkItemId = 1, CancelJobOnFailure = false, Url = "http://testing.com", SerializedPayload = "{\"Test\":\"Test\"}", HttpMethod = HttpMethodType.Post, WorkItemExecutions = new List { workItemExecution } }; var job = new Job { JobId = 1 }; _mockJobService.Setup(x => x.GetByWorkItemIdExcludingWorkItemsAsync(It.IsAny())).ReturnsAsync(job); _mockWorkItemService.Setup(x => x.GetByIdAsync(It.IsAny())).ReturnsAsync(workItem); _mockExecutionMessageService.Setup(x => x.SaveExecutionMessages(It.IsAny(), It.IsAny>())).Verifiable(); _mockQueueJobFailureService.Setup(x => x.QueueJobFailure(It.IsAny(), It.IsAny(), It.IsAny>())).Verifiable(); _mockQueueDetermineOperationService.Setup(x => x.QueueDetermineOperation(It.IsAny(), It.IsAny(), It.IsAny())).Verifiable(); await _completionService.HandleCompletionRequest(response); _mockJobService.Verify(x => x.GetByWorkItemIdExcludingWorkItemsAsync(It.IsAny()), Times.Once); _mockQueueJobFailureService.Verify(x => x.QueueJobFailure(It.IsAny(), It.IsAny(), It.IsAny>()), Times.Once); _mockWorkItemService.Verify(x => x.GetByIdAsync(It.IsAny()), Times.Never); _mockExecutionMessageService.Verify(x => x.SaveExecutionMessages(It.IsAny(), It.IsAny>()), Times.Never); _mockWorkItemService.Verify(x => x.ResetCanceledJobCounter(It.IsAny()), Times.Never); _mockJobService.Verify(x => x.UpdateAsync(It.IsAny()), Times.Never); _mockQueueDetermineOperationService.Verify(x => x.QueueDetermineOperation(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); } [Fact] public async Task HandleCompletionRequest_Successful_true_ResetCanceledJobCounter_CompleteJob() { var dispatcherReturnResponse = new DispatcherReturnResponse { WorkItemId = 1 }; var response = new Response { ResponsePayload = JsonConvert.SerializeObject(dispatcherReturnResponse), Successful = true }; var workItemExecution = new WorkItemExecution { WorkItemExecutionId = 1, WorkItemId = 1, CompletedTimestamp = null, Status = StatusType.Failed }; var workItem = new WorkItem { WorkItemId = 1, CancelJobOnFailure = true, CanceledJobCounter = 1, CancelJobLimit = 1, Url = "http://testing.com", SerializedPayload = "{\"Test\":\"Test\"}", HttpMethod = HttpMethodType.Post, Order = 1, WorkItemExecutions = new List { workItemExecution } }; var job = new Job { JobId = 1, WorkItems = new List { workItem } }; var updatedWorkItem = new WorkItem { WorkItemId = 1, CancelJobOnFailure = true, CanceledJobCounter = 0, CancelJobLimit = 1, Url = "http://testing.com", SerializedPayload = "{\"Test\":\"Test\"}", HttpMethod = HttpMethodType.Post, Order = 1, WorkItemExecutions = new List { workItemExecution } }; var updatedJob = new Job { JobId = 1, JobStatus = JobStatus.DeterminingOperation }; _mockJobService.Setup(x => x.GetByWorkItemIdExcludingWorkItemsAsync(It.IsAny())).ReturnsAsync(job); _mockWorkItemService.Setup(x => x.GetByIdAsync(It.IsAny())).ReturnsAsync(workItem); _mockExecutionMessageService.Setup(x => x.SaveExecutionMessages(It.IsAny(), It.IsAny>())).Verifiable(); _mockQueueJobFailureService.Setup(x => x.QueueJobFailure(It.IsAny(), It.IsAny(), It.IsAny>())).Verifiable(); _mockJobService.Setup(x => x.UpdateAsync(It.IsAny())).ReturnsAsync(updatedJob); _mockQueueDetermineOperationService.Setup(x => x.QueueDetermineOperation(It.IsAny(), It.IsAny(), It.IsAny())).Verifiable(); await _completionService.HandleCompletionRequest(response); _mockJobService.Verify(x => x.GetByWorkItemIdExcludingWorkItemsAsync(It.IsAny()), Times.Once); _mockQueueJobFailureService.Verify(x => x.QueueJobFailure(It.IsAny(), It.IsAny(), It.IsAny>()), Times.Never); _mockWorkItemService.Verify(x => x.GetByIdAsync(It.IsAny()), Times.Once); _mockExecutionMessageService.Verify(x => x.SaveExecutionMessages(It.IsAny(), It.IsAny>()), Times.Once); _mockWorkItemService.Verify(x => x.ResetCanceledJobCounter(It.IsAny()), Times.Once); _mockJobService.Verify(x => x.UpdateAsync(It.IsAny()), Times.Once); _mockQueueDetermineOperationService.Verify(x => x.QueueDetermineOperation(It.IsAny(), It.IsAny(), It.IsAny()), Times.Once); } }