an ORM-free SQL experience

add tests for insert stmt

Signed-off-by: oppiliappan <me@oppi.li>

oppi.li 0d2a557e 46362302

verified
Changed files
+71 -14
+19 -14
query.go
··· 325 type insert struct { 326 into string 327 or InsertOr 328 - values map[string]any 329 } 330 331 type InsertOr int ··· 357 } 358 359 func Insert() insert { 360 - return insert{ 361 - values: make(map[string]any), 362 - } 363 } 364 365 type InsertOpt func(s *insert) ··· 375 } 376 377 func (s insert) Value(column string, arg any) insert { 378 - s.values[column] = arg 379 return s 380 } 381 ··· 388 if s.or != None { 389 sql.WriteString("OR ") 390 sql.WriteString(s.or.String()) 391 } 392 393 if s.into == "" { 394 return "", nil, fmt.Errorf("INTO clause is required") 395 } 396 - sql.WriteString(" INTO ") 397 sql.WriteString(s.into) 398 399 if len(s.values) == 0 { ··· 402 403 sql.WriteString(" (") 404 405 - first := true 406 - for col, val := range s.values { 407 - if !first { 408 - sql.WriteString(",") 409 - first = !first 410 } 411 412 - sql.WriteString(col) 413 - args = append(args, val) 414 } 415 416 sql.WriteString(") VALUES (") 417 - sql.WriteString(strings.TrimSuffix(strings.Repeat("?,", len(s.values)), ",")) 418 sql.WriteString(")") 419 420 return sql.String(), args, nil
··· 325 type insert struct { 326 into string 327 or InsertOr 328 + values []struct { 329 + col string 330 + val any 331 + } 332 } 333 334 type InsertOr int ··· 360 } 361 362 func Insert() insert { 363 + return insert{} 364 } 365 366 type InsertOpt func(s *insert) ··· 376 } 377 378 func (s insert) Value(column string, arg any) insert { 379 + s.values = append(s.values, struct { 380 + col string 381 + val any 382 + }{ 383 + column, arg, 384 + }) 385 return s 386 } 387 ··· 394 if s.or != None { 395 sql.WriteString("OR ") 396 sql.WriteString(s.or.String()) 397 + sql.WriteString(" ") 398 } 399 400 if s.into == "" { 401 return "", nil, fmt.Errorf("INTO clause is required") 402 } 403 + sql.WriteString("INTO ") 404 sql.WriteString(s.into) 405 406 if len(s.values) == 0 { ··· 409 410 sql.WriteString(" (") 411 412 + for i, v := range s.values { 413 + if i != 0 { 414 + sql.WriteString(", ") 415 } 416 417 + sql.WriteString(v.col) 418 + args = append(args, v.val) 419 } 420 421 sql.WriteString(") VALUES (") 422 + sql.WriteString(strings.TrimSuffix(strings.Repeat("?, ", len(s.values)), ", ")) 423 sql.WriteString(")") 424 425 return sql.String(), args, nil
+52
query_test.go
··· 742 }) 743 } 744 }
··· 742 }) 743 } 744 } 745 + 746 + func TestInsertBuild_Success(t *testing.T) { 747 + tests := []struct { 748 + name string 749 + stmt insert 750 + expectedSql string 751 + expectedArgs []any 752 + }{ 753 + { 754 + name: "Simple insert", 755 + stmt: Insert().Into("users").Value("name", "John"), 756 + expectedSql: "INSERT INTO users (name) VALUES (?)", 757 + expectedArgs: []any{"John"}, 758 + }, 759 + { 760 + name: "Replace clause", 761 + stmt: Insert().Or(Replace).Into("users").Value("name", "John"), 762 + expectedSql: "INSERT OR REPLACE INTO users (name) VALUES (?)", 763 + expectedArgs: []any{"John"}, 764 + }, 765 + { 766 + name: "More values", 767 + stmt: Insert().Into("users").Value("name", "John").Value("age", 35), 768 + expectedSql: "INSERT INTO users (name, age) VALUES (?, ?)", 769 + expectedArgs: []any{"John", 35}, 770 + }, 771 + } 772 + 773 + for _, test := range tests { 774 + t.Run(test.name, func(t *testing.T) { 775 + sql, args, err := test.stmt.Build() 776 + 777 + if err != nil { 778 + t.Errorf("Expected no error, got %v", err) 779 + } 780 + 781 + if sql != test.expectedSql { 782 + t.Errorf("Expected '%s', got '%s'", test.expectedSql, sql) 783 + } 784 + 785 + if len(args) != len(test.expectedArgs) { 786 + t.Errorf("Expected '%d' args, got '%d' args", len(test.expectedArgs), len(args)) 787 + } 788 + 789 + for i := range len(args) { 790 + if args[i] != test.expectedArgs[i] { 791 + t.Errorf("Expected '%v', got '%v' at index %d", test.expectedArgs[i], args[i], i) 792 + } 793 + } 794 + }) 795 + } 796 + }