Answer: How many tests?
Two days ago I asked how many tests this method need:
///<summary>
///Get the latest published webcast
///</summary>
public Webcast GetLatest();
Here is what I came up with:
[TestFixture]
public class WebcastRepositoryTest : DatabaseTestFixtureBase
{
private IWebcastRepository webcastRepository;
[TestFixtureSetUp]
public void TestFixtureSetup()
{
IntializeNHibernateAndIoC(PersistenceFramework.ActiveRecord,
"windsor.boo", MappingInfo.FromAssemblyContaining<Webcast>());
}
[SetUp]
public void Setup()
{
CurrentContext.CreateUnitOfWork();
webcastRepository = IoC.Resolve<IWebcastRepository>();
}
[TearDown]
public void Teardown()
{
CurrentContext.DisposeUnitOfWork();
}
[Test]
public void Can_save_webcast()
{
var webcast = new Webcast { Name = "test", PublishDate = null };
With.Transaction(() => webcastRepository.Save(webcast));
Assert.AreNotEqual(0, webcast.Id);
}
[Test]
public void Can_load_webcast()
{
var webcast = new Webcast { Name = "test", PublishDate = null };
With.Transaction(() => webcastRepository.Save(webcast));
UnitOfWork.CurrentSession.Evict(webcast);
var webcast2 = webcastRepository.Get(webcast.Id);
Assert.AreEqual(webcast.Id, webcast2.Id);
Assert.AreEqual("test", webcast2.Name);
Assert.IsNull(webcast2.PublishDate);
}
[Test]
public void When_asking_for_latest_webcast_will_not_consider_any_that_is_not_published()
{
var webcast = new Webcast { Name = "test", PublishDate = null };
With.Transaction(() => webcastRepository.Save(webcast));
Assert.IsNull(webcastRepository.GetLatest());
}
[Test]
public void When_asking_for_latest_webcast_will_get_published_webcast()
{
var webcast = new Webcast { Name = "test", PublishDate = null };
With.Transaction(() => webcastRepository.Save(webcast));
var webcast2 = new Webcast { Name = "test", PublishDate = DateTime.Now.AddDays(-1) };
With.Transaction(() => webcastRepository.Save(webcast2));
Assert.AreEqual(webcast2.Id, webcastRepository.GetLatest().Id);
}
[Test]
public void When_asking_for_latest_webcast_will_get_the_latest_webcast()
{
var webcast = new Webcast { Name = "test", PublishDate = DateTime.Now.AddDays(-2) };
With.Transaction(() => webcastRepository.Save(webcast));
var webcast2 = new Webcast { Name = "test", PublishDate = DateTime.Now.AddDays(-1) };
With.Transaction(() => webcastRepository.Save(webcast2));
Assert.AreEqual(webcast2.Id, webcastRepository.GetLatest().Id);
}
[Test]
public void When_asking_for_latest_webcast_will_not_consider_webcasts_published_in_the_future()
{
var webcast = new Webcast { Name = "test", PublishDate = DateTime.Now.AddDays(-2) };
With.Transaction(() => webcastRepository.Save(webcast));
var webcast2 = new Webcast { Name = "test", PublishDate = DateTime.Now.AddDays(2) };
With.Transaction(() => webcastRepository.Save(webcast2));
Assert.AreEqual(webcast.Id, webcastRepository.GetLatest().Id);
}
}
And the implementation:
public class WebcastRepository : RepositoryDecorator<Webcast>, IWebcastRepository
{
public WebcastRepository(IRepository<Webcast> repository)
{
Inner = repository;
}
public Webcast GetLatest()
{
var publishedWebcastsByDateDesc =
from webcast in Webcasts
where webcast.PublishDate != null && webcast.PublishDate < SystemTime.Now()
orderby webcast.PublishDate descending
select webcast;
return publishedWebcastsByDateDesc.FirstOrDefault();
}
private static IOrderedQueryable<Webcast> Webcasts
{
get { return UnitOfWork.CurrentSession.Linq<Webcast>(); }
}
}
I think it is pretty sweet.