p_sql_test.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package backends
  2. import (
  3. "database/sql"
  4. "flag"
  5. "fmt"
  6. "strconv"
  7. "strings"
  8. "testing"
  9. "time"
  10. "github.com/flashmob/go-guerrilla/log"
  11. "github.com/flashmob/go-guerrilla/mail"
  12. _ "github.com/go-sql-driver/mysql"
  13. )
  14. var (
  15. mailTableFlag = flag.String("mail-table", "test", "Table to use for testing the SQL backend")
  16. sqlDSNFlag = flag.String("sql-dsn", "", "DSN to use for testing the SQL backend")
  17. sqlDriverFlag = flag.String("sql-driver", "mysql", "Driver to use for testing the SQL backend")
  18. )
  19. func TestSQL(t *testing.T) {
  20. if *sqlDSNFlag == "" {
  21. t.Skip("requires -sql-dsn to run")
  22. }
  23. logger, err := log.GetLogger(log.OutputOff.String(), log.DebugLevel.String())
  24. if err != nil {
  25. t.Fatal("get logger:", err)
  26. }
  27. cfg := BackendConfig{}
  28. cfg.SetValue(ConfigGateways, DefaultGateway, "save_process", "sql")
  29. cfg.SetValue(ConfigProcessors, "sql", "mail_table", *mailTableFlag)
  30. cfg.SetValue(ConfigProcessors, "sql", "primary_mail_host", "example.com")
  31. cfg.SetValue(ConfigProcessors, "sql", "sql_driver", *sqlDriverFlag)
  32. cfg.SetValue(ConfigProcessors, "sql", "sql_dsn", *sqlDSNFlag)
  33. backend, err := New(DefaultGateway, cfg, logger)
  34. if err != nil {
  35. t.Fatal("new backend:", err)
  36. }
  37. if err := backend.Start(); err != nil {
  38. t.Fatal("start backend: ", err)
  39. }
  40. hash := strconv.FormatInt(time.Now().UnixNano(), 10)
  41. envelope := &mail.Envelope{
  42. RcptTo: []mail.Address{{User: "user", Host: "example.com"}},
  43. Hashes: []string{hash},
  44. }
  45. // The SQL processor is expected to use the hash to queue the mail.
  46. result := backend.Process(envelope)
  47. if !strings.Contains(result.String(), hash) {
  48. t.Errorf("expected message to be queued with hash, got %q", result)
  49. }
  50. // Ensure that a record actually exists.
  51. results, err := findRows(hash)
  52. if err != nil {
  53. t.Fatal("find rows: ", err)
  54. }
  55. if len(results) != 1 {
  56. t.Fatalf("expected one row, got %d", len(results))
  57. }
  58. }
  59. func findRows(hash string) ([]string, error) {
  60. db, err := sql.Open(*sqlDriverFlag, *sqlDSNFlag)
  61. if err != nil {
  62. return nil, err
  63. }
  64. defer func() {
  65. _ = db.Close()
  66. }()
  67. stmt := fmt.Sprintf(`SELECT hash FROM %s WHERE hash = ?`, *mailTableFlag)
  68. rows, err := db.Query(stmt, hash)
  69. if err != nil {
  70. return nil, err
  71. }
  72. var results []string
  73. for rows.Next() {
  74. var result string
  75. if err := rows.Scan(&result); err != nil {
  76. return nil, err
  77. }
  78. results = append(results, result)
  79. }
  80. return results, nil
  81. }