Browse Source

replace moq with nsubstitute (#1365)

pull/1366/head
Jason Dove 2 years ago committed by GitHub
parent
commit
797d4005e2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 126
      ErsatzTV.Core.Tests/Emby/EmbyPathReplacementServiceTests.cs
  2. 2
      ErsatzTV.Core.Tests/ErsatzTV.Core.Tests.csproj
  3. 6
      ErsatzTV.Core.Tests/FFmpeg/HlsPlaylistFilterTests.cs
  4. 140
      ErsatzTV.Core.Tests/Jellyfin/JellyfinPathReplacementServiceTests.cs
  5. 4
      ErsatzTV.Core.Tests/Metadata/FallbackMetadataProviderTests.cs
  6. 114
      ErsatzTV.Core.Tests/Plex/PlexPathReplacementServiceTests.cs
  7. 393
      ErsatzTV.Core.Tests/Scheduling/PlayoutBuilderTests.cs
  8. 6
      ErsatzTV.Core.Tests/Scheduling/PlayoutModeSchedulerBaseTests.cs
  9. 20
      ErsatzTV.Core.Tests/Scheduling/PlayoutModeSchedulerDurationTests.cs
  10. 28
      ErsatzTV.Core.Tests/Scheduling/PlayoutModeSchedulerFloodTests.cs
  11. 18
      ErsatzTV.Core.Tests/Scheduling/PlayoutModeSchedulerMultipleTests.cs
  12. 22
      ErsatzTV.Core.Tests/Scheduling/PlayoutModeSchedulerOneTests.cs
  13. 16
      ErsatzTV.Core.Tests/Scheduling/ScheduleIntegrationTests.cs
  14. 2
      ErsatzTV.FFmpeg.Tests/ErsatzTV.FFmpeg.Tests.csproj
  15. 4
      ErsatzTV.FFmpeg.Tests/PipelineBuilderBaseTests.cs
  16. 10
      ErsatzTV.Infrastructure.Tests/Data/Repositories/Caching/CachingSearchRepositoryTests.cs
  17. 2
      ErsatzTV.Infrastructure.Tests/ErsatzTV.Infrastructure.Tests.csproj
  18. 75
      ErsatzTV.Scanner.Tests/Core/FFmpeg/TranscodingTests.cs
  19. 10
      ErsatzTV.Scanner.Tests/Core/Metadata/LocalStatisticsProviderTests.cs
  20. 14
      ErsatzTV.Scanner.Tests/Core/Metadata/LocalSubtitlesProviderTests.cs
  21. 356
      ErsatzTV.Scanner.Tests/Core/Metadata/MovieFolderScannerTests.cs
  22. 4
      ErsatzTV.Scanner.Tests/Core/Metadata/Nfo/ArtistNfoReaderTests.cs
  23. 4
      ErsatzTV.Scanner.Tests/Core/Metadata/Nfo/EpisodeNfoReaderTests.cs
  24. 4
      ErsatzTV.Scanner.Tests/Core/Metadata/Nfo/MovieNfoReaderTests.cs
  25. 4
      ErsatzTV.Scanner.Tests/Core/Metadata/Nfo/MusicVideoNfoReaderTests.cs
  26. 4
      ErsatzTV.Scanner.Tests/Core/Metadata/Nfo/OtherVideoNfoReaderTests.cs
  27. 4
      ErsatzTV.Scanner.Tests/Core/Metadata/Nfo/ShowNfoReaderTests.cs
  28. 2
      ErsatzTV.Scanner.Tests/ErsatzTV.Scanner.Tests.csproj

126
ErsatzTV.Core.Tests/Emby/EmbyPathReplacementServiceTests.cs

@ -5,7 +5,7 @@ using ErsatzTV.Core.Interfaces.Repositories;
using ErsatzTV.FFmpeg.Runtime; using ErsatzTV.FFmpeg.Runtime;
using FluentAssertions; using FluentAssertions;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Moq; using NSubstitute;
using NUnit.Framework; using NUnit.Framework;
namespace ErsatzTV.Core.Tests.Emby; namespace ErsatzTV.Core.Tests.Emby;
@ -27,16 +27,16 @@ public class EmbyPathReplacementServiceTests
} }
}; };
var repo = new Mock<IMediaSourceRepository>(); IMediaSourceRepository repo = Substitute.For<IMediaSourceRepository>();
repo.Setup(x => x.GetEmbyPathReplacementsByLibraryId(It.IsAny<int>())).Returns(replacements.AsTask()); repo.GetEmbyPathReplacementsByLibraryId(Arg.Any<int>()).Returns(replacements.AsTask());
var runtime = new Mock<IRuntimeInfo>(); IRuntimeInfo runtime = Substitute.For<IRuntimeInfo>();
runtime.Setup(x => x.IsOSPlatform(OSPlatform.Windows)).Returns(true); runtime.IsOSPlatform(OSPlatform.Windows).Returns(true);
var service = new EmbyPathReplacementService( var service = new EmbyPathReplacementService(
repo.Object, repo,
runtime.Object, runtime,
new Mock<ILogger<EmbyPathReplacementService>>().Object); Substitute.For<ILogger<EmbyPathReplacementService>>());
string result = await service.GetReplacementEmbyPath( string result = await service.GetReplacementEmbyPath(
0, 0,
@ -59,16 +59,16 @@ public class EmbyPathReplacementServiceTests
} }
}; };
var repo = new Mock<IMediaSourceRepository>(); IMediaSourceRepository repo = Substitute.For<IMediaSourceRepository>();
repo.Setup(x => x.GetEmbyPathReplacementsByLibraryId(It.IsAny<int>())).Returns(replacements.AsTask()); repo.GetEmbyPathReplacementsByLibraryId(Arg.Any<int>()).Returns(replacements.AsTask());
var runtime = new Mock<IRuntimeInfo>(); IRuntimeInfo runtime = Substitute.For<IRuntimeInfo>();
runtime.Setup(x => x.IsOSPlatform(OSPlatform.Windows)).Returns(false); runtime.IsOSPlatform(OSPlatform.Windows).Returns(false);
var service = new EmbyPathReplacementService( var service = new EmbyPathReplacementService(
repo.Object, repo,
runtime.Object, runtime,
new Mock<ILogger<EmbyPathReplacementService>>().Object); Substitute.For<ILogger<EmbyPathReplacementService>>());
string result = await service.GetReplacementEmbyPath( string result = await service.GetReplacementEmbyPath(
0, 0,
@ -82,15 +82,15 @@ public class EmbyPathReplacementServiceTests
{ {
var mediaSource = new EmbyMediaSource { OperatingSystem = "Windows" }; var mediaSource = new EmbyMediaSource { OperatingSystem = "Windows" };
var repo = new Mock<IMediaSourceRepository>(); IMediaSourceRepository repo = Substitute.For<IMediaSourceRepository>();
var runtime = new Mock<IRuntimeInfo>(); IRuntimeInfo runtime = Substitute.For<IRuntimeInfo>();
runtime.Setup(x => x.IsOSPlatform(OSPlatform.Windows)).Returns(false); runtime.IsOSPlatform(OSPlatform.Windows).Returns(false);
var service = new EmbyPathReplacementService( var service = new EmbyPathReplacementService(
repo.Object, repo,
runtime.Object, runtime,
new Mock<ILogger<EmbyPathReplacementService>>().Object); Substitute.For<ILogger<EmbyPathReplacementService>>());
string result = service.ReplaceNetworkPath( string result = service.ReplaceNetworkPath(
mediaSource, mediaSource,
@ -115,16 +115,16 @@ public class EmbyPathReplacementServiceTests
} }
}; };
var repo = new Mock<IMediaSourceRepository>(); IMediaSourceRepository repo = Substitute.For<IMediaSourceRepository>();
repo.Setup(x => x.GetEmbyPathReplacementsByLibraryId(It.IsAny<int>())).Returns(replacements.AsTask()); repo.GetEmbyPathReplacementsByLibraryId(Arg.Any<int>()).Returns(replacements.AsTask());
var runtime = new Mock<IRuntimeInfo>(); IRuntimeInfo runtime = Substitute.For<IRuntimeInfo>();
runtime.Setup(x => x.IsOSPlatform(OSPlatform.Windows)).Returns(false); runtime.IsOSPlatform(OSPlatform.Windows).Returns(false);
var service = new EmbyPathReplacementService( var service = new EmbyPathReplacementService(
repo.Object, repo,
runtime.Object, runtime,
new Mock<ILogger<EmbyPathReplacementService>>().Object); Substitute.For<ILogger<EmbyPathReplacementService>>());
string result = await service.GetReplacementEmbyPath( string result = await service.GetReplacementEmbyPath(
0, 0,
@ -147,16 +147,16 @@ public class EmbyPathReplacementServiceTests
} }
}; };
var repo = new Mock<IMediaSourceRepository>(); IMediaSourceRepository repo = Substitute.For<IMediaSourceRepository>();
repo.Setup(x => x.GetEmbyPathReplacementsByLibraryId(It.IsAny<int>())).Returns(replacements.AsTask()); repo.GetEmbyPathReplacementsByLibraryId(Arg.Any<int>()).Returns(replacements.AsTask());
var runtime = new Mock<IRuntimeInfo>(); IRuntimeInfo runtime = Substitute.For<IRuntimeInfo>();
runtime.Setup(x => x.IsOSPlatform(OSPlatform.Windows)).Returns(false); runtime.IsOSPlatform(OSPlatform.Windows).Returns(false);
var service = new EmbyPathReplacementService( var service = new EmbyPathReplacementService(
repo.Object, repo,
runtime.Object, runtime,
new Mock<ILogger<EmbyPathReplacementService>>().Object); Substitute.For<ILogger<EmbyPathReplacementService>>());
string result = await service.GetReplacementEmbyPath( string result = await service.GetReplacementEmbyPath(
0, 0,
@ -179,16 +179,16 @@ public class EmbyPathReplacementServiceTests
} }
}; };
var repo = new Mock<IMediaSourceRepository>(); IMediaSourceRepository repo = Substitute.For<IMediaSourceRepository>();
repo.Setup(x => x.GetEmbyPathReplacementsByLibraryId(It.IsAny<int>())).Returns(replacements.AsTask()); repo.GetEmbyPathReplacementsByLibraryId(Arg.Any<int>()).Returns(replacements.AsTask());
var runtime = new Mock<IRuntimeInfo>(); IRuntimeInfo runtime = Substitute.For<IRuntimeInfo>();
runtime.Setup(x => x.IsOSPlatform(OSPlatform.Windows)).Returns(true); runtime.IsOSPlatform(OSPlatform.Windows).Returns(true);
var service = new EmbyPathReplacementService( var service = new EmbyPathReplacementService(
repo.Object, repo,
runtime.Object, runtime,
new Mock<ILogger<EmbyPathReplacementService>>().Object); Substitute.For<ILogger<EmbyPathReplacementService>>());
string result = await service.GetReplacementEmbyPath( string result = await service.GetReplacementEmbyPath(
0, 0,
@ -211,16 +211,16 @@ public class EmbyPathReplacementServiceTests
} }
}; };
var repo = new Mock<IMediaSourceRepository>(); IMediaSourceRepository repo = Substitute.For<IMediaSourceRepository>();
repo.Setup(x => x.GetEmbyPathReplacementsByLibraryId(It.IsAny<int>())).Returns(replacements.AsTask()); repo.GetEmbyPathReplacementsByLibraryId(Arg.Any<int>()).Returns(replacements.AsTask());
var runtime = new Mock<IRuntimeInfo>(); IRuntimeInfo runtime = Substitute.For<IRuntimeInfo>();
runtime.Setup(x => x.IsOSPlatform(OSPlatform.Windows)).Returns(false); runtime.IsOSPlatform(OSPlatform.Windows).Returns(false);
var service = new EmbyPathReplacementService( var service = new EmbyPathReplacementService(
repo.Object, repo,
runtime.Object, runtime,
new Mock<ILogger<EmbyPathReplacementService>>().Object); Substitute.For<ILogger<EmbyPathReplacementService>>());
string result = await service.GetReplacementEmbyPath( string result = await service.GetReplacementEmbyPath(
0, 0,
@ -243,16 +243,16 @@ public class EmbyPathReplacementServiceTests
} }
}; };
var repo = new Mock<IMediaSourceRepository>(); IMediaSourceRepository repo = Substitute.For<IMediaSourceRepository>();
repo.Setup(x => x.GetEmbyPathReplacementsByLibraryId(It.IsAny<int>())).Returns(replacements.AsTask()); repo.GetEmbyPathReplacementsByLibraryId(Arg.Any<int>()).Returns(replacements.AsTask());
var runtime = new Mock<IRuntimeInfo>(); IRuntimeInfo runtime = Substitute.For<IRuntimeInfo>();
runtime.Setup(x => x.IsOSPlatform(OSPlatform.Windows)).Returns(false); runtime.IsOSPlatform(OSPlatform.Windows).Returns(false);
var service = new EmbyPathReplacementService( var service = new EmbyPathReplacementService(
repo.Object, repo,
runtime.Object, runtime,
new Mock<ILogger<EmbyPathReplacementService>>().Object); Substitute.For<ILogger<EmbyPathReplacementService>>());
string result = await service.GetReplacementEmbyPath( string result = await service.GetReplacementEmbyPath(
0, 0,
@ -275,16 +275,16 @@ public class EmbyPathReplacementServiceTests
} }
}; };
var repo = new Mock<IMediaSourceRepository>(); IMediaSourceRepository repo = Substitute.For<IMediaSourceRepository>();
repo.Setup(x => x.GetEmbyPathReplacementsByLibraryId(It.IsAny<int>())).Returns(replacements.AsTask()); repo.GetEmbyPathReplacementsByLibraryId(Arg.Any<int>()).Returns(replacements.AsTask());
var runtime = new Mock<IRuntimeInfo>(); IRuntimeInfo runtime = Substitute.For<IRuntimeInfo>();
runtime.Setup(x => x.IsOSPlatform(OSPlatform.Windows)).Returns(false); runtime.IsOSPlatform(OSPlatform.Windows).Returns(false);
var service = new EmbyPathReplacementService( var service = new EmbyPathReplacementService(
repo.Object, repo,
runtime.Object, runtime,
new Mock<ILogger<EmbyPathReplacementService>>().Object); Substitute.For<ILogger<EmbyPathReplacementService>>());
string result = await service.GetReplacementEmbyPath( string result = await service.GetReplacementEmbyPath(
0, 0,

2
ErsatzTV.Core.Tests/ErsatzTV.Core.Tests.csproj

@ -21,7 +21,7 @@
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="Moq" Version="4.18.4" /> <PackageReference Include="NSubstitute" Version="5.0.0" />
<PackageReference Include="NUnit" Version="3.13.3" /> <PackageReference Include="NUnit" Version="3.13.3" />
<PackageReference Include="NUnit3TestAdapter" Version="4.5.0" /> <PackageReference Include="NUnit3TestAdapter" Version="4.5.0" />
<PackageReference Include="Serilog" Version="3.0.1" /> <PackageReference Include="Serilog" Version="3.0.1" />

6
ErsatzTV.Core.Tests/FFmpeg/HlsPlaylistFilterTests.cs

@ -2,7 +2,7 @@
using ErsatzTV.Core.Interfaces.FFmpeg; using ErsatzTV.Core.Interfaces.FFmpeg;
using FluentAssertions; using FluentAssertions;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Moq; using NSubstitute;
using NUnit.Framework; using NUnit.Framework;
namespace ErsatzTV.Core.Tests.FFmpeg; namespace ErsatzTV.Core.Tests.FFmpeg;
@ -13,8 +13,8 @@ public class HlsPlaylistFilterTests
[SetUp] [SetUp]
public void SetUp() => public void SetUp() =>
_hlsPlaylistFilter = new HlsPlaylistFilter( _hlsPlaylistFilter = new HlsPlaylistFilter(
new Mock<ITempFilePool>().Object, Substitute.For<ITempFilePool>(),
new Mock<ILogger<HlsPlaylistFilter>>().Object Substitute.For<ILogger<HlsPlaylistFilter>>()
); );
private HlsPlaylistFilter _hlsPlaylistFilter; private HlsPlaylistFilter _hlsPlaylistFilter;

140
ErsatzTV.Core.Tests/Jellyfin/JellyfinPathReplacementServiceTests.cs

@ -5,7 +5,7 @@ using ErsatzTV.Core.Jellyfin;
using ErsatzTV.FFmpeg.Runtime; using ErsatzTV.FFmpeg.Runtime;
using FluentAssertions; using FluentAssertions;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Moq; using NSubstitute;
using NUnit.Framework; using NUnit.Framework;
namespace ErsatzTV.Core.Tests.Jellyfin; namespace ErsatzTV.Core.Tests.Jellyfin;
@ -27,16 +27,16 @@ public class JellyfinPathReplacementServiceTests
} }
}; };
var repo = new Mock<IMediaSourceRepository>(); IMediaSourceRepository repo = Substitute.For<IMediaSourceRepository>();
repo.Setup(x => x.GetJellyfinPathReplacementsByLibraryId(It.IsAny<int>())).Returns(replacements.AsTask()); repo.GetJellyfinPathReplacementsByLibraryId(Arg.Any<int>()).Returns(replacements.AsTask());
var runtime = new Mock<IRuntimeInfo>(); IRuntimeInfo runtime = Substitute.For<IRuntimeInfo>();
runtime.Setup(x => x.IsOSPlatform(OSPlatform.Windows)).Returns(true); runtime.IsOSPlatform(OSPlatform.Windows).Returns(true);
var service = new JellyfinPathReplacementService( var service = new JellyfinPathReplacementService(
repo.Object, repo,
runtime.Object, runtime,
new Mock<ILogger<JellyfinPathReplacementService>>().Object); Substitute.For<ILogger<JellyfinPathReplacementService>>());
string result = await service.GetReplacementJellyfinPath( string result = await service.GetReplacementJellyfinPath(
0, 0,
@ -59,16 +59,16 @@ public class JellyfinPathReplacementServiceTests
} }
}; };
var repo = new Mock<IMediaSourceRepository>(); IMediaSourceRepository repo = Substitute.For<IMediaSourceRepository>();
repo.Setup(x => x.GetJellyfinPathReplacementsByLibraryId(It.IsAny<int>())).Returns(replacements.AsTask()); repo.GetJellyfinPathReplacementsByLibraryId(Arg.Any<int>()).Returns(replacements.AsTask());
var runtime = new Mock<IRuntimeInfo>(); IRuntimeInfo runtime = Substitute.For<IRuntimeInfo>();
runtime.Setup(x => x.IsOSPlatform(OSPlatform.Windows)).Returns(false); runtime.IsOSPlatform(OSPlatform.Windows).Returns(false);
var service = new JellyfinPathReplacementService( var service = new JellyfinPathReplacementService(
repo.Object, repo,
runtime.Object, runtime,
new Mock<ILogger<JellyfinPathReplacementService>>().Object); Substitute.For<ILogger<JellyfinPathReplacementService>>());
string result = await service.GetReplacementJellyfinPath( string result = await service.GetReplacementJellyfinPath(
0, 0,
@ -82,15 +82,15 @@ public class JellyfinPathReplacementServiceTests
{ {
var mediaSource = new JellyfinMediaSource { OperatingSystem = "Windows" }; var mediaSource = new JellyfinMediaSource { OperatingSystem = "Windows" };
var repo = new Mock<IMediaSourceRepository>(); IMediaSourceRepository repo = Substitute.For<IMediaSourceRepository>();
var runtime = new Mock<IRuntimeInfo>(); IRuntimeInfo runtime = Substitute.For<IRuntimeInfo>();
runtime.Setup(x => x.IsOSPlatform(OSPlatform.Windows)).Returns(false); runtime.IsOSPlatform(OSPlatform.Windows).Returns(false);
var service = new JellyfinPathReplacementService( var service = new JellyfinPathReplacementService(
repo.Object, repo,
runtime.Object, runtime,
new Mock<ILogger<JellyfinPathReplacementService>>().Object); Substitute.For<ILogger<JellyfinPathReplacementService>>());
string result = service.ReplaceNetworkPath( string result = service.ReplaceNetworkPath(
mediaSource, mediaSource,
@ -115,16 +115,16 @@ public class JellyfinPathReplacementServiceTests
} }
}; };
var repo = new Mock<IMediaSourceRepository>(); IMediaSourceRepository repo = Substitute.For<IMediaSourceRepository>();
repo.Setup(x => x.GetJellyfinPathReplacementsByLibraryId(It.IsAny<int>())).Returns(replacements.AsTask()); repo.GetJellyfinPathReplacementsByLibraryId(Arg.Any<int>()).Returns(replacements.AsTask());
var runtime = new Mock<IRuntimeInfo>(); IRuntimeInfo runtime = Substitute.For<IRuntimeInfo>();
runtime.Setup(x => x.IsOSPlatform(OSPlatform.Windows)).Returns(false); runtime.IsOSPlatform(OSPlatform.Windows).Returns(false);
var service = new JellyfinPathReplacementService( var service = new JellyfinPathReplacementService(
repo.Object, repo,
runtime.Object, runtime,
new Mock<ILogger<JellyfinPathReplacementService>>().Object); Substitute.For<ILogger<JellyfinPathReplacementService>>());
string result = await service.GetReplacementJellyfinPath( string result = await service.GetReplacementJellyfinPath(
0, 0,
@ -147,16 +147,16 @@ public class JellyfinPathReplacementServiceTests
} }
}; };
var repo = new Mock<IMediaSourceRepository>(); IMediaSourceRepository repo = Substitute.For<IMediaSourceRepository>();
repo.Setup(x => x.GetJellyfinPathReplacementsByLibraryId(It.IsAny<int>())).Returns(replacements.AsTask()); repo.GetJellyfinPathReplacementsByLibraryId(Arg.Any<int>()).Returns(replacements.AsTask());
var runtime = new Mock<IRuntimeInfo>(); IRuntimeInfo runtime = Substitute.For<IRuntimeInfo>();
runtime.Setup(x => x.IsOSPlatform(OSPlatform.Windows)).Returns(false); runtime.IsOSPlatform(OSPlatform.Windows).Returns(false);
var service = new JellyfinPathReplacementService( var service = new JellyfinPathReplacementService(
repo.Object, repo,
runtime.Object, runtime,
new Mock<ILogger<JellyfinPathReplacementService>>().Object); Substitute.For<ILogger<JellyfinPathReplacementService>>());
string result = await service.GetReplacementJellyfinPath( string result = await service.GetReplacementJellyfinPath(
0, 0,
@ -179,16 +179,16 @@ public class JellyfinPathReplacementServiceTests
} }
}; };
var repo = new Mock<IMediaSourceRepository>(); IMediaSourceRepository repo = Substitute.For<IMediaSourceRepository>();
repo.Setup(x => x.GetJellyfinPathReplacementsByLibraryId(It.IsAny<int>())).Returns(replacements.AsTask()); repo.GetJellyfinPathReplacementsByLibraryId(Arg.Any<int>()).Returns(replacements.AsTask());
var runtime = new Mock<IRuntimeInfo>(); IRuntimeInfo runtime = Substitute.For<IRuntimeInfo>();
runtime.Setup(x => x.IsOSPlatform(OSPlatform.Windows)).Returns(true); runtime.IsOSPlatform(OSPlatform.Windows).Returns(true);
var service = new JellyfinPathReplacementService( var service = new JellyfinPathReplacementService(
repo.Object, repo,
runtime.Object, runtime,
new Mock<ILogger<JellyfinPathReplacementService>>().Object); Substitute.For<ILogger<JellyfinPathReplacementService>>());
string result = await service.GetReplacementJellyfinPath( string result = await service.GetReplacementJellyfinPath(
0, 0,
@ -211,16 +211,16 @@ public class JellyfinPathReplacementServiceTests
} }
}; };
var repo = new Mock<IMediaSourceRepository>(); IMediaSourceRepository repo = Substitute.For<IMediaSourceRepository>();
repo.Setup(x => x.GetJellyfinPathReplacementsByLibraryId(It.IsAny<int>())).Returns(replacements.AsTask()); repo.GetJellyfinPathReplacementsByLibraryId(Arg.Any<int>()).Returns(replacements.AsTask());
var runtime = new Mock<IRuntimeInfo>(); IRuntimeInfo runtime = Substitute.For<IRuntimeInfo>();
runtime.Setup(x => x.IsOSPlatform(OSPlatform.Windows)).Returns(false); runtime.IsOSPlatform(OSPlatform.Windows).Returns(false);
var service = new JellyfinPathReplacementService( var service = new JellyfinPathReplacementService(
repo.Object, repo,
runtime.Object, runtime,
new Mock<ILogger<JellyfinPathReplacementService>>().Object); Substitute.For<ILogger<JellyfinPathReplacementService>>());
string result = await service.GetReplacementJellyfinPath( string result = await service.GetReplacementJellyfinPath(
0, 0,
@ -243,16 +243,16 @@ public class JellyfinPathReplacementServiceTests
} }
}; };
var repo = new Mock<IMediaSourceRepository>(); IMediaSourceRepository repo = Substitute.For<IMediaSourceRepository>();
repo.Setup(x => x.GetJellyfinPathReplacementsByLibraryId(It.IsAny<int>())).Returns(replacements.AsTask()); repo.GetJellyfinPathReplacementsByLibraryId(Arg.Any<int>()).Returns(replacements.AsTask());
var runtime = new Mock<IRuntimeInfo>(); IRuntimeInfo runtime = Substitute.For<IRuntimeInfo>();
runtime.Setup(x => x.IsOSPlatform(OSPlatform.Windows)).Returns(false); runtime.IsOSPlatform(OSPlatform.Windows).Returns(false);
var service = new JellyfinPathReplacementService( var service = new JellyfinPathReplacementService(
repo.Object, repo,
runtime.Object, runtime,
new Mock<ILogger<JellyfinPathReplacementService>>().Object); Substitute.For<ILogger<JellyfinPathReplacementService>>());
string result = await service.GetReplacementJellyfinPath( string result = await service.GetReplacementJellyfinPath(
0, 0,
@ -275,16 +275,16 @@ public class JellyfinPathReplacementServiceTests
} }
}; };
var repo = new Mock<IMediaSourceRepository>(); IMediaSourceRepository repo = Substitute.For<IMediaSourceRepository>();
repo.Setup(x => x.GetJellyfinPathReplacementsByLibraryId(It.IsAny<int>())).Returns(replacements.AsTask()); repo.GetJellyfinPathReplacementsByLibraryId(Arg.Any<int>()).Returns(replacements.AsTask());
var runtime = new Mock<IRuntimeInfo>(); IRuntimeInfo runtime = Substitute.For<IRuntimeInfo>();
runtime.Setup(x => x.IsOSPlatform(OSPlatform.Windows)).Returns(false); runtime.IsOSPlatform(OSPlatform.Windows).Returns(false);
var service = new JellyfinPathReplacementService( var service = new JellyfinPathReplacementService(
repo.Object, repo,
runtime.Object, runtime,
new Mock<ILogger<JellyfinPathReplacementService>>().Object); Substitute.For<ILogger<JellyfinPathReplacementService>>());
string result = await service.GetReplacementJellyfinPath( string result = await service.GetReplacementJellyfinPath(
0, 0,
@ -307,16 +307,16 @@ public class JellyfinPathReplacementServiceTests
} }
}; };
var repo = new Mock<IMediaSourceRepository>(); IMediaSourceRepository repo = Substitute.For<IMediaSourceRepository>();
repo.Setup(x => x.GetJellyfinPathReplacementsByLibraryId(It.IsAny<int>())).Returns(replacements.AsTask()); repo.GetJellyfinPathReplacementsByLibraryId(Arg.Any<int>()).Returns(replacements.AsTask());
var runtime = new Mock<IRuntimeInfo>(); IRuntimeInfo runtime = Substitute.For<IRuntimeInfo>();
runtime.Setup(x => x.IsOSPlatform(OSPlatform.Windows)).Returns(false); runtime.IsOSPlatform(OSPlatform.Windows).Returns(false);
var service = new JellyfinPathReplacementService( var service = new JellyfinPathReplacementService(
repo.Object, repo,
runtime.Object, runtime,
new Mock<ILogger<JellyfinPathReplacementService>>().Object); Substitute.For<ILogger<JellyfinPathReplacementService>>());
string result = await service.GetReplacementJellyfinPath( string result = await service.GetReplacementJellyfinPath(
0, 0,

4
ErsatzTV.Core.Tests/Metadata/FallbackMetadataProviderTests.cs

@ -2,7 +2,7 @@
using ErsatzTV.Core.Domain; using ErsatzTV.Core.Domain;
using ErsatzTV.Core.Metadata; using ErsatzTV.Core.Metadata;
using FluentAssertions; using FluentAssertions;
using Moq; using NSubstitute;
using NUnit.Framework; using NUnit.Framework;
namespace ErsatzTV.Core.Tests.Metadata; namespace ErsatzTV.Core.Tests.Metadata;
@ -11,7 +11,7 @@ namespace ErsatzTV.Core.Tests.Metadata;
public class FallbackMetadataProviderTests public class FallbackMetadataProviderTests
{ {
[SetUp] [SetUp]
public void SetUp() => _fallbackMetadataProvider = new FallbackMetadataProvider(new Mock<IClient>().Object); public void SetUp() => _fallbackMetadataProvider = new FallbackMetadataProvider(Substitute.For<IClient>());
private FallbackMetadataProvider _fallbackMetadataProvider; private FallbackMetadataProvider _fallbackMetadataProvider;

114
ErsatzTV.Core.Tests/Plex/PlexPathReplacementServiceTests.cs

@ -5,7 +5,7 @@ using ErsatzTV.Core.Plex;
using ErsatzTV.FFmpeg.Runtime; using ErsatzTV.FFmpeg.Runtime;
using FluentAssertions; using FluentAssertions;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Moq; using NSubstitute;
using NUnit.Framework; using NUnit.Framework;
namespace ErsatzTV.Core.Tests.Plex; namespace ErsatzTV.Core.Tests.Plex;
@ -27,16 +27,16 @@ public class PlexPathReplacementServiceTests
} }
}; };
var repo = new Mock<IMediaSourceRepository>(); IMediaSourceRepository repo = Substitute.For<IMediaSourceRepository>();
repo.Setup(x => x.GetPlexPathReplacementsByLibraryId(It.IsAny<int>())).Returns(replacements.AsTask()); repo.GetPlexPathReplacementsByLibraryId(Arg.Any<int>()).Returns(replacements.AsTask());
var runtime = new Mock<IRuntimeInfo>(); IRuntimeInfo runtime = Substitute.For<IRuntimeInfo>();
runtime.Setup(x => x.IsOSPlatform(OSPlatform.Windows)).Returns(true); runtime.IsOSPlatform(OSPlatform.Windows).Returns(true);
var service = new PlexPathReplacementService( var service = new PlexPathReplacementService(
repo.Object, repo,
runtime.Object, runtime,
new Mock<ILogger<PlexPathReplacementService>>().Object); Substitute.For<ILogger<PlexPathReplacementService>>());
string result = await service.GetReplacementPlexPath( string result = await service.GetReplacementPlexPath(
0, 0,
@ -59,16 +59,16 @@ public class PlexPathReplacementServiceTests
} }
}; };
var repo = new Mock<IMediaSourceRepository>(); IMediaSourceRepository repo = Substitute.For<IMediaSourceRepository>();
repo.Setup(x => x.GetPlexPathReplacementsByLibraryId(It.IsAny<int>())).Returns(replacements.AsTask()); repo.GetPlexPathReplacementsByLibraryId(Arg.Any<int>()).Returns(replacements.AsTask());
var runtime = new Mock<IRuntimeInfo>(); IRuntimeInfo runtime = Substitute.For<IRuntimeInfo>();
runtime.Setup(x => x.IsOSPlatform(OSPlatform.Windows)).Returns(false); runtime.IsOSPlatform(OSPlatform.Windows).Returns(false);
var service = new PlexPathReplacementService( var service = new PlexPathReplacementService(
repo.Object, repo,
runtime.Object, runtime,
new Mock<ILogger<PlexPathReplacementService>>().Object); Substitute.For<ILogger<PlexPathReplacementService>>());
string result = await service.GetReplacementPlexPath( string result = await service.GetReplacementPlexPath(
0, 0,
@ -91,16 +91,16 @@ public class PlexPathReplacementServiceTests
} }
}; };
var repo = new Mock<IMediaSourceRepository>(); IMediaSourceRepository repo = Substitute.For<IMediaSourceRepository>();
repo.Setup(x => x.GetPlexPathReplacementsByLibraryId(It.IsAny<int>())).Returns(replacements.AsTask()); repo.GetPlexPathReplacementsByLibraryId(Arg.Any<int>()).Returns(replacements.AsTask());
var runtime = new Mock<IRuntimeInfo>(); IRuntimeInfo runtime = Substitute.For<IRuntimeInfo>();
runtime.Setup(x => x.IsOSPlatform(OSPlatform.Windows)).Returns(false); runtime.IsOSPlatform(OSPlatform.Windows).Returns(false);
var service = new PlexPathReplacementService( var service = new PlexPathReplacementService(
repo.Object, repo,
runtime.Object, runtime,
new Mock<ILogger<PlexPathReplacementService>>().Object); Substitute.For<ILogger<PlexPathReplacementService>>());
string result = await service.GetReplacementPlexPath( string result = await service.GetReplacementPlexPath(
0, 0,
@ -123,16 +123,16 @@ public class PlexPathReplacementServiceTests
} }
}; };
var repo = new Mock<IMediaSourceRepository>(); IMediaSourceRepository repo = Substitute.For<IMediaSourceRepository>();
repo.Setup(x => x.GetPlexPathReplacementsByLibraryId(It.IsAny<int>())).Returns(replacements.AsTask()); repo.GetPlexPathReplacementsByLibraryId(Arg.Any<int>()).Returns(replacements.AsTask());
var runtime = new Mock<IRuntimeInfo>(); IRuntimeInfo runtime = Substitute.For<IRuntimeInfo>();
runtime.Setup(x => x.IsOSPlatform(OSPlatform.Windows)).Returns(false); runtime.IsOSPlatform(OSPlatform.Windows).Returns(false);
var service = new PlexPathReplacementService( var service = new PlexPathReplacementService(
repo.Object, repo,
runtime.Object, runtime,
new Mock<ILogger<PlexPathReplacementService>>().Object); Substitute.For<ILogger<PlexPathReplacementService>>());
string result = await service.GetReplacementPlexPath( string result = await service.GetReplacementPlexPath(
0, 0,
@ -155,16 +155,16 @@ public class PlexPathReplacementServiceTests
} }
}; };
var repo = new Mock<IMediaSourceRepository>(); IMediaSourceRepository repo = Substitute.For<IMediaSourceRepository>();
repo.Setup(x => x.GetPlexPathReplacementsByLibraryId(It.IsAny<int>())).Returns(replacements.AsTask()); repo.GetPlexPathReplacementsByLibraryId(Arg.Any<int>()).Returns(replacements.AsTask());
var runtime = new Mock<IRuntimeInfo>(); IRuntimeInfo runtime = Substitute.For<IRuntimeInfo>();
runtime.Setup(x => x.IsOSPlatform(OSPlatform.Windows)).Returns(true); runtime.IsOSPlatform(OSPlatform.Windows).Returns(true);
var service = new PlexPathReplacementService( var service = new PlexPathReplacementService(
repo.Object, repo,
runtime.Object, runtime,
new Mock<ILogger<PlexPathReplacementService>>().Object); Substitute.For<ILogger<PlexPathReplacementService>>());
string result = await service.GetReplacementPlexPath( string result = await service.GetReplacementPlexPath(
0, 0,
@ -187,16 +187,16 @@ public class PlexPathReplacementServiceTests
} }
}; };
var repo = new Mock<IMediaSourceRepository>(); IMediaSourceRepository repo = Substitute.For<IMediaSourceRepository>();
repo.Setup(x => x.GetPlexPathReplacementsByLibraryId(It.IsAny<int>())).Returns(replacements.AsTask()); repo.GetPlexPathReplacementsByLibraryId(Arg.Any<int>()).Returns(replacements.AsTask());
var runtime = new Mock<IRuntimeInfo>(); IRuntimeInfo runtime = Substitute.For<IRuntimeInfo>();
runtime.Setup(x => x.IsOSPlatform(OSPlatform.Windows)).Returns(false); runtime.IsOSPlatform(OSPlatform.Windows).Returns(false);
var service = new PlexPathReplacementService( var service = new PlexPathReplacementService(
repo.Object, repo,
runtime.Object, runtime,
new Mock<ILogger<PlexPathReplacementService>>().Object); Substitute.For<ILogger<PlexPathReplacementService>>());
string result = await service.GetReplacementPlexPath( string result = await service.GetReplacementPlexPath(
0, 0,
@ -219,16 +219,16 @@ public class PlexPathReplacementServiceTests
} }
}; };
var repo = new Mock<IMediaSourceRepository>(); IMediaSourceRepository repo = Substitute.For<IMediaSourceRepository>();
repo.Setup(x => x.GetPlexPathReplacementsByLibraryId(It.IsAny<int>())).Returns(replacements.AsTask()); repo.GetPlexPathReplacementsByLibraryId(Arg.Any<int>()).Returns(replacements.AsTask());
var runtime = new Mock<IRuntimeInfo>(); IRuntimeInfo runtime = Substitute.For<IRuntimeInfo>();
runtime.Setup(x => x.IsOSPlatform(OSPlatform.Windows)).Returns(false); runtime.IsOSPlatform(OSPlatform.Windows).Returns(false);
var service = new PlexPathReplacementService( var service = new PlexPathReplacementService(
repo.Object, repo,
runtime.Object, runtime,
new Mock<ILogger<PlexPathReplacementService>>().Object); Substitute.For<ILogger<PlexPathReplacementService>>());
string result = await service.GetReplacementPlexPath( string result = await service.GetReplacementPlexPath(
0, 0,
@ -251,16 +251,16 @@ public class PlexPathReplacementServiceTests
} }
}; };
var repo = new Mock<IMediaSourceRepository>(); IMediaSourceRepository repo = Substitute.For<IMediaSourceRepository>();
repo.Setup(x => x.GetPlexPathReplacementsByLibraryId(It.IsAny<int>())).Returns(replacements.AsTask()); repo.GetPlexPathReplacementsByLibraryId(Arg.Any<int>()).Returns(replacements.AsTask());
var runtime = new Mock<IRuntimeInfo>(); IRuntimeInfo runtime = Substitute.For<IRuntimeInfo>();
runtime.Setup(x => x.IsOSPlatform(OSPlatform.Windows)).Returns(false); runtime.IsOSPlatform(OSPlatform.Windows).Returns(false);
var service = new PlexPathReplacementService( var service = new PlexPathReplacementService(
repo.Object, repo,
runtime.Object, runtime,
new Mock<ILogger<PlexPathReplacementService>>().Object); Substitute.For<ILogger<PlexPathReplacementService>>());
string result = await service.GetReplacementPlexPath( string result = await service.GetReplacementPlexPath(
0, 0,

393
ErsatzTV.Core.Tests/Scheduling/PlayoutBuilderTests.cs

@ -8,7 +8,7 @@ using ErsatzTV.Core.Scheduling;
using ErsatzTV.Core.Tests.Fakes; using ErsatzTV.Core.Tests.Fakes;
using FluentAssertions; using FluentAssertions;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Moq; using NSubstitute;
using NUnit.Framework; using NUnit.Framework;
using Serilog; using Serilog;
@ -32,7 +32,7 @@ public class PlayoutBuilderTests
ILoggerFactory loggerFactory = new LoggerFactory().AddSerilog(Log.Logger); ILoggerFactory loggerFactory = new LoggerFactory().AddSerilog(Log.Logger);
_logger = loggerFactory?.CreateLogger<PlayoutBuilder>(); _logger = loggerFactory.CreateLogger<PlayoutBuilder>();
} }
private CancellationToken _cancellationToken; private CancellationToken _cancellationToken;
@ -90,19 +90,16 @@ public class PlayoutBuilderTests
mediaItems[0].State = MediaItemState.FileNotFound; mediaItems[0].State = MediaItemState.FileNotFound;
var configRepo = new Mock<IConfigElementRepository>(); IConfigElementRepository configRepo = Substitute.For<IConfigElementRepository>();
configRepo.Setup( configRepo
repo => repo.GetValue<bool>( .GetValue<bool>(Arg.Is<ConfigElementKey>(k => k.Key == ConfigElementKey.PlayoutSkipMissingItems.Key))
It.Is<ConfigElementKey>(k => k.Key == ConfigElementKey.PlayoutSkipMissingItems.Key))) .Returns(Some(true));
.ReturnsAsync(Some(true));
(PlayoutBuilder builder, Playout playout) = (PlayoutBuilder builder, Playout playout) =
TestDataFloodForItems(mediaItems, PlaybackOrder.Random, configRepo); TestDataFloodForItems(mediaItems, PlaybackOrder.Random, configRepo);
Playout result = await builder.Build(playout, PlayoutBuildMode.Reset, _cancellationToken); Playout result = await builder.Build(playout, PlayoutBuildMode.Reset, _cancellationToken);
configRepo.Verify();
result.Items.Should().BeEmpty(); result.Items.Should().BeEmpty();
} }
@ -117,11 +114,10 @@ public class PlayoutBuilderTests
mediaItems[0].State = MediaItemState.FileNotFound; mediaItems[0].State = MediaItemState.FileNotFound;
var configRepo = new Mock<IConfigElementRepository>(); IConfigElementRepository configRepo = Substitute.For<IConfigElementRepository>();
configRepo.Setup( configRepo
repo => repo.GetValue<bool>( .GetValue<bool>(Arg.Is<ConfigElementKey>(k => k.Key == ConfigElementKey.PlayoutSkipMissingItems.Key))
It.Is<ConfigElementKey>(k => k.Key == ConfigElementKey.PlayoutSkipMissingItems.Key))) .Returns(Some(true));
.ReturnsAsync(Some(true));
(PlayoutBuilder builder, Playout playout) = (PlayoutBuilder builder, Playout playout) =
TestDataFloodForItems(mediaItems, PlaybackOrder.Random, configRepo); TestDataFloodForItems(mediaItems, PlaybackOrder.Random, configRepo);
@ -130,8 +126,6 @@ public class PlayoutBuilderTests
Playout result = await builder.Build(playout, PlayoutBuildMode.Reset, start, finish, _cancellationToken); Playout result = await builder.Build(playout, PlayoutBuildMode.Reset, start, finish, _cancellationToken);
configRepo.Verify();
result.Items.Count.Should().Be(1); result.Items.Count.Should().Be(1);
result.Items.Head().MediaItemId.Should().Be(2); result.Items.Head().MediaItemId.Should().Be(2);
result.Items.Head().StartOffset.TimeOfDay.Should().Be(TimeSpan.Zero); result.Items.Head().StartOffset.TimeOfDay.Should().Be(TimeSpan.Zero);
@ -151,19 +145,16 @@ public class PlayoutBuilderTests
mediaItems[0].State = MediaItemState.Unavailable; mediaItems[0].State = MediaItemState.Unavailable;
var configRepo = new Mock<IConfigElementRepository>(); IConfigElementRepository configRepo = Substitute.For<IConfigElementRepository>();
configRepo.Setup( configRepo
repo => repo.GetValue<bool>( .GetValue<bool>(Arg.Is<ConfigElementKey>(k => k.Key == ConfigElementKey.PlayoutSkipMissingItems.Key))
It.Is<ConfigElementKey>(k => k.Key == ConfigElementKey.PlayoutSkipMissingItems.Key))) .Returns(Some(true));
.ReturnsAsync(Some(true));
(PlayoutBuilder builder, Playout playout) = (PlayoutBuilder builder, Playout playout) =
TestDataFloodForItems(mediaItems, PlaybackOrder.Random, configRepo); TestDataFloodForItems(mediaItems, PlaybackOrder.Random, configRepo);
Playout result = await builder.Build(playout, PlayoutBuildMode.Reset, _cancellationToken); Playout result = await builder.Build(playout, PlayoutBuildMode.Reset, _cancellationToken);
configRepo.Verify();
result.Items.Should().BeEmpty(); result.Items.Should().BeEmpty();
} }
@ -178,11 +169,10 @@ public class PlayoutBuilderTests
mediaItems[0].State = MediaItemState.Unavailable; mediaItems[0].State = MediaItemState.Unavailable;
var configRepo = new Mock<IConfigElementRepository>(); IConfigElementRepository configRepo = Substitute.For<IConfigElementRepository>();
configRepo.Setup( configRepo
repo => repo.GetValue<bool>( .GetValue<bool>(Arg.Is<ConfigElementKey>(k => k.Key == ConfigElementKey.PlayoutSkipMissingItems.Key))
It.Is<ConfigElementKey>(k => k.Key == ConfigElementKey.PlayoutSkipMissingItems.Key))) .Returns(Some(true));
.ReturnsAsync(Some(true));
(PlayoutBuilder builder, Playout playout) = (PlayoutBuilder builder, Playout playout) =
TestDataFloodForItems(mediaItems, PlaybackOrder.Random, configRepo); TestDataFloodForItems(mediaItems, PlaybackOrder.Random, configRepo);
@ -191,8 +181,6 @@ public class PlayoutBuilderTests
Playout result = await builder.Build(playout, PlayoutBuildMode.Reset, start, finish, _cancellationToken); Playout result = await builder.Build(playout, PlayoutBuildMode.Reset, start, finish, _cancellationToken);
configRepo.Verify();
result.Items.Count.Should().Be(1); result.Items.Count.Should().Be(1);
result.Items.Head().MediaItemId.Should().Be(2); result.Items.Head().MediaItemId.Should().Be(2);
result.Items.Head().StartOffset.TimeOfDay.Should().Be(TimeSpan.Zero); result.Items.Head().StartOffset.TimeOfDay.Should().Be(TimeSpan.Zero);
@ -211,11 +199,10 @@ public class PlayoutBuilderTests
mediaItems[0].State = MediaItemState.FileNotFound; mediaItems[0].State = MediaItemState.FileNotFound;
var configRepo = new Mock<IConfigElementRepository>(); IConfigElementRepository configRepo = Substitute.For<IConfigElementRepository>();
configRepo.Setup( configRepo
repo => repo.GetValue<bool>( .GetValue<bool>(Arg.Is<ConfigElementKey>(k => k.Key == ConfigElementKey.PlayoutSkipMissingItems.Key))
It.Is<ConfigElementKey>(k => k.Key == ConfigElementKey.PlayoutSkipMissingItems.Key))) .Returns(Some(false));
.ReturnsAsync(Some(false));
(PlayoutBuilder builder, Playout playout) = (PlayoutBuilder builder, Playout playout) =
TestDataFloodForItems(mediaItems, PlaybackOrder.Random, configRepo); TestDataFloodForItems(mediaItems, PlaybackOrder.Random, configRepo);
@ -241,11 +228,10 @@ public class PlayoutBuilderTests
mediaItems[0].State = MediaItemState.Unavailable; mediaItems[0].State = MediaItemState.Unavailable;
var configRepo = new Mock<IConfigElementRepository>(); IConfigElementRepository configRepo = Substitute.For<IConfigElementRepository>();
configRepo.Setup( configRepo
repo => repo.GetValue<bool>( .GetValue<bool>(Arg.Is<ConfigElementKey>(k => k.Key == ConfigElementKey.PlayoutSkipMissingItems.Key))
It.Is<ConfigElementKey>(k => k.Key == ConfigElementKey.PlayoutSkipMissingItems.Key))) .Returns(Some(false));
.ReturnsAsync(Some(false));
(PlayoutBuilder builder, Playout playout) = (PlayoutBuilder builder, Playout playout) =
TestDataFloodForItems(mediaItems, PlaybackOrder.Random, configRepo); TestDataFloodForItems(mediaItems, PlaybackOrder.Random, configRepo);
@ -567,18 +553,19 @@ public class PlayoutBuilderTests
ProgramScheduleAlternates = new List<ProgramScheduleAlternate>() ProgramScheduleAlternates = new List<ProgramScheduleAlternate>()
}; };
var configRepo = new Mock<IConfigElementRepository>(); IConfigElementRepository configRepo = Substitute.For<IConfigElementRepository>();
var televisionRepo = new FakeTelevisionRepository(); var televisionRepo = new FakeTelevisionRepository();
var artistRepo = new Mock<IArtistRepository>(); IArtistRepository artistRepo = Substitute.For<IArtistRepository>();
var factory = new Mock<IMultiEpisodeShuffleCollectionEnumeratorFactory>(); IMultiEpisodeShuffleCollectionEnumeratorFactory factory =
var localFileSystem = new Mock<ILocalFileSystem>(); Substitute.For<IMultiEpisodeShuffleCollectionEnumeratorFactory>();
ILocalFileSystem localFileSystem = Substitute.For<ILocalFileSystem>();
var builder = new PlayoutBuilder( var builder = new PlayoutBuilder(
configRepo.Object, configRepo,
fakeRepository, fakeRepository,
televisionRepo, televisionRepo,
artistRepo.Object, artistRepo,
factory.Object, factory,
localFileSystem.Object, localFileSystem,
_logger); _logger);
DateTimeOffset start = HoursAfterMidnight(0); DateTimeOffset start = HoursAfterMidnight(0);
@ -664,18 +651,19 @@ public class PlayoutBuilderTests
ProgramScheduleAlternates = new List<ProgramScheduleAlternate>() ProgramScheduleAlternates = new List<ProgramScheduleAlternate>()
}; };
var configRepo = new Mock<IConfigElementRepository>(); IConfigElementRepository configRepo = Substitute.For<IConfigElementRepository>();
var televisionRepo = new FakeTelevisionRepository(); var televisionRepo = new FakeTelevisionRepository();
var artistRepo = new Mock<IArtistRepository>(); IArtistRepository artistRepo = Substitute.For<IArtistRepository>();
var factory = new Mock<IMultiEpisodeShuffleCollectionEnumeratorFactory>(); IMultiEpisodeShuffleCollectionEnumeratorFactory factory =
var localFileSystem = new Mock<ILocalFileSystem>(); Substitute.For<IMultiEpisodeShuffleCollectionEnumeratorFactory>();
ILocalFileSystem localFileSystem = Substitute.For<ILocalFileSystem>();
var builder = new PlayoutBuilder( var builder = new PlayoutBuilder(
configRepo.Object, configRepo,
fakeRepository, fakeRepository,
televisionRepo, televisionRepo,
artistRepo.Object, artistRepo,
factory.Object, factory,
localFileSystem.Object, localFileSystem,
_logger); _logger);
DateTimeOffset start = HoursAfterMidnight(0); DateTimeOffset start = HoursAfterMidnight(0);
@ -809,18 +797,19 @@ public class PlayoutBuilderTests
ProgramScheduleAlternates = new List<ProgramScheduleAlternate>() ProgramScheduleAlternates = new List<ProgramScheduleAlternate>()
}; };
var configRepo = new Mock<IConfigElementRepository>(); IConfigElementRepository configRepo = Substitute.For<IConfigElementRepository>();
var televisionRepo = new FakeTelevisionRepository(); var televisionRepo = new FakeTelevisionRepository();
var artistRepo = new Mock<IArtistRepository>(); IArtistRepository artistRepo = Substitute.For<IArtistRepository>();
var factory = new Mock<IMultiEpisodeShuffleCollectionEnumeratorFactory>(); IMultiEpisodeShuffleCollectionEnumeratorFactory factory =
var localFileSystem = new Mock<ILocalFileSystem>(); Substitute.For<IMultiEpisodeShuffleCollectionEnumeratorFactory>();
ILocalFileSystem localFileSystem = Substitute.For<ILocalFileSystem>();
var builder = new PlayoutBuilder( var builder = new PlayoutBuilder(
configRepo.Object, configRepo,
fakeRepository, fakeRepository,
televisionRepo, televisionRepo,
artistRepo.Object, artistRepo,
factory.Object, factory,
localFileSystem.Object, localFileSystem,
_logger); _logger);
DateTimeOffset start = HoursAfterMidnight(0); DateTimeOffset start = HoursAfterMidnight(0);
@ -912,18 +901,19 @@ public class PlayoutBuilderTests
ProgramScheduleAlternates = new List<ProgramScheduleAlternate>() ProgramScheduleAlternates = new List<ProgramScheduleAlternate>()
}; };
var configRepo = new Mock<IConfigElementRepository>(); IConfigElementRepository configRepo = Substitute.For<IConfigElementRepository>();
var televisionRepo = new FakeTelevisionRepository(); var televisionRepo = new FakeTelevisionRepository();
var artistRepo = new Mock<IArtistRepository>(); IArtistRepository artistRepo = Substitute.For<IArtistRepository>();
var factory = new Mock<IMultiEpisodeShuffleCollectionEnumeratorFactory>(); IMultiEpisodeShuffleCollectionEnumeratorFactory factory =
var localFileSystem = new Mock<ILocalFileSystem>(); Substitute.For<IMultiEpisodeShuffleCollectionEnumeratorFactory>();
ILocalFileSystem localFileSystem = Substitute.For<ILocalFileSystem>();
var builder = new PlayoutBuilder( var builder = new PlayoutBuilder(
configRepo.Object, configRepo,
fakeRepository, fakeRepository,
televisionRepo, televisionRepo,
artistRepo.Object, artistRepo,
factory.Object, factory,
localFileSystem.Object, localFileSystem,
_logger); _logger);
DateTimeOffset start = HoursAfterMidnight(0); DateTimeOffset start = HoursAfterMidnight(0);
@ -1024,18 +1014,19 @@ public class PlayoutBuilderTests
ProgramScheduleAlternates = new List<ProgramScheduleAlternate>() ProgramScheduleAlternates = new List<ProgramScheduleAlternate>()
}; };
var configRepo = new Mock<IConfigElementRepository>(); IConfigElementRepository configRepo = Substitute.For<IConfigElementRepository>();
var televisionRepo = new FakeTelevisionRepository(); var televisionRepo = new FakeTelevisionRepository();
var artistRepo = new Mock<IArtistRepository>(); IArtistRepository artistRepo = Substitute.For<IArtistRepository>();
var factory = new Mock<IMultiEpisodeShuffleCollectionEnumeratorFactory>(); IMultiEpisodeShuffleCollectionEnumeratorFactory factory =
var localFileSystem = new Mock<ILocalFileSystem>(); Substitute.For<IMultiEpisodeShuffleCollectionEnumeratorFactory>();
ILocalFileSystem localFileSystem = Substitute.For<ILocalFileSystem>();
var builder = new PlayoutBuilder( var builder = new PlayoutBuilder(
configRepo.Object, configRepo,
fakeRepository, fakeRepository,
televisionRepo, televisionRepo,
artistRepo.Object, artistRepo,
factory.Object, factory,
localFileSystem.Object, localFileSystem,
_logger); _logger);
DateTimeOffset start = HoursAfterMidnight(0); DateTimeOffset start = HoursAfterMidnight(0);
@ -1129,18 +1120,19 @@ public class PlayoutBuilderTests
ProgramScheduleAlternates = new List<ProgramScheduleAlternate>() ProgramScheduleAlternates = new List<ProgramScheduleAlternate>()
}; };
var configRepo = new Mock<IConfigElementRepository>(); IConfigElementRepository configRepo = Substitute.For<IConfigElementRepository>();
var televisionRepo = new FakeTelevisionRepository(); var televisionRepo = new FakeTelevisionRepository();
var artistRepo = new Mock<IArtistRepository>(); IArtistRepository artistRepo = Substitute.For<IArtistRepository>();
var factory = new Mock<IMultiEpisodeShuffleCollectionEnumeratorFactory>(); IMultiEpisodeShuffleCollectionEnumeratorFactory factory =
var localFileSystem = new Mock<ILocalFileSystem>(); Substitute.For<IMultiEpisodeShuffleCollectionEnumeratorFactory>();
ILocalFileSystem localFileSystem = Substitute.For<ILocalFileSystem>();
var builder = new PlayoutBuilder( var builder = new PlayoutBuilder(
configRepo.Object, configRepo,
fakeRepository, fakeRepository,
televisionRepo, televisionRepo,
artistRepo.Object, artistRepo,
factory.Object, factory,
localFileSystem.Object, localFileSystem,
_logger); _logger);
DateTimeOffset start = HoursAfterMidnight(0); DateTimeOffset start = HoursAfterMidnight(0);
@ -1238,18 +1230,19 @@ public class PlayoutBuilderTests
ProgramScheduleAlternates = new List<ProgramScheduleAlternate>() ProgramScheduleAlternates = new List<ProgramScheduleAlternate>()
}; };
var configRepo = new Mock<IConfigElementRepository>(); IConfigElementRepository configRepo = Substitute.For<IConfigElementRepository>();
var televisionRepo = new FakeTelevisionRepository(); var televisionRepo = new FakeTelevisionRepository();
var artistRepo = new Mock<IArtistRepository>(); IArtistRepository artistRepo = Substitute.For<IArtistRepository>();
var factory = new Mock<IMultiEpisodeShuffleCollectionEnumeratorFactory>(); IMultiEpisodeShuffleCollectionEnumeratorFactory factory =
var localFileSystem = new Mock<ILocalFileSystem>(); Substitute.For<IMultiEpisodeShuffleCollectionEnumeratorFactory>();
ILocalFileSystem localFileSystem = Substitute.For<ILocalFileSystem>();
var builder = new PlayoutBuilder( var builder = new PlayoutBuilder(
configRepo.Object, configRepo,
fakeRepository, fakeRepository,
televisionRepo, televisionRepo,
artistRepo.Object, artistRepo,
factory.Object, factory,
localFileSystem.Object, localFileSystem,
_logger); _logger);
DateTimeOffset start = HoursAfterMidnight(0); DateTimeOffset start = HoursAfterMidnight(0);
@ -1352,18 +1345,19 @@ public class PlayoutBuilderTests
ProgramScheduleAlternates = new List<ProgramScheduleAlternate>() ProgramScheduleAlternates = new List<ProgramScheduleAlternate>()
}; };
var configRepo = new Mock<IConfigElementRepository>(); IConfigElementRepository configRepo = Substitute.For<IConfigElementRepository>();
var televisionRepo = new FakeTelevisionRepository(); var televisionRepo = new FakeTelevisionRepository();
var artistRepo = new Mock<IArtistRepository>(); IArtistRepository artistRepo = Substitute.For<IArtistRepository>();
var factory = new Mock<IMultiEpisodeShuffleCollectionEnumeratorFactory>(); IMultiEpisodeShuffleCollectionEnumeratorFactory factory =
var localFileSystem = new Mock<ILocalFileSystem>(); Substitute.For<IMultiEpisodeShuffleCollectionEnumeratorFactory>();
ILocalFileSystem localFileSystem = Substitute.For<ILocalFileSystem>();
var builder = new PlayoutBuilder( var builder = new PlayoutBuilder(
configRepo.Object, configRepo,
fakeRepository, fakeRepository,
televisionRepo, televisionRepo,
artistRepo.Object, artistRepo,
factory.Object, factory,
localFileSystem.Object, localFileSystem,
_logger); _logger);
DateTimeOffset start = HoursAfterMidnight(0); DateTimeOffset start = HoursAfterMidnight(0);
@ -1455,18 +1449,19 @@ public class PlayoutBuilderTests
ProgramScheduleAlternates = new List<ProgramScheduleAlternate>() ProgramScheduleAlternates = new List<ProgramScheduleAlternate>()
}; };
var configRepo = new Mock<IConfigElementRepository>(); IConfigElementRepository configRepo = Substitute.For<IConfigElementRepository>();
var televisionRepo = new FakeTelevisionRepository(); var televisionRepo = new FakeTelevisionRepository();
var artistRepo = new Mock<IArtistRepository>(); IArtistRepository artistRepo = Substitute.For<IArtistRepository>();
var factory = new Mock<IMultiEpisodeShuffleCollectionEnumeratorFactory>(); IMultiEpisodeShuffleCollectionEnumeratorFactory factory =
var localFileSystem = new Mock<ILocalFileSystem>(); Substitute.For<IMultiEpisodeShuffleCollectionEnumeratorFactory>();
ILocalFileSystem localFileSystem = Substitute.For<ILocalFileSystem>();
var builder = new PlayoutBuilder( var builder = new PlayoutBuilder(
configRepo.Object, configRepo,
fakeRepository, fakeRepository,
televisionRepo, televisionRepo,
artistRepo.Object, artistRepo,
factory.Object, factory,
localFileSystem.Object, localFileSystem,
_logger); _logger);
DateTimeOffset start = HoursAfterMidnight(0); DateTimeOffset start = HoursAfterMidnight(0);
@ -1569,18 +1564,19 @@ public class PlayoutBuilderTests
ProgramScheduleAlternates = new List<ProgramScheduleAlternate>() ProgramScheduleAlternates = new List<ProgramScheduleAlternate>()
}; };
var configRepo = new Mock<IConfigElementRepository>(); IConfigElementRepository configRepo = Substitute.For<IConfigElementRepository>();
var televisionRepo = new FakeTelevisionRepository(); var televisionRepo = new FakeTelevisionRepository();
var artistRepo = new Mock<IArtistRepository>(); IArtistRepository artistRepo = Substitute.For<IArtistRepository>();
var factory = new Mock<IMultiEpisodeShuffleCollectionEnumeratorFactory>(); IMultiEpisodeShuffleCollectionEnumeratorFactory factory =
var localFileSystem = new Mock<ILocalFileSystem>(); Substitute.For<IMultiEpisodeShuffleCollectionEnumeratorFactory>();
ILocalFileSystem localFileSystem = Substitute.For<ILocalFileSystem>();
var builder = new PlayoutBuilder( var builder = new PlayoutBuilder(
configRepo.Object, configRepo,
fakeRepository, fakeRepository,
televisionRepo, televisionRepo,
artistRepo.Object, artistRepo,
factory.Object, factory,
localFileSystem.Object, localFileSystem,
_logger); _logger);
DateTimeOffset start = HoursAfterMidnight(0); DateTimeOffset start = HoursAfterMidnight(0);
@ -1694,18 +1690,19 @@ public class PlayoutBuilderTests
ProgramScheduleAlternates = new List<ProgramScheduleAlternate>() ProgramScheduleAlternates = new List<ProgramScheduleAlternate>()
}; };
var configRepo = new Mock<IConfigElementRepository>(); IConfigElementRepository configRepo = Substitute.For<IConfigElementRepository>();
var televisionRepo = new FakeTelevisionRepository(); var televisionRepo = new FakeTelevisionRepository();
var artistRepo = new Mock<IArtistRepository>(); IArtistRepository artistRepo = Substitute.For<IArtistRepository>();
var factory = new Mock<IMultiEpisodeShuffleCollectionEnumeratorFactory>(); IMultiEpisodeShuffleCollectionEnumeratorFactory factory =
var localFileSystem = new Mock<ILocalFileSystem>(); Substitute.For<IMultiEpisodeShuffleCollectionEnumeratorFactory>();
ILocalFileSystem localFileSystem = Substitute.For<ILocalFileSystem>();
var builder = new PlayoutBuilder( var builder = new PlayoutBuilder(
configRepo.Object, configRepo,
fakeRepository, fakeRepository,
televisionRepo, televisionRepo,
artistRepo.Object, artistRepo,
factory.Object, factory,
localFileSystem.Object, localFileSystem,
_logger); _logger);
DateTimeOffset start = HoursAfterMidnight(0); DateTimeOffset start = HoursAfterMidnight(0);
@ -1811,18 +1808,19 @@ public class PlayoutBuilderTests
ProgramScheduleAlternates = new List<ProgramScheduleAlternate>() ProgramScheduleAlternates = new List<ProgramScheduleAlternate>()
}; };
var configRepo = new Mock<IConfigElementRepository>(); IConfigElementRepository configRepo = Substitute.For<IConfigElementRepository>();
var televisionRepo = new FakeTelevisionRepository(); var televisionRepo = new FakeTelevisionRepository();
var artistRepo = new Mock<IArtistRepository>(); IArtistRepository artistRepo = Substitute.For<IArtistRepository>();
var factory = new Mock<IMultiEpisodeShuffleCollectionEnumeratorFactory>(); IMultiEpisodeShuffleCollectionEnumeratorFactory factory =
var localFileSystem = new Mock<ILocalFileSystem>(); Substitute.For<IMultiEpisodeShuffleCollectionEnumeratorFactory>();
ILocalFileSystem localFileSystem = Substitute.For<ILocalFileSystem>();
var builder = new PlayoutBuilder( var builder = new PlayoutBuilder(
configRepo.Object, configRepo,
fakeRepository, fakeRepository,
televisionRepo, televisionRepo,
artistRepo.Object, artistRepo,
factory.Object, factory,
localFileSystem.Object, localFileSystem,
_logger); _logger);
DateTimeOffset start = HoursAfterMidnight(0); DateTimeOffset start = HoursAfterMidnight(0);
@ -1888,18 +1886,19 @@ public class PlayoutBuilderTests
ProgramScheduleAlternates = new List<ProgramScheduleAlternate>() ProgramScheduleAlternates = new List<ProgramScheduleAlternate>()
}; };
var configRepo = new Mock<IConfigElementRepository>(); IConfigElementRepository configRepo = Substitute.For<IConfigElementRepository>();
var televisionRepo = new FakeTelevisionRepository(); var televisionRepo = new FakeTelevisionRepository();
var artistRepo = new Mock<IArtistRepository>(); IArtistRepository artistRepo = Substitute.For<IArtistRepository>();
var factory = new Mock<IMultiEpisodeShuffleCollectionEnumeratorFactory>(); IMultiEpisodeShuffleCollectionEnumeratorFactory factory =
var localFileSystem = new Mock<ILocalFileSystem>(); Substitute.For<IMultiEpisodeShuffleCollectionEnumeratorFactory>();
ILocalFileSystem localFileSystem = Substitute.For<ILocalFileSystem>();
var builder = new PlayoutBuilder( var builder = new PlayoutBuilder(
configRepo.Object, configRepo,
fakeRepository, fakeRepository,
televisionRepo, televisionRepo,
artistRepo.Object, artistRepo,
factory.Object, factory,
localFileSystem.Object, localFileSystem,
_logger); _logger);
DateTimeOffset start = HoursAfterMidnight(0); DateTimeOffset start = HoursAfterMidnight(0);
@ -2101,18 +2100,19 @@ public class PlayoutBuilderTests
Playout = playout Playout = playout
}); });
var configRepo = new Mock<IConfigElementRepository>(); IConfigElementRepository configRepo = Substitute.For<IConfigElementRepository>();
var televisionRepo = new FakeTelevisionRepository(); var televisionRepo = new FakeTelevisionRepository();
var artistRepo = new Mock<IArtistRepository>(); IArtistRepository artistRepo = Substitute.For<IArtistRepository>();
var factory = new Mock<IMultiEpisodeShuffleCollectionEnumeratorFactory>(); IMultiEpisodeShuffleCollectionEnumeratorFactory factory =
var localFileSystem = new Mock<ILocalFileSystem>(); Substitute.For<IMultiEpisodeShuffleCollectionEnumeratorFactory>();
ILocalFileSystem localFileSystem = Substitute.For<ILocalFileSystem>();
var builder = new PlayoutBuilder( var builder = new PlayoutBuilder(
configRepo.Object, configRepo,
fakeRepository, fakeRepository,
televisionRepo, televisionRepo,
artistRepo.Object, artistRepo,
factory.Object, factory,
localFileSystem.Object, localFileSystem,
_logger); _logger);
DateTimeOffset start = HoursAfterMidnight(24); DateTimeOffset start = HoursAfterMidnight(24);
@ -2590,18 +2590,19 @@ public class PlayoutBuilderTests
ProgramScheduleAlternates = new List<ProgramScheduleAlternate>() ProgramScheduleAlternates = new List<ProgramScheduleAlternate>()
}; };
var configRepo = new Mock<IConfigElementRepository>(); IConfigElementRepository configRepo = Substitute.For<IConfigElementRepository>();
var televisionRepo = new FakeTelevisionRepository(); var televisionRepo = new FakeTelevisionRepository();
var artistRepo = new Mock<IArtistRepository>(); IArtistRepository artistRepo = Substitute.For<IArtistRepository>();
var factory = new Mock<IMultiEpisodeShuffleCollectionEnumeratorFactory>(); IMultiEpisodeShuffleCollectionEnumeratorFactory factory =
var localFileSystem = new Mock<ILocalFileSystem>(); Substitute.For<IMultiEpisodeShuffleCollectionEnumeratorFactory>();
ILocalFileSystem localFileSystem = Substitute.For<ILocalFileSystem>();
var builder = new PlayoutBuilder( var builder = new PlayoutBuilder(
configRepo.Object, configRepo,
fakeRepository, fakeRepository,
televisionRepo, televisionRepo,
artistRepo.Object, artistRepo,
factory.Object, factory,
localFileSystem.Object, localFileSystem,
_logger); _logger);
DateTimeOffset start = HoursAfterMidnight(0); DateTimeOffset start = HoursAfterMidnight(0);
@ -2702,18 +2703,19 @@ public class PlayoutBuilderTests
ProgramScheduleAlternates = new List<ProgramScheduleAlternate>() ProgramScheduleAlternates = new List<ProgramScheduleAlternate>()
}; };
var configRepo = new Mock<IConfigElementRepository>(); IConfigElementRepository configRepo = Substitute.For<IConfigElementRepository>();
var televisionRepo = new FakeTelevisionRepository(); var televisionRepo = new FakeTelevisionRepository();
var artistRepo = new Mock<IArtistRepository>(); IArtistRepository artistRepo = Substitute.For<IArtistRepository>();
var factory = new Mock<IMultiEpisodeShuffleCollectionEnumeratorFactory>(); IMultiEpisodeShuffleCollectionEnumeratorFactory factory =
var localFileSystem = new Mock<ILocalFileSystem>(); Substitute.For<IMultiEpisodeShuffleCollectionEnumeratorFactory>();
ILocalFileSystem localFileSystem = Substitute.For<ILocalFileSystem>();
var builder = new PlayoutBuilder( var builder = new PlayoutBuilder(
configRepo.Object, configRepo,
fakeRepository, fakeRepository,
televisionRepo, televisionRepo,
artistRepo.Object, artistRepo,
factory.Object, factory,
localFileSystem.Object, localFileSystem,
_logger); _logger);
DateTimeOffset start = HoursAfterMidnight(0); DateTimeOffset start = HoursAfterMidnight(0);
@ -2814,18 +2816,19 @@ public class PlayoutBuilderTests
ProgramScheduleAlternates = new List<ProgramScheduleAlternate>() ProgramScheduleAlternates = new List<ProgramScheduleAlternate>()
}; };
var configRepo = new Mock<IConfigElementRepository>(); IConfigElementRepository configRepo = Substitute.For<IConfigElementRepository>();
var televisionRepo = new FakeTelevisionRepository(); var televisionRepo = new FakeTelevisionRepository();
var artistRepo = new Mock<IArtistRepository>(); IArtistRepository artistRepo = Substitute.For<IArtistRepository>();
var factory = new Mock<IMultiEpisodeShuffleCollectionEnumeratorFactory>(); IMultiEpisodeShuffleCollectionEnumeratorFactory factory =
var localFileSystem = new Mock<ILocalFileSystem>(); Substitute.For<IMultiEpisodeShuffleCollectionEnumeratorFactory>();
ILocalFileSystem localFileSystem = Substitute.For<ILocalFileSystem>();
var builder = new PlayoutBuilder( var builder = new PlayoutBuilder(
configRepo.Object, configRepo,
fakeRepository, fakeRepository,
televisionRepo, televisionRepo,
artistRepo.Object, artistRepo,
factory.Object, factory,
localFileSystem.Object, localFileSystem,
_logger); _logger);
DateTimeOffset start = HoursAfterMidnight(0); DateTimeOffset start = HoursAfterMidnight(0);
@ -2912,7 +2915,7 @@ public class PlayoutBuilderTests
private TestData TestDataFloodForItems( private TestData TestDataFloodForItems(
List<MediaItem> mediaItems, List<MediaItem> mediaItems,
PlaybackOrder playbackOrder, PlaybackOrder playbackOrder,
Mock<IConfigElementRepository> configMock = null) IConfigElementRepository configMock = null)
{ {
var mediaCollection = new Collection var mediaCollection = new Collection
{ {
@ -2920,20 +2923,21 @@ public class PlayoutBuilderTests
MediaItems = mediaItems MediaItems = mediaItems
}; };
Mock<IConfigElementRepository> configRepo = configMock ?? new Mock<IConfigElementRepository>(); IConfigElementRepository configRepo = configMock ?? Substitute.For<IConfigElementRepository>();
var collectionRepo = new FakeMediaCollectionRepository(Map((mediaCollection.Id, mediaItems))); var collectionRepo = new FakeMediaCollectionRepository(Map((mediaCollection.Id, mediaItems)));
var televisionRepo = new FakeTelevisionRepository(); var televisionRepo = new FakeTelevisionRepository();
var artistRepo = new Mock<IArtistRepository>(); IArtistRepository artistRepo = Substitute.For<IArtistRepository>();
var factory = new Mock<IMultiEpisodeShuffleCollectionEnumeratorFactory>(); IMultiEpisodeShuffleCollectionEnumeratorFactory factory =
var localFileSystem = new Mock<ILocalFileSystem>(); Substitute.For<IMultiEpisodeShuffleCollectionEnumeratorFactory>();
ILocalFileSystem localFileSystem = Substitute.For<ILocalFileSystem>();
var builder = new PlayoutBuilder( var builder = new PlayoutBuilder(
configRepo.Object, configRepo,
collectionRepo, collectionRepo,
televisionRepo, televisionRepo,
artistRepo.Object, artistRepo,
factory.Object, factory,
localFileSystem.Object, localFileSystem,
_logger); _logger);
var items = new List<ProgramScheduleItem> { Flood(mediaCollection, playbackOrder) }; var items = new List<ProgramScheduleItem> { Flood(mediaCollection, playbackOrder) };
@ -2954,7 +2958,7 @@ public class PlayoutBuilderTests
private TestData TestDataFloodForSmartCollectionItems( private TestData TestDataFloodForSmartCollectionItems(
List<MediaItem> mediaItems, List<MediaItem> mediaItems,
PlaybackOrder playbackOrder, PlaybackOrder playbackOrder,
Mock<IConfigElementRepository> configMock = null) IConfigElementRepository configMock = null)
{ {
var mediaCollection = new SmartCollection var mediaCollection = new SmartCollection
{ {
@ -2968,7 +2972,7 @@ public class PlayoutBuilderTests
Query = "ghjk" Query = "ghjk"
}; };
Mock<IConfigElementRepository> configRepo = configMock ?? new Mock<IConfigElementRepository>(); IConfigElementRepository configRepo = configMock ?? Substitute.For<IConfigElementRepository>();
var collectionRepo = new FakeMediaCollectionRepository( var collectionRepo = new FakeMediaCollectionRepository(
Map( Map(
@ -2977,16 +2981,17 @@ public class PlayoutBuilderTests
) )
); );
var televisionRepo = new FakeTelevisionRepository(); var televisionRepo = new FakeTelevisionRepository();
var artistRepo = new Mock<IArtistRepository>(); IArtistRepository artistRepo = Substitute.For<IArtistRepository>();
var factory = new Mock<IMultiEpisodeShuffleCollectionEnumeratorFactory>(); IMultiEpisodeShuffleCollectionEnumeratorFactory factory =
var localFileSystem = new Mock<ILocalFileSystem>(); Substitute.For<IMultiEpisodeShuffleCollectionEnumeratorFactory>();
ILocalFileSystem localFileSystem = Substitute.For<ILocalFileSystem>();
var builder = new PlayoutBuilder( var builder = new PlayoutBuilder(
configRepo.Object, configRepo,
collectionRepo, collectionRepo,
televisionRepo, televisionRepo,
artistRepo.Object, artistRepo,
factory.Object, factory,
localFileSystem.Object, localFileSystem,
_logger); _logger);
var items = new List<ProgramScheduleItem> { Flood(mediaCollection, fillerCollection, playbackOrder) }; var items = new List<ProgramScheduleItem> { Flood(mediaCollection, fillerCollection, playbackOrder) };

6
ErsatzTV.Core.Tests/Scheduling/PlayoutModeSchedulerBaseTests.cs

@ -4,7 +4,7 @@ using ErsatzTV.Core.Interfaces.Scheduling;
using ErsatzTV.Core.Scheduling; using ErsatzTV.Core.Scheduling;
using FluentAssertions; using FluentAssertions;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Moq; using NSubstitute;
using NUnit.Framework; using NUnit.Framework;
using Serilog; using Serilog;
@ -409,10 +409,10 @@ public class PlayoutModeSchedulerBaseTests : SchedulerTestBase
[Test] [Test]
public void Should_Compare_Time_As_Local_Time() public void Should_Compare_Time_As_Local_Time()
{ {
var enumerator = new Mock<IScheduleItemsEnumerator>(); IScheduleItemsEnumerator enumerator = Substitute.For<IScheduleItemsEnumerator>();
var state = new PlayoutBuilderState( var state = new PlayoutBuilderState(
enumerator.Object, enumerator,
None, None,
None, None,
false, false,

20
ErsatzTV.Core.Tests/Scheduling/PlayoutModeSchedulerDurationTests.cs

@ -3,7 +3,7 @@ using ErsatzTV.Core.Domain.Filler;
using ErsatzTV.Core.Scheduling; using ErsatzTV.Core.Scheduling;
using FluentAssertions; using FluentAssertions;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Moq; using NSubstitute;
using NUnit.Framework; using NUnit.Framework;
namespace ErsatzTV.Core.Tests.Scheduling; namespace ErsatzTV.Core.Tests.Scheduling;
@ -44,7 +44,7 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator); PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerDuration(new Mock<ILogger>().Object); var scheduler = new PlayoutModeSchedulerDuration(Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule( (PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState, startState,
CollectionEnumerators(scheduleItem, enumerator), CollectionEnumerators(scheduleItem, enumerator),
@ -117,7 +117,7 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator); PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerDuration(new Mock<ILogger>().Object); var scheduler = new PlayoutModeSchedulerDuration(Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule( (PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState, startState,
CollectionEnumerators(scheduleItem, enumerator), CollectionEnumerators(scheduleItem, enumerator),
@ -189,7 +189,7 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator); PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerDuration(new Mock<ILogger>().Object); var scheduler = new PlayoutModeSchedulerDuration(Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule( (PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState, startState,
CollectionEnumerators(scheduleItem, enumerator), CollectionEnumerators(scheduleItem, enumerator),
@ -258,7 +258,7 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator); PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerDuration(new Mock<ILogger>().Object); var scheduler = new PlayoutModeSchedulerDuration(Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule( (PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState, startState,
CollectionEnumerators(scheduleItem, enumerator), CollectionEnumerators(scheduleItem, enumerator),
@ -341,7 +341,7 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator); PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerDuration(new Mock<ILogger>().Object); var scheduler = new PlayoutModeSchedulerDuration(Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule( (PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState, startState,
CollectionEnumerators(scheduleItem, enumerator1, scheduleItem.FallbackFiller, enumerator2), CollectionEnumerators(scheduleItem, enumerator1, scheduleItem.FallbackFiller, enumerator2),
@ -428,7 +428,7 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator); PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerDuration(new Mock<ILogger>().Object); var scheduler = new PlayoutModeSchedulerDuration(Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule( (PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState, startState,
CollectionEnumerators(scheduleItem, enumerator1, scheduleItem.TailFiller, enumerator2), CollectionEnumerators(scheduleItem, enumerator1, scheduleItem.TailFiller, enumerator2),
@ -527,7 +527,7 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator); PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerDuration(new Mock<ILogger>().Object); var scheduler = new PlayoutModeSchedulerDuration(Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule( (PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState, startState,
CollectionEnumerators(scheduleItem, enumerator1, scheduleItem.TailFiller, enumerator2), CollectionEnumerators(scheduleItem, enumerator1, scheduleItem.TailFiller, enumerator2),
@ -637,7 +637,7 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator); PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerDuration(new Mock<ILogger>().Object); var scheduler = new PlayoutModeSchedulerDuration(Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule( (PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState, startState,
CollectionEnumerators( CollectionEnumerators(
@ -745,7 +745,7 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator); PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerDuration(new Mock<ILogger>().Object); var scheduler = new PlayoutModeSchedulerDuration(Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule( (PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState, startState,
CollectionEnumerators(scheduleItem, enumerator), CollectionEnumerators(scheduleItem, enumerator),

28
ErsatzTV.Core.Tests/Scheduling/PlayoutModeSchedulerFloodTests.cs

@ -3,7 +3,7 @@ using ErsatzTV.Core.Domain.Filler;
using ErsatzTV.Core.Scheduling; using ErsatzTV.Core.Scheduling;
using FluentAssertions; using FluentAssertions;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Moq; using NSubstitute;
using NUnit.Framework; using NUnit.Framework;
namespace ErsatzTV.Core.Tests.Scheduling; namespace ErsatzTV.Core.Tests.Scheduling;
@ -50,7 +50,7 @@ public class PlayoutModeSchedulerFloodTests : SchedulerTestBase
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator); PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerFlood(new Mock<ILogger>().Object); var scheduler = new PlayoutModeSchedulerFlood(Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule( (PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState, startState,
CollectionEnumerators(scheduleItem, enumerator), CollectionEnumerators(scheduleItem, enumerator),
@ -125,7 +125,7 @@ public class PlayoutModeSchedulerFloodTests : SchedulerTestBase
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator); PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerFlood(new Mock<ILogger>().Object); var scheduler = new PlayoutModeSchedulerFlood(Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule( (PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState, startState,
CollectionEnumerators(scheduleItem, enumerator), CollectionEnumerators(scheduleItem, enumerator),
@ -222,7 +222,7 @@ public class PlayoutModeSchedulerFloodTests : SchedulerTestBase
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator); PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerFlood(new Mock<ILogger>().Object); var scheduler = new PlayoutModeSchedulerFlood(Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule( (PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState, startState,
CollectionEnumerators(scheduleItem, enumerator), CollectionEnumerators(scheduleItem, enumerator),
@ -307,7 +307,7 @@ public class PlayoutModeSchedulerFloodTests : SchedulerTestBase
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator); PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerFlood(new Mock<ILogger>().Object); var scheduler = new PlayoutModeSchedulerFlood(Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule( (PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState, startState,
CollectionEnumerators(scheduleItem, enumerator1, scheduleItem.PostRollFiller, enumerator2), CollectionEnumerators(scheduleItem, enumerator1, scheduleItem.PostRollFiller, enumerator2),
@ -395,7 +395,7 @@ public class PlayoutModeSchedulerFloodTests : SchedulerTestBase
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator); PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerFlood(new Mock<ILogger>().Object); var scheduler = new PlayoutModeSchedulerFlood(Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule( (PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState, startState,
CollectionEnumerators(scheduleItem, enumerator), CollectionEnumerators(scheduleItem, enumerator),
@ -477,7 +477,7 @@ public class PlayoutModeSchedulerFloodTests : SchedulerTestBase
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator); PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerFlood(new Mock<ILogger>().Object); var scheduler = new PlayoutModeSchedulerFlood(Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule( (PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState, startState,
CollectionEnumerators(scheduleItem, enumerator1, scheduleItem.TailFiller, enumerator2), CollectionEnumerators(scheduleItem, enumerator1, scheduleItem.TailFiller, enumerator2),
@ -575,7 +575,7 @@ public class PlayoutModeSchedulerFloodTests : SchedulerTestBase
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator); PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerFlood(new Mock<ILogger>().Object); var scheduler = new PlayoutModeSchedulerFlood(Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule( (PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState, startState,
CollectionEnumerators(scheduleItem, enumerator1, scheduleItem.FallbackFiller, enumerator2), CollectionEnumerators(scheduleItem, enumerator1, scheduleItem.FallbackFiller, enumerator2),
@ -663,7 +663,7 @@ public class PlayoutModeSchedulerFloodTests : SchedulerTestBase
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator); PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerFlood(new Mock<ILogger>().Object); var scheduler = new PlayoutModeSchedulerFlood(Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule( (PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState, startState,
CollectionEnumerators(scheduleItem, enumerator1, scheduleItem.TailFiller, enumerator2), CollectionEnumerators(scheduleItem, enumerator1, scheduleItem.TailFiller, enumerator2),
@ -771,7 +771,7 @@ public class PlayoutModeSchedulerFloodTests : SchedulerTestBase
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator); PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerFlood(new Mock<ILogger>().Object); var scheduler = new PlayoutModeSchedulerFlood(Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule( (PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState, startState,
CollectionEnumerators( CollectionEnumerators(
@ -881,7 +881,7 @@ public class PlayoutModeSchedulerFloodTests : SchedulerTestBase
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator); PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerFlood(new Mock<ILogger>().Object); var scheduler = new PlayoutModeSchedulerFlood(Substitute.For<ILogger>());
// hard stop at 2, an hour before the "next schedule item" at 3 // hard stop at 2, an hour before the "next schedule item" at 3
DateTimeOffset hardStop = StartState(scheduleItemsEnumerator).CurrentTime.AddHours(2); DateTimeOffset hardStop = StartState(scheduleItemsEnumerator).CurrentTime.AddHours(2);
@ -987,7 +987,7 @@ public class PlayoutModeSchedulerFloodTests : SchedulerTestBase
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator); PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerFlood(new Mock<ILogger>().Object); var scheduler = new PlayoutModeSchedulerFlood(Substitute.For<ILogger>());
// hard stop at 2, an hour before the "next schedule item" at 3 // hard stop at 2, an hour before the "next schedule item" at 3
DateTimeOffset hardStop = StartState(scheduleItemsEnumerator).CurrentTime.AddHours(2); DateTimeOffset hardStop = StartState(scheduleItemsEnumerator).CurrentTime.AddHours(2);
@ -1103,7 +1103,7 @@ public class PlayoutModeSchedulerFloodTests : SchedulerTestBase
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator); PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerFlood(new Mock<ILogger>().Object); var scheduler = new PlayoutModeSchedulerFlood(Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule( (PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState, startState,
CollectionEnumerators( CollectionEnumerators(
@ -1183,7 +1183,7 @@ public class PlayoutModeSchedulerFloodTests : SchedulerTestBase
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator); PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerFlood(new Mock<ILogger>().Object); var scheduler = new PlayoutModeSchedulerFlood(Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule( (PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState, startState,
CollectionEnumerators(scheduleItem, enumerator), CollectionEnumerators(scheduleItem, enumerator),

18
ErsatzTV.Core.Tests/Scheduling/PlayoutModeSchedulerMultipleTests.cs

@ -3,7 +3,7 @@ using ErsatzTV.Core.Domain.Filler;
using ErsatzTV.Core.Scheduling; using ErsatzTV.Core.Scheduling;
using FluentAssertions; using FluentAssertions;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Moq; using NSubstitute;
using NUnit.Framework; using NUnit.Framework;
namespace ErsatzTV.Core.Tests.Scheduling; namespace ErsatzTV.Core.Tests.Scheduling;
@ -51,7 +51,7 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator); PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerMultiple(collectionMediaItems, new Mock<ILogger>().Object); var scheduler = new PlayoutModeSchedulerMultiple(collectionMediaItems, Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule( (PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState, startState,
CollectionEnumerators(scheduleItem, enumerator), CollectionEnumerators(scheduleItem, enumerator),
@ -126,7 +126,7 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator); PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerMultiple(collectionMediaItems, new Mock<ILogger>().Object); var scheduler = new PlayoutModeSchedulerMultiple(collectionMediaItems, Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule( (PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState, startState,
CollectionEnumerators(scheduleItem, enumerator), CollectionEnumerators(scheduleItem, enumerator),
@ -209,7 +209,7 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator); PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerMultiple(collectionMediaItems, new Mock<ILogger>().Object); var scheduler = new PlayoutModeSchedulerMultiple(collectionMediaItems, Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule( (PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState, startState,
CollectionEnumerators(scheduleItem, enumerator1, scheduleItem.TailFiller, enumerator2), CollectionEnumerators(scheduleItem, enumerator1, scheduleItem.TailFiller, enumerator2),
@ -308,7 +308,7 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator); PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerMultiple(collectionMediaItems, new Mock<ILogger>().Object); var scheduler = new PlayoutModeSchedulerMultiple(collectionMediaItems, Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule( (PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState, startState,
CollectionEnumerators(scheduleItem, enumerator1, scheduleItem.FallbackFiller, enumerator2), CollectionEnumerators(scheduleItem, enumerator1, scheduleItem.FallbackFiller, enumerator2),
@ -397,7 +397,7 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator); PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerMultiple(collectionMediaItems, new Mock<ILogger>().Object); var scheduler = new PlayoutModeSchedulerMultiple(collectionMediaItems, Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule( (PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState, startState,
CollectionEnumerators(scheduleItem, enumerator1, scheduleItem.TailFiller, enumerator2), CollectionEnumerators(scheduleItem, enumerator1, scheduleItem.TailFiller, enumerator2),
@ -507,7 +507,7 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator); PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerMultiple(collectionMediaItems, new Mock<ILogger>().Object); var scheduler = new PlayoutModeSchedulerMultiple(collectionMediaItems, Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule( (PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState, startState,
CollectionEnumerators( CollectionEnumerators(
@ -629,7 +629,7 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator); PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerMultiple(collectionMediaItems, new Mock<ILogger>().Object); var scheduler = new PlayoutModeSchedulerMultiple(collectionMediaItems, Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule( (PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState, startState,
CollectionEnumerators( CollectionEnumerators(
@ -715,7 +715,7 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator); PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerMultiple(collectionMediaItems, new Mock<ILogger>().Object); var scheduler = new PlayoutModeSchedulerMultiple(collectionMediaItems, Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule( (PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState, startState,
CollectionEnumerators(scheduleItem, enumerator), CollectionEnumerators(scheduleItem, enumerator),

22
ErsatzTV.Core.Tests/Scheduling/PlayoutModeSchedulerOneTests.cs

@ -3,7 +3,7 @@ using ErsatzTV.Core.Domain.Filler;
using ErsatzTV.Core.Scheduling; using ErsatzTV.Core.Scheduling;
using FluentAssertions; using FluentAssertions;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Moq; using NSubstitute;
using NUnit.Framework; using NUnit.Framework;
namespace ErsatzTV.Core.Tests.Scheduling; namespace ErsatzTV.Core.Tests.Scheduling;
@ -44,7 +44,7 @@ public class PlayoutModeSchedulerOneTests : SchedulerTestBase
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator); PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerOne(new Mock<ILogger>().Object); var scheduler = new PlayoutModeSchedulerOne(Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule( (PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState, startState,
CollectionEnumerators(scheduleItem, enumerator), CollectionEnumerators(scheduleItem, enumerator),
@ -121,7 +121,7 @@ public class PlayoutModeSchedulerOneTests : SchedulerTestBase
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator); PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerOne(new Mock<ILogger>().Object); var scheduler = new PlayoutModeSchedulerOne(Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule( (PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState, startState,
CollectionEnumerators( CollectionEnumerators(
@ -195,7 +195,7 @@ public class PlayoutModeSchedulerOneTests : SchedulerTestBase
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator); PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerOne(new Mock<ILogger>().Object); var scheduler = new PlayoutModeSchedulerOne(Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule( (PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState, startState,
CollectionEnumerators(scheduleItem, enumerator1, scheduleItem.TailFiller, enumerator2), CollectionEnumerators(scheduleItem, enumerator1, scheduleItem.TailFiller, enumerator2),
@ -277,7 +277,7 @@ public class PlayoutModeSchedulerOneTests : SchedulerTestBase
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator); PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerOne(new Mock<ILogger>().Object); var scheduler = new PlayoutModeSchedulerOne(Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule( (PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState, startState,
CollectionEnumerators(scheduleItem, enumerator1, scheduleItem.FallbackFiller, enumerator2), CollectionEnumerators(scheduleItem, enumerator1, scheduleItem.FallbackFiller, enumerator2),
@ -349,7 +349,7 @@ public class PlayoutModeSchedulerOneTests : SchedulerTestBase
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator); PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerOne(new Mock<ILogger>().Object); var scheduler = new PlayoutModeSchedulerOne(Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule( (PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState, startState,
CollectionEnumerators(scheduleItem, enumerator1, scheduleItem.TailFiller, enumerator2), CollectionEnumerators(scheduleItem, enumerator1, scheduleItem.TailFiller, enumerator2),
@ -441,7 +441,7 @@ public class PlayoutModeSchedulerOneTests : SchedulerTestBase
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator); PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerOne(new Mock<ILogger>().Object); var scheduler = new PlayoutModeSchedulerOne(Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule( (PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState, startState,
CollectionEnumerators( CollectionEnumerators(
@ -545,7 +545,7 @@ public class PlayoutModeSchedulerOneTests : SchedulerTestBase
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator); PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerOne(new Mock<ILogger>().Object); var scheduler = new PlayoutModeSchedulerOne(Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule( (PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState, startState,
CollectionEnumerators( CollectionEnumerators(
@ -631,7 +631,7 @@ public class PlayoutModeSchedulerOneTests : SchedulerTestBase
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator); PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerOne(new Mock<ILogger>().Object); var scheduler = new PlayoutModeSchedulerOne(Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule( (PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState, startState,
CollectionEnumerators( CollectionEnumerators(
@ -731,7 +731,7 @@ public class PlayoutModeSchedulerOneTests : SchedulerTestBase
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator); PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerOne(new Mock<ILogger>().Object); var scheduler = new PlayoutModeSchedulerOne(Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule( (PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState, startState,
CollectionEnumerators( CollectionEnumerators(
@ -816,7 +816,7 @@ public class PlayoutModeSchedulerOneTests : SchedulerTestBase
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator); PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerOne(new Mock<ILogger>().Object); var scheduler = new PlayoutModeSchedulerOne(Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule( (PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState, startState,
CollectionEnumerators(scheduleItem, enumerator), CollectionEnumerators(scheduleItem, enumerator),

16
ErsatzTV.Core.Tests/Scheduling/ScheduleIntegrationTests.cs

@ -18,7 +18,7 @@ using LanguageExt.UnsafeValueAccess;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Moq; using NSubstitute;
using NUnit.Framework; using NUnit.Framework;
using Serilog; using Serilog;
using Serilog.Events; using Serilog.Events;
@ -91,7 +91,7 @@ public class ScheduleIntegrationTests
services.AddSingleton<ISearchIndex, SearchIndex>(); services.AddSingleton<ISearchIndex, SearchIndex>();
services.AddSingleton(_ => new Mock<IClient>().Object); services.AddSingleton(_ => Substitute.For<IClient>());
ServiceProvider provider = services.BuildServiceProvider(); ServiceProvider provider = services.BuildServiceProvider();
@ -117,11 +117,11 @@ public class ScheduleIntegrationTests
var builder = new PlayoutBuilder( var builder = new PlayoutBuilder(
new ConfigElementRepository(factory), new ConfigElementRepository(factory),
new MediaCollectionRepository(new Mock<IClient>().Object, searchIndex, factory), new MediaCollectionRepository(Substitute.For<IClient>(), searchIndex, factory),
new TelevisionRepository(factory, provider.GetRequiredService<ILogger<TelevisionRepository>>()), new TelevisionRepository(factory, provider.GetRequiredService<ILogger<TelevisionRepository>>()),
new ArtistRepository(factory), new ArtistRepository(factory),
new Mock<IMultiEpisodeShuffleCollectionEnumeratorFactory>().Object, Substitute.For<IMultiEpisodeShuffleCollectionEnumeratorFactory>(),
new Mock<ILocalFileSystem>().Object, Substitute.For<ILocalFileSystem>(),
provider.GetRequiredService<ILogger<PlayoutBuilder>>()); provider.GetRequiredService<ILogger<PlayoutBuilder>>());
{ {
@ -287,11 +287,11 @@ public class ScheduleIntegrationTests
var builder = new PlayoutBuilder( var builder = new PlayoutBuilder(
new ConfigElementRepository(factory), new ConfigElementRepository(factory),
new MediaCollectionRepository(new Mock<IClient>().Object, new Mock<ISearchIndex>().Object, factory), new MediaCollectionRepository(Substitute.For<IClient>(), Substitute.For<ISearchIndex>(), factory),
new TelevisionRepository(factory, provider.GetRequiredService<ILogger<TelevisionRepository>>()), new TelevisionRepository(factory, provider.GetRequiredService<ILogger<TelevisionRepository>>()),
new ArtistRepository(factory), new ArtistRepository(factory),
new Mock<IMultiEpisodeShuffleCollectionEnumeratorFactory>().Object, Substitute.For<IMultiEpisodeShuffleCollectionEnumeratorFactory>(),
new Mock<ILocalFileSystem>().Object, Substitute.For<ILocalFileSystem>(),
provider.GetRequiredService<ILogger<PlayoutBuilder>>()); provider.GetRequiredService<ILogger<PlayoutBuilder>>());
for (var i = 0; i <= 24 * 4; i++) for (var i = 0; i <= 24 * 4; i++)

2
ErsatzTV.FFmpeg.Tests/ErsatzTV.FFmpeg.Tests.csproj

@ -11,7 +11,7 @@
<PackageReference Include="FluentAssertions" Version="6.11.0" /> <PackageReference Include="FluentAssertions" Version="6.11.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="7.0.1" /> <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="7.0.1" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.7.0" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.7.0" />
<PackageReference Include="Moq" Version="4.18.4" /> <PackageReference Include="NSubstitute" Version="5.0.0" />
<PackageReference Include="NUnit" Version="3.13.3" /> <PackageReference Include="NUnit" Version="3.13.3" />
<PackageReference Include="NUnit3TestAdapter" Version="4.5.0" /> <PackageReference Include="NUnit3TestAdapter" Version="4.5.0" />
<PackageReference Include="System.IO.FileSystem.Primitives" Version="4.3.0" /> <PackageReference Include="System.IO.FileSystem.Primitives" Version="4.3.0" />

4
ErsatzTV.FFmpeg.Tests/PipelineBuilderBaseTests.cs

@ -10,7 +10,7 @@ using ErsatzTV.FFmpeg.State;
using FluentAssertions; using FluentAssertions;
using LanguageExt; using LanguageExt;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Moq; using NSubstitute;
using NUnit.Framework; using NUnit.Framework;
using static LanguageExt.Prelude; using static LanguageExt.Prelude;
@ -19,7 +19,7 @@ namespace ErsatzTV.FFmpeg.Tests;
[TestFixture] [TestFixture]
public class PipelineBuilderBaseTests public class PipelineBuilderBaseTests
{ {
private readonly ILogger _logger = new Mock<ILogger>().Object; private readonly ILogger _logger = Substitute.For<ILogger>();
[Test] [Test]
public void Incorrect_Video_Codec_Should_Use_Encoder() public void Incorrect_Video_Codec_Should_Use_Encoder()

10
ErsatzTV.Infrastructure.Tests/Data/Repositories/Caching/CachingSearchRepositoryTests.cs

@ -2,7 +2,7 @@ using ErsatzTV.Core.Interfaces.Repositories;
using ErsatzTV.Infrastructure.Data.Repositories.Caching; using ErsatzTV.Infrastructure.Data.Repositories.Caching;
using FluentAssertions; using FluentAssertions;
using LanguageExt; using LanguageExt;
using Moq; using NSubstitute;
using NUnit.Framework; using NUnit.Framework;
namespace ErsatzTV.Infrastructure.Tests.Data.Repositories.Caching; namespace ErsatzTV.Infrastructure.Tests.Data.Repositories.Caching;
@ -18,11 +18,11 @@ public class CachingSearchRepositoryTests
var englishResult = new List<string> { "english_result" }; var englishResult = new List<string> { "english_result" };
var frenchResult = new List<string> { "french_result" }; var frenchResult = new List<string> { "french_result" };
var searchRepo = new Mock<ISearchRepository>(); ISearchRepository searchRepo = Substitute.For<ISearchRepository>();
searchRepo.Setup(x => x.GetAllLanguageCodes(englishMediaCodes)).Returns(englishResult.AsTask()); searchRepo.GetAllLanguageCodes(englishMediaCodes).Returns(englishResult.AsTask());
searchRepo.Setup(x => x.GetAllLanguageCodes(frenchMediaCodes)).Returns(frenchResult.AsTask()); searchRepo.GetAllLanguageCodes(frenchMediaCodes).Returns(frenchResult.AsTask());
var repo = new CachingSearchRepository(searchRepo.Object); var repo = new CachingSearchRepository(searchRepo);
List<string> result1 = await repo.GetAllLanguageCodes(englishMediaCodes); List<string> result1 = await repo.GetAllLanguageCodes(englishMediaCodes);
result1.Should().BeEquivalentTo(englishResult); result1.Should().BeEquivalentTo(englishResult);

2
ErsatzTV.Infrastructure.Tests/ErsatzTV.Infrastructure.Tests.csproj

@ -11,7 +11,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="FluentAssertions" Version="6.11.0" /> <PackageReference Include="FluentAssertions" Version="6.11.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.7.0" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.7.0" />
<PackageReference Include="Moq" Version="4.18.4" /> <PackageReference Include="NSubstitute" Version="5.0.0" />
<PackageReference Include="NUnit" Version="3.13.3" /> <PackageReference Include="NUnit" Version="3.13.3" />
<PackageReference Include="NUnit3TestAdapter" Version="4.5.0" /> <PackageReference Include="NUnit3TestAdapter" Version="4.5.0" />
<PackageReference Include="NUnit.Analyzers" Version="3.6.1"> <PackageReference Include="NUnit.Analyzers" Version="3.6.1">

75
ErsatzTV.Scanner.Tests/Core/FFmpeg/TranscodingTests.cs

@ -28,7 +28,7 @@ using ErsatzTV.Scanner.Core.Metadata;
using FluentAssertions; using FluentAssertions;
using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Moq; using NSubstitute;
using NUnit.Framework; using NUnit.Framework;
using Serilog; using Serilog;
using MediaStream = ErsatzTV.Core.Domain.MediaStream; using MediaStream = ErsatzTV.Core.Domain.MediaStream;
@ -215,26 +215,25 @@ public class TranscodingTests
HardwareAccelerationKind profileAcceleration) HardwareAccelerationKind profileAcceleration)
{ {
var localFileSystem = new LocalFileSystem( var localFileSystem = new LocalFileSystem(
new Mock<IClient>().Object, Substitute.For<IClient>(),
LoggerFactory.CreateLogger<LocalFileSystem>()); LoggerFactory.CreateLogger<LocalFileSystem>());
var tempFilePool = new TempFilePool(); var tempFilePool = new TempFilePool();
var mockImageCache = new Mock<ImageCache>(localFileSystem, tempFilePool); ImageCache mockImageCache = Substitute.For<ImageCache>(localFileSystem, tempFilePool);
// always return the static watermark resource // always return the static watermark resource
mockImageCache.Setup( mockImageCache.GetPathForImage(
ic => ic.GetPathForImage( Arg.Any<string>(),
It.IsAny<string>(), Arg.Is<ArtworkKind>(x => x == ArtworkKind.Watermark),
It.Is<ArtworkKind>(x => x == ArtworkKind.Watermark), Arg.Any<Option<int>>())
It.IsAny<Option<int>>()))
.Returns(Path.Combine(TestContext.CurrentContext.TestDirectory, "Resources", "ErsatzTV.png")); .Returns(Path.Combine(TestContext.CurrentContext.TestDirectory, "Resources", "ErsatzTV.png"));
var oldService = new FFmpegProcessService( var oldService = new FFmpegProcessService(
new FFmpegPlaybackSettingsCalculator(), new FFmpegPlaybackSettingsCalculator(),
new FakeStreamSelector(), new FakeStreamSelector(),
mockImageCache.Object, mockImageCache,
tempFilePool, tempFilePool,
new Mock<IClient>().Object, Substitute.For<IClient>(),
MemoryCache, MemoryCache,
LoggerFactory.CreateLogger<FFmpegProcessService>()); LoggerFactory.CreateLogger<FFmpegProcessService>());
@ -250,10 +249,10 @@ public class TranscodingTests
MemoryCache, MemoryCache,
LoggerFactory.CreateLogger<HardwareCapabilitiesFactory>()), LoggerFactory.CreateLogger<HardwareCapabilitiesFactory>()),
LoggerFactory.CreateLogger<PipelineBuilderFactory>()), LoggerFactory.CreateLogger<PipelineBuilderFactory>()),
new Mock<IConfigElementRepository>().Object, Substitute.For<IConfigElementRepository>(),
LoggerFactory.CreateLogger<FFmpegLibraryProcessService>()); LoggerFactory.CreateLogger<FFmpegLibraryProcessService>());
var songVideoGenerator = new SongVideoGenerator(tempFilePool, mockImageCache.Object, service); var songVideoGenerator = new SongVideoGenerator(tempFilePool, mockImageCache, service);
var channel = new Channel(Guid.NewGuid()) var channel = new Channel(Guid.NewGuid())
{ {
@ -304,12 +303,12 @@ public class TranscodingTests
ExecutableName("ffprobe"), ExecutableName("ffprobe"),
CancellationToken.None); CancellationToken.None);
var metadataRepository = new Mock<IMetadataRepository>(); IMetadataRepository metadataRepository = Substitute.For<IMetadataRepository>();
metadataRepository metadataRepository.When(x => x.UpdateStatistics(Arg.Any<MediaItem>(), Arg.Any<MediaVersion>(), Arg.Any<bool>()))
.Setup(r => r.UpdateStatistics(It.IsAny<MediaItem>(), It.IsAny<MediaVersion>(), It.IsAny<bool>())) .Do(
.Callback<MediaItem, MediaVersion, bool>( x =>
(_, version, _) =>
{ {
MediaVersion version = x.Arg<MediaVersion>();
if (version.Streams.Any(s => s.MediaStreamKind == MediaStreamKind.Video && s.AttachedPic == false)) if (version.Streams.Any(s => s.MediaStreamKind == MediaStreamKind.Video && s.AttachedPic == false))
{ {
version.MediaFiles = videoVersion.MediaFiles; version.MediaFiles = videoVersion.MediaFiles;
@ -323,9 +322,9 @@ public class TranscodingTests
}); });
var localStatisticsProvider = new LocalStatisticsProvider( var localStatisticsProvider = new LocalStatisticsProvider(
metadataRepository.Object, metadataRepository,
new LocalFileSystem(new Mock<IClient>().Object, LoggerFactory.CreateLogger<LocalFileSystem>()), new LocalFileSystem(Substitute.For<IClient>(), LoggerFactory.CreateLogger<LocalFileSystem>()),
new Mock<IClient>().Object, Substitute.For<IClient>(),
LoggerFactory.CreateLogger<LocalStatisticsProvider>()); LoggerFactory.CreateLogger<LocalStatisticsProvider>());
await localStatisticsProvider.RefreshStatistics(ExecutableName("ffmpeg"), ExecutableName("ffprobe"), song); await localStatisticsProvider.RefreshStatistics(ExecutableName("ffmpeg"), ExecutableName("ffprobe"), song);
@ -434,20 +433,21 @@ public class TranscodingTests
Streams = new List<MediaStream>() Streams = new List<MediaStream>()
}; };
var metadataRepository = new Mock<IMetadataRepository>(); IMetadataRepository? metadataRepository = Substitute.For<IMetadataRepository>();
metadataRepository metadataRepository
.Setup(r => r.UpdateStatistics(It.IsAny<MediaItem>(), It.IsAny<MediaVersion>(), It.IsAny<bool>())) .When(r => r.UpdateStatistics(Arg.Any<MediaItem>(), Arg.Any<MediaVersion>(), Arg.Any<bool>()))
.Callback<MediaItem, MediaVersion, bool>( .Do(
(_, version, _) => args =>
{ {
MediaVersion? version = args.Arg<MediaVersion>();
version.MediaFiles = v.MediaFiles; version.MediaFiles = v.MediaFiles;
v = version; v = version;
}); });
var localStatisticsProvider = new LocalStatisticsProvider( var localStatisticsProvider = new LocalStatisticsProvider(
metadataRepository.Object, metadataRepository,
new LocalFileSystem(new Mock<IClient>().Object, LoggerFactory.CreateLogger<LocalFileSystem>()), new LocalFileSystem(Substitute.For<IClient>(), LoggerFactory.CreateLogger<LocalFileSystem>()),
new Mock<IClient>().Object, Substitute.For<IClient>(),
LoggerFactory.CreateLogger<LocalStatisticsProvider>()); LoggerFactory.CreateLogger<LocalStatisticsProvider>());
await localStatisticsProvider.RefreshStatistics( await localStatisticsProvider.RefreshStatistics(
@ -837,22 +837,21 @@ public class TranscodingTests
private static FFmpegLibraryProcessService GetService() private static FFmpegLibraryProcessService GetService()
{ {
var imageCache = new Mock<IImageCache>(); IImageCache? imageCache = Substitute.For<IImageCache>();
// always return the static watermark resource // always return the static watermark resource
imageCache.Setup( imageCache.GetPathForImage(
ic => ic.GetPathForImage( Arg.Any<string>(),
It.IsAny<string>(), Arg.Is<ArtworkKind>(x => x == ArtworkKind.Watermark),
It.Is<ArtworkKind>(x => x == ArtworkKind.Watermark), Arg.Any<Option<int>>())
It.IsAny<Option<int>>()))
.Returns(Path.Combine(TestContext.CurrentContext.TestDirectory, "Resources", "ErsatzTV.png")); .Returns(Path.Combine(TestContext.CurrentContext.TestDirectory, "Resources", "ErsatzTV.png"));
var oldService = new FFmpegProcessService( var oldService = new FFmpegProcessService(
new FFmpegPlaybackSettingsCalculator(), new FFmpegPlaybackSettingsCalculator(),
new FakeStreamSelector(), new FakeStreamSelector(),
imageCache.Object, imageCache,
new Mock<ITempFilePool>().Object, Substitute.For<ITempFilePool>(),
new Mock<IClient>().Object, Substitute.For<IClient>(),
MemoryCache, MemoryCache,
LoggerFactory.CreateLogger<FFmpegProcessService>()); LoggerFactory.CreateLogger<FFmpegProcessService>());
@ -860,7 +859,7 @@ public class TranscodingTests
oldService, oldService,
new FFmpegPlaybackSettingsCalculator(), new FFmpegPlaybackSettingsCalculator(),
new FakeStreamSelector(), new FakeStreamSelector(),
new Mock<ITempFilePool>().Object, Substitute.For<ITempFilePool>(),
new PipelineBuilderFactory( new PipelineBuilderFactory(
new RuntimeInfo(), new RuntimeInfo(),
//new FakeNvidiaCapabilitiesFactory(), //new FakeNvidiaCapabilitiesFactory(),
@ -868,7 +867,7 @@ public class TranscodingTests
MemoryCache, MemoryCache,
LoggerFactory.CreateLogger<HardwareCapabilitiesFactory>()), LoggerFactory.CreateLogger<HardwareCapabilitiesFactory>()),
LoggerFactory.CreateLogger<PipelineBuilderFactory>()), LoggerFactory.CreateLogger<PipelineBuilderFactory>()),
new Mock<IConfigElementRepository>().Object, Substitute.For<IConfigElementRepository>(),
LoggerFactory.CreateLogger<FFmpegLibraryProcessService>()); LoggerFactory.CreateLogger<FFmpegLibraryProcessService>());
return service; return service;

10
ErsatzTV.Scanner.Tests/Core/Metadata/LocalStatisticsProviderTests.cs

@ -5,7 +5,7 @@ using ErsatzTV.Core.Interfaces.Repositories;
using ErsatzTV.Scanner.Core.Metadata; using ErsatzTV.Scanner.Core.Metadata;
using FluentAssertions; using FluentAssertions;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Moq; using NSubstitute;
using NUnit.Framework; using NUnit.Framework;
namespace ErsatzTV.Scanner.Tests.Core.Metadata; namespace ErsatzTV.Scanner.Tests.Core.Metadata;
@ -19,10 +19,10 @@ public class LocalStatisticsProviderTests
public void Test() public void Test()
{ {
var provider = new LocalStatisticsProvider( var provider = new LocalStatisticsProvider(
new Mock<IMetadataRepository>().Object, Substitute.For<IMetadataRepository>(),
new Mock<ILocalFileSystem>().Object, Substitute.For<ILocalFileSystem>(),
new Mock<IClient>().Object, Substitute.For<IClient>(),
new Mock<ILogger<LocalStatisticsProvider>>().Object); Substitute.For<ILogger<LocalStatisticsProvider>>());
var input = new LocalStatisticsProvider.FFprobe( var input = new LocalStatisticsProvider.FFprobe(
new LocalStatisticsProvider.FFprobeFormat( new LocalStatisticsProvider.FFprobeFormat(

14
ErsatzTV.Scanner.Tests/Core/Metadata/LocalSubtitlesProviderTests.cs

@ -5,7 +5,7 @@ using ErsatzTV.Scanner.Core.Metadata;
using ErsatzTV.Scanner.Tests.Core.Fakes; using ErsatzTV.Scanner.Tests.Core.Fakes;
using FluentAssertions; using FluentAssertions;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Moq; using NSubstitute;
using NUnit.Framework; using NUnit.Framework;
namespace ErsatzTV.Scanner.Tests.Core.Metadata; namespace ErsatzTV.Scanner.Tests.Core.Metadata;
@ -45,10 +45,10 @@ public class LocalSubtitlesProviderTests
}; };
var provider = new LocalSubtitlesProvider( var provider = new LocalSubtitlesProvider(
new Mock<IMediaItemRepository>().Object, Substitute.For<IMediaItemRepository>(),
new Mock<IMetadataRepository>().Object, Substitute.For<IMetadataRepository>(),
new FakeLocalFileSystem(fakeFiles), new FakeLocalFileSystem(fakeFiles),
new Mock<ILogger<LocalSubtitlesProvider>>().Object); Substitute.For<ILogger<LocalSubtitlesProvider>>());
List<Subtitle> result = provider.LocateExternalSubtitles( List<Subtitle> result = provider.LocateExternalSubtitles(
cultures, cultures,
@ -86,10 +86,10 @@ public class LocalSubtitlesProviderTests
}; };
var provider = new LocalSubtitlesProvider( var provider = new LocalSubtitlesProvider(
new Mock<IMediaItemRepository>().Object, Substitute.For<IMediaItemRepository>(),
new Mock<IMetadataRepository>().Object, Substitute.For<IMetadataRepository>(),
new FakeLocalFileSystem(fakeFiles), new FakeLocalFileSystem(fakeFiles),
new Mock<ILogger<LocalSubtitlesProvider>>().Object); Substitute.For<ILogger<LocalSubtitlesProvider>>());
List<Subtitle> result = provider.LocateExternalSubtitles( List<Subtitle> result = provider.LocateExternalSubtitles(
cultures, cultures,

356
ErsatzTV.Scanner.Tests/Core/Metadata/MovieFolderScannerTests.cs

@ -13,7 +13,7 @@ using ErsatzTV.Scanner.Tests.Core.Fakes;
using FluentAssertions; using FluentAssertions;
using MediatR; using MediatR;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Moq; using NSubstitute;
using NUnit.Framework; using NUnit.Framework;
namespace ErsatzTV.Scanner.Tests.Core.Metadata; namespace ErsatzTV.Scanner.Tests.Core.Metadata;
@ -43,42 +43,42 @@ public class MovieFolderScannerTests
[SetUp] [SetUp]
public void SetUp() public void SetUp()
{ {
_movieRepository = new Mock<IMovieRepository>(); _movieRepository = Substitute.For<IMovieRepository>();
_movieRepository.Setup(x => x.GetOrAdd(It.IsAny<LibraryPath>(), It.IsAny<string>())) _movieRepository.GetOrAdd(Arg.Any<LibraryPath>(), Arg.Any<string>())
.Returns( .Returns(
(LibraryPath _, string path) => args =>
Right<BaseError, MediaItemScanResult<Movie>>(new FakeMovieWithPath(path)).AsTask()); Right<BaseError, MediaItemScanResult<Movie>>(new FakeMovieWithPath(args.Arg<string>()))
_movieRepository.Setup(x => x.FindMoviePaths(It.IsAny<LibraryPath>())) .AsTask());
_movieRepository.FindMoviePaths(Arg.Any<LibraryPath>())
.Returns(new List<string>().AsEnumerable().AsTask()); .Returns(new List<string>().AsEnumerable().AsTask());
_mediaItemRepository = new Mock<IMediaItemRepository>(); _mediaItemRepository = Substitute.For<IMediaItemRepository>();
_mediaItemRepository.Setup(x => x.FlagFileNotFound(It.IsAny<LibraryPath>(), It.IsAny<string>())) _mediaItemRepository.FlagFileNotFound(Arg.Any<LibraryPath>(), Arg.Any<string>())
.Returns(new List<int>().AsTask()); .Returns(new List<int>().AsTask());
_localStatisticsProvider = new Mock<ILocalStatisticsProvider>(); _localStatisticsProvider = Substitute.For<ILocalStatisticsProvider>();
_localMetadataProvider = new Mock<ILocalMetadataProvider>(); _localMetadataProvider = Substitute.For<ILocalMetadataProvider>();
_localStatisticsProvider.Setup( _localStatisticsProvider.RefreshStatistics(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<MediaItem>())
x => x.RefreshStatistics(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<MediaItem>())) .Returns(Right<BaseError, bool>(true).AsTask());
.Returns<string, string, MediaItem>((_, _, _) => Right<BaseError, bool>(true).AsTask());
// fallback metadata adds metadata to a movie, so we need to replicate that here // fallback metadata adds metadata to a movie, so we need to replicate that here
_localMetadataProvider.Setup(x => x.RefreshFallbackMetadata(It.IsAny<Movie>())) _localMetadataProvider.RefreshFallbackMetadata(Arg.Any<Movie>())
.Returns( .Returns(
(MediaItem mediaItem) => arg =>
{ {
((Movie)mediaItem).MovieMetadata = new List<MovieMetadata> { new() }; ((Movie)arg.Arg<MediaItem>()).MovieMetadata = new List<MovieMetadata> { new() };
return Task.FromResult(true); return Task.FromResult(true);
}); });
_imageCache = new Mock<IImageCache>(); _imageCache = Substitute.For<IImageCache>();
} }
private Mock<IMovieRepository> _movieRepository; private IMovieRepository _movieRepository;
private Mock<IMediaItemRepository> _mediaItemRepository; private IMediaItemRepository _mediaItemRepository;
private Mock<ILocalStatisticsProvider> _localStatisticsProvider; private ILocalStatisticsProvider _localStatisticsProvider;
private Mock<ILocalMetadataProvider> _localMetadataProvider; private ILocalMetadataProvider _localMetadataProvider;
private Mock<IImageCache> _imageCache; private IImageCache _imageCache;
[Test] [Test]
public async Task NewMovie_Statistics_And_FallbackMetadata( public async Task NewMovie_Statistics_And_FallbackMetadata(
@ -105,20 +105,16 @@ public class MovieFolderScannerTests
result.IsRight.Should().BeTrue(); result.IsRight.Should().BeTrue();
_movieRepository.Verify(x => x.GetOrAdd(It.IsAny<LibraryPath>(), It.IsAny<string>()), Times.Once); await _movieRepository.Received(1).GetOrAdd(Arg.Any<LibraryPath>(), Arg.Any<string>());
_movieRepository.Verify(x => x.GetOrAdd(libraryPath, moviePath), Times.Once); await _movieRepository.Received(1).GetOrAdd(libraryPath, moviePath);
_localStatisticsProvider.Verify( await _localStatisticsProvider.Received(1).RefreshStatistics(
x => x.RefreshStatistics( FFmpegPath,
FFmpegPath, FFprobePath,
FFprobePath, Arg.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath));
It.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath)),
Times.Once);
_localMetadataProvider.Verify( await _localMetadataProvider.Received(1).RefreshFallbackMetadata(
x => x.RefreshFallbackMetadata( Arg.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath));
It.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath)),
Times.Once);
} }
[Test] [Test]
@ -150,20 +146,16 @@ public class MovieFolderScannerTests
result.IsRight.Should().BeTrue(); result.IsRight.Should().BeTrue();
_movieRepository.Verify(x => x.GetOrAdd(It.IsAny<LibraryPath>(), It.IsAny<string>()), Times.Once); await _movieRepository.Received(1).GetOrAdd(Arg.Any<LibraryPath>(), Arg.Any<string>());
_movieRepository.Verify(x => x.GetOrAdd(libraryPath, moviePath), Times.Once); await _movieRepository.Received(1).GetOrAdd(libraryPath, moviePath);
_localStatisticsProvider.Verify( await _localStatisticsProvider.Received(1).RefreshStatistics(
x => x.RefreshStatistics( FFmpegPath,
FFmpegPath, FFprobePath,
FFprobePath, Arg.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath));
It.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath)),
Times.Once);
_localMetadataProvider.Verify( await _localMetadataProvider.Received(1).RefreshFallbackMetadata(
x => x.RefreshFallbackMetadata( Arg.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath));
It.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath)),
Times.Once);
} }
[Test] [Test]
@ -194,21 +186,17 @@ public class MovieFolderScannerTests
result.IsRight.Should().BeTrue(); result.IsRight.Should().BeTrue();
_movieRepository.Verify(x => x.GetOrAdd(It.IsAny<LibraryPath>(), It.IsAny<string>()), Times.Once); await _movieRepository.Received(1).GetOrAdd(Arg.Any<LibraryPath>(), Arg.Any<string>());
_movieRepository.Verify(x => x.GetOrAdd(libraryPath, moviePath), Times.Once); await _movieRepository.Received(1).GetOrAdd(libraryPath, moviePath);
_localStatisticsProvider.Verify( await _localStatisticsProvider.Received(1).RefreshStatistics(
x => x.RefreshStatistics( FFmpegPath,
FFmpegPath, FFprobePath,
FFprobePath, Arg.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath));
It.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath)),
Times.Once); await _localMetadataProvider.Received(1).RefreshSidecarMetadata(
Arg.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath),
_localMetadataProvider.Verify( metadataPath);
x => x.RefreshSidecarMetadata(
It.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath),
metadataPath),
Times.Once);
} }
[Test] [Test]
@ -239,21 +227,17 @@ public class MovieFolderScannerTests
result.IsRight.Should().BeTrue(); result.IsRight.Should().BeTrue();
_movieRepository.Verify(x => x.GetOrAdd(It.IsAny<LibraryPath>(), It.IsAny<string>()), Times.Once); await _movieRepository.Received(1).GetOrAdd(Arg.Any<LibraryPath>(), Arg.Any<string>());
_movieRepository.Verify(x => x.GetOrAdd(libraryPath, moviePath), Times.Once); await _movieRepository.Received(1).GetOrAdd(libraryPath, moviePath);
_localStatisticsProvider.Verify( await _localStatisticsProvider.Received(1).RefreshStatistics(
x => x.RefreshStatistics( FFmpegPath,
FFmpegPath, FFprobePath,
FFprobePath, Arg.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath));
It.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath)),
Times.Once); await _localMetadataProvider.Received(1).RefreshSidecarMetadata(
Arg.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath),
_localMetadataProvider.Verify( metadataPath);
x => x.RefreshSidecarMetadata(
It.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath),
metadataPath),
Times.Once);
} }
[Test] [Test]
@ -288,24 +272,18 @@ public class MovieFolderScannerTests
result.IsRight.Should().BeTrue(); result.IsRight.Should().BeTrue();
_movieRepository.Verify(x => x.GetOrAdd(It.IsAny<LibraryPath>(), It.IsAny<string>()), Times.Once); await _movieRepository.Received(1).GetOrAdd(Arg.Any<LibraryPath>(), Arg.Any<string>());
_movieRepository.Verify(x => x.GetOrAdd(libraryPath, moviePath), Times.Once); await _movieRepository.Received(1).GetOrAdd(libraryPath, moviePath);
_localStatisticsProvider.Verify( await _localStatisticsProvider.Received(1).RefreshStatistics(
x => x.RefreshStatistics( FFmpegPath,
FFmpegPath, FFprobePath,
FFprobePath, Arg.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath));
It.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath)),
Times.Once);
_localMetadataProvider.Verify( await _localMetadataProvider.Received(1).RefreshFallbackMetadata(
x => x.RefreshFallbackMetadata( Arg.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath));
It.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath)),
Times.Once);
_imageCache.Verify( await _imageCache.Received(1).CopyArtworkToCache(posterPath, ArtworkKind.Poster);
x => x.CopyArtworkToCache(posterPath, ArtworkKind.Poster),
Times.Once);
} }
[Test] [Test]
@ -340,24 +318,18 @@ public class MovieFolderScannerTests
result.IsRight.Should().BeTrue(); result.IsRight.Should().BeTrue();
_movieRepository.Verify(x => x.GetOrAdd(It.IsAny<LibraryPath>(), It.IsAny<string>()), Times.Once); await _movieRepository.Received(1).GetOrAdd(Arg.Any<LibraryPath>(), Arg.Any<string>());
_movieRepository.Verify(x => x.GetOrAdd(libraryPath, moviePath), Times.Once); await _movieRepository.Received(1).GetOrAdd(libraryPath, moviePath);
_localStatisticsProvider.Verify( await _localStatisticsProvider.Received(1).RefreshStatistics(
x => x.RefreshStatistics( FFmpegPath,
FFmpegPath, FFprobePath,
FFprobePath, Arg.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath));
It.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath)),
Times.Once);
_localMetadataProvider.Verify( await _localMetadataProvider.Received(1).RefreshFallbackMetadata(
x => x.RefreshFallbackMetadata( Arg.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath));
It.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath)),
Times.Once);
_imageCache.Verify( await _imageCache.Received(1).CopyArtworkToCache(posterPath, ArtworkKind.Poster);
x => x.CopyArtworkToCache(posterPath, ArtworkKind.Poster),
Times.Once);
} }
[Test] [Test]
@ -392,24 +364,18 @@ public class MovieFolderScannerTests
result.IsRight.Should().BeTrue(); result.IsRight.Should().BeTrue();
_movieRepository.Verify(x => x.GetOrAdd(It.IsAny<LibraryPath>(), It.IsAny<string>()), Times.Once); await _movieRepository.Received(1).GetOrAdd(Arg.Any<LibraryPath>(), Arg.Any<string>());
_movieRepository.Verify(x => x.GetOrAdd(libraryPath, moviePath), Times.Once); await _movieRepository.Received(1).GetOrAdd(libraryPath, moviePath);
_localStatisticsProvider.Verify( await _localStatisticsProvider.Received(1).RefreshStatistics(
x => x.RefreshStatistics( FFmpegPath,
FFmpegPath, FFprobePath,
FFprobePath, Arg.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath));
It.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath)),
Times.Once);
_localMetadataProvider.Verify( await _localMetadataProvider.Received(1).RefreshFallbackMetadata(
x => x.RefreshFallbackMetadata( Arg.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath));
It.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath)),
Times.Once);
_imageCache.Verify( await _imageCache.Received(1).CopyArtworkToCache(posterPath, ArtworkKind.Poster);
x => x.CopyArtworkToCache(posterPath, ArtworkKind.Poster),
Times.Once);
} }
[Test] [Test]
@ -443,20 +409,16 @@ public class MovieFolderScannerTests
result.IsRight.Should().BeTrue(); result.IsRight.Should().BeTrue();
_movieRepository.Verify(x => x.GetOrAdd(It.IsAny<LibraryPath>(), It.IsAny<string>()), Times.Once); await _movieRepository.Received(1).GetOrAdd(Arg.Any<LibraryPath>(), Arg.Any<string>());
_movieRepository.Verify(x => x.GetOrAdd(libraryPath, moviePath), Times.Once); await _movieRepository.Received(1).GetOrAdd(libraryPath, moviePath);
_localStatisticsProvider.Verify( await _localStatisticsProvider.Received(1).RefreshStatistics(
x => x.RefreshStatistics( FFmpegPath,
FFmpegPath, FFprobePath,
FFprobePath, Arg.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath));
It.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath)),
Times.Once);
_localMetadataProvider.Verify( await _localMetadataProvider.Received(1).RefreshFallbackMetadata(
x => x.RefreshFallbackMetadata( Arg.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath));
It.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath)),
Times.Once);
} }
[Test] [Test]
@ -488,20 +450,16 @@ public class MovieFolderScannerTests
result.IsRight.Should().BeTrue(); result.IsRight.Should().BeTrue();
_movieRepository.Verify(x => x.GetOrAdd(It.IsAny<LibraryPath>(), It.IsAny<string>()), Times.Once); await _movieRepository.Received(1).GetOrAdd(Arg.Any<LibraryPath>(), Arg.Any<string>());
_movieRepository.Verify(x => x.GetOrAdd(libraryPath, moviePath), Times.Once); await _movieRepository.Received(1).GetOrAdd(libraryPath, moviePath);
_localStatisticsProvider.Verify( await _localStatisticsProvider.Received(1).RefreshStatistics(
x => x.RefreshStatistics( FFmpegPath,
FFmpegPath, FFprobePath,
FFprobePath, Arg.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath));
It.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath)),
Times.Once);
_localMetadataProvider.Verify( await _localMetadataProvider.Received(1).RefreshFallbackMetadata(
x => x.RefreshFallbackMetadata( Arg.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath));
It.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath)),
Times.Once);
} }
[Test] [Test]
@ -535,20 +493,16 @@ public class MovieFolderScannerTests
result.IsRight.Should().BeTrue(); result.IsRight.Should().BeTrue();
_movieRepository.Verify(x => x.GetOrAdd(It.IsAny<LibraryPath>(), It.IsAny<string>()), Times.Once); await _movieRepository.Received(1).GetOrAdd(Arg.Any<LibraryPath>(), Arg.Any<string>());
_movieRepository.Verify(x => x.GetOrAdd(libraryPath, moviePath), Times.Once); await _movieRepository.Received(1).GetOrAdd(libraryPath, moviePath);
_localStatisticsProvider.Verify( await _localStatisticsProvider.Received(1).RefreshStatistics(
x => x.RefreshStatistics( FFmpegPath,
FFmpegPath, FFprobePath,
FFprobePath, Arg.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath));
It.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath)),
Times.Once);
_localMetadataProvider.Verify( await _localMetadataProvider.Received(1).RefreshFallbackMetadata(
x => x.RefreshFallbackMetadata( Arg.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath));
It.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath)),
Times.Once);
} }
[Test] [Test]
@ -576,20 +530,16 @@ public class MovieFolderScannerTests
result.IsRight.Should().BeTrue(); result.IsRight.Should().BeTrue();
_movieRepository.Verify(x => x.GetOrAdd(It.IsAny<LibraryPath>(), It.IsAny<string>()), Times.Once); await _movieRepository.Received(1).GetOrAdd(Arg.Any<LibraryPath>(), Arg.Any<string>());
_movieRepository.Verify(x => x.GetOrAdd(libraryPath, moviePath), Times.Once); await _movieRepository.Received(1).GetOrAdd(libraryPath, moviePath);
_localStatisticsProvider.Verify( await _localStatisticsProvider.Received(1).RefreshStatistics(
x => x.RefreshStatistics( FFmpegPath,
FFmpegPath, FFprobePath,
FFprobePath, Arg.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath));
It.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath)),
Times.Once);
_localMetadataProvider.Verify( await _localMetadataProvider.Received(1).RefreshFallbackMetadata(
x => x.RefreshFallbackMetadata( Arg.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath));
It.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath)),
Times.Once);
} }
[Test] [Test]
@ -601,7 +551,7 @@ public class MovieFolderScannerTests
string movieFolder = Path.Combine(FakeRoot, "Movie (2020)"); string movieFolder = Path.Combine(FakeRoot, "Movie (2020)");
string oldMoviePath = Path.Combine(movieFolder, "Movie (2020).avi"); string oldMoviePath = Path.Combine(movieFolder, "Movie (2020).avi");
_movieRepository.Setup(x => x.FindMoviePaths(It.IsAny<LibraryPath>())) _movieRepository.FindMoviePaths(Arg.Any<LibraryPath>())
.Returns(new List<string> { oldMoviePath }.AsEnumerable().AsTask()); .Returns(new List<string> { oldMoviePath }.AsEnumerable().AsTask());
string moviePath = Path.Combine(movieFolder, "Movie (2020).mkv"); string moviePath = Path.Combine(movieFolder, "Movie (2020).mkv");
@ -622,10 +572,8 @@ public class MovieFolderScannerTests
result.IsRight.Should().BeTrue(); result.IsRight.Should().BeTrue();
_mediaItemRepository.Verify( await _mediaItemRepository.Received(1).FlagFileNotFound(Arg.Any<LibraryPath>(), Arg.Any<string>());
x => x.FlagFileNotFound(It.IsAny<LibraryPath>(), It.IsAny<string>()), await _mediaItemRepository.Received(1).FlagFileNotFound(libraryPath, oldMoviePath);
Times.Once);
_mediaItemRepository.Verify(x => x.FlagFileNotFound(libraryPath, oldMoviePath), Times.Once);
} }
[Test] [Test]
@ -634,7 +582,7 @@ public class MovieFolderScannerTests
string movieFolder = Path.Combine(FakeRoot, "Movie (2020)"); string movieFolder = Path.Combine(FakeRoot, "Movie (2020)");
string oldMoviePath = Path.Combine(movieFolder, "Movie (2020).avi"); string oldMoviePath = Path.Combine(movieFolder, "Movie (2020).avi");
_movieRepository.Setup(x => x.FindMoviePaths(It.IsAny<LibraryPath>())) _movieRepository.FindMoviePaths(Arg.Any<LibraryPath>())
.Returns(new List<string> { oldMoviePath }.AsEnumerable().AsTask()); .Returns(new List<string> { oldMoviePath }.AsEnumerable().AsTask());
MovieFolderScanner service = GetService( MovieFolderScanner service = GetService(
@ -653,46 +601,44 @@ public class MovieFolderScannerTests
result.IsRight.Should().BeTrue(); result.IsRight.Should().BeTrue();
_mediaItemRepository.Verify( await _mediaItemRepository.Received(1).FlagFileNotFound(Arg.Any<LibraryPath>(), Arg.Any<string>());
x => x.FlagFileNotFound(It.IsAny<LibraryPath>(), It.IsAny<string>()), await _mediaItemRepository.Received(1).FlagFileNotFound(libraryPath, oldMoviePath);
Times.Once);
_mediaItemRepository.Verify(x => x.FlagFileNotFound(libraryPath, oldMoviePath), Times.Once);
} }
private MovieFolderScanner GetService(params FakeFileEntry[] files) => private MovieFolderScanner GetService(params FakeFileEntry[] files) =>
new( new(
new FakeLocalFileSystem(new List<FakeFileEntry>(files)), new FakeLocalFileSystem(new List<FakeFileEntry>(files)),
_movieRepository.Object, _movieRepository,
_localStatisticsProvider.Object, _localStatisticsProvider,
new Mock<ILocalSubtitlesProvider>().Object, Substitute.For<ILocalSubtitlesProvider>(),
_localMetadataProvider.Object, _localMetadataProvider,
new Mock<IMetadataRepository>().Object, Substitute.For<IMetadataRepository>(),
_imageCache.Object, _imageCache,
new Mock<ILibraryRepository>().Object, Substitute.For<ILibraryRepository>(),
_mediaItemRepository.Object, _mediaItemRepository,
new Mock<IMediator>().Object, Substitute.For<IMediator>(),
new Mock<IFFmpegPngService>().Object, Substitute.For<IFFmpegPngService>(),
new Mock<ITempFilePool>().Object, Substitute.For<ITempFilePool>(),
new Mock<IClient>().Object, Substitute.For<IClient>(),
new Mock<ILogger<MovieFolderScanner>>().Object Substitute.For<ILogger<MovieFolderScanner>>()
); );
private MovieFolderScanner GetService(params FakeFolderEntry[] folders) => private MovieFolderScanner GetService(params FakeFolderEntry[] folders) =>
new( new(
new FakeLocalFileSystem(new List<FakeFileEntry>(), new List<FakeFolderEntry>(folders)), new FakeLocalFileSystem(new List<FakeFileEntry>(), new List<FakeFolderEntry>(folders)),
_movieRepository.Object, _movieRepository,
_localStatisticsProvider.Object, _localStatisticsProvider,
new Mock<ILocalSubtitlesProvider>().Object, Substitute.For<ILocalSubtitlesProvider>(),
_localMetadataProvider.Object, _localMetadataProvider,
new Mock<IMetadataRepository>().Object, Substitute.For<IMetadataRepository>(),
_imageCache.Object, _imageCache,
new Mock<ILibraryRepository>().Object, Substitute.For<ILibraryRepository>(),
_mediaItemRepository.Object, _mediaItemRepository,
new Mock<IMediator>().Object, Substitute.For<IMediator>(),
new Mock<IFFmpegPngService>().Object, Substitute.For<IFFmpegPngService>(),
new Mock<ITempFilePool>().Object, Substitute.For<ITempFilePool>(),
new Mock<IClient>().Object, Substitute.For<IClient>(),
new Mock<ILogger<MovieFolderScanner>>().Object Substitute.For<ILogger<MovieFolderScanner>>()
); );
} }
} }

4
ErsatzTV.Scanner.Tests/Core/Metadata/Nfo/ArtistNfoReaderTests.cs

@ -5,7 +5,7 @@ using ErsatzTV.Scanner.Core.Metadata.Nfo;
using FluentAssertions; using FluentAssertions;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.IO; using Microsoft.IO;
using Moq; using NSubstitute;
using NUnit.Framework; using NUnit.Framework;
using Serilog; using Serilog;
@ -17,7 +17,7 @@ public class ArtistNfoReaderTests
[SetUp] [SetUp]
public void SetUp() => _artistNfoReader = new ArtistNfoReader( public void SetUp() => _artistNfoReader = new ArtistNfoReader(
new RecyclableMemoryStreamManager(), new RecyclableMemoryStreamManager(),
new Mock<IClient>().Object, Substitute.For<IClient>(),
_logger); _logger);
private readonly ILogger<ArtistNfoReader> _logger; private readonly ILogger<ArtistNfoReader> _logger;

4
ErsatzTV.Scanner.Tests/Core/Metadata/Nfo/EpisodeNfoReaderTests.cs

@ -5,7 +5,7 @@ using ErsatzTV.Scanner.Core.Metadata.Nfo;
using FluentAssertions; using FluentAssertions;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.IO; using Microsoft.IO;
using Moq; using NSubstitute;
using NUnit.Framework; using NUnit.Framework;
using Serilog; using Serilog;
@ -17,7 +17,7 @@ public class EpisodeNfoReaderTests
[SetUp] [SetUp]
public void SetUp() => _episodeNfoReader = new EpisodeNfoReader( public void SetUp() => _episodeNfoReader = new EpisodeNfoReader(
new RecyclableMemoryStreamManager(), new RecyclableMemoryStreamManager(),
new Mock<IClient>().Object, Substitute.For<IClient>(),
_logger); _logger);
private readonly ILogger<EpisodeNfoReader> _logger; private readonly ILogger<EpisodeNfoReader> _logger;

4
ErsatzTV.Scanner.Tests/Core/Metadata/Nfo/MovieNfoReaderTests.cs

@ -5,7 +5,7 @@ using ErsatzTV.Scanner.Core.Metadata.Nfo;
using FluentAssertions; using FluentAssertions;
using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.IO; using Microsoft.IO;
using Moq; using NSubstitute;
using NUnit.Framework; using NUnit.Framework;
namespace ErsatzTV.Scanner.Tests.Core.Metadata.Nfo; namespace ErsatzTV.Scanner.Tests.Core.Metadata.Nfo;
@ -16,7 +16,7 @@ public class MovieNfoReaderTests
[SetUp] [SetUp]
public void SetUp() => _movieNfoReader = new MovieNfoReader( public void SetUp() => _movieNfoReader = new MovieNfoReader(
new RecyclableMemoryStreamManager(), new RecyclableMemoryStreamManager(),
new Mock<IClient>().Object, Substitute.For<IClient>(),
new NullLogger<MovieNfoReader>()); new NullLogger<MovieNfoReader>());
private MovieNfoReader _movieNfoReader; private MovieNfoReader _movieNfoReader;

4
ErsatzTV.Scanner.Tests/Core/Metadata/Nfo/MusicVideoNfoReaderTests.cs

@ -5,7 +5,7 @@ using ErsatzTV.Scanner.Core.Metadata.Nfo;
using FluentAssertions; using FluentAssertions;
using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.IO; using Microsoft.IO;
using Moq; using NSubstitute;
using NUnit.Framework; using NUnit.Framework;
namespace ErsatzTV.Scanner.Tests.Core.Metadata.Nfo; namespace ErsatzTV.Scanner.Tests.Core.Metadata.Nfo;
@ -16,7 +16,7 @@ public class MusicVideoNfoReaderTests
[SetUp] [SetUp]
public void SetUp() => _musicVideoNfoReader = new MusicVideoNfoReader( public void SetUp() => _musicVideoNfoReader = new MusicVideoNfoReader(
new RecyclableMemoryStreamManager(), new RecyclableMemoryStreamManager(),
new Mock<IClient>().Object, Substitute.For<IClient>(),
new NullLogger<MusicVideoNfoReader>()); new NullLogger<MusicVideoNfoReader>());
private MusicVideoNfoReader _musicVideoNfoReader; private MusicVideoNfoReader _musicVideoNfoReader;

4
ErsatzTV.Scanner.Tests/Core/Metadata/Nfo/OtherVideoNfoReaderTests.cs

@ -5,7 +5,7 @@ using ErsatzTV.Scanner.Core.Metadata.Nfo;
using FluentAssertions; using FluentAssertions;
using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.IO; using Microsoft.IO;
using Moq; using NSubstitute;
using NUnit.Framework; using NUnit.Framework;
namespace ErsatzTV.Scanner.Tests.Core.Metadata.Nfo; namespace ErsatzTV.Scanner.Tests.Core.Metadata.Nfo;
@ -16,7 +16,7 @@ public class OtherVideoNfoReaderTests
[SetUp] [SetUp]
public void SetUp() => _otherVideoNfoReader = new OtherVideoNfoReader( public void SetUp() => _otherVideoNfoReader = new OtherVideoNfoReader(
new RecyclableMemoryStreamManager(), new RecyclableMemoryStreamManager(),
new Mock<IClient>().Object, Substitute.For<IClient>(),
new NullLogger<OtherVideoNfoReader>()); new NullLogger<OtherVideoNfoReader>());
private OtherVideoNfoReader _otherVideoNfoReader; private OtherVideoNfoReader _otherVideoNfoReader;

4
ErsatzTV.Scanner.Tests/Core/Metadata/Nfo/ShowNfoReaderTests.cs

@ -5,7 +5,7 @@ using ErsatzTV.Scanner.Core.Metadata.Nfo;
using FluentAssertions; using FluentAssertions;
using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.IO; using Microsoft.IO;
using Moq; using NSubstitute;
using NUnit.Framework; using NUnit.Framework;
namespace ErsatzTV.Scanner.Tests.Core.Metadata.Nfo; namespace ErsatzTV.Scanner.Tests.Core.Metadata.Nfo;
@ -16,7 +16,7 @@ public class ShowNfoReaderTests
[SetUp] [SetUp]
public void SetUp() => _showNfoReader = new ShowNfoReader( public void SetUp() => _showNfoReader = new ShowNfoReader(
new RecyclableMemoryStreamManager(), new RecyclableMemoryStreamManager(),
new Mock<IClient>().Object, Substitute.For<IClient>(),
new NullLogger<ShowNfoReader>()); new NullLogger<ShowNfoReader>());
private ShowNfoReader _showNfoReader; private ShowNfoReader _showNfoReader;

2
ErsatzTV.Scanner.Tests/ErsatzTV.Scanner.Tests.csproj

@ -12,7 +12,7 @@
<PackageReference Include="FluentAssertions" Version="6.11.0" /> <PackageReference Include="FluentAssertions" Version="6.11.0" />
<PackageReference Include="LanguageExt.Core" Version="4.4.3" /> <PackageReference Include="LanguageExt.Core" Version="4.4.3" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.7.0" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.7.0" />
<PackageReference Include="Moq" Version="4.18.4" /> <PackageReference Include="NSubstitute" Version="5.0.0" />
<PackageReference Include="NUnit" Version="3.13.3" /> <PackageReference Include="NUnit" Version="3.13.3" />
<PackageReference Include="NUnit3TestAdapter" Version="4.5.0" /> <PackageReference Include="NUnit3TestAdapter" Version="4.5.0" />
<PackageReference Include="NUnit.Analyzers" Version="3.6.1"> <PackageReference Include="NUnit.Analyzers" Version="3.6.1">

Loading…
Cancel
Save