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