public async void GetAllAsync_ShouldReturnListOfLibraries_WithAsManyElementsAsImportedLibrariesList()
        {
            var fileServiceMock        = new Mock <IFileService>();
            var settingsProviderMock   = new Mock <ISettingsProviderService>();
            var libraryFileServiceMock = new Mock <ILibraryFileService>();
            var settings = new Settings()
            {
                ImportedLibraries = new List <string>()
                {
                    "Tests\\path1.plib",
                    "Tests\\path2.plib",
                    "Tests\\path3.plib"
                }
            };

            settingsProviderMock.Setup(x => x.Settings)
            .Returns(settings);

            libraryFileServiceMock.Setup(x => x.ReadLibraryFromStreamAsync(It.IsAny <Stream>(), It.IsAny <Origin>()))
            .Returns(Task.FromResult(GetLibrary()));

            var repository = new LocalLibraryRepositoryStrategy(fileServiceMock.Object, settingsProviderMock.Object, libraryFileServiceMock.Object);
            var libraries  = await repository.GetAllAsync();

            Assert.True(libraries.ToList().Count == settings.ImportedLibraries.Count);
        }
        public async void RemoveRangeAsync_ShouldCallRemoveMethod_ForeachLibraryInACollection()
        {
            var fileServiceMock        = new Mock <IFileService>();
            var settingsProviderMock   = new Mock <ISettingsProviderService>();
            var libraryFileServiceMock = new Mock <ILibraryFileService>();

            var libraries =
                new List <Library>()
            {
                new Library()
                {
                    FullName = "Tests\\path1.plib"
                },

                new Library()
                {
                    FullName = "Tests\\path2.plib"
                }
            };

            fileServiceMock.Setup(x => x.Remove(libraries[0].FullName))
            .Verifiable();
            fileServiceMock.Setup(x => x.Remove(libraries[1].FullName))
            .Verifiable();

            var repository = new LocalLibraryRepositoryStrategy(fileServiceMock.Object, settingsProviderMock.Object, libraryFileServiceMock.Object);
            await repository.RemoveRangeAsync(libraries);

            fileServiceMock.Verify(x => x.Remove(libraries[0].FullName));
            fileServiceMock.Verify(x => x.Remove(libraries[1].FullName));
        }
        public async void GetAllAsync_ShouldOpenFileAndReadFromIt_ForeachFilePathInImportedLibraries()
        {
            var fileServiceMock        = new Mock <IFileService>();
            var settingsProviderMock   = new Mock <ISettingsProviderService>();
            var libraryFileServiceMock = new Mock <ILibraryFileService>();
            var settings = new Settings()
            {
                ImportedLibraries = new List <string>()
                {
                    "Tests\\path1.plib",
                    "Tests\\path2.plib",
                    "Tests\\path3.plib"
                }
            };

            settingsProviderMock.Setup(x => x.Settings)
            .Returns(settings);

            int openFileCallCounter    = 0;
            int readLibraryCallCounter = 0;

            fileServiceMock.Setup(x => x.OpenFile(It.IsAny <string>(), It.IsAny <FileMode>(), It.IsAny <FileAccess>(), It.IsAny <FileShare>()))
            .Callback(() => { openFileCallCounter++; });
            libraryFileServiceMock.Setup(x => x.ReadLibraryFromStreamAsync(It.IsAny <Stream>(), It.IsAny <Origin>()))
            .Callback(() => { readLibraryCallCounter++; });

            var repository = new LocalLibraryRepositoryStrategy(fileServiceMock.Object, settingsProviderMock.Object, libraryFileServiceMock.Object);
            var libraries  = await repository.GetAllAsync();

            Assert.True(openFileCallCounter == settings.ImportedLibraries.Count && readLibraryCallCounter == settings.ImportedLibraries.Count);
        }
        public async void UpdateAsync_ShouldThrowArgumentNullException_WhenLibraryIsNull()
        {
            var fileServiceMock        = new Mock <IFileService>();
            var settingsProviderMock   = new Mock <ISettingsProviderService>();
            var libraryFileServiceMock = new Mock <ILibraryFileService>();

            Library library = null;

            var repository = new LocalLibraryRepositoryStrategy(fileServiceMock.Object, settingsProviderMock.Object, libraryFileServiceMock.Object);

            await Assert.ThrowsAsync <ArgumentNullException>(() => repository.UpdateAsync(library));
        }
        public async void RemoveAsync_ShouldCallRemoveMethod()
        {
            var fileServiceMock        = new Mock <IFileService>();
            var settingsProviderMock   = new Mock <ISettingsProviderService>();
            var libraryFileServiceMock = new Mock <ILibraryFileService>();

            fileServiceMock.Setup(x => x.Remove(It.IsAny <string>()))
            .Verifiable();

            var repository = new LocalLibraryRepositoryStrategy(fileServiceMock.Object, settingsProviderMock.Object, libraryFileServiceMock.Object);
            await repository.RemoveAsync("Tests\\path1.plib");

            fileServiceMock.Verify(x => x.Remove(It.IsAny <string>()));
        }
        public async void GetAllAsync_ShouldReturnEmptyList_WhenImportedLibrariesListIsNull()
        {
            var fileServiceMock        = new Mock <IFileService>();
            var settingsProviderMock   = new Mock <ISettingsProviderService>();
            var libraryFileServiceMock = new Mock <ILibraryFileService>();
            var settings = new Settings()
            {
                ImportedLibraries = null
            };

            settingsProviderMock.Setup(x => x.Settings)
            .Returns(settings);

            var repository = new LocalLibraryRepositoryStrategy(fileServiceMock.Object, settingsProviderMock.Object, libraryFileServiceMock.Object);

            var libraries = await repository.GetAllAsync();

            Assert.Empty(libraries);
        }
        public async void GetByPathAsync_ShouldReturnLibrary()
        {
            var fileServiceMock        = new Mock <IFileService>();
            var settingsProviderMock   = new Mock <ISettingsProviderService>();
            var libraryFileServiceMock = new Mock <ILibraryFileService>();

            var library =
                new Library()
            {
                FullName = "Tests\\path1.plib"
            };

            libraryFileServiceMock.Setup(x => x.ReadLibraryFromStreamAsync(It.IsAny <Stream>(), It.IsAny <Origin>()))
            .Returns(Task.FromResult(library));

            var repository = new LocalLibraryRepositoryStrategy(fileServiceMock.Object, settingsProviderMock.Object, libraryFileServiceMock.Object);
            var result     = await repository.GetByPathAsync(It.IsAny <string>());

            Assert.True(result.FullName == library.FullName);
        }
        public async void GetByPathAsync_ShouldOpenAndReadFromASpecifiedFile()
        {
            var fileServiceMock        = new Mock <IFileService>();
            var settingsProviderMock   = new Mock <ISettingsProviderService>();
            var libraryFileServiceMock = new Mock <ILibraryFileService>();

            var filePath     = "Tests\\path1.plib";
            var memoryStream = new MemoryStream();

            fileServiceMock.Setup(x => x.OpenFile(filePath, It.IsAny <FileMode>(), It.IsAny <FileAccess>(), It.IsAny <FileShare>()))
            .Returns(memoryStream);
            libraryFileServiceMock.Setup(x => x.ReadLibraryFromStreamAsync(memoryStream, It.IsAny <Origin>()))
            .Verifiable();

            var repository = new LocalLibraryRepositoryStrategy(fileServiceMock.Object, settingsProviderMock.Object, libraryFileServiceMock.Object);
            var library    = await repository.GetByPathAsync(filePath);

            fileServiceMock.Verify(x => x.OpenFile(filePath, It.IsAny <FileMode>(), It.IsAny <FileAccess>(), It.IsAny <FileShare>()));
            libraryFileServiceMock.Verify(x => x.ReadLibraryFromStreamAsync(memoryStream, It.IsAny <Origin>()));
        }
        public async void AddAsync_ShouldCallOpenFileMethod_ForPreviouslyCreatedFile()
        {
            var fileServiceMock        = new Mock <IFileService>();
            var settingsProviderMock   = new Mock <ISettingsProviderService>();
            var libraryFileServiceMock = new Mock <ILibraryFileService>();
            var settings = new Settings()
            {
                ImportedLibraries = new List <string>()
            };

            settingsProviderMock.Setup(x => x.Settings)
            .Returns(settings);

            var library = GetLibrary();

            fileServiceMock.Setup(x => x.OpenFile(library.FullName, It.IsAny <FileMode>(), It.IsAny <FileAccess>(), It.IsAny <FileShare>()))
            .Verifiable();

            var repository = new LocalLibraryRepositoryStrategy(fileServiceMock.Object, settingsProviderMock.Object, libraryFileServiceMock.Object);

            await repository.AddAsync(library);

            fileServiceMock.Verify(x => x.OpenFile(library.FullName, It.IsAny <FileMode>(), It.IsAny <FileAccess>(), It.IsAny <FileShare>()));
        }
        public async void AddAsync_ShouldCallFileCreateMethod()
        {
            var fileServiceMock        = new Mock <IFileService>();
            var settingsProviderMock   = new Mock <ISettingsProviderService>();
            var libraryFileServiceMock = new Mock <ILibraryFileService>();
            var settings = new Settings()
            {
                ImportedLibraries = new List <string>()
            };

            settingsProviderMock.Setup(x => x.Settings)
            .Returns(settings);

            var library = GetLibrary();

            fileServiceMock.Setup(x => x.Create(library.FullName))
            .Verifiable();

            var repository = new LocalLibraryRepositoryStrategy(fileServiceMock.Object, settingsProviderMock.Object, libraryFileServiceMock.Object);

            await repository.AddAsync(library);

            fileServiceMock.Verify(x => x.Create(library.FullName));
        }
        public async void AddAsync_ShouldAddLibraryFullNameToSettings_AndSaveSettings()
        {
            var fileServiceMock        = new Mock <IFileService>();
            var settingsProviderMock   = new Mock <ISettingsProviderService>();
            var libraryFileServiceMock = new Mock <ILibraryFileService>();
            var settings = new Settings()
            {
                ImportedLibraries = new List <string>()
            };

            settingsProviderMock.Setup(x => x.Settings)
            .Returns(settings);
            settingsProviderMock.Setup(x => x.SaveSettingsAsync())
            .Verifiable();

            var library = GetLibrary();

            var repository = new LocalLibraryRepositoryStrategy(fileServiceMock.Object, settingsProviderMock.Object, libraryFileServiceMock.Object);

            await repository.AddAsync(library);

            Assert.Contains(library.FullName, settings.ImportedLibraries);
            settingsProviderMock.Verify(x => x.SaveSettingsAsync());
        }
        public async void FindAsync_ShouldReturnPartOfLibrariesListReturnedFromGetAllAsync_MatchingGivenPredicate()
        {
            var fileServiceMock        = new Mock <IFileService>();
            var settingsProviderMock   = new Mock <ISettingsProviderService>();
            var libraryFileServiceMock = new Mock <ILibraryFileService>();

            var libraries =
                new List <Library>()
            {
                new Library()
                {
                    FullName = "Tests\\path1.plib"
                },

                new Library()
                {
                    FullName = "Tests\\path2.plib"
                },

                new Library()
                {
                    FullName = "Tests\\path3.plib"
                }
            };

            var fileStreams =
                new List <Stream>()
            {
                new MemoryStream(),
                new MemoryStream(),
                new MemoryStream()
            };

            var settings = new Settings()
            {
                ImportedLibraries = new List <string>()
                {
                    libraries[0].FullName,
                    libraries[1].FullName,
                    libraries[2].FullName
                }
            };

            settingsProviderMock.Setup(x => x.Settings)
            .Returns(settings);

            fileServiceMock.Setup(x => x.OpenFile(libraries[0].FullName, It.IsAny <FileMode>(), It.IsAny <FileAccess>(), It.IsAny <FileShare>()))
            .Returns(fileStreams[0]);
            fileServiceMock.Setup(x => x.OpenFile(libraries[1].FullName, It.IsAny <FileMode>(), It.IsAny <FileAccess>(), It.IsAny <FileShare>()))
            .Returns(fileStreams[1]);
            fileServiceMock.Setup(x => x.OpenFile(libraries[2].FullName, It.IsAny <FileMode>(), It.IsAny <FileAccess>(), It.IsAny <FileShare>()))
            .Returns(fileStreams[2]);

            libraryFileServiceMock.Setup(x => x.ReadLibraryFromStreamAsync(fileStreams[0], It.IsAny <Origin>()))
            .Returns(Task.FromResult(libraries[0]));
            libraryFileServiceMock.Setup(x => x.ReadLibraryFromStreamAsync(fileStreams[1], It.IsAny <Origin>()))
            .Returns(Task.FromResult(libraries[1]));
            libraryFileServiceMock.Setup(x => x.ReadLibraryFromStreamAsync(fileStreams[2], It.IsAny <Origin>()))
            .Returns(Task.FromResult(libraries[2]));

            var repository = new LocalLibraryRepositoryStrategy(fileServiceMock.Object, settingsProviderMock.Object, libraryFileServiceMock.Object);
            var result     = await repository.FindAsync(x => x.FullName == libraries[0].FullName || x.FullName == libraries[1].FullName);

            Assert.Contains(libraries[0], result);
            Assert.Contains(libraries[1], result);
        }