using Bit.Core.Services; using Bit.Test.Common.AutoFixture; using Bit.Test.Common.AutoFixture.Attributes; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using NSubstitute; using Xunit; namespace Bit.Core.Test.Services; [SutProviderCustomize] public class PlayIdServiceTests { [Theory] [BitAutoData] public void InPlay_WhenPlayIdSetAndDevelopment_ReturnsTrue( string playId, SutProvider sutProvider) { sutProvider.GetDependency().EnvironmentName.Returns(Environments.Development); sutProvider.Sut.PlayId = playId; var result = sutProvider.Sut.InPlay(out var resultPlayId); Assert.True(result); Assert.Equal(playId, resultPlayId); } [Theory] [BitAutoData] public void InPlay_WhenPlayIdSetButNotDevelopment_ReturnsFalse( string playId, SutProvider sutProvider) { sutProvider.GetDependency().EnvironmentName.Returns(Environments.Production); sutProvider.Sut.PlayId = playId; var result = sutProvider.Sut.InPlay(out var resultPlayId); Assert.False(result); Assert.Equal(playId, resultPlayId); } [Theory] [BitAutoData((string?)null)] [BitAutoData("")] public void InPlay_WhenPlayIdNullOrEmptyAndDevelopment_ReturnsFalse( string? playId, SutProvider sutProvider) { sutProvider.GetDependency().EnvironmentName.Returns(Environments.Development); sutProvider.Sut.PlayId = playId; var result = sutProvider.Sut.InPlay(out var resultPlayId); Assert.False(result); Assert.Empty(resultPlayId); } [Theory] [BitAutoData] public void PlayId_CanGetAndSet(string playId) { var hostEnvironment = Substitute.For(); var sut = new PlayIdService(hostEnvironment); sut.PlayId = playId; Assert.Equal(playId, sut.PlayId); } } [SutProviderCustomize] public class NeverPlayIdServicesTests { [Fact] public void InPlay_ReturnsFalse() { var sut = new NeverPlayIdServices(); var result = sut.InPlay(out var playId); Assert.False(result); Assert.Empty(playId); } [Theory] [InlineData("test-play-id")] [InlineData(null)] public void PlayId_SetterDoesNothing_GetterReturnsNull(string? value) { var sut = new NeverPlayIdServices(); sut.PlayId = value; Assert.Null(sut.PlayId); } } [SutProviderCustomize] public class PlayIdSingletonServiceTests { public static IEnumerable SutProvider() { var sutProvider = new SutProvider(); var httpContext = sutProvider.CreateDependency(); var serviceProvider = sutProvider.CreateDependency(); var hostEnvironment = sutProvider.CreateDependency(); var playIdService = new PlayIdService(hostEnvironment); sutProvider.SetDependency(playIdService); httpContext.RequestServices.Returns(serviceProvider); serviceProvider.GetService().Returns(playIdService); serviceProvider.GetRequiredService().Returns(playIdService); sutProvider.CreateDependency().HttpContext.Returns(httpContext); sutProvider.Create(); return [[sutProvider]]; } private void PrepHttpContext( SutProvider sutProvider) { var httpContext = sutProvider.CreateDependency(); var serviceProvider = sutProvider.CreateDependency(); var PlayIdService = sutProvider.CreateDependency(); httpContext.RequestServices.Returns(serviceProvider); serviceProvider.GetRequiredService().Returns(PlayIdService); sutProvider.GetDependency().HttpContext.Returns(httpContext); } [Theory] [BitMemberAutoData(nameof(SutProvider))] public void InPlay_WhenNoHttpContext_ReturnsFalse( SutProvider sutProvider) { sutProvider.GetDependency().HttpContext.Returns((HttpContext?)null); sutProvider.GetDependency().EnvironmentName.Returns(Environments.Development); var result = sutProvider.Sut.InPlay(out var playId); Assert.False(result); Assert.Empty(playId); } [Theory] [BitMemberAutoData(nameof(SutProvider))] public void InPlay_WhenNotDevelopment_ReturnsFalse( SutProvider sutProvider, string playIdValue) { var scopedPlayIdService = sutProvider.GetDependency(); scopedPlayIdService.PlayId = playIdValue; sutProvider.GetDependency().EnvironmentName.Returns(Environments.Production); var result = sutProvider.Sut.InPlay(out var playId); Assert.False(result); Assert.Empty(playId); } [Theory] [BitMemberAutoData(nameof(SutProvider))] public void InPlay_WhenDevelopmentAndHttpContextWithPlayId_ReturnsTrue( SutProvider sutProvider, string playIdValue) { sutProvider.GetDependency().PlayId = playIdValue; sutProvider.GetDependency().EnvironmentName.Returns(Environments.Development); var result = sutProvider.Sut.InPlay(out var playId); Assert.True(result); Assert.Equal(playIdValue, playId); } [Theory] [BitMemberAutoData(nameof(SutProvider))] public void PlayId_SetterSetsOnScopedService( SutProvider sutProvider, string playIdValue) { var scopedPlayIdService = sutProvider.GetDependency(); sutProvider.Sut.PlayId = playIdValue; Assert.Equal(playIdValue, scopedPlayIdService.PlayId); } [Theory] [BitMemberAutoData(nameof(SutProvider))] public void PlayId_WhenNoHttpContext_GetterReturnsNull( SutProvider sutProvider) { sutProvider.GetDependency().HttpContext.Returns((HttpContext?)null); var result = sutProvider.Sut.PlayId; Assert.Null(result); } [Theory] [BitMemberAutoData(nameof(SutProvider))] public void PlayId_WhenNoHttpContext_SetterDoesNotThrow( SutProvider sutProvider, string playIdValue) { sutProvider.GetDependency().HttpContext.Returns((HttpContext?)null); sutProvider.Sut.PlayId = playIdValue; } }