integration_test.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. package repository
  2. import (
  3. "context"
  4. "log"
  5. "os"
  6. "testing"
  7. "time"
  8. "github.com/google/uuid"
  9. "github.com/jackc/pgx/v5/pgxpool"
  10. "gogs.fxtmmsk.ru/foxtime/photoplaces/backend/internal/models"
  11. )
  12. var testPool *pgxpool.Pool
  13. func TestMain(m *testing.M) {
  14. databaseURL := os.Getenv("DATABASE_URL_TEST")
  15. if databaseURL == "" {
  16. databaseURL = os.Getenv("DATABASE_URL")
  17. }
  18. if databaseURL == "" {
  19. log.Println("SKIP: DATABASE_URL_TEST not set")
  20. return
  21. }
  22. ctx := context.Background()
  23. pool, err := pgxpool.New(ctx, databaseURL)
  24. if err != nil {
  25. log.Printf("SKIP: cannot connect to test database: %v", err)
  26. return
  27. }
  28. defer pool.Close()
  29. testPool = pool
  30. os.Exit(m.Run())
  31. }
  32. func cleanTables(t *testing.T, tables ...string) {
  33. t.Helper()
  34. ctx := context.Background()
  35. for _, table := range tables {
  36. if _, err := testPool.Exec(ctx, "DELETE FROM "+table); err != nil {
  37. t.Fatalf("clean table %s: %v", table, err)
  38. }
  39. }
  40. }
  41. func insertTestUser(t *testing.T) *models.User {
  42. t.Helper()
  43. ctx := context.Background()
  44. user := &models.User{
  45. ID: uuid.New().String(),
  46. Email: uuid.New().String() + "@test.test",
  47. PasswordHash: "hash",
  48. Role: "customer",
  49. Status: "active",
  50. CreatedAt: time.Now(),
  51. }
  52. _, err := testPool.Exec(ctx,
  53. `INSERT INTO users (id, email, password_hash, role, status, created_at)
  54. VALUES ($1, $2, $3, $4, $5, $6)`,
  55. user.ID, user.Email, user.PasswordHash, user.Role, user.Status, user.CreatedAt)
  56. if err != nil {
  57. t.Fatalf("insert test user: %v", err)
  58. }
  59. return user
  60. }
  61. func insertTestPlace(t *testing.T, ownerID string, hourlyRate *int) *models.Place {
  62. t.Helper()
  63. ctx := context.Background()
  64. p := &models.Place{
  65. ID: uuid.New().String(),
  66. Type: "studio",
  67. OwnerID: ownerID,
  68. Title: "Test Place " + uuid.New().String()[:8],
  69. Lat: 55.75,
  70. Lng: 37.61,
  71. Status: "published",
  72. HourlyRate: hourlyRate,
  73. Currency: "RUB",
  74. Rating: 0,
  75. CreatedAt: time.Now(),
  76. UpdatedAt: time.Now(),
  77. }
  78. _, err := testPool.Exec(ctx,
  79. `INSERT INTO places (id, type, owner_id, title, coordinates, status, hourly_rate, currency, rating, created_at, updated_at)
  80. VALUES ($1, $2, $3, $4, ST_SetSRID(ST_MakePoint($5, $6), 4326), $7, $8, $9, $10, $11, $12)`,
  81. p.ID, p.Type, p.OwnerID, p.Title, p.Lng, p.Lat, p.Status, p.HourlyRate, p.Currency, p.Rating, p.CreatedAt, p.UpdatedAt)
  82. if err != nil {
  83. t.Fatalf("insert test place: %v", err)
  84. }
  85. return p
  86. }
  87. func insertTestTag(t *testing.T) *models.Tag {
  88. t.Helper()
  89. ctx := context.Background()
  90. tag := &models.Tag{
  91. ID: uuid.New().String(),
  92. Name: "Test Tag " + uuid.New().String()[:8],
  93. Category: "style",
  94. }
  95. _, err := testPool.Exec(ctx,
  96. `INSERT INTO tags (id, name, category) VALUES ($1, $2, $3)`,
  97. tag.ID, tag.Name, tag.Category)
  98. if err != nil {
  99. t.Fatalf("insert test tag: %v", err)
  100. }
  101. return tag
  102. }
  103. func insertTestPlaceTag(t *testing.T, placeID, tagID string) {
  104. t.Helper()
  105. if _, err := testPool.Exec(context.Background(),
  106. `INSERT INTO place_tags (place_id, tag_id) VALUES ($1, $2)`, placeID, tagID); err != nil {
  107. t.Fatalf("insert place_tag: %v", err)
  108. }
  109. }