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));
        }
        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_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_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"));
        }
        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_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"));
        }