public async Task MemoryKeyCollectionValuePairsRepositoryOfTweet_AddValidNonPresentKeyAndValidValue_ShouldWork()
        {
            // Arrange
            string key             = "some key";
            var    valueMock       = new Mock <ITweet>();
            var    returnValueMock = new Mock <ICollection <ITweet> >();

            var dataStoreMock = new Mock <IMemoryStringKeyCollectionValueDataStore <ITweet> >();

            dataStoreMock
            .Setup(s => s.AddOrUpdate(key, It.IsAny <Func <string, ICollection <ITweet> > >(), It.IsAny <Func <string, ICollection <ITweet>, ICollection <ITweet> > >()))
            .Returns(returnValueMock.Object);

            var repository = new MemoryKeyCollectionValuePairsRepository <ITweet>(dataStoreMock.Object);

            // Act
            var result = await repository.Add(key, valueMock.Object);

            // Asset
            Assert.AreSame(result, returnValueMock.Object);

            dataStoreMock.Verify(
                s => s.AddOrUpdate(It.IsAny <string>(), It.IsAny <Func <string, ICollection <ITweet> > >(), It.IsAny <Func <string, ICollection <ITweet>, ICollection <ITweet> > >()),
                Times.Once);

            dataStoreMock.Verify(
                s => s.AddOrUpdate(key, It.IsAny <Func <string, ICollection <ITweet> > >(), It.IsAny <Func <string, ICollection <ITweet>, ICollection <ITweet> > >()),
                Times.Once);
        }
        public void MemoryKeyCollectionValuePairsRepositoryOfTweet_WithNullDataStoreInConstructor_ShouldThrowArgumentNullExceptionWithCorrectParamName()
        {
            // Act + Assert
            var exception = Assert.Throws <ArgumentNullException>(() =>
            {
                var repository = new MemoryKeyCollectionValuePairsRepository <ITweet>(null);
            });

            Assert.AreEqual(Constants.DataStoreParamName, exception.ParamName);
        }
        public async Task MemoryKeyCollectionValuePairsRepositoryOfTweet_SaveChanges_ShouldWork()
        {
            // Arrange
            var dataStoreMock = new Mock <IMemoryStringKeyCollectionValueDataStore <ITweet> >();

            var repository = new MemoryKeyCollectionValuePairsRepository <ITweet>(dataStoreMock.Object);

            // Act
            var result = await repository.SaveChangesAsync();

            // Asset
            Assert.That(result, Is.EqualTo(0L));

            dataStoreMock.Verify();
        }
        public void MemoryKeyCollectionValuePairsRepositoryOfTweet_RemoveWithInvalidKeyAndNullValue_ShouldThrowArgumentNullException(string key)
        {
            // Arrange
            var dataStoreMock = new Mock <IMemoryStringKeyCollectionValueDataStore <ITweet> >();

            var repository = new MemoryKeyCollectionValuePairsRepository <ITweet>(dataStoreMock.Object);

            // Act + Assert
            Assert.ThrowsAsync <ArgumentNullException>(() =>
            {
                return(repository.Remove(key, null));
            });

            dataStoreMock.Verify(s => s.Remove(It.IsAny <string>()), Times.Never);
        }
        public void MemoryKeyCollectionValuePairsRepositoryOfTweet_WithValidDataStoreInConstructor_ShouldBeInitializedCorrectly()
        {
            // Arrange
            var dataStoreMock = new Mock <IMemoryStringKeyCollectionValueDataStore <ITweet> >();
            var dataStore     = dataStoreMock.Object;

            // Act + Assert
            var repository = new MemoryKeyCollectionValuePairsRepository <ITweet>(dataStore);

            Assert.IsNotNull(repository);

            var dataStoreFieldValue = PrivateField.GetInstanceField <MemoryKeyCollectionValuePairsRepository <ITweet> >(
                repository,
                Constants.DataStoreParamName);

            Assert.AreSame(dataStore, dataStoreFieldValue);
        }
        public void MemoryKeyCollectionValuePairsRepositoryOfTweet_RemoveWithInvalidKey_ShouldThrowArgumentNullExceptionWithCorrectParamName(string key)
        {
            // Arrange
            var dataStoreMock = new Mock <IMemoryStringKeyCollectionValueDataStore <ITweet> >();

            var repository = new MemoryKeyCollectionValuePairsRepository <ITweet>(dataStoreMock.Object);

            // Act + Assert
            var exception = Assert.ThrowsAsync <ArgumentNullException>(() =>
            {
                return(repository.Remove(key));
            });

            Assert.AreEqual(Constants.KeyParamName, exception.ParamName);

            dataStoreMock.Verify(s => s.Remove(It.IsAny <string>()), Times.Never);
        }
        public void MemoryKeyCollectionValuePairsRepositoryOfTweet_GetKeys_ShouldWork()
        {
            // Arrange
            var listOfKeys = new List <string>();

            var dataStoreMock = new Mock <IMemoryStringKeyCollectionValueDataStore <ITweet> >();

            dataStoreMock
            .SetupGet(s => s.Keys)
            .Returns(listOfKeys);

            var repository = new MemoryKeyCollectionValuePairsRepository <ITweet>(dataStoreMock.Object);

            // Act
            var keys = repository.Keys;

            // Assert
            Assert.AreSame(listOfKeys, keys);

            dataStoreMock.Verify(s => s.Keys, Times.Once);
        }
        public void MemoryKeyCollectionValuePairsRepositoryOfTweet_AddWithValidKeyAndNullValue_ShouldThrowArgumentNullExceptionWithCorrectParamName()
        {
            // Arrange
            string key = "some key";

            var dataStoreMock = new Mock <IMemoryStringKeyCollectionValueDataStore <ITweet> >();

            var repository = new MemoryKeyCollectionValuePairsRepository <ITweet>(dataStoreMock.Object);

            // Act + Assert
            var exception = Assert.ThrowsAsync <ArgumentNullException>(() =>
            {
                return(repository.Add(key, null));
            });

            Assert.AreEqual(Constants.ValueParamName, exception.ParamName);

            dataStoreMock.Verify(
                s => s.AddOrUpdate(key, It.IsAny <Func <string, ICollection <ITweet> > >(), It.IsAny <Func <string, ICollection <ITweet>, ICollection <ITweet> > >()),
                Times.Never);
        }
        public async Task MemoryKeyCollectionValuePairsRepositoryOfTweet_RemoveValidYetPresentKey_ShouldWork()
        {
            // Arrange
            string key = "some key";

            var dataStoreMock = new Mock <IMemoryStringKeyCollectionValueDataStore <ITweet> >();

            dataStoreMock
            .Setup(s => s.Remove(key))
            .Returns(true);

            var repository = new MemoryKeyCollectionValuePairsRepository <ITweet>(dataStoreMock.Object);

            // Act
            var result = await repository.Remove(key);

            // Asset
            Assert.That(result, Is.EqualTo(true));

            dataStoreMock.Verify(s => s.Remove(It.IsAny <string>()), Times.Once);
            dataStoreMock.Verify(s => s.Remove(key), Times.Once);
        }
        public async Task MemoryKeyCollectionValuePairsRepositoryOfTweet_RemoveValidKeyAndValidValue_ShouldWork()
        {
            // Arrange
            string key       = "some key";
            var    valueMock = new Mock <ITweet>();

            var dataStoreMock = new Mock <IMemoryStringKeyCollectionValueDataStore <ITweet> >();

            var repository = new MemoryKeyCollectionValuePairsRepository <ITweet>(dataStoreMock.Object);

            // Act
            var result = await repository.Remove(key, valueMock.Object);

            // Asset
            Assert.That(result, Is.EqualTo(true));

            dataStoreMock.Verify(
                s => s.AddOrUpdate(It.IsAny <string>(), It.IsAny <Func <string, ICollection <ITweet> > >(), It.IsAny <Func <string, ICollection <ITweet>, ICollection <ITweet> > >()),
                Times.Once);

            dataStoreMock.Verify(
                s => s.AddOrUpdate(key, It.IsAny <Func <string, ICollection <ITweet> > >(), It.IsAny <Func <string, ICollection <ITweet>, ICollection <ITweet> > >()),
                Times.Once);
        }
        public void MemoryKeyCollectionValuePairsRepositoryOfTweet_GetAllValidKeyAndEmptyList_ShouldReturnEmptyIEnumerable()
        {
            // Arrange
            string key = "some key";

            var list = new List <ITweet>();

            var dataStoreMock = new Mock <IMemoryStringKeyCollectionValueDataStore <ITweet> >();

            dataStoreMock
            .Setup(s => s[It.IsAny <string>()])
            .Returns(list);

            var repository = new MemoryKeyCollectionValuePairsRepository <ITweet>(dataStoreMock.Object);

            // Act
            var result = repository.GetAll(key);

            // Act + Asset
            Assert.That(result.Count(), Is.EqualTo(0));

            dataStoreMock.Verify(s => s[It.IsAny <string>()], Times.Once);
            dataStoreMock.Verify(s => s[key], Times.Once);
        }