package paymentaccount import ( "context" "errors" "testing" "hfb_sys/backend/internal/model" "gorm.io/driver/sqlite" "gorm.io/gorm" "gorm.io/gorm/logger" ) func TestPrivateCertificateURLsConvertsLegacyPublicURL(t *testing.T) { values := privateCertificateURLs([]string{ "/api/public/files/object?key=payment-cert%2F2026%2Fqr.jpg", "/api/public/files/object?key=avatar%2Fuser.jpg", }) if values[0] != "/api/files/object?key=payment-cert%2F2026%2Fqr.jpg" { t.Fatalf("payment certificate URL = %q", values[0]) } if values[1] != "/api/public/files/object?key=avatar%2Fuser.jpg" { t.Fatalf("non-certificate URL changed = %q", values[1]) } } func TestValidateCertificateURLsRequiresUploaderOwnership(t *testing.T) { db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{Logger: logger.Default.LogMode(logger.Silent)}) if err != nil { t.Fatalf("open sqlite error = %v", err) } if err := db.AutoMigrate(&model.FileUploadOwner{}); err != nil { t.Fatalf("migrate upload owners error = %v", err) } if err := db.Create(&model.FileUploadOwner{UserID: 1, ObjectKey: "payment-cert/owned.jpg"}).Error; err != nil { t.Fatalf("create upload owner error = %v", err) } repo := NewRepository(db, nil) ownedURL := "/api/files/object?key=payment-cert%2Fowned.jpg" if err := repo.validateCertificateURLs(context.Background(), 1, []string{ownedURL}, nil); err != nil { t.Fatalf("owned certificate rejected: %v", err) } if err := repo.validateCertificateURLs(context.Background(), 2, []string{ownedURL}, nil); !errors.Is(err, ErrInvalidCertificateURL) { t.Fatalf("other user's certificate validation error = %v", err) } if err := repo.validateCertificateURLs(context.Background(), 1, []string{"/api/files/object?key=listing%2Fowned.jpg"}, nil); !errors.Is(err, ErrInvalidCertificateURL) { t.Fatalf("non-certificate file validation error = %v", err) } legacyURL := "/api/public/files/object?key=payment-cert%2Flegacy.jpg" if err := repo.validateCertificateURLs(context.Background(), 1, []string{legacyURL}, []string{legacyURL}); err != nil { t.Fatalf("existing legacy certificate rejected: %v", err) } }