A community based topic aggregation platform built on atproto
1package integration_test
2
3import (
4 "os"
5 "testing"
6
7 "Coves/internal/atproto/carstore"
8 "Coves/internal/core/repository"
9 "Coves/internal/db/postgres"
10 "database/sql"
11 _ "github.com/lib/pq"
12 "github.com/pressly/goose/v3"
13 postgresDriver "gorm.io/driver/postgres"
14 "gorm.io/gorm"
15)
16
17func TestRepositoryIntegration(t *testing.T) {
18 // Skip if not running integration tests
19 if testing.Short() {
20 t.Skip("Skipping integration test")
21 }
22
23 // Use test database URL from environment or default
24 dbURL := os.Getenv("TEST_DATABASE_URL")
25 if dbURL == "" {
26 dbURL = "postgres://test_user:test_password@localhost:5434/coves_test?sslmode=disable"
27 }
28
29 // Connect to test database with sql.DB for migrations
30 sqlDB, err := sql.Open("postgres", dbURL)
31 if err != nil {
32 t.Fatalf("Failed to connect to test database: %v", err)
33 }
34 defer sqlDB.Close()
35
36 // Run migrations
37 if err := goose.Up(sqlDB, "../../internal/db/migrations"); err != nil {
38 t.Fatalf("Failed to run migrations: %v", err)
39 }
40
41 // Connect with GORM for carstore
42 gormDB, err := gorm.Open(postgresDriver.Open(dbURL), &gorm.Config{
43 DisableForeignKeyConstraintWhenMigrating: true,
44 PrepareStmt: false,
45 })
46 if err != nil {
47 t.Fatalf("Failed to create GORM connection: %v", err)
48 }
49
50 // Create temporary directory for carstore
51 tempDir, err := os.MkdirTemp("", "carstore_integration_test")
52 if err != nil {
53 t.Fatalf("Failed to create temp dir: %v", err)
54 }
55 defer os.RemoveAll(tempDir)
56
57 // Initialize carstore
58 carDirs := []string{tempDir}
59 repoStore, err := carstore.NewRepoStore(gormDB, carDirs)
60 if err != nil {
61 t.Fatalf("Failed to create repo store: %v", err)
62 }
63
64 // Create repository repo
65 repoRepo := postgres.NewRepositoryRepo(sqlDB)
66
67 // Create service with both repo and repoStore
68 service := repository.NewService(repoRepo, repoStore)
69
70 // Test creating a repository
71 did := "did:plc:testuser123"
72 service.SetSigningKey(did, "mock-signing-key")
73
74 repo, err := service.CreateRepository(did)
75 if err != nil {
76 t.Fatalf("Failed to create repository: %v", err)
77 }
78
79 if repo.DID != did {
80 t.Errorf("Expected DID %s, got %s", did, repo.DID)
81 }
82
83 // Test getting the repository
84 fetchedRepo, err := service.GetRepository(did)
85 if err != nil {
86 t.Fatalf("Failed to get repository: %v", err)
87 }
88
89 if fetchedRepo.DID != did {
90 t.Errorf("Expected DID %s, got %s", did, fetchedRepo.DID)
91 }
92
93 // Clean up
94 err = service.DeleteRepository(did)
95 if err != nil {
96 t.Fatalf("Failed to delete repository: %v", err)
97 }
98
99 // Clean up test data
100 gormDB.Exec("DELETE FROM repositories")
101 gormDB.Exec("DELETE FROM user_maps")
102 gormDB.Exec("DELETE FROM car_shards")
103}