mysql_test.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. package infrastructure
  2. import (
  3. "database/sql"
  4. "fmt"
  5. "os"
  6. "testing"
  7. "code.osinet.fr/fgm/kurz/domain"
  8. "github.com/pressly/goose"
  9. "github.com/spf13/viper"
  10. _ "github.com/go-sql-driver/mysql"
  11. )
  12. func TestMySQLEmptyRepo(test *testing.T) {
  13. db := mySQLTestSetup(test)
  14. defer db.Close()
  15. test.Run("empty repo", func(subTest *testing.T) {
  16. _, err := domain.GetTargetURL("whatever")
  17. if err == nil {
  18. subTest.Error("Empty repository should not find a target for any URL")
  19. }
  20. s1, isNew, err := domain.GetShortURL(exampleValidHTTPURL)
  21. if err != nil {
  22. subTest.Error("Creating a short URL for a valid URL should not fail")
  23. }
  24. if !isNew {
  25. subTest.Error("The first short URL in an empty repository should be new")
  26. }
  27. s2, isNew, err := domain.GetShortURL(exampleValidHTTPURL)
  28. if err != nil {
  29. subTest.Error("Creating a short URL for a valid URL should not fail")
  30. }
  31. if isNew {
  32. subTest.Error("The second short URL for an already shortened URL should not be new")
  33. }
  34. if s1 != s2 {
  35. subTest.Error("The second short URL for an already shortened URL should be the same as the first one")
  36. }
  37. t, err := domain.GetTargetURL(s1)
  38. if err != nil {
  39. subTest.Error("Repository should find a target for an existing short URL")
  40. }
  41. if t != exampleValidHTTPURL {
  42. subTest.Error("Target URL for a short URL should match the target it was created for")
  43. }
  44. })
  45. mySQLTestTeardown(test, db)
  46. }
  47. func TestMySQLSad(test *testing.T) {
  48. db := mySQLTestSetup(test)
  49. defer db.Close()
  50. test.Run("Sad", func(subTest *testing.T) {
  51. _, _, err := domain.GetShortURL("")
  52. if err == nil {
  53. test.Error("Empty target URL has no valid short URL")
  54. }
  55. })
  56. mySQLTestTeardown(test, db)
  57. }
  58. /**
  59. mySQLTestSetup opens the database and initialized it from the production database schema.
  60. */
  61. func mySQLTestSetup(t *testing.T) *sql.DB {
  62. db, err := DbDial(ParseTestDbCred())
  63. if err != nil {
  64. panic(err)
  65. }
  66. // Ensure current schema for test DB.
  67. cwd, _ := os.Getwd()
  68. current, err := goose.GetDBVersion(db)
  69. if err != nil {
  70. t.Errorf("setup failed to obtain the test DB version: %s", err)
  71. t.FailNow()
  72. }
  73. versions, err := goose.CollectMigrations(cwd, current, int64((1<<63)-1))
  74. if err != nil {
  75. t.Errorf("setup failed to obtain the test DB migrations: %s", err)
  76. t.FailNow()
  77. }
  78. if versions != nil {
  79. err = goose.Up(db, cwd)
  80. if err != nil {
  81. t.Errorf("setup failed to upgrade the test DB schema: %s", err)
  82. t.FailNow()
  83. }
  84. }
  85. // Ensure empty test DB.
  86. _, err = db.Exec("DELETE FROM map")
  87. if err != nil {
  88. t.Error("setup failed to clean test database")
  89. }
  90. sr := MySQLShortURLRepository{db}
  91. tr := MySQLTargetURLRepository{db}
  92. domain.RegisterRepositories(sr, tr)
  93. return db
  94. }
  95. func mySQLTestTeardown(t *testing.T, db *sql.DB) {
  96. _, err := db.Exec("DELETE FROM map")
  97. if err != nil {
  98. t.Error("teardown failed to clean test database")
  99. }
  100. }
  101. func TestMain(m *testing.M) {
  102. viper.SetConfigName("config")
  103. viper.AddConfigPath(".")
  104. viper.AddConfigPath("$HOME/.kurz")
  105. err := viper.ReadInConfig()
  106. if err != nil {
  107. fmt.Fprintln(os.Stderr, err)
  108. os.Exit(2)
  109. }
  110. exitCode := m.Run()
  111. os.Exit(exitCode)
  112. }