mirror of
https://github.com/Sonarr/Sonarr
synced 2024-12-27 02:07:41 +00:00
Fixed: Concurrent manual imports silently failing
This commit is contained in:
parent
37054673b7
commit
46d8e5830a
3 changed files with 91 additions and 6 deletions
|
@ -1,17 +1,29 @@
|
||||||
using System.Collections.Generic;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using FizzWare.NBuilder;
|
||||||
using FluentAssertions;
|
using FluentAssertions;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
|
using NzbDrone.Common.Extensions;
|
||||||
using NzbDrone.Core.Indexers;
|
using NzbDrone.Core.Indexers;
|
||||||
using NzbDrone.Core.IndexerSearch;
|
using NzbDrone.Core.IndexerSearch;
|
||||||
using NzbDrone.Core.MediaFiles.Commands;
|
using NzbDrone.Core.MediaFiles.Commands;
|
||||||
|
using NzbDrone.Core.MediaFiles.EpisodeImport.Manual;
|
||||||
using NzbDrone.Core.Messaging.Commands;
|
using NzbDrone.Core.Messaging.Commands;
|
||||||
using NzbDrone.Core.Update.Commands;
|
using NzbDrone.Core.Update.Commands;
|
||||||
|
using NzbDrone.Test.Common;
|
||||||
|
|
||||||
namespace NzbDrone.Core.Test.Messaging.Commands
|
namespace NzbDrone.Core.Test.Messaging.Commands
|
||||||
{
|
{
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
public class CommandEqualityComparerFixture
|
public class CommandEqualityComparerFixture
|
||||||
{
|
{
|
||||||
|
private string GivenRandomPath()
|
||||||
|
{
|
||||||
|
return Path.Combine(@"C:\Tesst\", Guid.NewGuid().ToString()).AsOsAgnostic();
|
||||||
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void should_return_true_when_there_are_no_properties()
|
public void should_return_true_when_there_are_no_properties()
|
||||||
{
|
{
|
||||||
|
@ -107,5 +119,43 @@ namespace NzbDrone.Core.Test.Messaging.Commands
|
||||||
|
|
||||||
CommandEqualityComparer.Instance.Equals(command1, command2).Should().BeFalse();
|
CommandEqualityComparer.Instance.Equals(command1, command2).Should().BeFalse();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_return_true_when_commands_list_for_non_primitive_type_match()
|
||||||
|
{
|
||||||
|
var files1 = Builder<ManualImportFile>.CreateListOfSize(2)
|
||||||
|
.All()
|
||||||
|
.With(m => m.Path = GivenRandomPath())
|
||||||
|
.Build()
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
var files2 = files1.JsonClone();
|
||||||
|
|
||||||
|
var command1 = new ManualImportCommand { Files = files1 };
|
||||||
|
var command2 = new ManualImportCommand { Files = files2 };
|
||||||
|
|
||||||
|
CommandEqualityComparer.Instance.Equals(command1, command2).Should().BeTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_return_false_when_commands_list_for_non_primitive_type_dont_match()
|
||||||
|
{
|
||||||
|
var files1 = Builder<ManualImportFile>.CreateListOfSize(2)
|
||||||
|
.All()
|
||||||
|
.With(m => m.Path = GivenRandomPath())
|
||||||
|
.Build()
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
var files2 = Builder<ManualImportFile>.CreateListOfSize(2)
|
||||||
|
.All()
|
||||||
|
.With(m => m.Path = GivenRandomPath())
|
||||||
|
.Build()
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
var command1 = new ManualImportCommand { Files = files1 };
|
||||||
|
var command2 = new ManualImportCommand { Files = files2 };
|
||||||
|
|
||||||
|
CommandEqualityComparer.Instance.Equals(command1, command2).Should().BeFalse();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
using System.Collections.Generic;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using NzbDrone.Common.Extensions;
|
||||||
using NzbDrone.Core.Qualities;
|
using NzbDrone.Core.Qualities;
|
||||||
|
|
||||||
namespace NzbDrone.Core.MediaFiles.EpisodeImport.Manual
|
namespace NzbDrone.Core.MediaFiles.EpisodeImport.Manual
|
||||||
{
|
{
|
||||||
public class ManualImportFile
|
public class ManualImportFile : IEquatable<ManualImportFile>
|
||||||
{
|
{
|
||||||
public string Path { get; set; }
|
public string Path { get; set; }
|
||||||
public string FolderName { get; set; }
|
public string FolderName { get; set; }
|
||||||
|
@ -11,5 +13,35 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Manual
|
||||||
public List<int> EpisodeIds { get; set; }
|
public List<int> EpisodeIds { get; set; }
|
||||||
public QualityModel Quality { get; set; }
|
public QualityModel Quality { get; set; }
|
||||||
public string DownloadId { get; set; }
|
public string DownloadId { get; set; }
|
||||||
|
|
||||||
|
public bool Equals(ManualImportFile other)
|
||||||
|
{
|
||||||
|
if (other == null)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Path.PathEquals(other.Path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool Equals(object obj)
|
||||||
|
{
|
||||||
|
if (obj == null)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (obj.GetType() != GetType())
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Path.PathEquals(((ManualImportFile)obj).Path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override int GetHashCode()
|
||||||
|
{
|
||||||
|
return Path != null ? Path.GetHashCode() : 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,10 +49,13 @@ namespace NzbDrone.Core.Messaging.Commands
|
||||||
|
|
||||||
if (typeof(IEnumerable).IsAssignableFrom(xProperty.PropertyType))
|
if (typeof(IEnumerable).IsAssignableFrom(xProperty.PropertyType))
|
||||||
{
|
{
|
||||||
var xValueCollection = ((IEnumerable)xValue).Cast<object>().OrderBy(t => t);
|
var xValueCollection = ((IEnumerable)xValue).Cast<object>();
|
||||||
var yValueCollection = ((IEnumerable)yValue).Cast<object>().OrderBy(t => t);
|
var yValueCollection = ((IEnumerable)yValue).Cast<object>();
|
||||||
|
|
||||||
if (!xValueCollection.SequenceEqual(yValueCollection))
|
var xNotY = xValueCollection.Except(yValueCollection);
|
||||||
|
var yNotX = yValueCollection.Except(xValueCollection);
|
||||||
|
|
||||||
|
if (xNotY.Any() || yNotX.Any())
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue