Files
PLib/tests/PLib.Tests/Library/InMemoryVideoRepository.cs
T

59 lines
2.1 KiB
C#

using PLib.Application.Abstractions;
using PLib.Application.Library;
using PLib.Domain.Videos;
namespace PLib.Tests.Library;
/// <summary>
/// A hand-written double rather than a mock: the scan logic is all about what ends up in the
/// repository, so the tests read better when they can just look at the resulting list.
/// </summary>
internal sealed class InMemoryVideoRepository : IVideoRepository
{
private readonly Dictionary<string, VideoItem> _items = new(LibraryPathComparer.Instance);
public int SaveCount { get; private set; }
public IReadOnlyCollection<VideoItem> Items => _items.Values;
public void Seed(params VideoItem[] items)
{
foreach (var item in items)
{
_items[item.FullPath] = item;
}
}
public Task<IReadOnlyList<VideoItem>> GetAllAsync(CancellationToken cancellationToken = default) =>
Task.FromResult<IReadOnlyList<VideoItem>>([.. _items.Values]);
// Labels are held on the entity itself here, so this is the same list.
public Task<IReadOnlyList<VideoItem>> GetAllWithLabelsAsync(CancellationToken cancellationToken = default) =>
GetAllAsync(cancellationToken);
public Task<VideoItem?> FindByPathAsync(string fullPath, CancellationToken cancellationToken = default) =>
Task.FromResult(_items.GetValueOrDefault(fullPath));
// Labels are held on the entity itself here, so there is nothing extra to load.
public Task<VideoItem?> FindWithLabelsAsync(Guid id, CancellationToken cancellationToken = default) =>
Task.FromResult(_items.Values.FirstOrDefault(item => item.Id == id));
public Task AddAsync(VideoItem item, CancellationToken cancellationToken = default)
{
_items[item.FullPath] = item;
return Task.CompletedTask;
}
public Task RemoveAsync(VideoItem item, CancellationToken cancellationToken = default)
{
_items.Remove(item.FullPath);
return Task.CompletedTask;
}
public Task SaveChangesAsync(CancellationToken cancellationToken = default)
{
SaveCount++;
return Task.CompletedTask;
}
}