mirror of
https://github.com/Cleanuparr/Cleanuparr.git
synced 2026-01-20 11:48:19 -05:00
561 lines
16 KiB
C#
561 lines
16 KiB
C#
using Cleanuparr.Infrastructure.Features.DownloadClient.QBittorrent;
|
|
using QBittorrent.Client;
|
|
using Shouldly;
|
|
using Xunit;
|
|
|
|
namespace Cleanuparr.Infrastructure.Tests.Features.DownloadClient;
|
|
|
|
public class QBitItemWrapperTests
|
|
{
|
|
[Fact]
|
|
public void Constructor_WithNullTorrentInfo_ThrowsArgumentNullException()
|
|
{
|
|
// Arrange
|
|
var trackers = new List<TorrentTracker>();
|
|
|
|
// Act & Assert
|
|
Should.Throw<ArgumentNullException>(() => new QBitItemWrapper(null!, trackers, false));
|
|
}
|
|
|
|
[Fact]
|
|
public void Constructor_WithNullTrackers_ThrowsArgumentNullException()
|
|
{
|
|
// Arrange
|
|
var torrentInfo = new TorrentInfo();
|
|
|
|
// Act & Assert
|
|
Should.Throw<ArgumentNullException>(() => new QBitItemWrapper(torrentInfo, null!, false));
|
|
}
|
|
|
|
[Fact]
|
|
public void Hash_ReturnsCorrectValue()
|
|
{
|
|
// Arrange
|
|
var expectedHash = "test-hash-123";
|
|
var torrentInfo = new TorrentInfo { Hash = expectedHash };
|
|
var trackers = new List<TorrentTracker>();
|
|
var wrapper = new QBitItemWrapper(torrentInfo, trackers, false);
|
|
|
|
// Act
|
|
var result = wrapper.Hash;
|
|
|
|
// Assert
|
|
result.ShouldBe(expectedHash);
|
|
}
|
|
|
|
[Fact]
|
|
public void Hash_WithNullValue_ReturnsEmptyString()
|
|
{
|
|
// Arrange
|
|
var torrentInfo = new TorrentInfo { Hash = null };
|
|
var trackers = new List<TorrentTracker>();
|
|
var wrapper = new QBitItemWrapper(torrentInfo, trackers, false);
|
|
|
|
// Act
|
|
var result = wrapper.Hash;
|
|
|
|
// Assert
|
|
result.ShouldBe(string.Empty);
|
|
}
|
|
|
|
[Fact]
|
|
public void Name_ReturnsCorrectValue()
|
|
{
|
|
// Arrange
|
|
var expectedName = "Test Torrent";
|
|
var torrentInfo = new TorrentInfo { Name = expectedName };
|
|
var trackers = new List<TorrentTracker>();
|
|
var wrapper = new QBitItemWrapper(torrentInfo, trackers, false);
|
|
|
|
// Act
|
|
var result = wrapper.Name;
|
|
|
|
// Assert
|
|
result.ShouldBe(expectedName);
|
|
}
|
|
|
|
[Fact]
|
|
public void Name_WithNullValue_ReturnsEmptyString()
|
|
{
|
|
// Arrange
|
|
var torrentInfo = new TorrentInfo { Name = null };
|
|
var trackers = new List<TorrentTracker>();
|
|
var wrapper = new QBitItemWrapper(torrentInfo, trackers, false);
|
|
|
|
// Act
|
|
var result = wrapper.Name;
|
|
|
|
// Assert
|
|
result.ShouldBe(string.Empty);
|
|
}
|
|
|
|
[Fact]
|
|
public void IsPrivate_ReturnsCorrectValue()
|
|
{
|
|
// Arrange
|
|
var torrentInfo = new TorrentInfo();
|
|
var trackers = new List<TorrentTracker>();
|
|
var wrapper = new QBitItemWrapper(torrentInfo, trackers, true);
|
|
|
|
// Act
|
|
var result = wrapper.IsPrivate;
|
|
|
|
// Assert
|
|
result.ShouldBeTrue();
|
|
}
|
|
|
|
[Fact]
|
|
public void Size_ReturnsCorrectValue()
|
|
{
|
|
// Arrange
|
|
var expectedSize = 1024L * 1024 * 1024; // 1GB
|
|
var torrentInfo = new TorrentInfo { Size = expectedSize };
|
|
var trackers = new List<TorrentTracker>();
|
|
var wrapper = new QBitItemWrapper(torrentInfo, trackers, false);
|
|
|
|
// Act
|
|
var result = wrapper.Size;
|
|
|
|
// Assert
|
|
result.ShouldBe(expectedSize);
|
|
}
|
|
|
|
[Fact]
|
|
public void Size_WithZeroValue_ReturnsZero()
|
|
{
|
|
// Arrange
|
|
var torrentInfo = new TorrentInfo { Size = 0 };
|
|
var trackers = new List<TorrentTracker>();
|
|
var wrapper = new QBitItemWrapper(torrentInfo, trackers, false);
|
|
|
|
// Act
|
|
var result = wrapper.Size;
|
|
|
|
// Assert
|
|
result.ShouldBe(0);
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData(0.0, 0.0)]
|
|
[InlineData(0.5, 50.0)]
|
|
[InlineData(0.75, 75.0)]
|
|
[InlineData(1.0, 100.0)]
|
|
public void CompletionPercentage_ReturnsCorrectValue(double progress, double expectedPercentage)
|
|
{
|
|
// Arrange
|
|
var torrentInfo = new TorrentInfo { Progress = progress };
|
|
var trackers = new List<TorrentTracker>();
|
|
var wrapper = new QBitItemWrapper(torrentInfo, trackers, false);
|
|
|
|
// Act
|
|
var result = wrapper.CompletionPercentage;
|
|
|
|
// Assert
|
|
result.ShouldBe(expectedPercentage);
|
|
}
|
|
|
|
[Fact]
|
|
public void DownloadedBytes_ReturnsCorrectValue()
|
|
{
|
|
// Arrange
|
|
var expectedDownloaded = 1024L * 1024 * 500; // 500MB
|
|
var torrentInfo = new TorrentInfo { Downloaded = expectedDownloaded };
|
|
var trackers = new List<TorrentTracker>();
|
|
var wrapper = new QBitItemWrapper(torrentInfo, trackers, false);
|
|
|
|
// Act
|
|
var result = wrapper.DownloadedBytes;
|
|
|
|
// Assert
|
|
result.ShouldBe(expectedDownloaded);
|
|
}
|
|
|
|
[Fact]
|
|
public void DownloadedBytes_WithNullValue_ReturnsZero()
|
|
{
|
|
// Arrange
|
|
var torrentInfo = new TorrentInfo { Downloaded = null };
|
|
var trackers = new List<TorrentTracker>();
|
|
var wrapper = new QBitItemWrapper(torrentInfo, trackers, false);
|
|
|
|
// Act
|
|
var result = wrapper.DownloadedBytes;
|
|
|
|
// Assert
|
|
result.ShouldBe(0);
|
|
}
|
|
|
|
[Fact]
|
|
public void DownloadSpeed_ReturnsCorrectValue()
|
|
{
|
|
// Arrange
|
|
var expectedSpeed = 1024 * 512; // 512 KB/s
|
|
var torrentInfo = new TorrentInfo { DownloadSpeed = expectedSpeed };
|
|
var trackers = new List<TorrentTracker>();
|
|
var wrapper = new QBitItemWrapper(torrentInfo, trackers, false);
|
|
|
|
// Act
|
|
var result = wrapper.DownloadSpeed;
|
|
|
|
// Assert
|
|
result.ShouldBe(expectedSpeed);
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData(0.0)]
|
|
[InlineData(0.5)]
|
|
[InlineData(1.0)]
|
|
[InlineData(2.5)]
|
|
public void Ratio_ReturnsCorrectValue(double expectedRatio)
|
|
{
|
|
// Arrange
|
|
var torrentInfo = new TorrentInfo { Ratio = expectedRatio };
|
|
var trackers = new List<TorrentTracker>();
|
|
var wrapper = new QBitItemWrapper(torrentInfo, trackers, false);
|
|
|
|
// Act
|
|
var result = wrapper.Ratio;
|
|
|
|
// Assert
|
|
result.ShouldBe(expectedRatio);
|
|
}
|
|
|
|
[Fact]
|
|
public void Eta_ReturnsCorrectValue()
|
|
{
|
|
// Arrange
|
|
var expectedEta = TimeSpan.FromMinutes(30);
|
|
var torrentInfo = new TorrentInfo { EstimatedTime = expectedEta };
|
|
var trackers = new List<TorrentTracker>();
|
|
var wrapper = new QBitItemWrapper(torrentInfo, trackers, false);
|
|
|
|
// Act
|
|
var result = wrapper.Eta;
|
|
|
|
// Assert
|
|
result.ShouldBe((long)expectedEta.TotalSeconds);
|
|
}
|
|
|
|
[Fact]
|
|
public void Eta_WithNullValue_ReturnsZero()
|
|
{
|
|
// Arrange
|
|
var torrentInfo = new TorrentInfo { EstimatedTime = null };
|
|
var trackers = new List<TorrentTracker>();
|
|
var wrapper = new QBitItemWrapper(torrentInfo, trackers, false);
|
|
|
|
// Act
|
|
var result = wrapper.Eta;
|
|
|
|
// Assert
|
|
result.ShouldBe(0);
|
|
}
|
|
|
|
[Fact]
|
|
public void SeedingTimeSeconds_ReturnsCorrectValue()
|
|
{
|
|
// Arrange
|
|
var expectedTime = TimeSpan.FromHours(5);
|
|
var torrentInfo = new TorrentInfo { SeedingTime = expectedTime };
|
|
var trackers = new List<TorrentTracker>();
|
|
var wrapper = new QBitItemWrapper(torrentInfo, trackers, false);
|
|
|
|
// Act
|
|
var result = wrapper.SeedingTimeSeconds;
|
|
|
|
// Assert
|
|
result.ShouldBe((long)expectedTime.TotalSeconds);
|
|
}
|
|
|
|
[Fact]
|
|
public void SeedingTimeSeconds_WithNullValue_ReturnsZero()
|
|
{
|
|
// Arrange
|
|
var torrentInfo = new TorrentInfo { SeedingTime = null };
|
|
var trackers = new List<TorrentTracker>();
|
|
var wrapper = new QBitItemWrapper(torrentInfo, trackers, false);
|
|
|
|
// Act
|
|
var result = wrapper.SeedingTimeSeconds;
|
|
|
|
// Assert
|
|
result.ShouldBe(0);
|
|
}
|
|
|
|
[Fact]
|
|
public void Tags_ReturnsCorrectValue()
|
|
{
|
|
// Arrange
|
|
var expectedTags = new List<string> { "tag1", "tag2", "tag3" };
|
|
var torrentInfo = new TorrentInfo { Tags = expectedTags.AsReadOnly() };
|
|
var trackers = new List<TorrentTracker>();
|
|
var wrapper = new QBitItemWrapper(torrentInfo, trackers, false);
|
|
|
|
// Act
|
|
var result = wrapper.Tags;
|
|
|
|
// Assert
|
|
result.ShouldBe(expectedTags);
|
|
}
|
|
|
|
[Fact]
|
|
public void Tags_WithNullValue_ReturnsEmptyList()
|
|
{
|
|
// Arrange
|
|
var torrentInfo = new TorrentInfo { Tags = null };
|
|
var trackers = new List<TorrentTracker>();
|
|
var wrapper = new QBitItemWrapper(torrentInfo, trackers, false);
|
|
|
|
// Act
|
|
var result = wrapper.Tags;
|
|
|
|
// Assert
|
|
result.ShouldBeEmpty();
|
|
}
|
|
|
|
[Fact]
|
|
public void Tags_WithEmptyList_ReturnsEmptyList()
|
|
{
|
|
// Arrange
|
|
var torrentInfo = new TorrentInfo { Tags = new List<string>().AsReadOnly() };
|
|
var trackers = new List<TorrentTracker>();
|
|
var wrapper = new QBitItemWrapper(torrentInfo, trackers, false);
|
|
|
|
// Act
|
|
var result = wrapper.Tags;
|
|
|
|
// Assert
|
|
result.ShouldBeEmpty();
|
|
}
|
|
|
|
[Fact]
|
|
public void Category_ReturnsCorrectValue()
|
|
{
|
|
// Arrange
|
|
var expectedCategory = "movies";
|
|
var torrentInfo = new TorrentInfo { Category = expectedCategory };
|
|
var trackers = new List<TorrentTracker>();
|
|
var wrapper = new QBitItemWrapper(torrentInfo, trackers, false);
|
|
|
|
// Act
|
|
var result = wrapper.Category;
|
|
|
|
// Assert
|
|
result.ShouldBe(expectedCategory);
|
|
}
|
|
|
|
[Fact]
|
|
public void Category_WithNullValue_ReturnsNull()
|
|
{
|
|
// Arrange
|
|
var torrentInfo = new TorrentInfo { Category = null };
|
|
var trackers = new List<TorrentTracker>();
|
|
var wrapper = new QBitItemWrapper(torrentInfo, trackers, false);
|
|
|
|
// Act
|
|
var result = wrapper.Category;
|
|
|
|
// Assert
|
|
result.ShouldBeNull();
|
|
}
|
|
|
|
// State checking method tests
|
|
[Theory]
|
|
[InlineData(TorrentState.Downloading, true)]
|
|
[InlineData(TorrentState.ForcedDownload, true)]
|
|
[InlineData(TorrentState.StalledDownload, false)]
|
|
[InlineData(TorrentState.Uploading, false)]
|
|
[InlineData(TorrentState.PausedDownload, false)]
|
|
public void IsDownloading_ReturnsCorrectValue(TorrentState state, bool expected)
|
|
{
|
|
// Arrange
|
|
var torrentInfo = new TorrentInfo { State = state };
|
|
var trackers = new List<TorrentTracker>();
|
|
var wrapper = new QBitItemWrapper(torrentInfo, trackers, false);
|
|
|
|
// Act
|
|
var result = wrapper.IsDownloading();
|
|
|
|
// Assert
|
|
result.ShouldBe(expected);
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData(TorrentState.StalledDownload, true)]
|
|
[InlineData(TorrentState.Downloading, false)]
|
|
[InlineData(TorrentState.ForcedDownload, false)]
|
|
[InlineData(TorrentState.Uploading, false)]
|
|
public void IsStalled_ReturnsCorrectValue(TorrentState state, bool expected)
|
|
{
|
|
// Arrange
|
|
var torrentInfo = new TorrentInfo { State = state };
|
|
var trackers = new List<TorrentTracker>();
|
|
var wrapper = new QBitItemWrapper(torrentInfo, trackers, false);
|
|
|
|
// Act
|
|
var result = wrapper.IsStalled();
|
|
|
|
// Assert
|
|
result.ShouldBe(expected);
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData(TorrentState.Uploading, true)]
|
|
[InlineData(TorrentState.ForcedUpload, true)]
|
|
[InlineData(TorrentState.StalledUpload, true)]
|
|
[InlineData(TorrentState.Downloading, false)]
|
|
[InlineData(TorrentState.PausedUpload, false)]
|
|
public void IsSeeding_ReturnsCorrectValue(TorrentState state, bool expected)
|
|
{
|
|
// Arrange
|
|
var torrentInfo = new TorrentInfo { State = state };
|
|
var trackers = new List<TorrentTracker>();
|
|
var wrapper = new QBitItemWrapper(torrentInfo, trackers, false);
|
|
|
|
// Act
|
|
var result = wrapper.IsSeeding();
|
|
|
|
// Assert
|
|
result.ShouldBe(expected);
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData(TorrentState.FetchingMetadata, true)]
|
|
[InlineData(TorrentState.ForcedFetchingMetadata, true)]
|
|
[InlineData(TorrentState.Downloading, false)]
|
|
[InlineData(TorrentState.StalledDownload, false)]
|
|
public void IsMetadataDownloading_ReturnsCorrectValue(TorrentState state, bool expected)
|
|
{
|
|
// Arrange
|
|
var torrentInfo = new TorrentInfo { State = state };
|
|
var trackers = new List<TorrentTracker>();
|
|
var wrapper = new QBitItemWrapper(torrentInfo, trackers, false);
|
|
|
|
// Act
|
|
var result = wrapper.IsMetadataDownloading();
|
|
|
|
// Assert
|
|
result.ShouldBe(expected);
|
|
}
|
|
|
|
[Fact]
|
|
public void IsIgnored_WithEmptyList_ReturnsFalse()
|
|
{
|
|
// Arrange
|
|
var torrentInfo = new TorrentInfo { Name = "Test Torrent", Hash = "abc123" };
|
|
var trackers = new List<TorrentTracker>();
|
|
var wrapper = new QBitItemWrapper(torrentInfo, trackers, false);
|
|
|
|
// Act
|
|
var result = wrapper.IsIgnored(Array.Empty<string>());
|
|
|
|
// Assert
|
|
result.ShouldBeFalse();
|
|
}
|
|
|
|
[Fact]
|
|
public void IsIgnored_MatchingHash_ReturnsTrue()
|
|
{
|
|
// Arrange
|
|
var torrentInfo = new TorrentInfo { Name = "Test Torrent", Hash = "abc123" };
|
|
var trackers = new List<TorrentTracker>();
|
|
var wrapper = new QBitItemWrapper(torrentInfo, trackers, false);
|
|
var ignoredDownloads = new[] { "abc123" };
|
|
|
|
// Act
|
|
var result = wrapper.IsIgnored(ignoredDownloads);
|
|
|
|
// Assert
|
|
result.ShouldBeTrue();
|
|
}
|
|
|
|
[Fact]
|
|
public void IsIgnored_MatchingTag_ReturnsTrue()
|
|
{
|
|
// Arrange
|
|
var torrentInfo = new TorrentInfo
|
|
{
|
|
Name = "Test Torrent",
|
|
Hash = "abc123",
|
|
Tags = new List<string> { "test-tag" }.AsReadOnly()
|
|
};
|
|
var trackers = new List<TorrentTracker>();
|
|
var wrapper = new QBitItemWrapper(torrentInfo, trackers, false);
|
|
var ignoredDownloads = new[] { "test-tag" };
|
|
|
|
// Act
|
|
var result = wrapper.IsIgnored(ignoredDownloads);
|
|
|
|
// Assert
|
|
result.ShouldBeTrue();
|
|
}
|
|
|
|
[Fact]
|
|
public void IsIgnored_MatchingCategory_ReturnsTrue()
|
|
{
|
|
// Arrange
|
|
var torrentInfo = new TorrentInfo
|
|
{
|
|
Name = "Test Torrent",
|
|
Hash = "abc123",
|
|
Category = "test-category"
|
|
};
|
|
var trackers = new List<TorrentTracker>();
|
|
var wrapper = new QBitItemWrapper(torrentInfo, trackers, false);
|
|
var ignoredDownloads = new[] { "test-category" };
|
|
|
|
// Act
|
|
var result = wrapper.IsIgnored(ignoredDownloads);
|
|
|
|
// Assert
|
|
result.ShouldBeTrue();
|
|
}
|
|
|
|
[Fact]
|
|
public void IsIgnored_MatchingTracker_ReturnsTrue()
|
|
{
|
|
// Arrange
|
|
var torrentInfo = new TorrentInfo
|
|
{
|
|
Name = "Test Torrent",
|
|
Hash = "abc123"
|
|
};
|
|
var trackers = new List<TorrentTracker>
|
|
{
|
|
new() { Url = "http://tracker.example.com/announce" }
|
|
};
|
|
var wrapper = new QBitItemWrapper(torrentInfo, trackers, false);
|
|
var ignoredDownloads = new[] { "tracker.example.com" };
|
|
|
|
// Act
|
|
var result = wrapper.IsIgnored(ignoredDownloads);
|
|
|
|
// Assert
|
|
result.ShouldBeTrue();
|
|
}
|
|
|
|
[Fact]
|
|
public void IsIgnored_NotMatching_ReturnsFalse()
|
|
{
|
|
// Arrange
|
|
var torrentInfo = new TorrentInfo
|
|
{
|
|
Name = "Test Torrent",
|
|
Hash = "abc123",
|
|
Category = "some-category",
|
|
Tags = new List<string> { "some-tag" }.AsReadOnly()
|
|
};
|
|
var trackers = new List<TorrentTracker>
|
|
{
|
|
new() { Url = "http://tracker.example.com/announce" }
|
|
};
|
|
var wrapper = new QBitItemWrapper(torrentInfo, trackers, false);
|
|
var ignoredDownloads = new[] { "notmatching" };
|
|
|
|
// Act
|
|
var result = wrapper.IsIgnored(ignoredDownloads);
|
|
|
|
// Assert
|
|
result.ShouldBeFalse();
|
|
}
|
|
} |