parent
531447a21f
commit
368363de96
@ -0,0 +1,113 @@
|
||||
using NUnit.Framework;
|
||||
using NzbDrone.Core.Test.Framework;
|
||||
using NzbDrone.Core.Datastore.Migration;
|
||||
using NzbDrone.Test.Common;
|
||||
using System.Linq;
|
||||
using FluentAssertions;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace NzbDrone.Core.Test.Datastore.Migration
|
||||
{
|
||||
[TestFixture]
|
||||
public class add_artistmetadataid_constraintFixture : MigrationTest<add_artistmetadataid_constraint>
|
||||
{
|
||||
private string _artistPath = null;
|
||||
|
||||
private void GivenArtistMetadata(add_artistmetadataid_constraint c, int id, string name)
|
||||
{
|
||||
c.Insert.IntoTable("ArtistMetadata").Row(new
|
||||
{
|
||||
Id = id,
|
||||
ForeignArtistId = id,
|
||||
Name = name,
|
||||
Status = 1,
|
||||
Images = "images"
|
||||
});
|
||||
}
|
||||
|
||||
private void GivenArtist(add_artistmetadataid_constraint c, int id, int artistMetadataId, string name)
|
||||
{
|
||||
_artistPath = $"/mnt/data/path/{name}".AsOsAgnostic();
|
||||
c.Insert.IntoTable("Artists").Row(new
|
||||
{
|
||||
Id = id,
|
||||
ArtistMetadataId = artistMetadataId,
|
||||
CleanName = name,
|
||||
Path = _artistPath,
|
||||
Monitored = 1,
|
||||
AlbumFolder = 1,
|
||||
LanguageProfileId = 1,
|
||||
MetadataProfileId = 1,
|
||||
});
|
||||
}
|
||||
|
||||
private void VerifyArtists(IDirectDataMapper db, List<int> ids)
|
||||
{
|
||||
var artists = db.Query("SELECT Artists.* from Artists");
|
||||
|
||||
artists.Select(x => x["Id"]).ShouldBeEquivalentTo(ids);
|
||||
|
||||
var duplicates = artists.GroupBy(x => x["ArtistMetadataId"])
|
||||
.Where(x => x.Count() > 1);
|
||||
|
||||
duplicates.Should().BeEmpty();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void migration_031_should_not_remove_unique_artist()
|
||||
{
|
||||
var db = WithMigrationTestDb(c => {
|
||||
GivenArtistMetadata(c, 1, "test");
|
||||
GivenArtist(c, 1, 1, "test");
|
||||
});
|
||||
|
||||
VerifyArtists(db, new List<int> { 1 });
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void migration_031_should_not_remove_either_unique_artist()
|
||||
{
|
||||
var db = WithMigrationTestDb(c => {
|
||||
GivenArtistMetadata(c, 1, "test");
|
||||
GivenArtist(c, 1, 1, "test");
|
||||
|
||||
GivenArtistMetadata(c, 2, "test2");
|
||||
GivenArtist(c, 2, 2, "test2");
|
||||
});
|
||||
|
||||
VerifyArtists(db, new List<int> { 1, 2 });
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void migration_031_should_remove_duplicate_artist()
|
||||
{
|
||||
var db = WithMigrationTestDb(c => {
|
||||
GivenArtistMetadata(c, 1, "test");
|
||||
GivenArtist(c, 1, 1, "test");
|
||||
|
||||
GivenArtist(c, 2, 1, "test2");
|
||||
});
|
||||
|
||||
VerifyArtists(db, new List<int> { 1 });
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void migration_031_should_remove_all_duplicate_artists()
|
||||
{
|
||||
var db = WithMigrationTestDb(c => {
|
||||
GivenArtistMetadata(c, 1, "test");
|
||||
GivenArtist(c, 1, 1, "test");
|
||||
GivenArtist(c, 2, 1, "test");
|
||||
GivenArtist(c, 3, 1, "test");
|
||||
GivenArtist(c, 4, 1, "test");
|
||||
|
||||
GivenArtistMetadata(c, 2, "test2");
|
||||
GivenArtist(c, 5, 2, "test2");
|
||||
GivenArtist(c, 6, 2, "test2");
|
||||
|
||||
});
|
||||
|
||||
VerifyArtists(db, new List<int> { 1, 5 });
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
using FluentMigrator;
|
||||
using NzbDrone.Core.Datastore.Migration.Framework;
|
||||
|
||||
namespace NzbDrone.Core.Datastore.Migration
|
||||
{
|
||||
[Migration(31)]
|
||||
public class add_artistmetadataid_constraint : NzbDroneMigrationBase
|
||||
{
|
||||
protected override void MainDbUpgrade()
|
||||
{
|
||||
// Remove any duplicate artists
|
||||
Execute.Sql(@"DELETE FROM Artists
|
||||
WHERE Id NOT IN (
|
||||
SELECT MIN(Artists.id) from Artists
|
||||
JOIN ArtistMetadata ON Artists.ArtistMetadataId = ArtistMetadata.Id
|
||||
GROUP BY ArtistMetadata.Id)");
|
||||
|
||||
// The index exists but will be recreated as part of unique constraint
|
||||
Delete.Index().OnTable("Artists").OnColumn("ArtistMetadataId");
|
||||
|
||||
// Add a constraint to prevent any more duplicates
|
||||
Alter.Column("ArtistMetadataId").OnTable("Artists").AsInt32().Unique();
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in new issue