mirror of
https://github.com/Rain-kl/OpenFlare.git
synced 2026-09-29 14:06:36 +08:00
147 lines
4.0 KiB
Go
147 lines
4.0 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{}))
|
|
|
|
db.SetDB(sqliteDB)
|
|
return func() {
|
|
db.SetDB(nil)
|
|
}
|
|
}
|
|
|
|
func TestCreateProxyRoute(t *testing.T) {
|
|
cleanup := setupProxyRouteTestDB(t)
|
|
defer cleanup()
|
|
ctx := context.Background()
|
|
|
|
view, err := CreateProxyRoute(ctx, Input{
|
|
SiteName: "example-site",
|
|
Domain: "example.com",
|
|
OriginURL: "http://origin.example.com:8080",
|
|
Enabled: true,
|
|
})
|
|
require.NoError(t, err)
|
|
assert.NotZero(t, view.ID)
|
|
assert.Equal(t, "example-site", view.SiteName)
|
|
assert.Equal(t, "example.com", view.Domain)
|
|
assert.Equal(t, []string{"example.com"}, view.Domains)
|
|
assert.Equal(t, "http://origin.example.com:8080", view.OriginURL)
|
|
assert.Equal(t, []string{"http://origin.example.com:8080"}, view.UpstreamList)
|
|
assert.True(t, view.Enabled)
|
|
|
|
_, err = CreateProxyRoute(ctx, Input{
|
|
SiteName: "duplicate-site",
|
|
Domain: "example.com",
|
|
OriginURL: "http://origin.example.com:8080",
|
|
})
|
|
require.Error(t, err)
|
|
assert.Contains(t, err.Error(), "already exists")
|
|
}
|
|
|
|
func TestListProxyRoutes(t *testing.T) {
|
|
cleanup := setupProxyRouteTestDB(t)
|
|
defer cleanup()
|
|
ctx := context.Background()
|
|
|
|
first, err := CreateProxyRoute(ctx, Input{
|
|
SiteName: "first-site",
|
|
Domain: "first.example.com",
|
|
OriginURL: "http://origin-a.internal:80",
|
|
})
|
|
require.NoError(t, err)
|
|
|
|
second, err := CreateProxyRoute(ctx, Input{
|
|
SiteName: "second-site",
|
|
Domain: "second.example.com",
|
|
OriginURL: "http://origin-b.internal:80",
|
|
})
|
|
require.NoError(t, err)
|
|
|
|
routes, err := ListProxyRoutes(ctx)
|
|
require.NoError(t, err)
|
|
require.Len(t, routes, 2)
|
|
assert.Equal(t, second.ID, routes[0].ID)
|
|
assert.Equal(t, first.ID, routes[1].ID)
|
|
assert.Equal(t, "second.example.com", routes[0].Domain)
|
|
assert.Equal(t, "first.example.com", routes[1].Domain)
|
|
}
|
|
|
|
func TestValidateProxyRouteIdentityUniquenessUsesDecodedPrimaryDomain(t *testing.T) {
|
|
cleanup := setupProxyRouteTestDB(t)
|
|
defer cleanup()
|
|
ctx := context.Background()
|
|
|
|
existing := &model.ProxyRoute{
|
|
SiteName: "",
|
|
Domain: "legacy.example.com",
|
|
Domains: `["primary.example.com"]`,
|
|
OriginURL: "http://origin.example.com:8080",
|
|
Upstreams: `["http://origin.example.com:8080"]`,
|
|
Enabled: true,
|
|
UpstreamType: "direct",
|
|
}
|
|
require.NoError(t, model.CreateProxyRouteRecord(ctx, existing))
|
|
|
|
view, err := GetProxyRoute(ctx, existing.ID)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, "primary.example.com", view.SiteName)
|
|
|
|
_, err = CreateProxyRoute(ctx, Input{
|
|
SiteName: "primary.example.com",
|
|
Domain: "other.example.com",
|
|
OriginURL: "http://origin-b.example.com:8080",
|
|
})
|
|
require.Error(t, err)
|
|
assert.Contains(t, err.Error(), "site_name already exists")
|
|
}
|
|
|
|
func TestUpdateProxyRouteAuthConfig(t *testing.T) {
|
|
cleanup := setupProxyRouteTestDB(t)
|
|
defer cleanup()
|
|
ctx := context.Background()
|
|
|
|
created, err := CreateProxyRoute(ctx, Input{
|
|
SiteName: "auth-site",
|
|
Domain: "auth.example.com",
|
|
OriginURL: "http://origin.example.com:8080",
|
|
Enabled: true,
|
|
})
|
|
require.NoError(t, err)
|
|
|
|
updated, err := UpdateProxyRoute(ctx, created.ID, Input{
|
|
SiteName: created.SiteName,
|
|
Domain: created.Domain,
|
|
Domains: created.Domains,
|
|
OriginURL: created.OriginURL,
|
|
Enabled: created.Enabled,
|
|
BasicAuthEnabled: true,
|
|
BasicAuthUsername: "admin",
|
|
BasicAuthPassword: "secret",
|
|
})
|
|
require.NoError(t, err)
|
|
assert.True(t, updated.BasicAuthEnabled)
|
|
assert.Equal(t, "admin", updated.BasicAuthUsername)
|
|
assert.Equal(t, "secret", updated.BasicAuthPassword)
|
|
}
|