2013-02-04 03:10:15 +03:00
|
|
|
using System;
|
2013-02-23 22:38:25 +03:00
|
|
|
using System.Collections.Generic;
|
2013-03-25 06:51:32 +03:00
|
|
|
using System.IO;
|
2013-02-04 03:10:15 +03:00
|
|
|
using System.Linq;
|
2013-03-25 06:51:32 +03:00
|
|
|
using Marr.Data;
|
2013-05-06 00:24:33 +03:00
|
|
|
using Moq;
|
2013-02-04 03:10:15 +03:00
|
|
|
using NUnit.Framework;
|
2013-06-28 04:03:04 +03:00
|
|
|
using NzbDrone.Common.EnvironmentInfo;
|
2013-05-06 00:24:33 +03:00
|
|
|
using NzbDrone.Common.Messaging;
|
2013-02-04 03:10:15 +03:00
|
|
|
using NzbDrone.Core.Datastore;
|
2013-03-25 09:13:53 +03:00
|
|
|
using NzbDrone.Core.Datastore.Migration.Framework;
|
2013-02-04 03:10:15 +03:00
|
|
|
|
|
|
|
namespace NzbDrone.Core.Test.Framework
|
|
|
|
{
|
2013-06-03 06:15:56 +03:00
|
|
|
[Category("DbTest")]
|
2013-03-24 07:16:00 +03:00
|
|
|
public abstract class DbTest<TSubject, TModel> : DbTest
|
2013-02-23 22:38:25 +03:00
|
|
|
where TSubject : class
|
2013-02-18 10:59:43 +03:00
|
|
|
where TModel : ModelBase, new()
|
|
|
|
{
|
2013-02-23 22:38:25 +03:00
|
|
|
private TSubject _subject;
|
2013-02-18 10:59:43 +03:00
|
|
|
|
|
|
|
protected BasicRepository<TModel> Storage { get; private set; }
|
|
|
|
|
2013-02-23 22:38:25 +03:00
|
|
|
protected IList<TModel> AllStoredModels
|
2013-02-18 10:59:43 +03:00
|
|
|
{
|
2013-02-23 22:38:25 +03:00
|
|
|
get
|
|
|
|
{
|
|
|
|
return Storage.All().ToList();
|
|
|
|
}
|
2013-02-18 10:59:43 +03:00
|
|
|
}
|
|
|
|
|
2013-02-23 22:38:25 +03:00
|
|
|
protected TModel StoredModel
|
|
|
|
{
|
|
|
|
get
|
|
|
|
{
|
|
|
|
return Storage.All().Single();
|
|
|
|
}
|
|
|
|
}
|
2013-02-16 06:50:22 +03:00
|
|
|
|
|
|
|
[SetUp]
|
|
|
|
public void CoreTestSetup()
|
|
|
|
{
|
|
|
|
_subject = null;
|
2013-02-23 22:38:25 +03:00
|
|
|
Storage = Mocker.Resolve<BasicRepository<TModel>>();
|
2013-02-16 06:50:22 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
protected TSubject Subject
|
|
|
|
{
|
|
|
|
get
|
|
|
|
{
|
|
|
|
if (_subject == null)
|
|
|
|
{
|
|
|
|
_subject = Mocker.Resolve<TSubject>();
|
|
|
|
}
|
|
|
|
|
|
|
|
return _subject;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-03-24 07:16:00 +03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public abstract class DbTest : CoreTest
|
2013-02-04 03:10:15 +03:00
|
|
|
{
|
2013-03-25 06:51:32 +03:00
|
|
|
private ITestDatabase _db;
|
|
|
|
private IDatabase _database;
|
|
|
|
|
2013-03-27 07:03:02 +03:00
|
|
|
|
|
|
|
protected virtual MigrationType MigrationType
|
|
|
|
{
|
|
|
|
get
|
|
|
|
{
|
|
|
|
return MigrationType.Main;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-03-25 06:51:32 +03:00
|
|
|
protected ITestDatabase Db
|
2013-02-04 03:10:15 +03: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;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-06-28 04:03:04 +03:00
|
|
|
private void WithTestDb()
|
2013-02-04 03:10:15 +03:00
|
|
|
{
|
2013-06-28 04:03:04 +03:00
|
|
|
WithTempAsAppPath();
|
2013-03-25 06:51:32 +03:00
|
|
|
|
|
|
|
|
|
|
|
MapRepository.Instance.EnableTraceLogging = true;
|
|
|
|
|
2013-06-28 04:03:04 +03:00
|
|
|
var factory = new DbFactory(new MigrationController(new MigrationLogger(TestLogger)), Mocker.GetMock<IAppDirectoryInfo>().Object);
|
|
|
|
_database = factory.Create(MigrationType);
|
2013-03-25 06:51:32 +03:00
|
|
|
_db = new TestTestDatabase(_database);
|
|
|
|
Mocker.SetConstant(_database);
|
2013-02-04 03:10:15 +03:00
|
|
|
}
|
|
|
|
|
2013-02-23 22:38:25 +03:00
|
|
|
[SetUp]
|
|
|
|
public void SetupReadDb()
|
|
|
|
{
|
2013-06-28 04:03:04 +03:00
|
|
|
WithTestDb();
|
2013-02-23 22:38:25 +03:00
|
|
|
}
|
|
|
|
|
2013-03-25 06:51:32 +03:00
|
|
|
[TearDown]
|
|
|
|
public void TearDown()
|
|
|
|
{
|
2013-06-28 04:03:04 +03:00
|
|
|
if (TestDirectoryInfo != null)
|
2013-03-25 06:51:32 +03:00
|
|
|
{
|
2013-06-28 04:03:04 +03:00
|
|
|
var files = Directory.GetFiles(TestDirectoryInfo.WorkingDirectory);
|
2013-03-25 06:51:32 +03:00
|
|
|
|
2013-06-28 04:03:04 +03:00
|
|
|
foreach (var file in files)
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
|
|
|
File.Delete(file);
|
|
|
|
}
|
|
|
|
catch (Exception)
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
2013-03-25 06:51:32 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2013-03-24 07:16:00 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2013-03-25 06:51:32 +03:00
|
|
|
public interface ITestDatabase
|
2013-03-24 07:16:00 +03:00
|
|
|
{
|
2013-03-25 06:51:32 +03:00
|
|
|
void InsertMany<T>(IEnumerable<T> items) where T : ModelBase, new();
|
2013-04-11 07:38:45 +03:00
|
|
|
T Insert<T>(T item) where T : ModelBase, new();
|
2013-03-27 03:51:37 +03:00
|
|
|
List<T> All<T>() where T : ModelBase, new();
|
2013-03-26 08:51:56 +03:00
|
|
|
T Single<T>() where T : ModelBase, new();
|
2013-03-25 06:51:32 +03:00
|
|
|
void Update<T>(T childModel) where T : ModelBase, new();
|
|
|
|
void Delete<T>(T childModel) where T : ModelBase, new();
|
2013-03-24 07:16:00 +03:00
|
|
|
}
|
|
|
|
|
2013-03-25 06:51:32 +03:00
|
|
|
public class TestTestDatabase : ITestDatabase
|
2013-03-24 07:16:00 +03:00
|
|
|
{
|
2013-03-25 06:51:32 +03:00
|
|
|
private readonly IDatabase _dbConnection;
|
2013-05-06 00:24:33 +03:00
|
|
|
private IMessageAggregator _messageAggregator;
|
2013-03-24 07:16:00 +03:00
|
|
|
|
2013-03-25 06:51:32 +03:00
|
|
|
public TestTestDatabase(IDatabase dbConnection)
|
2013-02-04 03:10:15 +03:00
|
|
|
{
|
2013-05-06 00:24:33 +03:00
|
|
|
_messageAggregator = new Mock<IMessageAggregator>().Object;
|
2013-03-24 07:16:00 +03:00
|
|
|
_dbConnection = dbConnection;
|
|
|
|
}
|
|
|
|
|
2013-03-25 06:51:32 +03:00
|
|
|
public void InsertMany<T>(IEnumerable<T> items) where T : ModelBase, new()
|
2013-03-24 07:16:00 +03:00
|
|
|
{
|
2013-05-06 00:24:33 +03:00
|
|
|
new BasicRepository<T>(_dbConnection, _messageAggregator).InsertMany(items.ToList());
|
2013-03-24 07:16:00 +03:00
|
|
|
}
|
|
|
|
|
2013-04-11 07:38:45 +03:00
|
|
|
public T Insert<T>(T item) where T : ModelBase, new()
|
2013-03-24 07:16:00 +03:00
|
|
|
{
|
2013-05-06 00:24:33 +03:00
|
|
|
return new BasicRepository<T>(_dbConnection, _messageAggregator).Insert(item);
|
2013-03-24 07:16:00 +03:00
|
|
|
}
|
|
|
|
|
2013-03-27 03:51:37 +03:00
|
|
|
public List<T> All<T>() where T : ModelBase, new()
|
2013-03-24 07:16:00 +03:00
|
|
|
{
|
2013-05-06 00:24:33 +03:00
|
|
|
return new BasicRepository<T>(_dbConnection, _messageAggregator).All().ToList();
|
2013-03-24 07:16:00 +03:00
|
|
|
}
|
|
|
|
|
2013-03-26 08:51:56 +03:00
|
|
|
public T Single<T>() where T : ModelBase, new()
|
|
|
|
{
|
|
|
|
return All<T>().SingleOrDefault();
|
|
|
|
}
|
|
|
|
|
2013-03-25 06:51:32 +03:00
|
|
|
public void Update<T>(T childModel) where T : ModelBase, new()
|
2013-03-24 07:16:00 +03:00
|
|
|
{
|
2013-05-06 00:24:33 +03:00
|
|
|
new BasicRepository<T>(_dbConnection, _messageAggregator).Update(childModel);
|
2013-03-24 07:16:00 +03:00
|
|
|
}
|
|
|
|
|
2013-03-25 06:51:32 +03:00
|
|
|
public void Delete<T>(T childModel) where T : ModelBase, new()
|
2013-03-24 07:16:00 +03:00
|
|
|
{
|
2013-05-06 00:24:33 +03:00
|
|
|
new BasicRepository<T>(_dbConnection, _messageAggregator).Delete(childModel);
|
2013-02-04 03:10:15 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|