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