A community based topic aggregation platform built on atproto
1package integration 2 3import ( 4 "Coves/internal/core/users" 5 "Coves/internal/db/postgres" 6 "bytes" 7 "database/sql" 8 "encoding/json" 9 "net/http" 10 "net/http/httptest" 11 "os" 12 "testing" 13 14 "github.com/go-chi/chi/v5" 15 _ "github.com/lib/pq" 16 "github.com/pressly/goose/v3" 17 18 "Coves/internal/api/routes" 19) 20 21func setupTestDB(t *testing.T) *sql.DB { 22 dbURL := os.Getenv("TEST_DATABASE_URL") 23 if dbURL == "" { 24 dbURL = "postgres://test_user:test_password@localhost:5434/coves_test?sslmode=disable" 25 } 26 27 db, err := sql.Open("postgres", dbURL) 28 if err != nil { 29 t.Fatalf("Failed to connect to test database: %v", err) 30 } 31 32 if err := db.Ping(); err != nil { 33 t.Fatalf("Failed to ping test database: %v", err) 34 } 35 36 if err := goose.SetDialect("postgres"); err != nil { 37 t.Fatalf("Failed to set goose dialect: %v", err) 38 } 39 40 if err := goose.Up(db, "../../internal/db/migrations"); err != nil { 41 t.Fatalf("Failed to run migrations: %v", err) 42 } 43 44 // Clean up any existing test data 45 _, err = db.Exec("DELETE FROM users WHERE email LIKE '%@example.com'") 46 if err != nil { 47 t.Logf("Warning: Failed to clean up test data: %v", err) 48 } 49 50 return db 51} 52 53func TestCreateUser(t *testing.T) { 54 db := setupTestDB(t) 55 defer db.Close() 56 57 // Wire up dependencies according to architecture 58 userRepo := postgres.NewUserRepository(db) 59 userService := users.NewUserService(userRepo) 60 61 r := chi.NewRouter() 62 r.Mount("/api/users", routes.UserRoutes(userService)) 63 64 user := users.CreateUserRequest{ 65 Email: "test@example.com", 66 Username: "testuser", 67 } 68 69 body, _ := json.Marshal(user) 70 req := httptest.NewRequest("POST", "/api/users", bytes.NewBuffer(body)) 71 req.Header.Set("Content-Type", "application/json") 72 73 w := httptest.NewRecorder() 74 r.ServeHTTP(w, req) 75 76 if w.Code != http.StatusCreated { 77 t.Errorf("Expected status %d, got %d. Response: %s", http.StatusCreated, w.Code, w.Body.String()) 78 return 79 } 80 81 var createdUser users.User 82 if err := json.NewDecoder(w.Body).Decode(&createdUser); err != nil { 83 t.Fatalf("Failed to decode response: %v", err) 84 } 85 86 if createdUser.Email != user.Email { 87 t.Errorf("Expected email %s, got %s", user.Email, createdUser.Email) 88 } 89 90 if createdUser.Username != user.Username { 91 t.Errorf("Expected username %s, got %s", user.Username, createdUser.Username) 92 } 93} 94