Files

113 lines
3.7 KiB
Go

package acceptance
import (
"flag"
"fmt"
"os"
"strings"
"testing"
"time"
)
type Config struct {
StagingURL string
AdminEmail string
AdminPassword string
UserEmail string
UserPassword string
NodeSecret string
NodeServerID string
NodeProtocol string
RunID string
ReportPath string
SeedSQLPath string
DB DBConfig
Redis RedisConfig
HTTPTimeout time.Duration
}
type DBConfig struct {
Host string
User string
Password string
Name string
}
type RedisConfig struct {
Addr string
Password string
DB int
}
var testConfig = Config{
HTTPTimeout: 15 * time.Second,
NodeServerID: "31",
NodeProtocol: "trojan",
SeedSQLPath: "fixtures/seed.sql",
}
func init() {
flag.StringVar(&testConfig.StagingURL, "staging-url", getenv("STAGING_BASE_URL", "https://tapi.hifast.biz"), "staging base URL")
flag.StringVar(&testConfig.AdminEmail, "admin-email", os.Getenv("ACCEPTANCE_ADMIN_EMAIL"), "admin login email")
flag.StringVar(&testConfig.AdminPassword, "admin-password", os.Getenv("ACCEPTANCE_ADMIN_PASSWORD"), "admin login password")
flag.StringVar(&testConfig.UserEmail, "user-email", os.Getenv("ACCEPTANCE_USER_EMAIL"), "user login email")
flag.StringVar(&testConfig.UserPassword, "user-password", os.Getenv("ACCEPTANCE_USER_PASSWORD"), "user login password")
flag.StringVar(&testConfig.NodeSecret, "node-secret", os.Getenv("ACCEPTANCE_NODE_SECRET"), "node secret; read from staging DB when omitted")
flag.StringVar(&testConfig.NodeServerID, "node-server-id", getenv("ACCEPTANCE_NODE_SERVER_ID", testConfig.NodeServerID), "server id for node smoke tests")
flag.StringVar(&testConfig.NodeProtocol, "node-protocol", getenv("ACCEPTANCE_NODE_PROTOCOL", testConfig.NodeProtocol), "server protocol for node smoke tests")
flag.StringVar(&testConfig.RunID, "run-id", getenv("ACCEPTANCE_RUN_ID", defaultRunID()), "acceptance run id")
flag.StringVar(&testConfig.ReportPath, "report-path", os.Getenv("ACCEPTANCE_REPORT_PATH"), "optional JSON report path")
flag.StringVar(&testConfig.SeedSQLPath, "seed-sql", getenv("ACCEPTANCE_SEED_SQL", testConfig.SeedSQLPath), "seed SQL file path")
flag.StringVar(&testConfig.DB.Host, "db-host", os.Getenv("STAGING_DB_HOST"), "staging DB host")
flag.StringVar(&testConfig.DB.User, "db-user", os.Getenv("STAGING_DB_USER"), "staging DB user")
flag.StringVar(&testConfig.DB.Password, "db-password", os.Getenv("STAGING_DB_PASSWORD"), "staging DB password")
flag.StringVar(&testConfig.DB.Name, "db-name", os.Getenv("STAGING_DB_NAME"), "staging DB name")
flag.StringVar(&testConfig.Redis.Addr, "redis-addr", os.Getenv("STAGING_REDIS_ADDR"), "staging Redis addr")
flag.StringVar(&testConfig.Redis.Password, "redis-password", os.Getenv("STAGING_REDIS_PASSWORD"), "staging Redis password")
flag.IntVar(&testConfig.Redis.DB, "redis-db", getenvInt("STAGING_REDIS_DB", 0), "staging Redis DB")
}
func cfg(t *testing.T) Config {
t.Helper()
if strings.TrimSpace(testConfig.StagingURL) == "" {
t.Fatal("staging-url is required")
}
return testConfig
}
func requireSecret(t *testing.T, name string, value string) string {
t.Helper()
if strings.TrimSpace(value) == "" {
t.Skipf("%s is required for this acceptance test", name)
}
return value
}
func getenv(key string, fallback string) string {
if value := os.Getenv(key); value != "" {
return value
}
return fallback
}
func getenvInt(key string, fallback int) int {
value := os.Getenv(key)
if value == "" {
return fallback
}
var parsed int
if _, err := fmt.Sscanf(value, "%d", &parsed); err != nil {
return fallback
}
return parsed
}
func defaultRunID() string {
runID := os.Getenv("GITHUB_RUN_ID")
attempt := getenv("GITHUB_RUN_ATTEMPT", "1")
if runID == "" {
return "qa_local"
}
return "qa_" + runID + "_" + attempt
}