public async Task Entry_FailedToDeliver_MaxRetryReached()
        {
            var costUserId = Guid.NewGuid();
            var costId     = Guid.NewGuid();
            var costUser   = new CostUser
            {
                Email = "*****@*****.**",
                Id    = costUserId
            };
            var data = new Dictionary <string, object>();

            data[Constants.ActivityLogData.CostId] = costId;
            var delivery = new ActivityLogDelivery
            {
                RetryCount = MaxRetry,
                Status     = ActivityLogDeliveryStatus.New
            };
            var entry = new ActivityLog
            {
                ActivityLogType     = ActivityLogType.CostCreated,
                IpAddress           = "127.0.0.1",
                Data                = JsonConvert.SerializeObject(data),
                Timestamp           = DateTime.UtcNow,
                Created             = DateTime.UtcNow,
                CostUserId          = costUserId,
                CostUser            = costUser,
                ActivityLogDelivery = delivery
            };
            var message  = new ActivityLogMessage();
            var expected = ActivityLogDeliveryStatus.MaxRetriesReached;

            await _target.EntryDeliveryFailed(entry, message);

            entry.ActivityLogDelivery.Status.Should().Be(expected);
        }
        public async void Execute()
        {
            Stopwatch sw = new Stopwatch();

            sw.Start();
            StringBuilder logMessage = new StringBuilder();

            try
            {
                logMessage.AppendLine("Starting ActivityLogDeliveryJob!");

                await _service.UpdateEntriesToProcessing();

                var entries = await _service.GetProcessingActivityLogs();

                if (entries == null || !entries.Any())
                {
                    //not entries to send
                    logMessage.AppendLine("No activity log entries ready for delivery.");
                }
                else
                {
                    List <ActivityLog> successLogs = new List <ActivityLog>();
                    Dictionary <ActivityLog, ActivityLogMessage> failedLogs = new Dictionary <ActivityLog, ActivityLogMessage>();
                    foreach (var entry in entries)
                    {
                        ActivityLogMessage message = null;
                        try
                        {
                            entry.ActivityLogDelivery.RetryCount++;

                            logMessage.AppendLine($"Building Activity Log: {entry.Id}");
                            message = _service.BuildLogMessage(entry);
                            logMessage.AppendLine($"Built Activity Log Message: {message.Message}");

                            logMessage.AppendLine($"Sending Activity Log: {entry.Id}");
                            var success = _paperPusherClient.SendMessage(message.Message).Result;
                            if (success)
                            {
                                logMessage.AppendLine($"Successfully sent Activity Log: {entry.Id}");
                                successLogs.Add(entry);
                            }
                            else
                            {
                                logMessage.AppendLine($"[Warning] Failed to send Activity Log: {entry.Id}");
                                failedLogs.Add(entry, message);
                            }
                        }
                        catch (Exception ex)
                        {
                            logMessage.AppendLine($"[Error] Failed to send Activity Log: {entry.Id} - {ex}");
                            failedLogs.Add(entry, message);
                        }
                    }

                    _service.EntriesDeliveredSuccessfully(successLogs);
                    await _service.EntriesDeliveryFailed(failedLogs);
                }
            }
            catch (Exception ex)
            {
                logMessage.AppendLine($"[Error] An error occurred whilst executing ActivityLogDeliveryJob. - {ex}");
            }
            finally
            {
                sw.Stop();
                logMessage.AppendLine($"Finished ActivityLogDeliveryJob! - Effort: {sw.ElapsedMilliseconds}");
                Logger.Information(logMessage.ToString());
            }
        }