public void VisitRules(string sqlPath, IEnumerable <IRuleException> ignoredRules, Stream sqlFileStream)
        {
            var overrides     = overrideFinder.GetOverrideList(sqlFileStream);
            var overrideArray = overrides as IOverride[] ?? overrides.ToArray();

            var sqlFragment = fragmentBuilder.GetFragment(GetSqlTextReader(sqlFileStream), out var errors, overrideArray);

            // notify user of syntax errors
            var ruleExceptions = ignoredRules as IRuleException[] ?? ignoredRules.ToArray();

            if (errors.Any())
            {
                HandleParserErrors(sqlPath, errors, ruleExceptions);
            }

            // lint what can be linted, even if there are errors
            var ruleVisitors = ruleVisitorBuilder.BuildVisitors(sqlPath, ruleExceptions);

            foreach (var visitor in ruleVisitors)
            {
                VisitFragment(sqlFragment, visitor, overrideArray);
            }
        }
        public void RuleVisitorEnforcesRule()
        {
            // arrange
            var mockReporter = Substitute.For <IReporter>();

            mockReporter.ReportViolation(Arg.Any <IRuleViolation>());

            var mockConfigReader = Substitute.For <IConfigReader>();

            mockConfigReader.GetRuleSeverity("select-star").Returns(RuleViolationSeverity.Error);

            var ignoredRuleList = new List <IRuleException>();

            var pathString         = "DoesntExist.sql";
            var RuleVisitorBuilder = new RuleVisitorBuilder(mockConfigReader, mockReporter);
            var ActiveRuleVisitors = RuleVisitorBuilder.BuildVisitors(pathString, ignoredRuleList);
            var testFileStream     = ParsingUtility.GenerateStreamFromString("SELECT * FROM FOO;");
            var textReader         = new StreamReader(testFileStream);
            var sqlFragment        = _fragmentBuilder.GetFragment(textReader, out _);

            // act
            foreach (var sqlFragmentVisitor in ActiveRuleVisitors)
            {
                sqlFragment.Accept(sqlFragmentVisitor);
                testFileStream.Seek(0, SeekOrigin.Begin);
            }

            // assert
            Assert.AreEqual(1, ActiveRuleVisitors.Count);
            Assert.IsTrue(ActiveRuleVisitors[0].GetType().Name == typeof(SelectStarRule).Name);
            mockReporter.Received().ReportViolation(Arg.Is <IRuleViolation>(x =>
                                                                            x.FileName == pathString &&
                                                                            x.RuleName == "select-star" &&
                                                                            x.Line == 1 &&
                                                                            x.Severity == RuleViolationSeverity.Error));
        }
Beispiel #3
0
        public void VisitRules(string sqlPath, IEnumerable <IRuleException> ignoredRules, Stream sqlFileStream)
        {
            TextReader sqlTextReader = new StreamReader(sqlFileStream);
            var        sqlFragment   = fragmentBuilder.GetFragment(sqlTextReader, out var errors);

            sqlFileStream.Seek(0, SeekOrigin.Begin);

            if (errors.Any())
            {
                HandleParserErrors(sqlPath, errors, ignoredRules);
            }

            var ruleVisitors = ruleVisitorBuilder.BuildVisitors(sqlPath, ignoredRules);

            foreach (var visitor in ruleVisitors)
            {
                sqlFragment?.Accept(visitor);
            }
        }
Beispiel #4
0
        public void VisitRules(string sqlPath, Stream sqlFileStream)
        {
            TextReader sqlTextReader = new StreamReader(sqlFileStream);
            var        sqlFragment   = fragmentBuilder.GetFragment(sqlTextReader, out var errors);

            if (errors.Count > 0)
            {
                reporter.ReportViolation(new RuleViolation(sqlPath, null, "TSQL not syntactically correct", 0, 0, RuleViolationSeverity.Error));
                return;
            }

            sqlFileStream.Seek(0, SeekOrigin.Begin);
            var ignoredRules = ruleExceptionFinder.GetIgnoredRuleList(sqlFileStream).ToList();

            var ruleVisitors = ruleVisitorBuilder.BuildVisitors(sqlPath, ignoredRules);

            foreach (var visitor in ruleVisitors)
            {
                sqlFragment.Accept(visitor);
            }
        }