Lidarr/src/NzbDrone.Core.Test/Framework/DbTest.cs

192 lines
5.1 KiB
C#
Raw Normal View History

2013-02-04 00:10:15 +00:00
using System;
2013-02-23 19:38:25 +00:00
using System.Collections.Generic;
2013-03-25 03:51:32 +00:00
using System.IO;
2013-02-04 00:10:15 +00:00
using System.Linq;
2014-12-02 20:08:37 +00:00
using FluentMigrator;
2013-07-05 03:56:27 +00:00
using FluentMigrator.Runner;
2013-03-25 03:51:32 +00:00
using Marr.Data;
2013-05-05 21:24:33 +00:00
using Moq;
2013-02-04 00:10:15 +00:00
using NUnit.Framework;
using NzbDrone.Core.Datastore;
2013-03-25 06:13:53 +00:00
using NzbDrone.Core.Datastore.Migration.Framework;
using NzbDrone.Core.Messaging.Events;
2013-09-11 06:33:47 +00:00
2013-02-04 00:10:15 +00:00
namespace NzbDrone.Core.Test.Framework
{
2013-03-24 04:16:00 +00:00
public abstract class DbTest<TSubject, TModel> : DbTest
2013-02-23 19:38:25 +00:00
where TSubject : class
where TModel : ModelBase, new()
{
2013-02-23 19:38:25 +00:00
private TSubject _subject;
protected BasicRepository<TModel> Storage { get; private set; }
2013-02-23 19:38:25 +00:00
protected IList<TModel> AllStoredModels
{
2013-02-23 19:38:25 +00:00
get
{
return Storage.All().ToList();
}
}
2013-02-23 19:38:25 +00:00
protected TModel StoredModel
{
get
{
return Storage.All().Single();
}
}
[SetUp]
public void CoreTestSetup()
{
_subject = null;
2013-02-23 19:38:25 +00:00
Storage = Mocker.Resolve<BasicRepository<TModel>>();
}
protected TSubject Subject
{
get
{
if (_subject == null)
{
_subject = Mocker.Resolve<TSubject>();
}
return _subject;
}
}
}
[Category("DbTest")]
2013-03-24 04:16:00 +00:00
public abstract class DbTest : CoreTest
2013-02-04 00:10:15 +00:00
{
2013-03-25 03:51:32 +00:00
private ITestDatabase _db;
2013-03-27 04:03:02 +00:00
protected virtual MigrationType MigrationType
{
get
{
return MigrationType.Main;
}
}
2013-03-25 03:51:32 +00:00
protected ITestDatabase Db
2013-02-04 00:10:15 +00:00
{
get
{
if (_db == null)
throw new InvalidOperationException("Test object database doesn't exists. Make sure you call WithRealDb() if you intend to use an actual database.");
return _db;
}
}
2014-12-02 20:08:37 +00:00
protected virtual TestDatabase WithTestDb(Action<MigrationBase> beforeMigration)
{
var factory = Mocker.Resolve<DbFactory>();
var database = factory.Create(MigrationType);
Mocker.SetConstant(database);
var testDb = new TestDatabase(database);
return testDb;
}
protected void SetupContainer()
2013-02-04 00:10:15 +00:00
{
2013-06-28 01:03:04 +00:00
WithTempAsAppPath();
2013-03-25 03:51:32 +00:00
2013-07-05 03:56:27 +00:00
Mocker.SetConstant<IAnnouncer>(Mocker.Resolve<MigrationLogger>());
Mocker.SetConstant<IConnectionStringFactory>(Mocker.Resolve<ConnectionStringFactory>());
Mocker.SetConstant<IMigrationController>(Mocker.Resolve<MigrationController>());
2013-03-25 03:51:32 +00:00
MapRepository.Instance.EnableTraceLogging = true;
2013-02-04 00:10:15 +00:00
}
2013-02-23 19:38:25 +00:00
[SetUp]
2014-12-02 20:08:37 +00:00
public virtual void SetupDb()
2013-02-23 19:38:25 +00:00
{
2014-12-02 20:08:37 +00:00
SetupContainer();
_db = WithTestDb(null);
2013-02-23 19:38:25 +00:00
}
2013-03-25 03:51:32 +00:00
[TearDown]
public void TearDown()
{
2013-07-09 22:06:41 +00:00
if (TestFolderInfo != null && Directory.Exists(TestFolderInfo.AppDataFolder))
2013-03-25 03:51:32 +00:00
{
var files = Directory.GetFiles(TestFolderInfo.AppDataFolder);
2013-03-25 03:51:32 +00:00
2013-06-28 01:03:04 +00:00
foreach (var file in files)
{
try
{
File.Delete(file);
}
catch (Exception)
{
}
2013-03-25 03:51:32 +00:00
}
}
}
2013-03-24 04:16:00 +00:00
}
2013-03-25 03:51:32 +00:00
public interface ITestDatabase
2013-03-24 04:16:00 +00:00
{
2013-03-25 03:51:32 +00:00
void InsertMany<T>(IEnumerable<T> items) where T : ModelBase, new();
2013-04-11 04:38:45 +00:00
T Insert<T>(T item) where T : ModelBase, new();
List<T> All<T>() where T : ModelBase, new();
T Single<T>() where T : ModelBase, new();
2013-03-25 03:51:32 +00:00
void Update<T>(T childModel) where T : ModelBase, new();
void Delete<T>(T childModel) where T : ModelBase, new();
2013-03-24 04:16:00 +00:00
}
public class TestDatabase : ITestDatabase
2013-03-24 04:16:00 +00:00
{
2013-03-25 03:51:32 +00:00
private readonly IDatabase _dbConnection;
private IEventAggregator _eventAggregator;
2013-03-24 04:16:00 +00:00
public TestDatabase(IDatabase dbConnection)
2013-02-04 00:10:15 +00:00
{
_eventAggregator = new Mock<IEventAggregator>().Object;
2013-03-24 04:16:00 +00:00
_dbConnection = dbConnection;
}
2013-03-25 03:51:32 +00:00
public void InsertMany<T>(IEnumerable<T> items) where T : ModelBase, new()
2013-03-24 04:16:00 +00:00
{
new BasicRepository<T>(_dbConnection, _eventAggregator).InsertMany(items.ToList());
2013-03-24 04:16:00 +00:00
}
2013-04-11 04:38:45 +00:00
public T Insert<T>(T item) where T : ModelBase, new()
2013-03-24 04:16:00 +00:00
{
return new BasicRepository<T>(_dbConnection, _eventAggregator).Insert(item);
2013-03-24 04:16:00 +00:00
}
public List<T> All<T>() where T : ModelBase, new()
2013-03-24 04:16:00 +00:00
{
return new BasicRepository<T>(_dbConnection, _eventAggregator).All().ToList();
2013-03-24 04:16:00 +00:00
}
public T Single<T>() where T : ModelBase, new()
{
return All<T>().SingleOrDefault();
}
2013-03-25 03:51:32 +00:00
public void Update<T>(T childModel) where T : ModelBase, new()
2013-03-24 04:16:00 +00:00
{
new BasicRepository<T>(_dbConnection, _eventAggregator).Update(childModel);
2013-03-24 04:16:00 +00:00
}
2013-03-25 03:51:32 +00:00
public void Delete<T>(T childModel) where T : ModelBase, new()
2013-03-24 04:16:00 +00:00
{
new BasicRepository<T>(_dbConnection, _eventAggregator).Delete(childModel);
2013-02-04 00:10:15 +00:00
}
}
}