using AutoMoq;
using Moq;
using NUnit.Framework;
using NzbDrone.Core.Providers.Core;
using NzbDrone.Core.Repository;
using NzbDrone.Core.Test.Framework;
using SubSonic.Repository;

namespace NzbDrone.Core.Test
{
    [TestFixture]
    // ReSharper disable InconsistentNaming
    public class ConfigProviderTest : TestBase
    {
        [Test]
        public void Overwrite_existing_value()
        {
            const string key = "MY_KEY";
            const string value = "MY_VALUE";

            //Arrange
            var config = new Config {Key = key, Value = value};

            var mocker = new AutoMoqer();

            mocker.GetMock<IRepository>()
                .Setup(r => r.Single<Config>(key))
                .Returns(config);

            //Act
            mocker.Resolve<ConfigProvider>().SetValue(key, value);

            //Assert
            mocker.GetMock<IRepository>().Verify(c => c.Update(config));
            mocker.GetMock<IRepository>().Verify(c => c.Add(It.IsAny<Config>()), Times.Never());
        }

        [Test]
        public void Add_new_value()
        {
            const string key = "MY_KEY";
            const string value = "MY_VALUE";

            //Arrange
            var mocker = new AutoMoqer();

            mocker.GetMock<IRepository>()
                .Setup(r => r.Single<Config>(It.IsAny<string>()))
                .Returns<Config>(null)
                .Verifiable();

            //Act
            mocker.Resolve<ConfigProvider>().SetValue(key, value);

            //Assert
            mocker.GetMock<IRepository>().Verify();
            mocker.GetMock<IRepository>().Verify(r => r.Update(It.IsAny<Config>()), Times.Never());
            mocker.GetMock<IRepository>().Verify(r => r.Add(It.Is<Config>(c => c.Key == key && c.Value == value)),
                                                 Times.Once());

            Assert.Pass();
        }
    }
}