예제 #1
0
        public void Fail_Deploy()
        {
            // Setup
            var parameters = GenerateRandomParameters();

            _projectMock.SetupAllProperties();
            _projectMock.Setup(p => p.Parameters).Returns(new ReadOnlyDictionary <string, IParameter>(parameters));

            _deployArgumentsMock.Setup(d => d.Catalog).Returns(Fakes.RandomString());
            _deployArgumentsMock.Setup(d => d.DeploymentFilePath).Returns(Fakes.RandomString());
            _deployArgumentsMock.Setup(d => d.Folder).Returns(Fakes.RandomString());
            _deployArgumentsMock.Setup(d => d.ProjectName).Returns(Fakes.RandomString());
            _deployArgumentsMock.Setup(d => d.ProjectPassword).Returns(Fakes.RandomString());
            _deployArgumentsMock.Setup(d => d.EraseSensitiveInfo).Returns(Fakes.RandomBool());
            _deployArgumentsMock.Setup(d => d.ServerInstance).Returns(Fakes.RandomString());
            _deployArgumentsMock.Setup(d => d.WorkingFolder).Returns(Fakes.RandomString());

            _catalogToolsMock.Setup(c => c.DeployProject(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <bool>(), It.IsAny <IDictionary <string, SensitiveParameter> >(), It.IsAny <MemoryStream>()))
            .Throws(new Exception("TEST"));

            _loggerMock.Setup(l => l.LogMessage(It.IsAny <string>())).Verifiable();

            // Execute
            var deployer  = new Deployer.Deployer(_loggerMock.Object, _projectMock.Object, _catalogToolsMock.Object);
            var exception = Record.Exception(() => deployer.Deploy(_deployArgumentsMock.Object));

            // Assert
            Assert.NotNull(exception);
            Assert.IsType <Exception>(exception);
            Assert.Equal("TEST", exception.Message);
        }
        public void Pass_New_AllArguments()
        {
            // Setup
            var workingFolder      = Fakes.RandomString();
            var deploymentFilePath = Fakes.RandomString();
            var serverInstance     = Fakes.RandomString();
            var catalog            = Fakes.RandomString();
            var folder             = Fakes.RandomString();
            var projectName        = Fakes.RandomString();
            var projectPassword    = Fakes.RandomString();
            var eraseSensitiveInfo = Fakes.RandomBool();


            // Execute
            var deployArguments = new DeployArguments(workingFolder, deploymentFilePath, serverInstance, catalog, folder, projectName, projectPassword, eraseSensitiveInfo);

            // Assert
            Assert.Equal(workingFolder, deployArguments.WorkingFolder);
            Assert.Equal(deploymentFilePath, deployArguments.DeploymentFilePath);
            Assert.Equal(serverInstance, deployArguments.ServerInstance);
            Assert.Equal(catalog, deployArguments.Catalog);
            Assert.Equal(folder, deployArguments.Folder);
            Assert.Equal(projectName, deployArguments.ProjectName);
            Assert.Equal(projectPassword, deployArguments.ProjectPassword);
            Assert.Equal(eraseSensitiveInfo, deployArguments.EraseSensitiveInfo);
        }
예제 #3
0
        public void Fail_Deploy_DeploymentFileNotFoundException()
        {
            // Setup
            var parameters = GenerateRandomParameters();

            _projectMock.SetupAllProperties();
            _projectMock.Setup(p => p.Parameters).Returns(new ReadOnlyDictionary <string, IParameter>(parameters));

            _deployArgumentsMock.Setup(d => d.Catalog).Returns(Fakes.RandomString());
            _deployArgumentsMock.Setup(d => d.Folder).Returns(Fakes.RandomString());
            _deployArgumentsMock.Setup(d => d.ProjectName).Returns(Fakes.RandomString());
            _deployArgumentsMock.Setup(d => d.ProjectPassword).Returns(Fakes.RandomString());
            _deployArgumentsMock.Setup(d => d.EraseSensitiveInfo).Returns(Fakes.RandomBool());
            _deployArgumentsMock.Setup(d => d.ServerInstance).Returns(Fakes.RandomString());
            _deployArgumentsMock.Setup(d => d.WorkingFolder).Returns(_workingFolder);

            var deployer = new Deployer.Deployer(_loggerMock.Object, _projectMock.Object, _catalogToolsMock.Object);

            // Execute
            var exception = Record.Exception(() => deployer.Deploy(_deployArgumentsMock.Object));

            // Assert
            Assert.NotNull(exception);
            Assert.IsType <DeploymentFileNotFoundException>(exception);
        }
예제 #4
0
        public void Pass_Deploy_ImplicitDeploymentFilePath()
        {
            // Setup
            var parameters = GenerateRandomParameters();

            _projectMock.SetupAllProperties();
            _projectMock.Setup(p => p.Parameters).Returns(new ReadOnlyDictionary <string, IParameter>(parameters));

            _deployArgumentsMock.Setup(d => d.Catalog).Returns(Fakes.RandomString());
            _deployArgumentsMock.Setup(d => d.Folder).Returns(Fakes.RandomString());
            _deployArgumentsMock.Setup(d => d.ProjectName).Returns(Fakes.RandomString());
            _deployArgumentsMock.Setup(d => d.ProjectPassword).Returns(Fakes.RandomString());
            _deployArgumentsMock.Setup(d => d.EraseSensitiveInfo).Returns(Fakes.RandomBool());
            _deployArgumentsMock.Setup(d => d.ServerInstance).Returns(Fakes.RandomString());
            _deployArgumentsMock.Setup(d => d.WorkingFolder).Returns(_workingFolder);

            var realDeploymentFilePath = Path.Combine(_workingFolder, $"{Fakes.RandomString()}.ispac");

            File.Create(realDeploymentFilePath).Close();

            string receivedDeploymentFilePath = null;

            _projectMock.Setup(p => p.LoadFromIspac(It.IsAny <string>(), It.IsAny <string>()))
            .Callback((string deploymentFilePath, string password) => receivedDeploymentFilePath = deploymentFilePath);

            var deployer = new Deployer.Deployer(_loggerMock.Object, _projectMock.Object, _catalogToolsMock.Object);

            // Execute
            deployer.Deploy(_deployArgumentsMock.Object);

            // Assert
            Assert.Equal(realDeploymentFilePath, receivedDeploymentFilePath);
        }
예제 #5
0
        public void Fail_ProcessRecord()
        {
            // Setup
            var workingFolder      = Fakes.RandomString();
            var deploymentFilePath = Fakes.RandomString();
            var serverInstance     = Fakes.RandomString();
            var catalog            = Fakes.RandomString();
            var folder             = Fakes.RandomString();
            var projectName        = Fakes.RandomString();
            var projectPassword    = Fakes.RandomString();
            var eraseSensitiveInfo = Fakes.RandomBool();

            IDeployArguments deployArguments = null;

            _deployerMock.Setup(d => d.Deploy(It.IsAny <IDeployArguments>())).Throws(new Exception("TEST"));

            // Execute
            var powershellCmd = new SsisDeployPowershell
            {
                DeploymentFilePath = deploymentFilePath,
                Folder             = folder,
                Catalog            = catalog,
                ServerInstance     = serverInstance,
                ProjectName        = projectName,
                EraseSensitiveInfo = eraseSensitiveInfo,
                ProjectPassword    = projectPassword
            };

            // Execute
            var exception = Record.Exception(() => powershellCmd.ProcessRecordInternal(_deployerMock.Object, workingFolder));

            Assert.NotNull(exception);
            Assert.IsType <Exception>(exception);
            Assert.Equal("TEST", exception.Message);
        }
예제 #6
0
        public void Fail_New_ProjectParameter_EmptyName()
        {
            // Setup
            var name         = string.Empty;
            var value        = Fakes.RandomString();
            var xmldoc       = new XmlDocument();
            var parameterXml = XmlGenerators.ProjectFileParameter(name, value, Fakes.RandomBool(), Fakes.RandomEnum <DataType>(), Fakes.RandomBool());

            xmldoc.LoadXml(parameterXml);

            // Execute
            var exception = Record.Exception(() => new ProjectParameter(Fakes.RandomString(), xmldoc.DocumentElement));

            // Assert
            Assert.NotNull(exception);
            Assert.IsType <InvalidXmlException>(exception);
            Assert.Equal(xmldoc.DocumentElement?.OuterXml, ((InvalidXmlException)exception).NodeXml);
            Assert.NotNull(exception.Message);
        }
예제 #7
0
        private static IDictionary <string, IParameter> GenerateRandomParameters()
        {
            var parameters = new Dictionary <string, IParameter>();

            var rnd = new Random();

            for (var cnt = 0; cnt < rnd.Next(30, 100); cnt++)
            {
                var parameterMock = new Mock <IParameter>();
                parameterMock.Setup(p => p.Name).Returns(Fakes.RandomString());
                parameterMock.Setup(p => p.Value).Returns(Fakes.RandomString());
                parameterMock.Setup(p => p.ParameterDataType).Returns(typeof(string));
                parameterMock.Setup(p => p.Sensitive).Returns(Fakes.RandomBool());
                parameterMock.Setup(p => p.Source).Returns(Fakes.RandomEnum <ParameterSource>());

                parameters.Add(parameterMock.Object.Name, parameterMock.Object);
            }
            return(parameters);
        }
예제 #8
0
        public void Pass_ProcessRecord()
        {
            // Setup
            var workingFolder      = Fakes.RandomString();
            var deploymentFilePath = Fakes.RandomString();
            var serverInstance     = Fakes.RandomString();
            var catalog            = Fakes.RandomString();
            var folder             = Fakes.RandomString();
            var projectName        = Fakes.RandomString();
            var projectPassword    = Fakes.RandomString();
            var eraseSensitiveInfo = Fakes.RandomBool();

            IDeployArguments deployArguments = null;

            _deployerMock.Setup(d => d.Deploy(It.IsAny <IDeployArguments>())).Callback((IDeployArguments da) => { deployArguments = da; });

            // Execute
            var powershellCmd = new SsisDeployPowershell
            {
                DeploymentFilePath = deploymentFilePath,
                Folder             = folder,
                Catalog            = catalog,
                ServerInstance     = serverInstance,
                ProjectName        = projectName,
                EraseSensitiveInfo = eraseSensitiveInfo,
                ProjectPassword    = projectPassword
            };

            powershellCmd.ProcessRecordInternal(_deployerMock.Object, workingFolder);

            // Assert
            Assert.Equal(workingFolder, deployArguments.WorkingFolder);
            Assert.Equal(deploymentFilePath, deployArguments.DeploymentFilePath);
            Assert.Equal(serverInstance, deployArguments.ServerInstance);
            Assert.Equal(catalog, deployArguments.Catalog);
            Assert.Equal(folder, deployArguments.Folder);
            Assert.Equal(projectName, deployArguments.ProjectName);
            Assert.Equal(projectPassword, deployArguments.ProjectPassword);
            Assert.Equal(eraseSensitiveInfo, deployArguments.EraseSensitiveInfo);
        }
        public void Fail_New_MissingFolder()
        {
            // Setup

            // Execute
            var exception = Record.Exception(() => new DeployArguments(null, null, Fakes.RandomString(), Fakes.RandomString(), null, Fakes.RandomString(), null, Fakes.RandomBool()));

            // Assert
            Assert.NotNull(exception);
            Assert.IsType <MissingRequiredArgumentException>(exception);
            Assert.True(((MissingRequiredArgumentException)exception).MissingArgument == nameof(DeployArguments.Folder));
        }
예제 #10
0
        internal static IEnumerable <object[]> ParameterData()
        {
            var protectionLevels = new[] { ProtectionLevel.DontSaveSensitive, ProtectionLevel.EncryptSensitiveWithPassword, ProtectionLevel.EncryptAllWithPassword };

            var testsCount = Fakes.RandomInt(1, 20);

            for (var cnt = 0; cnt < testsCount; cnt++)
            {
                var paramsCount = Fakes.RandomInt(0, 20);
                var paramsData  = new List <ParameterSetupData>();
                for (var cnt1 = 0; cnt1 < paramsCount; cnt1++)
                {
                    paramsData.Add(new ParameterSetupData()
                    {
                        Name      = Fakes.RandomString(),
                        Value     = Fakes.RandomString(),
                        DataType  = DataType.String,
                        Sensitive = Fakes.RandomBool()
                    });
                }

                var packages   = new List <string>();
                var packageNum = Fakes.RandomInt(0, 20);
                for (var cnt1 = 0; cnt1 < packageNum; cnt1++)
                {
                    packages.Add(Fakes.RandomString());
                }

                var connections    = new List <string>();
                var connectionsNum = Fakes.RandomInt(0, 20);
                for (var cnt1 = 0; cnt1 < connectionsNum; cnt1++)
                {
                    connections.Add(Fakes.RandomString());
                }



                //ProtectionLevel protectionLevel,
                //string versionMajor,
                //string versionMinor,
                //string versionComments,
                //string versionBuild,
                //string description,
                //string[] packages,
                //string[] connectionManagers,
                //ParameterSetupData[] parameters

                yield return(new object[]
                {
                    protectionLevels[Fakes.RandomInt(0, 299) / 100],
                    Fakes.RandomInt(0, 100),
                    Fakes.RandomInt(0, 100),
                    Fakes.RandomInt(0, 100) < 30 ? string.Empty : Fakes.RandomString(),
                    Fakes.RandomInt(0, 100),
                    Fakes.RandomInt(0, 100) < 30 ? string.Empty : Fakes.RandomString(),
                    packages.ToArray(),
                    connections.ToArray(),
                    paramsData.ToArray()
                });
            }
        }
예제 #11
0
        public void Pass_Deploy()
        {
            // Setup
            var parameters = GenerateRandomParameters();

            _projectMock.SetupAllProperties();
            _projectMock.Setup(p => p.Parameters).Returns(new ReadOnlyDictionary <string, IParameter>(parameters));

            _deployArgumentsMock.Setup(d => d.Catalog).Returns(Fakes.RandomString());
            _deployArgumentsMock.Setup(d => d.DeploymentFilePath).Returns(Fakes.RandomString());
            _deployArgumentsMock.Setup(d => d.Folder).Returns(Fakes.RandomString());
            _deployArgumentsMock.Setup(d => d.ProjectName).Returns(Fakes.RandomString());
            _deployArgumentsMock.Setup(d => d.ProjectPassword).Returns(Fakes.RandomString());
            _deployArgumentsMock.Setup(d => d.EraseSensitiveInfo).Returns(Fakes.RandomBool());
            _deployArgumentsMock.Setup(d => d.ServerInstance).Returns(Fakes.RandomString());
            _deployArgumentsMock.Setup(d => d.WorkingFolder).Returns(Fakes.RandomString());

            string passedCatalog            = null;
            string passedServerInstance     = null;
            string passedFolder             = null;
            string passedProjectName        = null;
            bool?  passedEraseSensitiveInfo = null;

            SensitiveParameter[] passedParameters = null;

            _catalogToolsMock.Setup(c => c.DeployProject(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <bool>(), It.IsAny <IDictionary <string, SensitiveParameter> >(), It.IsAny <MemoryStream>()))
            .Callback(
                (string connectionString, string folderName, string projectName, bool eraseSensitiveInfo, IDictionary <string, SensitiveParameter> parametersToDeploy,
                 MemoryStream projectStream) =>
            {
                var sb               = new SqlConnectionStringBuilder(connectionString);
                passedCatalog        = sb.InitialCatalog;
                passedServerInstance = sb.DataSource;

                passedFolder             = folderName;
                passedProjectName        = projectName;
                passedEraseSensitiveInfo = eraseSensitiveInfo;
                passedParameters         = parametersToDeploy.Values.ToArray();
            })
            .Verifiable();

            _loggerMock.Setup(l => l.LogMessage(It.IsAny <string>())).Verifiable();
            var deployer = new Deployer.Deployer(_loggerMock.Object, _projectMock.Object, _catalogToolsMock.Object);

            // Execute
            deployer.Deploy(_deployArgumentsMock.Object);

            // Assert
            _loggerMock.Verify(m => m.LogMessage(It.IsAny <string>()));
            Assert.Equal(_deployArgumentsMock.Object.Catalog, passedCatalog);
            Assert.Equal(_deployArgumentsMock.Object.ServerInstance, passedServerInstance);
            Assert.Equal(_deployArgumentsMock.Object.Folder, passedFolder);
            Assert.Equal(_deployArgumentsMock.Object.ProjectName, passedProjectName);
            Assert.NotNull(passedEraseSensitiveInfo);
            Assert.Equal(_deployArgumentsMock.Object.EraseSensitiveInfo, passedEraseSensitiveInfo.Value);

            foreach (var parameter in parameters.Where(p => p.Value.Sensitive))
            {
                Assert.True(passedParameters.Any(pp => pp.Name == parameter.Key && pp.Value == parameter.Value.Value && pp.DataType == parameter.Value.ParameterDataType));
            }
        }
예제 #12
0
        public void Pass_UpdateParameters()
        {
            // Setup
            var manifestMock = new Mock <IProjectManifest>();

            var manifestParameters = new[]
            {
                CreateParameter($"Project::{Fakes.RandomString()}", Fakes.RandomString(), Fakes.RandomBool(), ParameterSource.Original),
                CreateParameter($"Project::{Fakes.RandomString()}", Fakes.RandomString(), Fakes.RandomBool(), ParameterSource.Original),
            }.ToDictionary(p => p.Name, p => p);

            manifestMock.Setup(m => m.Parameters).Returns(manifestParameters);
            var manifest = manifestMock.Object;

            var projectParamsMock = new Mock <IProjectFile>();
            var projectParameters = new[]
            {
                CreateParameter($"Project::{Fakes.RandomString()}", Fakes.RandomString(), Fakes.RandomBool(), ParameterSource.Original),
                CreateParameter($"Project::{Fakes.RandomString()}", Fakes.RandomString(), Fakes.RandomBool(), ParameterSource.Original),
            }.ToDictionary(p => p.Name, p => p);

            projectParamsMock.Setup(m => m.Parameters).Returns(projectParameters);
            var projectParams = projectParamsMock.Object;

            // Execute
            var project = new Project();

            typeof(Project).GetField("_projectManifest", BindingFlags.NonPublic | BindingFlags.Instance)?.SetValue(project, manifest);
            typeof(Project).GetField("_projectParams", BindingFlags.NonPublic | BindingFlags.Instance)?.SetValue(project, projectParams);
            typeof(Project).GetField("_isLoaded", BindingFlags.NonPublic | BindingFlags.Instance)?.SetValue(project, true);

            // Assert
            Assert.Equal(4, project.Parameters.Count);
            foreach (var parameter in projectParameters)
            {
                var newValue = Fakes.RandomString();
                project.UpdateParameter(parameter.Value.Name, newValue, ParameterSource.Manual);

                Assert.True(project.Parameters.ContainsKey(parameter.Key));
                Assert.Equal(newValue, project.Parameters[parameter.Key].Value);
                Assert.Equal(ParameterSource.Manual, project.Parameters[parameter.Key].Source);
            }
            foreach (var parameter in manifestParameters)
            {
                var newValue = Fakes.RandomString();
                project.UpdateParameter(parameter.Value.Name, newValue, ParameterSource.Manual);

                Assert.True(project.Parameters.ContainsKey(parameter.Key));
                Assert.Equal(newValue, project.Parameters[parameter.Key].Value);
                Assert.Equal(ParameterSource.Manual, project.Parameters[parameter.Key].Source);
            }
        }