TestSQLAnalyzer_DeleteStatements tests analysis of DELETE statements
(t *testing.T)
| 583 | |
| 584 | // TestSQLAnalyzer_DeleteStatements tests analysis of DELETE statements |
| 585 | func TestSQLAnalyzer_DeleteStatements(t *testing.T) { |
| 586 | tests := []struct { |
| 587 | name string |
| 588 | sql string |
| 589 | expectMissingWhere bool |
| 590 | expectSecurityIssue bool |
| 591 | }{ |
| 592 | { |
| 593 | name: "DELETE with WHERE", |
| 594 | sql: "DELETE FROM users WHERE id = 1", |
| 595 | expectMissingWhere: false, |
| 596 | expectSecurityIssue: false, |
| 597 | }, |
| 598 | { |
| 599 | name: "DELETE without WHERE (dangerous)", |
| 600 | sql: "DELETE FROM users", |
| 601 | expectMissingWhere: true, |
| 602 | expectSecurityIssue: true, // Missing WHERE on DELETE is a security issue |
| 603 | }, |
| 604 | { |
| 605 | name: "DELETE with complex condition", |
| 606 | sql: "DELETE FROM logs WHERE created_at < '2020-01-01' AND processed = true", |
| 607 | expectMissingWhere: false, |
| 608 | expectSecurityIssue: false, |
| 609 | }, |
| 610 | } |
| 611 | |
| 612 | for _, tt := range tests { |
| 613 | t.Run(tt.name, func(t *testing.T) { |
| 614 | tkz := tokenizer.GetTokenizer() |
| 615 | defer tokenizer.PutTokenizer(tkz) |
| 616 | |
| 617 | tokens, err := tkz.Tokenize([]byte(tt.sql)) |
| 618 | if err != nil { |
| 619 | t.Fatalf("Tokenization failed: %v", err) |
| 620 | } |
| 621 | |
| 622 | p := parser.NewParser() |
| 623 | astObj := ast.NewAST() |
| 624 | defer ast.ReleaseAST(astObj) |
| 625 | |
| 626 | result, err := p.ParseFromModelTokens(tokens) |
| 627 | if err != nil { |
| 628 | t.Fatalf("Parsing failed: %v", err) |
| 629 | } |
| 630 | astObj.Statements = result.Statements |
| 631 | |
| 632 | analyzer := NewSQLAnalyzer() |
| 633 | report, err := analyzer.Analyze(astObj) |
| 634 | if err != nil { |
| 635 | t.Fatalf("Analysis failed: %v", err) |
| 636 | } |
| 637 | |
| 638 | // Check for missing WHERE issue |
| 639 | foundMissingWhere := false |
| 640 | hasSecurityIssue := false |
| 641 | for _, issue := range report.Issues { |
| 642 | if strings.Contains(issue.ID, "MISSING_WHERE") { |
nothing calls this directly
no test coverage detected