public void ScanReturnValues_ForExtraNewlinesAndWhiteSpace_Ignores()
        {
            // Setup
            var scanner   = new StoredProcedureReturnValueScanner();
            var sqlParser = new TSql120Parser(false);
            var outReport = new StoredProcedureReport
            {
                ReturnValues = new List <ReturnSqlReportEntry>()
            };

            var sql       = SqlSamples.LotsOfWhitespace;
            var parsedSql =
                sqlParser.Parse(new StringReader(sql), out var parseErrors);

            var script            = parsedSql as TSqlScript;
            var createSpStatement =
                script?.Batches[0].Statements[0] as CreateProcedureStatement;

            // Act
            scanner.ScanReturnValues(outReport, createSpStatement);

            // Assert
            Assert.That(parseErrors.Count, Is.EqualTo(0));
            Assert.That(outReport.ReturnValues.Count, Is.EqualTo(2));
            Assert.That(outReport.ReturnValues[0].ReturnValueName, Is.EqualTo("'Hello' AS SomeName"));
            Assert.That(outReport.ReturnValues[1].ReturnValueName, Is.EqualTo("'Word555' AS SomeWord"));
        }
        public void SerializeSqlReportElement(StoredProcedureReport entry)
        {
            var paramSerializer =
                new XmlSerializer(typeof(StoredProcedureReport));

            paramSerializer.Serialize(_xmlWriter, entry, _ns);
        }
Exemple #3
0
        private void CheckForMissingReturnValues(StoredProcedureReport masterSp,
                                                 StoredProcedureReport newSp, List <string> errors)
        {
            var count            = 1;
            var isChangedLiteral = false;

            foreach (var masterReturnValue in masterSp.ReturnValues)
            {
                var newReturnValue = newSp.ReturnValues.FirstOrDefault(
                    x => Regex.Replace(x.ReturnValueName, @"\s+", " ") == Regex.Replace(masterReturnValue.ReturnValueName, @"\s+", " "));

                if (masterReturnValue.IsLiteral)
                {
                    if (newSp.ReturnValues.Count >= count &&
                        newSp.ReturnValues[count - 1].IsLiteral &&
                        newSp.ReturnValues[count - 1].ColumnNamedAs == masterReturnValue.ColumnNamedAs)
                    {
                        isChangedLiteral = true;
                    }
                }

                if (newReturnValue == null &&
                    !isChangedLiteral)
                {
                    errors.Add($"{masterSp.SpUniqueName}\\{masterReturnValue.ReturnValueName}|existing return value is missing from new code");
                }

                count++;
            }
        }
        public void CompareReports_ForDuplicatedSp_ReturnsError()
        {
            // Setup
            var comparer = new ParamReportComparer();

            var sp1 = new StoredProcedureReport("DB1", "dbo", "LoadSomething1")
            {
                Parameters = new List <ParamSqlReportEntry>
                {
                    new ParamSqlReportEntry("@id", "INT", "N/A", false),
                    new ParamSqlReportEntry("@data", "VARCHAR", "200", true)
                }
            };

            var masterReport = new SqlReport
            {
                StoredProcedures = new List <StoredProcedureReport>
                {
                    sp1
                }
            };

            var sp2 = new StoredProcedureReport("DB1", "dbo", "LoadSomething1")
            {
                Parameters = new List <ParamSqlReportEntry>
                {
                    new ParamSqlReportEntry("@id", "INT", "N/A", false),
                    new ParamSqlReportEntry("@data", "VARCHAR", "200", true)
                }
            };

            var sp3 = new StoredProcedureReport("DB1", "dbo", "LoadSomething1")
            {
                Parameters = new List <ParamSqlReportEntry>
                {
                    new ParamSqlReportEntry("@id", "INT", "N/A", false),
                    new ParamSqlReportEntry("@data", "VARCHAR", "200", true)
                }
            };

            var newReport = new SqlReport
            {
                StoredProcedures = new List <StoredProcedureReport>
                {
                    sp2,
                    sp3
                }
            };

            var errors = new List <string>();

            // Act
            comparer.CompareReports(masterReport, newReport, errors);

            // Assert
            Assert.That(errors.Count, Is.EqualTo(1));
            Assert.That(errors[0], Is.EqualTo("DB1\\dbo\\LoadSomething1\\|sp defined 2 times"));
        }
        public void CompareReports_ForNewNonDefaultInNewSp_DoesNotReturnError()
        {
            // Setup
            var comparer = new ParamReportComparer();

            var sp1 = new StoredProcedureReport("DB1", "dbo", "LoadSomething1")
            {
                Parameters = new List <ParamSqlReportEntry>
                {
                    new ParamSqlReportEntry("@id", "INT", "N/A", false),
                    new ParamSqlReportEntry("@data", "VARCHAR", "200", true)
                }
            };

            var masterReport = new SqlReport
            {
                StoredProcedures = new List <StoredProcedureReport>
                {
                    sp1
                }
            };

            var sp2 = new StoredProcedureReport("DB1", "dbo", "LoadSomething1")
            {
                Parameters = new List <ParamSqlReportEntry>
                {
                    new ParamSqlReportEntry("@id", "INT", "N/A", false),
                    new ParamSqlReportEntry("@data", "VARCHAR", "200", true)
                }
            };

            var sp3 = new StoredProcedureReport("DB1", "dbo", "LoadSomething2")
            {
                Parameters = new List <ParamSqlReportEntry>
                {
                    new ParamSqlReportEntry("@id", "INT", "N/A", false)
                }
            };


            var newReport = new SqlReport
            {
                StoredProcedures = new List <StoredProcedureReport>
                {
                    sp2,
                    sp3
                }
            };

            var errors = new List <string>();

            // Act
            comparer.CompareReports(masterReport, newReport, errors);

            // Assert
            Assert.That(errors.Count, Is.EqualTo(0));
        }
        private void CheckForNewNonDefaultedParameters(StoredProcedureReport masterSp,
                                                       StoredProcedureReport newSp, List <string> errors)
        {
            var newParams =
                newSp.Parameters.Where(
                    x => masterSp.Parameters.All(y => x.ParameterName != y.ParameterName));

            errors.AddRange(from newParam in newParams where !newParam.IsDefaulted select $"{newSp.SpUniqueName}\\{newParam.ParameterName}|new parameter has no default");
        }
        public void CompareReports_ForMultipleSelectsWithNewValuesAtEnd_ReturnsNoErrors()
        {
            // Setup
            var returnComparer = new ReturnReportComparer();
            var errors         = new List <string>();

            var sp1 = new StoredProcedureReport("DB1", "dbo", "StoredProcedure1")
            {
                ReturnValues = new List <ReturnSqlReportEntry>()
                {
                    new ReturnSqlReportEntry("C.SomeAmount", 1, false, ""),
                    new ReturnSqlReportEntry("C.Name", 1, false, ""),
                    new ReturnSqlReportEntry("C.Id", 1, false, ""),
                    new ReturnSqlReportEntry("C.SomeAmountExt", 2, false, ""),
                    new ReturnSqlReportEntry("C.NameExt", 2, false, ""),
                    new ReturnSqlReportEntry("C.IdExt", 2, false, "")
                }
            };

            var masterReport = new SqlReport
            {
                StoredProcedures = new List <StoredProcedureReport>
                {
                    sp1
                }
            };

            var sp2 = new StoredProcedureReport("DB1", "dbo", "StoredProcedure1")
            {
                ReturnValues = new List <ReturnSqlReportEntry>()
                {
                    new ReturnSqlReportEntry("C.SomeAmount", 1, false, ""),
                    new ReturnSqlReportEntry("C.Name", 1, false, ""),
                    new ReturnSqlReportEntry("C.Id", 1, false, ""),
                    new ReturnSqlReportEntry("C.SomethingElse", 1, false, ""),
                    new ReturnSqlReportEntry("C.SomeAmountExt", 2, false, ""),
                    new ReturnSqlReportEntry("C.NameExt", 2, false, ""),
                    new ReturnSqlReportEntry("C.IdExt", 2, false, ""),
                    new ReturnSqlReportEntry("C.SomethingElseExt", 2, false, "")
                }
            };

            var newReport = new SqlReport
            {
                StoredProcedures = new List <StoredProcedureReport>
                {
                    sp2
                }
            };

            // Act
            returnComparer.CompareReports(masterReport, newReport, errors);

            // Assert
            Assert.That(errors.Count, Is.EqualTo(0));
        }
        private void CheckParameterOrder(StoredProcedureReport masterSp,
                                         StoredProcedureReport newSp, List <string> errors)
        {
            if (newSp.Parameters.Count < masterSp.Parameters.Count)
            {
                return;
            }

            errors.AddRange(masterSp.Parameters.Where((t, i) => t.ParameterName != newSp.Parameters[i].ParameterName)
                            .Select(t => $"{masterSp.SpUniqueName}\\{t.ParameterName}|existing parameter is out of order"));
        }
Exemple #9
0
        public void ScanReturnValues(StoredProcedureReport spReport,
                                     CreateProcedureStatement sp)
        {
            var returnValueVisitor = new SelectElementVisitor();
            var spText             = ParseSpText(sp);

            sp.Accept(returnValueVisitor);

            foreach (var returnValue in returnValueVisitor.ReturnValues)
            {
                ParseSelectElement(returnValue, spText, spReport);
            }
        }
        public void CompareReports_ForRenameStringLiteral_ReturnsError()
        {
            // Setup
            var returnComparer = new ReturnReportComparer();
            var errors         = new List <string>();

            var sp1 = new StoredProcedureReport("DB1", "dbo", "StoredProcedure1")
            {
                ReturnValues = new List <ReturnSqlReportEntry>()
                {
                    new ReturnSqlReportEntry("'Hello' AS TheName", 1, true, "TheName"),
                    new ReturnSqlReportEntry("C.Name", 1, false, ""),
                    new ReturnSqlReportEntry("C.Id", 1, false, "")
                }
            };

            var masterReport = new SqlReport
            {
                StoredProcedures = new List <StoredProcedureReport>
                {
                    sp1
                }
            };

            var sp2 = new StoredProcedureReport("DB1", "dbo", "StoredProcedure1")
            {
                ReturnValues = new List <ReturnSqlReportEntry>()
                {
                    new ReturnSqlReportEntry("'Hello' AS DifferentName", 1, true, "DifferentName"),
                    new ReturnSqlReportEntry("C.Name", 1, false, ""),
                    new ReturnSqlReportEntry("C.Id", 1, false, "")
                }
            };

            var newReport = new SqlReport
            {
                StoredProcedures = new List <StoredProcedureReport>
                {
                    sp2
                }
            };

            // Act
            returnComparer.CompareReports(masterReport, newReport, errors);

            // Assert
            Assert.That(errors.Count, Is.EqualTo(1));
            Assert.That(errors[0], Is.EqualTo("DB1\\dbo\\StoredProcedure1\\'Hello' AS TheName|existing return value is missing from new code"));
        }
        public void CompareReports_ForChangeFieldCase_ReturnsError()
        {
            // Setup
            var returnComparer = new ReturnReportComparer();
            var errors         = new List <string>();

            var sp1 = new StoredProcedureReport("DB1", "dbo", "StoredProcedure1")
            {
                ReturnValues = new List <ReturnSqlReportEntry>()
                {
                    new ReturnSqlReportEntry("C.Id", 1, false, ""),
                    new ReturnSqlReportEntry("C.Phone", 1, false, ""),
                    new ReturnSqlReportEntry("C.Name", 1, false, "")
                }
            };

            var masterReport = new SqlReport
            {
                StoredProcedures = new List <StoredProcedureReport>
                {
                    sp1
                }
            };

            var sp2 = new StoredProcedureReport("DB1", "dbo", "StoredProcedure1")
            {
                ReturnValues = new List <ReturnSqlReportEntry>()
                {
                    new ReturnSqlReportEntry("C.Id", 1, false, ""),
                    new ReturnSqlReportEntry("C.PhonE", 1, false, ""),
                    new ReturnSqlReportEntry("C.Name", 1, false, "")
                }
            };

            var newReport = new SqlReport
            {
                StoredProcedures = new List <StoredProcedureReport>
                {
                    sp2
                }
            };

            // Act
            returnComparer.CompareReports(masterReport, newReport, errors);

            // Assert
            Assert.That(errors.Count, Is.EqualTo(1));
            Assert.That(errors[0], Is.EqualTo("DB1\\dbo\\StoredProcedure1\\C.Phone|existing return value is missing from new code"));
        }
        private void CheckParameterType(StoredProcedureReport masterSp,
                                        StoredProcedureReport newSp, List <string> errors)
        {
            var masterBigIntParameters = masterSp.Parameters
                                         .Where(x => x.ParameterType.ToUpper() == SqlDbType.BigInt.ToUpperString());

            var newShrunkParameters =
                from newParam in newSp.Parameters
                join oldParam in masterBigIntParameters
                on newParam.ParameterName equals oldParam.ParameterName
                where newParam.ParameterType.ToUpper() != SqlDbType.BigInt.ToUpperString()
                select newParam;

            errors.AddRange(newShrunkParameters.Select(shrunkParameter => $"{masterSp.SpUniqueName}\\{shrunkParameter.ParameterName}|existing BIGINT parameter was changed to {shrunkParameter.ParameterType}"));
        }
        public void CompareReports_ForBigIntToTinyInt_ReturnsError()
        {
            // Setup
            var comparer = new ParamReportComparer();

            var sp1 = new StoredProcedureReport("DB1", "dbo", "LoadSomething1")
            {
                Parameters = new List <ParamSqlReportEntry>
                {
                    new ParamSqlReportEntry("@id", "bigint", "N/A", false),
                    new ParamSqlReportEntry("@data", "VARCHAR", "200", true)
                }
            };

            var masterReport = new SqlReport
            {
                StoredProcedures = new List <StoredProcedureReport>
                {
                    sp1
                }
            };

            var sp2 = new StoredProcedureReport("DB1", "dbo", "LoadSomething1")
            {
                Parameters = new List <ParamSqlReportEntry>
                {
                    new ParamSqlReportEntry("@id", "TINYINT", "N/A", false),
                    new ParamSqlReportEntry("@data", "VARCHAR", "200", true)
                }
            };

            var newReport = new SqlReport
            {
                StoredProcedures = new List <StoredProcedureReport>
                {
                    sp2
                }
            };

            var errors = new List <string>();

            // Act
            comparer.CompareReports(masterReport, newReport, errors);

            // Assert
            Assert.That(errors.Count, Is.EqualTo(1));
            Assert.That(errors[0], Is.EqualTo("DB1\\dbo\\LoadSomething1\\@id|existing BIGINT parameter was changed to TINYINT"));
        }
        public void CompareReports_ForChangeStringLiteralWithName_ReturnsNoError()
        {
            // Setup
            var returnComparer = new ReturnReportComparer();
            var errors         = new List <string>();

            var sp1 = new StoredProcedureReport("DB1", "dbo", "StoredProcedure1")
            {
                ReturnValues = new List <ReturnSqlReportEntry>()
                {
                    new ReturnSqlReportEntry("'Hello' AS TheName", 1, true, "TheName"),
                    new ReturnSqlReportEntry("C.Name", 1, false, ""),
                    new ReturnSqlReportEntry("C.Id", 1, false, "")
                }
            };

            var masterReport = new SqlReport
            {
                StoredProcedures = new List <StoredProcedureReport>
                {
                    sp1
                }
            };

            var sp2 = new StoredProcedureReport("DB1", "dbo", "StoredProcedure1")
            {
                ReturnValues = new List <ReturnSqlReportEntry>()
                {
                    new ReturnSqlReportEntry("'Hello 123' AS TheName", 1, true, "TheName"),
                    new ReturnSqlReportEntry("C.Name", 1, false, ""),
                    new ReturnSqlReportEntry("C.Id", 1, false, "")
                }
            };

            var newReport = new SqlReport
            {
                StoredProcedures = new List <StoredProcedureReport>
                {
                    sp2
                }
            };

            // Act
            returnComparer.CompareReports(masterReport, newReport, errors);

            // Assert
            Assert.That(errors.Count, Is.EqualTo(0));
        }
        public void CompareReports_ForNoLongerDefaultedParam_ReturnsError()
        {
            // Setup
            var comparer = new ParamReportComparer();

            var sp1 = new StoredProcedureReport("DB1", "dbo", "LoadSomething1")
            {
                Parameters = new List <ParamSqlReportEntry>
                {
                    new ParamSqlReportEntry("@id", "INT", "N/A", false),
                    new ParamSqlReportEntry("@data", "VARCHAR", "200", true)
                }
            };

            var masterReport = new SqlReport
            {
                StoredProcedures = new List <StoredProcedureReport>
                {
                    sp1
                }
            };

            var sp2 = new StoredProcedureReport("DB1", "dbo", "LoadSomething1")
            {
                Parameters = new List <ParamSqlReportEntry>
                {
                    new ParamSqlReportEntry("@id", "INT", "N/A", false),
                    new ParamSqlReportEntry("@data", "VARCHAR", "200", false)
                }
            };

            var newReport = new SqlReport
            {
                StoredProcedures = new List <StoredProcedureReport>
                {
                    sp2
                }
            };

            var errors = new List <string>();

            // Act
            comparer.CompareReports(masterReport, newReport, errors);

            // Assert
            Assert.That(errors.Count, Is.EqualTo(1));
            Assert.That(errors[0], Is.EqualTo("DB1\\dbo\\LoadSomething1\\@data|parameter is defaulted in master but not in new code"));
        }
        public void CompareReports_StarReplacesWithParamNames_ReturnsError()
        {
            // Setup
            var returnComparer = new ReturnReportComparer();
            var errors         = new List <string>();

            var sp1 = new StoredProcedureReport("Database1", "dbo", "StoredProcedure1")
            {
                ReturnValues = new List <ReturnSqlReportEntry>()
                {
                    new ReturnSqlReportEntry("*", 1, false, "")
                }
            };

            var masterReport = new SqlReport
            {
                StoredProcedures = new List <StoredProcedureReport>
                {
                    sp1
                }
            };

            var sp2 = new StoredProcedureReport("Database1", "dbo", "StoredProcedure1")
            {
                ReturnValues = new List <ReturnSqlReportEntry>()
                {
                    new ReturnSqlReportEntry("Param1", 1, false, ""),
                    new ReturnSqlReportEntry("Param2", 1, false, ""),
                    new ReturnSqlReportEntry("Param3", 1, false, "")
                }
            };

            var newReport = new SqlReport
            {
                StoredProcedures = new List <StoredProcedureReport>
                {
                    sp2
                }
            };

            // Act
            returnComparer.CompareReports(masterReport, newReport, errors);

            // Assert
            Assert.That(errors.Count, Is.EqualTo(1));
            Assert.That(errors[0], Is.EqualTo("Database1\\dbo\\StoredProcedure1\\*|existing return value is missing from new code"));
        }
        public void WriteMasterReport_ForValidReport_WritesDataToFile()
        {
            // Setup
            var xmlFactory   = Substitute.For <IXmlStreamWrapperFactory>();
            var fileWrapper  = Substitute.For <IFileWrapper>();
            var streamWriter = Substitute.For <IXmlStreamWriterWrapper>();

            xmlFactory.CreateXmlWriter("c:\\output\\fakeReport1.xml")
            .Returns(streamWriter);

            var storedProcedureReport = new StoredProcedureReport()
            {
                Db         = "MyDB",
                Schema     = "Schema1",
                SpName     = "SomeSp1",
                Parameters = new List <ParamSqlReportEntry>()
                {
                    new ParamSqlReportEntry("@Id", "INT", "N/A", false)
                },
                ReturnValues = new List <ReturnSqlReportEntry>()
                {
                    new ReturnSqlReportEntry("P.Name", 1, false, ""),
                }
            };

            var sqlReport = new SqlReport
            {
                TimeStamp        = "6/21/2019 6:45:00 PM",
                StoredProcedures = new List <StoredProcedureReport>()
                {
                    storedProcedureReport
                }
            };

            var writer = new SqlReportWriter(xmlFactory, fileWrapper);

            // Act
            writer.WriteMasterReport("c:\\output\\fakeReport1.xml",
                                     sqlReport);

            // Assert
            streamWriter.Received(1).WriteStartElement("SqlReport");
            streamWriter.Received(1).WriteElementString("TimeStamp", Arg.Any <string>());
            streamWriter.Received(1).SerializeSqlReportElement(storedProcedureReport);
            streamWriter.Received(1).WriteEndElement();
            streamWriter.Received(1).Flush();
        }
        public void CompareReports_ForBigIntRemoved_ReturnsCorrectError()
        {
            // Setup
            var comparer = new ParamReportComparer();

            var sp1 = new StoredProcedureReport("DB1", "dbo", "LoadSomething1")
            {
                Parameters = new List <ParamSqlReportEntry>
                {
                    new ParamSqlReportEntry("@id", "BIGINT", "N/A", false),
                    new ParamSqlReportEntry("@data", "VARCHAR", "200", true)
                }
            };

            var masterReport = new SqlReport
            {
                StoredProcedures = new List <StoredProcedureReport>
                {
                    sp1
                }
            };

            var sp2 = new StoredProcedureReport("DB1", "dbo", "LoadSomething1")
            {
                Parameters = new List <ParamSqlReportEntry>
                {
                    new ParamSqlReportEntry("@data", "VARCHAR", "200", true)
                }
            };

            var newReport = new SqlReport
            {
                StoredProcedures = new List <StoredProcedureReport>
                {
                    sp2
                }
            };

            var errors = new List <string>();

            // Act
            comparer.CompareReports(masterReport, newReport, errors);

            // Assert
            Assert.That(errors.Count, Is.EqualTo(1));
            Assert.That(errors[0], Is.EqualTo("DB1\\dbo\\LoadSomething1\\@id|existing parameter is missing from new code"));
        }
        private void CheckForRemovedParameters(StoredProcedureReport masterSp,
                                               StoredProcedureReport newSp, List <string> errors)
        {
            foreach (var masterParam in masterSp.Parameters)
            {
                var newParam = newSp.Parameters.FirstOrDefault(
                    x => x.ParameterName == masterParam.ParameterName);

                if (newParam == null)
                {
                    errors.Add($"{masterSp.SpUniqueName}\\{masterParam.ParameterName}|existing parameter is missing from new code");
                }
                else if (masterParam.IsDefaulted && !newParam.IsDefaulted)
                {
                    errors.Add($"{masterSp.SpUniqueName}\\{masterParam.ParameterName}|parameter is defaulted in master but not in new code");
                }
            }
        }
        public void CompareReports_SelectStatementRemoved_ReturnsError()
        {
            // Setup
            var returnComparer = new ReturnReportComparer();
            var errors         = new List <string>();

            var sp1 = new StoredProcedureReport("Database1", "dbo", "StoredProcedure1")
            {
                ReturnValues = new List <ReturnSqlReportEntry>()
                {
                    new ReturnSqlReportEntry("A.Name1", 1, false, "Name1"),
                    new ReturnSqlReportEntry("A.Name2", 1, false, "Name2")
                }
            };

            var masterReport = new SqlReport
            {
                StoredProcedures = new List <StoredProcedureReport>
                {
                    sp1
                }
            };

            var sp2 = new StoredProcedureReport("Database1", "dbo", "StoredProcedure1")
            {
                ReturnValues = new List <ReturnSqlReportEntry>()
            };

            var newReport = new SqlReport
            {
                StoredProcedures = new List <StoredProcedureReport>
                {
                    sp2
                }
            };

            // Act
            returnComparer.CompareReports(masterReport, newReport, errors);

            // Assert
            Assert.That(errors.Count, Is.EqualTo(2));
            Assert.That(errors[0], Is.EqualTo("Database1\\dbo\\StoredProcedure1\\A.Name1|existing return value is missing from new code"));
            Assert.That(errors[1], Is.EqualTo("Database1\\dbo\\StoredProcedure1\\A.Name2|existing return value is missing from new code"));
        }
        private void ScanSp(TSqlScript tSqlScript, string fullPath,
                            IgnoreList ignoreList)
        {
            var parameterScanner   = new StoredProcedureParameterScanner();
            var returnValueScanner = new StoredProcedureReturnValueScanner();

            var solutionSchemaOffset = 3;
            var dbOffset             = 4;
            var scriptParts          = fullPath.Split('\\');

            var schema = scriptParts[scriptParts.Length - solutionSchemaOffset];
            var db     = scriptParts[scriptParts.Length - dbOffset];

            if (ignoreList.IsSchemaIgnored(db, schema))
            {
                return;
            }

            foreach (var batch in tSqlScript.Batches)
            {
                foreach (var statement in batch.Statements)
                {
                    if (!(statement is CreateProcedureStatement sp))
                    {
                        continue;
                    }

                    var spFormattedName =
                        sp.ProcedureReference.Name.BaseIdentifier.Value;

                    var spReport =
                        new StoredProcedureReport(db, schema, spFormattedName);

                    parameterScanner.ScanSpParameters(spReport, sp);

                    returnValueScanner.ScanReturnValues(spReport, sp);

                    _sqlReport.StoredProcedures.Add(spReport);
                }
            }
        }
Exemple #22
0
        public void ScanSpParameters(StoredProcedureReport spReport,
                                     CreateProcedureStatement sp)
        {
            if (sp.Parameters.Count == 0)
            {
                return;
            }

            foreach (var p in sp.Parameters)
            {
                var isDefaulted = p.Value != null;
                var length      = ParseLength(p);

                var entry =
                    new ParamSqlReportEntry(p.VariableName.Value,
                                            p.DataType.Name.BaseIdentifier.Value,
                                            length,
                                            isDefaulted);

                spReport.Parameters.Add(entry);
            }
        }
Exemple #23
0
        private void ParseSelectElement(SelectElementWrapper result,
                                        string spText, StoredProcedureReport spReport)
        {
            var valueName =
                spText.Substring(result.SelectElementHolder.StartOffset,
                                 result.SelectElementHolder.FragmentLength);

            valueName =
                valueName
                .Replace("\r", " ")
                .Replace("\n", " ")
                .Replace("\t", " ");

            valueName =
                Regex.Replace(valueName, @"\s+", " ");

            var entry =
                new ReturnSqlReportEntry(valueName, result.QueryExpressionId,
                                         result.IsLiteral, result.ColumnName);

            spReport.ReturnValues.Add(entry);
        }
Exemple #24
0
        private void CheckReturnValueOrder(StoredProcedureReport masterSp,
                                           StoredProcedureReport newSp, List <string> errors)
        {
            var uniqueStatements =
                masterSp.ReturnValues.Select(x => x.StatementId)
                .Distinct()
                .ToList();

            foreach (var statementId in uniqueStatements)
            {
                var masterReturns =
                    masterSp.ReturnValues.Where(x => x.StatementId == statementId)
                    .ToList();

                var newReturns =
                    newSp.ReturnValues.Where(x => x.StatementId == statementId)
                    .ToList();

                if (newReturns.Count < masterReturns.Count)
                {
                    return;
                }

                for (var i = 0; i < masterReturns.Count; i++)
                {
                    if (newReturns[i].ReturnValueName == masterReturns[i].ReturnValueName ||
                        masterReturns[i].IsLiteral)
                    {
                        continue;
                    }
                    if (newReturns.Any(x => x.ReturnValueName == masterReturns[i].ReturnValueName))
                    {
                        errors.Add(
                            $"{masterSp.SpUniqueName}\\{masterSp.ReturnValues[i].ReturnValueName}|existing return value is out of order");
                    }
                }
            }
        }
        public void CompareReports_ForDuplicatedSpWithDifferentValues_ReturnsError()
        {
            // Setup
            var comparer = new ParamReportComparer();

            var sp1 = new StoredProcedureReport("DB1", "dbo", "LoadSomething1")
            {
                Parameters = new List <ParamSqlReportEntry>
                {
                    new ParamSqlReportEntry("@id", "INT", "N/A", false),
                    new ParamSqlReportEntry("@data", "VARCHAR", "200", true)
                }
            };

            var sp2 = new StoredProcedureReport("DB1", "dbo", "LoadSomething1")
            {
                Parameters = new List <ParamSqlReportEntry>
                {
                    new ParamSqlReportEntry("@data", "VARCHAR", "200", true)
                }
            };

            var masterReport = new SqlReport
            {
                StoredProcedures = new List <StoredProcedureReport>
                {
                    sp1,
                    sp2
                }
            };

            var sp3 = new StoredProcedureReport("DB1", "dbo", "LoadSomething1")
            {
                Parameters = new List <ParamSqlReportEntry>
                {
                    new ParamSqlReportEntry("@id", "INT", "N/A", false),
                    new ParamSqlReportEntry("@data", "VARCHAR", "200", true)
                }
            };

            var sp4 = new StoredProcedureReport("DB1", "dbo", "LoadSomething1")
            {
                Parameters = new List <ParamSqlReportEntry>
                {
                    new ParamSqlReportEntry("@data", "VARCHAR", "200", true)
                }
            };

            var newReport = new SqlReport
            {
                StoredProcedures = new List <StoredProcedureReport>
                {
                    sp3,
                    sp4
                }
            };

            var errors = new List <string>();

            // Act
            comparer.CompareReports(masterReport, newReport, errors);

            // Assert
            Assert.That(errors.Count, Is.EqualTo(3));
            Assert.That(errors[0], Is.EqualTo("DB1\\dbo\\LoadSomething1\\@id|new parameter has no default"));
            Assert.That(errors[1], Is.EqualTo("DB1\\dbo\\LoadSomething1\\@data|existing parameter is out of order"));
            Assert.That(errors[2], Is.EqualTo("DB1\\dbo\\LoadSomething1\\|sp defined 2 times"));
        }
        public void CompareReports_ForNewValueInMiddle_ReturnsError()
        {
            // Setup
            var returnComparer = new ReturnReportComparer();
            var errors         = new List <string>();

            var sp1 = new StoredProcedureReport("Database1", "dbo", "StoredProcedure1")
            {
                ReturnValues = new List <ReturnSqlReportEntry>()
                {
                    new ReturnSqlReportEntry(
                        "[FieldB] = CAST(SUBSTRING(ISNULL([SomeTable].[text],''), 1, false, 1, false024) AS VARCHAR(1024))", 1, false, "FieldB")
                }
            };

            var sp2 = new StoredProcedureReport("Database2", "schema1", "StoredProcedure2")
            {
                ReturnValues = new List <ReturnSqlReportEntry>()
                {
                    new ReturnSqlReportEntry("C.SomeAmount", 1, false, ""),
                    new ReturnSqlReportEntry("C.Name", 1, false, ""),
                    new ReturnSqlReportEntry("C.Id", 1, false, "")
                }
            };

            var masterReport = new SqlReport
            {
                StoredProcedures = new List <StoredProcedureReport>
                {
                    sp1,
                    sp2
                }
            };

            var sp3 = new StoredProcedureReport("Database1", "dbo", "StoredProcedure1")
            {
                ReturnValues = new List <ReturnSqlReportEntry>()
                {
                    new ReturnSqlReportEntry(
                        "[FieldB] = CAST(SUBSTRING(ISNULL([SomeTable].[text],''), 1, false, 1, false024) AS VARCHAR(1024))", 1, false, "FieldB")
                }
            };

            var sp4 = new StoredProcedureReport("Database2", "schema1", "StoredProcedure2")
            {
                ReturnValues = new List <ReturnSqlReportEntry>()
                {
                    new ReturnSqlReportEntry("C.SomeAmount", 1, false, ""),
                    new ReturnSqlReportEntry("C.Name", 1, false, ""),
                    new ReturnSqlReportEntry("C.NewValue", 1, false, ""),
                    new ReturnSqlReportEntry("C.Id", 1, false, ""),
                    new ReturnSqlReportEntry("C.Phone", 1, false, "")
                }
            };

            var newReport = new SqlReport
            {
                StoredProcedures = new List <StoredProcedureReport>
                {
                    sp3,
                    sp4
                }
            };

            // Act
            returnComparer.CompareReports(masterReport, newReport, errors);

            // Assert
            Assert.That(errors.Count, Is.EqualTo(1));
            Assert.That(errors[0], Is.EqualTo("Database2\\schema1\\StoredProcedure2\\C.Id|existing return value is out of order"));
        }
        public void CompareReports_ForSpCaseChanged_ReturnsError()
        {
            // Setup
            var comparer = new ParamReportComparer();

            var sp1 = new StoredProcedureReport("DB1", "dbo", "LoadSomething1")
            {
                Parameters = new List <ParamSqlReportEntry>
                {
                    new ParamSqlReportEntry("@id", "INT", "N/A", false),
                    new ParamSqlReportEntry("@data", "VARCHAR", "200", true)
                }
            };

            var sp2 = new StoredProcedureReport("DB1", "dbo", "LoadSomething2")
            {
                Parameters = new List <ParamSqlReportEntry>
                {
                    new ParamSqlReportEntry("@name", "VARCHAR", "200", false)
                }
            };

            var sp3 = new StoredProcedureReport("DB1", "dbo", "LoadSomething3")
            {
                Parameters = new List <ParamSqlReportEntry>
                {
                    new ParamSqlReportEntry("@info", "VARCHAR", "200", false)
                }
            };

            var masterReport = new SqlReport
            {
                StoredProcedures = new List <StoredProcedureReport>
                {
                    sp1,
                    sp2,
                    sp3
                }
            };

            var sp4 = new StoredProcedureReport("DB1", "dbo", "LoadSomething1")
            {
                Parameters = new List <ParamSqlReportEntry>
                {
                    new ParamSqlReportEntry("@id", "INT", "N/A", false),
                    new ParamSqlReportEntry("@data", "VARCHAR", "200", true)
                }
            };

            var sp5 = new StoredProcedureReport("DB1", "dbo", "loadsomethinG2")
            {
                Parameters = new List <ParamSqlReportEntry>
                {
                    new ParamSqlReportEntry("@name", "VARCHAR", "200", false)
                }
            };

            var sp6 = new StoredProcedureReport("DB1", "dbo", "LoadSomething3")
            {
                Parameters = new List <ParamSqlReportEntry>
                {
                    new ParamSqlReportEntry("@info", "VARCHAR", "200", false)
                }
            };

            var newReport = new SqlReport
            {
                StoredProcedures = new List <StoredProcedureReport>
                {
                    sp4,
                    sp5,
                    sp6
                }
            };

            var errors = new List <string>();

            // Act
            comparer.CompareReports(masterReport, newReport, errors);

            // Assert
            Assert.That(errors.Count, Is.EqualTo(1));
            Assert.That(errors[0],
                        Is.EqualTo("DB1\\dbo\\LoadSomething2:loadsomethinG2\\|sp was renamed with different case"));
        }
        public void CompareReports_ForArityChange_ReturnsError()
        {
            // Setup
            var comparer = new ParamReportComparer();

            var sp1 = new StoredProcedureReport("DB1", "dbo", "LoadSomething1")
            {
                Parameters = new List <ParamSqlReportEntry>
                {
                    new ParamSqlReportEntry("@id", "INT", "N/A", false),
                    new ParamSqlReportEntry("@data", "VARCHAR", "200", true)
                }
            };

            var sp2 = new StoredProcedureReport("DB1", "dbo", "LoadSomething2")
            {
                Parameters = new List <ParamSqlReportEntry>
                {
                    new ParamSqlReportEntry("@name", "VARCHAR", "200", false),
                    new ParamSqlReportEntry("@address", "VARCHAR", "200", true),
                    new ParamSqlReportEntry("@phone", "VARCHAR", "200", false)
                }
            };

            var sp3 = new StoredProcedureReport("DB1", "dbo", "LoadSomething3")
            {
                Parameters = new List <ParamSqlReportEntry>
                {
                    new ParamSqlReportEntry("@id", "INT", "N/A", true),
                    new ParamSqlReportEntry("@style", "VARCHAR", "200", true)
                }
            };

            var masterReport = new SqlReport
            {
                StoredProcedures = new List <StoredProcedureReport>
                {
                    sp1,
                    sp2,
                    sp3
                }
            };

            var sp4 = new StoredProcedureReport("DB1", "dbo", "LoadSomething1")
            {
                Parameters = new List <ParamSqlReportEntry>
                {
                    new ParamSqlReportEntry("@id", "INT", "N/A", false),
                    new ParamSqlReportEntry("@data", "VARCHAR", "200", true)
                }
            };

            var sp5 = new StoredProcedureReport("DB1", "dbo", "LoadSomething2")
            {
                Parameters = new List <ParamSqlReportEntry>
                {
                    new ParamSqlReportEntry("@name", "VARCHAR", "200", false),
                    new ParamSqlReportEntry("@phone", "VARCHAR", "200", false),
                    new ParamSqlReportEntry("@address", "VARCHAR", "200", true)
                }
            };

            var sp6 = new StoredProcedureReport("DB1", "dbo", "LoadSomething3")
            {
                Parameters = new List <ParamSqlReportEntry>
                {
                    new ParamSqlReportEntry("@id", "INT", "N/A", true),
                    new ParamSqlReportEntry("@style", "VARCHAR", "200", true)
                }
            };

            var newReport = new SqlReport
            {
                StoredProcedures = new List <StoredProcedureReport>
                {
                    sp4,
                    sp5,
                    sp6
                }
            };

            var errors = new List <string>();

            // Act
            comparer.CompareReports(masterReport, newReport, errors);

            // Assert
            Assert.That(errors.Count, Is.EqualTo(2));
            Assert.That(errors[0], Is.EqualTo("DB1\\dbo\\LoadSomething2\\@address|existing parameter is out of order"));
            Assert.That(errors[1], Is.EqualTo("DB1\\dbo\\LoadSomething2\\@phone|existing parameter is out of order"));
        }
        public void CompareReports_ForSameSpNameInDifferentDb_ReturnsNoErrors()
        {
            // Setup
            var returnComparer = new ReturnReportComparer();
            var errors         = new List <string>();

            var sp1 = new StoredProcedureReport("Database1", "dbo", "StoredProcedure1")
            {
                ReturnValues = new List <ReturnSqlReportEntry>()
                {
                    new ReturnSqlReportEntry(
                        "[FieldB] = CAST(SUBSTRING(ISNULL([SomeTable].[text],''), 1, false, 1, false024) AS VARCHAR(1024))", 1, false, "FieldB")
                }
            };

            var sp2 = new StoredProcedureReport("Database2", "schema1", "StoredProcedure2")
            {
                ReturnValues = new List <ReturnSqlReportEntry>()
                {
                    new ReturnSqlReportEntry("C.SomeAmount", 1, false, ""),
                    new ReturnSqlReportEntry("C.Name", 1, false, ""),
                    new ReturnSqlReportEntry("C.Id", 1, false, "")
                }
            };

            var sp3 = new StoredProcedureReport("Database3", "schema1", "StoredProcedure2")
            {
                ReturnValues = new List <ReturnSqlReportEntry>()
                {
                    new ReturnSqlReportEntry("C.SomeAmount", 1, false, ""),
                    new ReturnSqlReportEntry("C.Name", 1, false, ""),
                    new ReturnSqlReportEntry("C.Id", 1, false, "")
                }
            };

            var masterReport = new SqlReport
            {
                StoredProcedures = new List <StoredProcedureReport>
                {
                    sp1,
                    sp2,
                    sp3
                }
            };

            var sp4 = new StoredProcedureReport("Database1", "dbo", "StoredProcedure1")
            {
                ReturnValues = new List <ReturnSqlReportEntry>()
                {
                    new ReturnSqlReportEntry(
                        "[FieldB] = CAST(SUBSTRING(ISNULL([SomeTable].[text],''), 1, false, 1, false024) AS VARCHAR(1024))", 1, false, "FieldB")
                }
            };

            var sp5 = new StoredProcedureReport("Database2", "schema1", "StoredProcedure2")
            {
                ReturnValues = new List <ReturnSqlReportEntry>()
                {
                    new ReturnSqlReportEntry("C.SomeAmount", 1, false, ""),
                    new ReturnSqlReportEntry("C.Name", 1, false, ""),
                    new ReturnSqlReportEntry("C.Id", 1, false, "")
                }
            };

            var sp6 = new StoredProcedureReport("Database3", "schema1", "StoredProcedure2")
            {
                ReturnValues = new List <ReturnSqlReportEntry>()
                {
                    new ReturnSqlReportEntry("C.SomeAmount", 1, false, ""),
                    new ReturnSqlReportEntry("C.Name", 1, false, ""),
                    new ReturnSqlReportEntry("C.Id", 1, false, "")
                }
            };

            var newReport = new SqlReport
            {
                StoredProcedures = new List <StoredProcedureReport>
                {
                    sp4,
                    sp5,
                    sp6
                }
            };

            // Act
            returnComparer.CompareReports(masterReport, newReport, errors);

            // Assert
            Assert.That(errors.Count, Is.EqualTo(0));
        }