public void TryLoadPathsForScriptCreationAsync_ArgumentNullException_Project()
        {
            // Arrange
            var vsMock                 = Mock.Of <IVersionService>();
            var fsaMock                = Mock.Of <IFileSystemAccess>();
            var loggerMock             = Mock.Of <ILogger>();
            ISqlProjectService service = new SqlProjectService(vsMock, fsaMock, loggerMock);

            // Act & Assert
            // ReSharper disable AssignNullToNotNullAttribute
            Assert.Throws <ArgumentNullException>(() => service.TryLoadPathsForScriptCreationAsync(null, null, null, false));
            // ReSharper restore AssignNullToNotNullAttribute
        }
        public async Task TryLoadPathsForScriptCreationAsync_SuccessfullyCreated_SpecificVersion_NoPublishProfile_Async()
        {
            // Arrange
            var project = new SqlProject("a", @"C:\TestProject\TestProject.sqlproj", "c");

            project.ProjectProperties.SqlTargetName = "TestSqlTarget";
            project.ProjectProperties.DacVersion    = new Version(40, 23, 4, 4948);
            var configuration = new ConfigurationModel
            {
                ArtifactsPath      = "_TestDeployment",
                PublishProfilePath = ConfigurationModel.UseSinglePublishProfileSpecialKeyword,
                CreateDocumentationWithScriptCreation = true
            };
            var vsMock = new Mock <IVersionService>();

            vsMock.Setup(m => m.FormatVersion(It.IsNotNull <Version>(), configuration))
            .Returns((Version version,
                      ConfigurationModel c) => version.ToString());
            var fsaMock = new Mock <IFileSystemAccess>();

            fsaMock.Setup(m => m.GetFilesIn(@"C:\TestProject", "*.publish.xml"))
            .Returns(new string[0]);
            var loggerMock             = new Mock <ILogger>();
            ISqlProjectService service = new SqlProjectService(vsMock.Object, fsaMock.Object, loggerMock.Object);

            // Act
            var paths = await service.TryLoadPathsForScriptCreationAsync(project, configuration, new Version(40, 23, 3, 4932), false);

            // Assert
            Assert.IsNotNull(paths);
            loggerMock.Verify(m => m.LogErrorAsync(It.IsAny <string>()), Times.Never);
            loggerMock.Verify(m => m.LogErrorAsync(It.IsAny <Exception>(), It.IsAny <string>()), Times.Never);
            Assert.AreEqual(@"C:\TestProject", paths.Directories.ProjectDirectory);
            Assert.AreEqual(string.Empty, paths.DeploySources.PublishProfilePath);
            Assert.AreEqual(@"C:\TestProject\_TestDeployment\latest", paths.Directories.LatestArtifactsDirectory);
            Assert.AreEqual(@"C:\TestProject\_TestDeployment\40.23.4.4948", paths.Directories.NewArtifactsDirectory);
            Assert.AreEqual(@"C:\TestProject\_TestDeployment\40.23.4.4948\TestSqlTarget.dacpac", paths.DeploySources.NewDacpacPath);
            Assert.AreEqual(@"C:\TestProject\_TestDeployment\40.23.3.4932\TestSqlTarget.dacpac", paths.DeploySources.PreviousDacpacPath);
            Assert.AreEqual(@"C:\TestProject\_TestDeployment\40.23.4.4948\TestSqlTarget_40.23.3.4932_40.23.4.4948.sql", paths.DeployTargets.DeployScriptPath);
            Assert.AreEqual(@"C:\TestProject\_TestDeployment\40.23.4.4948\TestSqlTarget_40.23.3.4932_40.23.4.4948.xml", paths.DeployTargets.DeployReportPath);
        }
        public async Task TryLoadPathsForScriptCreationAsync_Error_NoProjectDirectory_Async()
        {
            // Arrange
            var project             = new SqlProject("a", @"C:\", "c");
            var configuration       = new ConfigurationModel();
            var vsMock              = Mock.Of <IVersionService>();
            var fsaMock             = Mock.Of <IFileSystemAccess>();
            var loggedErrorMessages = new List <string>();
            var loggerMock          = new Mock <ILogger>();

            loggerMock.Setup(m => m.LogErrorAsync(It.IsAny <string>()))
            .Callback((string message) => loggedErrorMessages.Add(message))
            .Returns(Task.CompletedTask);
            ISqlProjectService service = new SqlProjectService(vsMock, fsaMock, loggerMock.Object);

            // Act
            var paths = await service.TryLoadPathsForScriptCreationAsync(project, configuration, new Version(1, 0), false);

            // Assert
            Assert.IsNull(paths);
            Assert.AreEqual(1, loggedErrorMessages.Count);
            Assert.AreEqual(@"Cannot get project directory for C:\", loggedErrorMessages[0]);
        }