mirror of
https://github.com/GMWalletApp/epusdt.git
synced 2026-07-07 10:16:15 +00:00
6bb47d4b00
- Add full admin REST API: auth, API keys, chains, chain tokens, wallets, orders, RPC nodes, settings, dashboard stats, notifications - Add JWT-based admin authentication and API key auth middleware - Add multi-chain listeners: BSC, ETH, Polygon, Plasma, EVM WebSocket - Add RPC node health check job with automatic failover - Add Telegram notification channel for order events - Add installer for first-run database initialization - Add new DB models: admin_user, api_key, chain, chain_token, rpc_node, settings, notification_channel - Add order statistics aggregation (daily/monthly/by-chain) - Serve built admin SPA from embedded www/ assets - Add comprehensive test coverage for all new features
93 lines
2.6 KiB
Go
93 lines
2.6 KiB
Go
package service
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/assimon/luuu/config"
|
|
"github.com/assimon/luuu/internal/testutil"
|
|
"github.com/assimon/luuu/model/dao"
|
|
"github.com/assimon/luuu/model/mdb"
|
|
)
|
|
|
|
// TestResolveTronNode_NoRow verifies that resolveTronNode falls back to the
|
|
// hard-coded default when the rpc_nodes table has no TRON row.
|
|
func TestResolveTronNode_NoRow(t *testing.T) {
|
|
cleanup := testutil.SetupTestDatabases(t)
|
|
defer cleanup()
|
|
|
|
config.TRON_GRID_API_KEY = "fallback-key"
|
|
|
|
gotURL, gotKey := resolveTronNode()
|
|
if gotURL != tronNodeDefault {
|
|
t.Errorf("url = %q, want %q", gotURL, tronNodeDefault)
|
|
}
|
|
if gotKey != "fallback-key" {
|
|
t.Errorf("apiKey = %q, want \"fallback-key\"", gotKey)
|
|
}
|
|
}
|
|
|
|
// TestResolveTronNode_WithRow verifies that resolveTronNode uses the DB row
|
|
// when an enabled TRON HTTP node is present.
|
|
func TestResolveTronNode_WithRow(t *testing.T) {
|
|
cleanup := testutil.SetupTestDatabases(t)
|
|
defer cleanup()
|
|
|
|
config.TRON_GRID_API_KEY = "fallback-key"
|
|
|
|
// Insert an enabled TRON http node.
|
|
node := &mdb.RpcNode{
|
|
Network: mdb.NetworkTron,
|
|
Url: "https://custom-tron.example.com",
|
|
Type: mdb.RpcNodeTypeHttp,
|
|
ApiKey: "db-api-key",
|
|
Weight: 1,
|
|
Enabled: true,
|
|
Status: mdb.RpcNodeStatusOk,
|
|
}
|
|
if err := dao.Mdb.Create(node).Error; err != nil {
|
|
t.Fatalf("seed rpc_node: %v", err)
|
|
}
|
|
|
|
gotURL, gotKey := resolveTronNode()
|
|
if gotURL != "https://custom-tron.example.com" {
|
|
t.Errorf("url = %q, want https://custom-tron.example.com", gotURL)
|
|
}
|
|
if gotKey != "db-api-key" {
|
|
t.Errorf("apiKey = %q, want \"db-api-key\"", gotKey)
|
|
}
|
|
}
|
|
|
|
// TestResolveTronNode_DisabledRow verifies that a disabled row is ignored and
|
|
// the fallback is used.
|
|
func TestResolveTronNode_DisabledRow(t *testing.T) {
|
|
cleanup := testutil.SetupTestDatabases(t)
|
|
defer cleanup()
|
|
|
|
config.TRON_GRID_API_KEY = "fallback-key"
|
|
|
|
node := &mdb.RpcNode{
|
|
Network: mdb.NetworkTron,
|
|
Url: "https://disabled-tron.example.com",
|
|
Type: mdb.RpcNodeTypeHttp,
|
|
ApiKey: "disabled-key",
|
|
Weight: 1,
|
|
Enabled: true, // start enabled, then disable below
|
|
Status: mdb.RpcNodeStatusOk,
|
|
}
|
|
if err := dao.Mdb.Create(node).Error; err != nil {
|
|
t.Fatalf("seed rpc_node: %v", err)
|
|
}
|
|
// Explicitly disable — GORM does not save bool zero-value on Create.
|
|
if err := dao.Mdb.Model(node).Update("enabled", false).Error; err != nil {
|
|
t.Fatalf("disable rpc_node: %v", err)
|
|
}
|
|
|
|
gotURL, gotKey := resolveTronNode()
|
|
if gotURL != tronNodeDefault {
|
|
t.Errorf("url = %q, want %q (disabled row should be ignored)", gotURL, tronNodeDefault)
|
|
}
|
|
if gotKey != "fallback-key" {
|
|
t.Errorf("apiKey = %q, want \"fallback-key\"", gotKey)
|
|
}
|
|
}
|