using AsbCloudInfrastructure.Services.Background; using System; using System.Threading; using System.Threading.Tasks; using Xunit; namespace AsbCloudWebApi.Tests.ServicesTests { public class BackgroundWorkerService_WorkQueue_Test { private readonly TimeSpan period = TimeSpan.FromSeconds(10); private readonly Func somAction = (string id, IServiceProvider scope, CancellationToken token) => Task.CompletedTask; [Fact] public void Push_not_unique_id_should_throw() { var work1 = new WorkPeriodic("1", somAction, TimeSpan.FromSeconds(30)); var work2 = new WorkBase("1", somAction); var queue = new WorkQueue(); queue.Push(work1); Assert.Throws( () => queue.Push(work2)); } [Fact] public void Pop_should_return_null() { var work1 = new WorkPeriodic("1", somAction, TimeSpan.FromSeconds(30)) { LastStart = DateTime.Now }; var queue = new WorkQueue(); queue.Push(work1); var workpoPoped= queue.Pop(); Assert.Null(workpoPoped); } [Fact] public void Pop_primary_first() { var work1 = new WorkBase("1", somAction); var work2 = new WorkPeriodic("1", somAction, period); var queue = new WorkQueue(); queue.Push(work2); queue.Push(work1); var workpoPoped= queue.Pop(); Assert.Equal(work1, workpoPoped); } [Fact] public void Pop_second_after_delete_first() { var work1 = new WorkPeriodic("1", somAction, period); var work2 = new WorkPeriodic("2", somAction, period); var queue = new WorkQueue(); queue.Push(work1); queue.Push(work2); queue.Delete("1"); var workpoPoped= queue.Pop(); Assert.Equal(work2, workpoPoped); } [Fact] public void Pop_closest_to_nextStart() { var work1 = new WorkPeriodic("1", somAction, period) { LastStart = DateTime.Now, }; var work2 = new WorkPeriodic("2", somAction, period); var queue = new WorkQueue(); queue.Push(work1); queue.Push(work2); var workpoPoped= queue.Pop(); Assert.Equal(work2, workpoPoped); } [Fact] public void Pop_closest_to_explicit_nextStart() { var baseTime = DateTime.Now - period; var work1 = new WorkPeriodic("1", somAction, period) { LastStart = baseTime - TimeSpan.FromSeconds(-1), }; var work2 = new WorkPeriodic("2", somAction, period) { LastStart = baseTime, }; var queue = new WorkQueue(); queue.Push(work1); queue.Push(work2); var workpoPoped= queue.Pop(); Assert.Equal(work2, workpoPoped); } } }