mirror of
https://github.com/Rain-kl/OpenFlare.git
synced 2026-09-30 06:16:37 +08:00
83 lines
3.2 KiB
Go
83 lines
3.2 KiB
Go
// Copyright 2026 Arctel.net
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
package proxy_route
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"github.com/Rain-kl/Wavelet/internal/db"
|
|
"github.com/Rain-kl/Wavelet/internal/model"
|
|
"github.com/glebarez/sqlite"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
func setupProxyRouteTestDB(t *testing.T) func() {
|
|
t.Helper()
|
|
sqliteDB, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{DisableForeignKeyConstraintWhenMigrating: true})
|
|
require.NoError(t, err)
|
|
require.NoError(t, sqliteDB.AutoMigrate(&model.ProxyRoute{}, &model.Origin{}, &model.Zone{}, &model.ZoneDomain{}, &model.TLSCertificate{}))
|
|
db.SetDB(sqliteDB)
|
|
return func() { db.SetDB(nil) }
|
|
}
|
|
|
|
func createZoneDomain(t *testing.T, ctx context.Context, domain string, certID *uint) *model.ZoneDomain {
|
|
t.Helper()
|
|
zone := &model.Zone{Domain: "example.com"}
|
|
var existing model.Zone
|
|
if err := db.DB(ctx).Where("domain = ?", zone.Domain).First(&existing).Error; err == nil {
|
|
zone = &existing
|
|
} else {
|
|
require.NoError(t, db.DB(ctx).Create(zone).Error)
|
|
}
|
|
item := &model.ZoneDomain{ZoneID: zone.ID, Domain: domain, CertID: certID}
|
|
require.NoError(t, db.DB(ctx).Create(item).Error)
|
|
return item
|
|
}
|
|
|
|
func TestCreateProxyRouteBindsZoneDomains(t *testing.T) {
|
|
cleanup := setupProxyRouteTestDB(t)
|
|
defer cleanup()
|
|
ctx := context.Background()
|
|
domainA := createZoneDomain(t, ctx, "api.example.com", nil)
|
|
domainB := createZoneDomain(t, ctx, "www.example.com", nil)
|
|
|
|
view, err := CreateProxyRoute(ctx, Input{SiteName: "api", ZoneDomainIDs: []uint{domainA.ID, domainB.ID}, OriginURL: "http://origin.example.com:8080", Enabled: true})
|
|
require.NoError(t, err)
|
|
assert.Equal(t, []uint{domainA.ID, domainB.ID}, view.ZoneDomainIDs)
|
|
require.Len(t, view.ZoneDomains, 2)
|
|
assert.Equal(t, "api.example.com", view.ZoneDomains[0].Domain)
|
|
}
|
|
|
|
func TestCreateProxyRouteRejectsInvalidZoneDomainBindings(t *testing.T) {
|
|
cleanup := setupProxyRouteTestDB(t)
|
|
defer cleanup()
|
|
ctx := context.Background()
|
|
domain := createZoneDomain(t, ctx, "api.example.com", nil)
|
|
base := Input{SiteName: "api", OriginURL: "http://origin.example.com:8080"}
|
|
|
|
_, err := CreateProxyRoute(ctx, base)
|
|
require.EqualError(t, err, errProxyRouteZoneDomainsRequired)
|
|
base.ZoneDomainIDs = []uint{domain.ID, domain.ID}
|
|
_, err = CreateProxyRoute(ctx, base)
|
|
require.EqualError(t, err, errProxyRouteZoneDomainDuplicate)
|
|
|
|
first, err := CreateProxyRoute(ctx, Input{SiteName: "first", ZoneDomainIDs: []uint{domain.ID}, OriginURL: "http://origin.example.com:8080"})
|
|
require.NoError(t, err)
|
|
_, err = CreateProxyRoute(ctx, Input{SiteName: "second", ZoneDomainIDs: []uint{domain.ID}, OriginURL: "http://other.example.com:8080"})
|
|
require.Error(t, err)
|
|
require.NoError(t, DeleteProxyRoute(ctx, first.ID))
|
|
}
|
|
|
|
func TestCreateProxyRouteHTTPSRequiresCoveringCertificate(t *testing.T) {
|
|
cleanup := setupProxyRouteTestDB(t)
|
|
defer cleanup()
|
|
ctx := context.Background()
|
|
domain := createZoneDomain(t, ctx, "api.example.com", nil)
|
|
_, err := CreateProxyRoute(ctx, Input{SiteName: "api", ZoneDomainIDs: []uint{domain.ID}, OriginURL: "http://origin.example.com:8080", EnableHTTPS: true})
|
|
require.EqualError(t, err, errProxyRouteCertRequired)
|
|
}
|