public void GenerateCommandList_withAFolderInTheRemoteRootThatIsNotInTheLocalRoot_shouldGenerateADeleteFolderCommand() { // Given the following local file structure: // root // | // +--> (no folder) // // And given the following remote file structure: // root // | // +--> Folder1 // // Then the generated command list should be: // DeleteFolder \Folder1 // Local file structure var localRoot = new FileItem(ItemType.Folder, @"\", 0); var localItems = new List <FileItem> { localRoot }; // Remote file structure // Root const string folderName = "Folder1"; var mockMegaNzNodeForRemoteRoot = new Mock <INode>(MockBehavior.Strict); var remoteRoot = new MegaNzItem(mockMegaNzNodeForRemoteRoot.Object, @"\", ItemType.Folder, @"\", 0); // File1 var mockMegaNzNodeForFile1 = new Mock <INode>(MockBehavior.Strict); var remoteFolder1 = new MegaNzItem(mockMegaNzNodeForFile1.Object, folderName, ItemType.Folder, @"\" + folderName, 0); var remoteItems = new List <MegaNzItem> { remoteRoot, remoteFolder1 }; // Act const string localBasePath = "c:\\testing\\"; var synchronizer = new CommandGenerator(localBasePath); var commandList = synchronizer.GenerateCommandList(localItems, remoteItems); // Assert commandList.Count.Should().Be(1); commandList[0].Should().BeOfType <DeleteFolderCommand>(); var deleteFolderCommand = (DeleteFolderCommand)commandList[0]; deleteFolderCommand.PathToDelete.Should().Be(remoteFolder1.Path); mockMegaNzNodeForRemoteRoot.VerifyAll(); mockMegaNzNodeForFile1.VerifyAll(); }
public void GenerateCommandList_withAFileInTheRemoteRootThatIsNotInTheLocalRoot_shouldGenerateADeleteCommand() { // Given the following local file structure: // root // | // (no file in the root) // // And given the following remote file structure: // root // | // +--> File1.jpeg - Last Modif 2016-1-1-0-0-0 // // Then the generated command list should be: // - Delete \File1.jpeg // Local file structure var localRoot = new FileItem(ItemType.Folder, @"\", 0); var localItems = new List <FileItem> { localRoot }; // Remote file structure // Root var mockMegaNzNodeForRemoteRoot = new Mock <INode>(MockBehavior.Strict); var remoteRoot = new MegaNzItem(mockMegaNzNodeForRemoteRoot.Object, @"\", ItemType.Folder, @"\", 0); // File1 var lastModifiedDate = new DateTime(2017, 1, 1, 0, 0, 0); var mockMegaNzNodeForFile1 = new Mock <INode>(MockBehavior.Strict); var remoteFile1 = new MegaNzItem(mockMegaNzNodeForFile1.Object, "File1.jpeg", ItemType.File, @"\\File1.jpeg", 1024, lastModifiedDate); var remoteItems = new List <MegaNzItem> { remoteRoot, remoteFile1 }; // Act var localBasePath = "c:\\testing\\"; var synchronizer = new CommandGenerator(localBasePath); var commandList = synchronizer.GenerateCommandList(localItems, remoteItems); // Assert commandList.Count.Should().Be(1); commandList[0].Should().BeOfType <DeleteFileCommand>(); var deleteCommand = (DeleteFileCommand)commandList[0]; deleteCommand.PathToDelete.Should().Be(remoteFile1.Path); deleteCommand.LastModifiedDate.Should().Be(lastModifiedDate); mockMegaNzNodeForRemoteRoot.VerifyAll(); mockMegaNzNodeForFile1.VerifyAll(); }
public void GenerateCommandList_withAFileInTheLocalRootThatIsTheSameInTheRemoteRoot_shouldNotGenerateAnyCommand() { // Given the following local file structure: // root // | // +--> File1.jpeg - Last Modif = 2016-1-1-0-0-0 - Size = 1024 // // And given the following remote file structure: // root // | // +--> File1.jpeg - Last Modif = 2016-1-1-0-0-0 - Size = 1024 // // Then the generated an empty command list const string fileName = "File1.jpeg"; const long size = 1024; var lastModifiedDate = new DateTime(2016, 1, 1, 0, 0, 0); // Local file structure var localRoot = new FileItem(ItemType.Folder, @"\", 0); var localFile1 = new FileItem(ItemType.File, @"\" + fileName, size, lastModifiedDate); var localItems = new List <FileItem> { localRoot, localFile1 }; // Remote file structure // Root var mockMegaNzNodeForRemoteRoot = new Mock <INode>(MockBehavior.Strict); var remoteRoot = new MegaNzItem(mockMegaNzNodeForRemoteRoot.Object, @"\", ItemType.Folder, @"\", 0); // File1 var mockMegaNzNodeForFile1 = new Mock <INode>(MockBehavior.Strict); var remoteFile1 = new MegaNzItem(mockMegaNzNodeForFile1.Object, fileName, ItemType.File, @"\" + fileName, size, lastModifiedDate); var remoteItems = new List <MegaNzItem> { remoteRoot, remoteFile1 }; // Act const string localBasePath = "c:\\testing\\"; var synchronizer = new CommandGenerator(localBasePath); var commandList = synchronizer.GenerateCommandList(localItems, remoteItems); // Assert commandList.Should().BeEmpty(); mockMegaNzNodeForRemoteRoot.VerifyAll(); mockMegaNzNodeForFile1.VerifyAll(); }
public void GenerateCommandList_withAFolderInTheLocalRootThatIsInTheRemoteRoot_shouldNotGenerateAnyCommand() { // Given the following local file structure: // root // | // +--> Folder1 // // And given the following remote file structure: // root // | // +--> Folder1 // // Then the generated command list should be empty // Local file structure const string folderName = "Folder1"; var localRoot = new FileItem(ItemType.Folder, @"\", 0); var localFolder1 = new FileItem(ItemType.Folder, @"\" + folderName, 0); var localItems = new List <FileItem> { localRoot, localFolder1 }; // Remote file structure // Root var mockMegaNzNodeForRemoteRoot = new Mock <INode>(MockBehavior.Strict); var remoteRoot = new MegaNzItem(mockMegaNzNodeForRemoteRoot.Object, @"\", ItemType.Folder, @"\", 0); // Folder1 var mockMegaNzNodeForFile1 = new Mock <INode>(MockBehavior.Strict); var remoteFolder1 = new MegaNzItem(mockMegaNzNodeForFile1.Object, folderName, ItemType.Folder, @"\" + folderName, 0); var remoteItems = new List <MegaNzItem> { remoteRoot, remoteFolder1 }; // Act const string localBasePath = "c:\\testing\\"; var generator = new CommandGenerator(localBasePath); var commandList = generator.GenerateCommandList(localItems, remoteItems); // Assert commandList.Should().BeEmpty(); mockMegaNzNodeForRemoteRoot.VerifyAll(); mockMegaNzNodeForFile1.VerifyAll(); }
private static void ProcessAccount(Account account, ILogger logger) { logger.Trace("Reading nodes from the folder {0}", account.LocalRoot); var itemListFromFileSystem = GenerateListFromLocalFolder(account.LocalRoot, account.LocalRoot); MegaApiClient client = new MegaApiClient(); client.Login(account.Username, account.Password); var itemListFromMegaNz = GenerateListFromMegaNz(client).ToList(); var commandGenerator = new CommandGenerator(account.LocalRoot); var commandList = commandGenerator.GenerateCommandList(itemListFromFileSystem, itemListFromMegaNz); if (!commandList.Any()) { logger.Trace("Nothing to do here. Exiting....."); return; } // Showing the commands and asking if continue ShowCommandList(commandList); if (commandList.OfType <DeleteFileCommand>().Any()) { Console.WriteLine("There are some files to delete. Continue? (y/n)"); var continueAnswer = Console.ReadLine(); if (continueAnswer.ToLower() != "y") { logger.Trace("Exiting..."); } } // Executing the commands in the list var fileManager = new FileManager(); var progressNotifier = new ProgressNotifier(new ConsoleWrapper()); var executor = new CommandExecutor(client, logger); var megaNzItemCollection = new MegaNzItemCollection(itemListFromMegaNz); executor.Execute(commandList, megaNzItemCollection, fileManager, progressNotifier); }
public void GenerateCommandList_withAFileInFolderInTheLocalRootThatIsOlderThanTheSameInTheRemoteFolder_shouldGenerateADeleteCommandAndAnUpdateCommand() { // Given the following local file structure: // root // | // +--> Folder1 // | // +--> File1.jpeg - Last Modif = 2015-1-1-0-0-0 - Size = 1024 // // And given the following remote file structure: // root // | // +--> Folder1 // | // +--> File1.jpeg - Last Modif = 2016-1-1-0-0-0 - Size = 1024 // // Then the generated command list should be: // Delete \Folder1\File1.jpeg // Upload \Folder1\File1.jpeg const string fileName = "File1.jpeg"; const long size = 1024; const string folderName = "Folder1"; var localLastModifiedDate = new DateTime(2015, 1, 1, 0, 0, 0); // Local file structure var localRoot = new FileItem(ItemType.Folder, @"\", 0); var localFolder1 = new FileItem(ItemType.Folder, @"\" + folderName, 0); var localFile1 = new FileItem(ItemType.File, @"\" + folderName + @"\" + fileName, size, localLastModifiedDate); var localItems = new List <FileItem> { localRoot, localFolder1, localFile1 }; // Remote file structure // Root var mockMegaNzNodeForRemoteRoot = new Mock <INode>(MockBehavior.Strict); var remoteRoot = new MegaNzItem(mockMegaNzNodeForRemoteRoot.Object, @"\", ItemType.Folder, @"\", 0); // Folder1 var mockMegaNzNodeForRemoteFolder1 = new Mock <INode>(MockBehavior.Strict); var remoteFolder1 = new MegaNzItem(mockMegaNzNodeForRemoteFolder1.Object, folderName, ItemType.Folder, @"\" + folderName, 0); // File1 var mockMegaNzNodeForRemoteFile1 = new Mock <INode>(MockBehavior.Strict); var remoteLastModifiedDate = localLastModifiedDate.AddYears(1); var remoteFile1 = new MegaNzItem(mockMegaNzNodeForRemoteFile1.Object, fileName, ItemType.File, @"\" + folderName + @"\" + fileName, size, remoteLastModifiedDate); var remoteItems = new List <MegaNzItem> { remoteRoot, remoteFolder1, remoteFile1 }; // Act const string localBasePath = "c:\\testing\\"; var synchronizer = new CommandGenerator(localBasePath); var commandList = synchronizer.GenerateCommandList(localItems, remoteItems); // Assert commandList.Count.Should().Be(2); commandList[0].Should().BeOfType <DeleteFileCommand>(); var deleteFileCommand = (DeleteFileCommand)commandList[0]; deleteFileCommand.PathToDelete.Should().Be(@"\Folder1\File1.jpeg"); deleteFileCommand.LastModifiedDate.Should().Be(remoteLastModifiedDate); commandList[1].Should().BeOfType <UploadFileCommand>(); var uploadFileCommand = (UploadFileCommand)commandList[1]; uploadFileCommand.SourcePath.Should().Be(localBasePath + folderName + @"\" + fileName); uploadFileCommand.DestinationPath.Should().Be(@"\" + folderName + @"\"); // Because we need the backslash at the end of the path for a folder uploadFileCommand.LastModifiedDate.Should().Be(localLastModifiedDate); mockMegaNzNodeForRemoteRoot.VerifyAll(); mockMegaNzNodeForRemoteFolder1.VerifyAll(); mockMegaNzNodeForRemoteFile1.VerifyAll(); }
public void GenerateCommandList_withAFileInFolderInTheLocalRootThatIsNotInTheRemoteFolder_shouldGenerateAnUploadCommand() { // Given the following local file structure: // root // | // +--> Folder1 // | // +--> File1.jpeg - Last Modif 2016-1-1-0-0-0 // // And given the following remote file structure: // root // | // +--> Folder1 // | // +--> (no file in the root) // // Then the generated command list should be: // - Upload \root\Folder1\File1.jpeg // Local file structure const string folderName = "Folder1"; var lastModifiedDate = new DateTime(2016, 1, 1, 0, 0, 0); var localRoot = new FileItem(ItemType.Folder, @"\", 0); var localFolder1 = new FileItem(ItemType.Folder, @"\" + folderName, 0); var localFile1 = new FileItem(ItemType.File, @"\" + folderName + @"\File1.jpeg", 1024, lastModifiedDate); var localItems = new List <FileItem> { localRoot, localFolder1, localFile1 }; // Remote file structure // Root var mockMegaNzNodeForRemoteRoot = new Mock <INode>(MockBehavior.Strict); var remoteRoot = new MegaNzItem(mockMegaNzNodeForRemoteRoot.Object, @"\", ItemType.Folder, @"\", 0); // Folder1 var mockMegaNzNodeForFolder1 = new Mock <INode>(MockBehavior.Strict); var remoteFolder1 = new MegaNzItem(mockMegaNzNodeForFolder1.Object, folderName, ItemType.Folder, @"\" + folderName, 0); var remoteItems = new List <MegaNzItem> { remoteRoot, remoteFolder1 }; // Act const string localBasePath = "c:\\testing\\"; var generator = new CommandGenerator(localBasePath); var commandList = generator.GenerateCommandList(localItems, remoteItems); // Assert commandList.Count.Should().Be(1); commandList[0].Should().BeOfType <UploadFileCommand>(); var uploadCommand = (UploadFileCommand)commandList[0]; uploadCommand.SourcePath.Should().Be(@"c:\testing\Folder1\File1.jpeg"); uploadCommand.DestinationPath.Should().Be(@"\Folder1\"); // We must have the backslash at the end of the path for a folder uploadCommand.LastModifiedDate.Should().Be(lastModifiedDate); mockMegaNzNodeForRemoteRoot.VerifyAll(); mockMegaNzNodeForFolder1.VerifyAll(); }
public void GenerateCommandList_withAFileInTheLocalRootThatHasDifferentSizeThanTheSameInTheRemoteRoot_shouldGenerateADeleteCommandAndAnUpdateCommand() { // Given the following local file structure: // root // | // +--> File1.jpeg - Last Modif = 2016-1-1-0-0-0 - Size = 2048 // // And given the following remote file structure: // root // | // +--> File1.jpeg - Last Modif = 2016-1-1-0-0-0 - Size = 1024 // // Then the generated command list should be: // Delete \File1.jpeg // Upload \File1.jpeg const string fileName = "File1.jpeg"; const long size = 1024; var lastModifiedDate = new DateTime(2016, 1, 1, 0, 0, 0); // Local file structure var localRoot = new FileItem(ItemType.Folder, @"\", 0); var localFile1 = new FileItem(ItemType.File, @"\" + fileName, size, lastModifiedDate); var localItems = new List <FileItem> { localRoot, localFile1 }; // Remote file structure var mockMegaNzNodeForRemoteRoot = new Mock <INode>(MockBehavior.Strict); var remoteRoot = new MegaNzItem(mockMegaNzNodeForRemoteRoot.Object, @"\", ItemType.Folder, @"\", 0); // File1 var mockMegaNzNodeForFile1 = new Mock <INode>(MockBehavior.Strict); var remoteFile1 = new MegaNzItem(mockMegaNzNodeForFile1.Object, fileName, ItemType.File, @"\" + fileName, size * 2, lastModifiedDate); var remoteItems = new List <MegaNzItem> { remoteRoot, remoteFile1 }; // Act const string localBasePath = "c:\\testing\\"; var synchronizer = new CommandGenerator(localBasePath); var commandList = synchronizer.GenerateCommandList(localItems, remoteItems); // Assert commandList.Count.Should().Be(2); commandList[0].Should().BeOfType <DeleteFileCommand>(); var deleteCommand = (DeleteFileCommand)commandList[0]; deleteCommand.PathToDelete.Should().Be(remoteFile1.Path); deleteCommand.LastModifiedDate.Should().Be(lastModifiedDate); commandList[1].Should().BeOfType <UploadFileCommand>(); var uploadCommand = (UploadFileCommand)commandList[1]; uploadCommand.DestinationPath.Should().Be(remoteRoot.Path); uploadCommand.SourcePath.Should().Be(localBasePath.TrimEnd('\\') + localFile1.Path); uploadCommand.LastModifiedDate.Should().Be(lastModifiedDate); mockMegaNzNodeForRemoteRoot.VerifyAll(); mockMegaNzNodeForFile1.VerifyAll(); }