Esempio n. 1
0
        public static void RunDynamicSQLRulesTest(Type ruleType, string sql, List <RuleViolation> expectedRuleViolations)
        {
            // arrange
            var ruleViolations  = new List <RuleViolation>();
            var mockReporter    = Substitute.For <IReporter>();
            var mockPath        = string.Empty;
            var compareer       = new RuleViolationComparer();
            var fragmentBuilder = new FragmentBuilder();
            var sqlStream       = ParsingUtility.GenerateStreamFromString(sql);

            void ErrorCallback(string ruleName, string ruleText, int startLine, int startColumn)
            {
                ruleViolations.Add(new RuleViolation(ruleName, startLine, startColumn));
            }

            var visitors = new List <TSqlFragmentVisitor>
            {
                GetVisitor(ruleType, ErrorCallback)
            };

            var mockRuleVisitorBuilder = Substitute.For <IRuleVisitorBuilder>();

            mockRuleVisitorBuilder.BuildVisitors(Arg.Any <string>(), Arg.Any <IEnumerable <IRuleException> >()).Returns(visitors);

            var sqlRuleVisitor = new SqlRuleVisitor(mockRuleVisitorBuilder, fragmentBuilder, mockReporter);

            // act
            sqlRuleVisitor.VisitRules(mockPath, new List <IRuleException>(), sqlStream);

            ruleViolations         = ruleViolations.OrderBy(o => o.Line).ThenBy(o => o.Column).ToList();
            expectedRuleViolations = expectedRuleViolations.OrderBy(o => o.Line).ThenBy(o => o.Column).ToList();

            // assert
            CollectionAssert.AreEqual(expectedRuleViolations, ruleViolations, compareer);
        }
        public void VisitRules_GlobalIgnoreNoFragments_ShouldNotReportErrors()
        {
            // arrange
            var sqlStream = ParsingUtility.GenerateStreamFromString(@"/* tsqllint-disable */
@@Scripts\dfu_setutp_import_cleanup.sql");

            var mockReporter           = Substitute.For <IReporter>();
            var mockRuleVisitorBuilder = Substitute.For <IRuleVisitorBuilder>();

            var visitors = new List <TSqlFragmentVisitor>
            {
                new SetAnsiNullsRule(null)
            };

            mockRuleVisitorBuilder.BuildVisitors(Arg.Any <string>(), Arg.Any <List <IRuleException> >()).Returns(visitors);

            var sqlRuleVisitor = new SqlRuleVisitor(mockRuleVisitorBuilder, new FragmentBuilder(120), mockReporter);

            // act
            sqlRuleVisitor.VisitRules(Path, new List <IRuleException> {
                new GlobalRuleException(0, 99)
            }, sqlStream);

            // assert
            mockReporter.DidNotReceive().ReportViolation(Arg.Any <IRuleViolation>());
        }
        public void VisitRules_InvalidSql_ShouldStillLint()
        {
            // arrange
            var mockReporter    = Substitute.For <IReporter>();
            var fragmentBuilder = new FragmentBuilder(120);

            var ruleViolations = new List <RuleViolation>();

            void ErrorCallback(string ruleName, string ruleText, int startLine, int startColumn)
            {
                ruleViolations.Add(new RuleViolation(ruleName, startLine, startColumn));
            }

            var visitors = new List <TSqlFragmentVisitor>
            {
                new KeywordCapitalizationRule(ErrorCallback)
            };

            var mockRuleVisitorBuilder = Substitute.For <IRuleVisitorBuilder>();

            mockRuleVisitorBuilder.BuildVisitors(Arg.Any <string>(), Arg.Any <List <IRuleException> >()).Returns(visitors);
            var sqlStream      = ParsingUtility.GenerateStreamFromString("select");
            var sqlRuleVisitor = new SqlRuleVisitor(mockRuleVisitorBuilder, fragmentBuilder, mockReporter);

            // act
            sqlRuleVisitor.VisitRules(Path, new List <IRuleException>(), sqlStream);

            // assert
            Assert.AreEqual(1, ruleViolations.Count);
        }
        public void VisitRules_NullFragentWithIgnores_ShouldNotReportErrors()
        {
            // arrange
            var path       = System.IO.Path.GetFullPath(System.IO.Path.Combine(TestContext.CurrentContext.TestDirectory, @"UnitTests/Parser/invalid-characters-ignore-rules.sql"));
            var fileStream = File.OpenRead(path);

            var mockReporter = Substitute.For <IReporter>();
            var visitors     = new List <TSqlFragmentVisitor>
            {
                new SetAnsiNullsRule(null)
            };

            var mockRuleVisitorBuilder = Substitute.For <IRuleVisitorBuilder>();

            mockRuleVisitorBuilder.BuildVisitors(Arg.Any <string>(), Arg.Any <List <IRuleException> >()).Returns(visitors);

            var sqlRuleVisitor = new SqlRuleVisitor(mockRuleVisitorBuilder, new FragmentBuilder(120), mockReporter);

            // act
            sqlRuleVisitor.VisitRules(Path, new List <IRuleException> {
                new GlobalRuleException(0, 99)
            }, fileStream);

            // assert
            mockReporter.DidNotReceive().ReportViolation(Arg.Any <IRuleViolation>());
        }
Esempio n. 5
0
        public void VisitRules_InvalidSql_ShouldReportError()
        {
            // arrange
            var mockReporter           = Substitute.For <IReporter>();
            var fragmentBuilder        = new FragmentBuilder();
            var mockRuleVisitorBuilder = Substitute.For <IRuleVisitorBuilder>();
            var sqlStream      = ParsingUtility.GenerateStreamFromString("SELECT");
            var sqlRuleVisitor = new SqlRuleVisitor(mockRuleVisitorBuilder, fragmentBuilder, mockReporter);

            // act
            sqlRuleVisitor.VisitRules(Path, sqlStream);

            // assert
            mockReporter.Received().ReportViolation(Arg.Is <RuleViolation>(x => x.FileName == Path && x.Text == "TSQL not syntactically correct"));
        }
Esempio n. 6
0
        public void VisitRules_ValidSql_ShouldVisitRules()
        {
            // arrange
            var sqlStream = ParsingUtility.GenerateStreamFromString("SELECT 1");

            var mockReporter = Substitute.For <IReporter>();
            var mockFragment = Substitute.For <TSqlFragment>();

            var mockFragmentBuilder       = Substitute.For <IFragmentBuilder>();
            IList <ParseError> mockErrors = new List <ParseError>();

            mockFragmentBuilder.GetFragment(Arg.Any <TextReader>(), out var errors).Returns(x =>
            {
                x[1] = mockErrors;
                return(mockFragment);
            });

            var mockRuleExceptionFinder = Substitute.For <IRuleExceptionFinder>();

            mockRuleExceptionFinder.GetIgnoredRuleList(Arg.Any <Stream>()).Returns(new List <IRuleException>());

            var visitors = new List <TSqlFragmentVisitor>
            {
                new SemicolonTerminationRule(null)
            };

            var mockRuleVisitorBuilder = Substitute.For <IRuleVisitorBuilder>();

            mockRuleVisitorBuilder.BuildVisitors(Arg.Any <string>(), Arg.Any <List <IRuleException> >()).Returns(visitors);

            var sqlRuleVisitor = new SqlRuleVisitor(mockRuleVisitorBuilder, mockRuleExceptionFinder, mockFragmentBuilder, mockReporter);

            // act
            sqlRuleVisitor.VisitRules(Path, sqlStream);

            // assert
            mockFragment.Received().Accept(Arg.Any <TSqlFragmentVisitor>());
        }