Files
hhctl/client/client_test.go
2026-10-27 17:02:15 -06:00

93 lines
2.8 KiB
Go

package client_test
import (
"testing"
"git.veillax.com/Veillax/hhctl/client"
"git.veillax.com/Veillax/hhctl/internal/fakehh"
)
func TestResourcesRoundTrip(t *testing.T) {
fs := fakehh.New()
defer fs.Close()
c := client.New(fs.URL, fakehh.ServerKey, "")
if err := c.ResolveOrg(); err != nil || c.Org != fakehh.OrgID {
t.Fatalf("resolve org: %q %v", c.Org, err)
}
edge, err := c.CreateEdge(client.Edge{Name: "fra", TunnelAddr: "1.2.3.4:51820"})
if err != nil || edge.ID == "" || edge.Token == "" {
t.Fatalf("create edge: %+v %v", edge, err)
}
site, err := c.CreateSite("home", []string{"lab"})
if err != nil || site.Token == "" {
t.Fatalf("create site: %+v %v", site, err)
}
got, err := c.GetSite(site.ID)
if err != nil || got.Name != "home" || len(got.Tags) != 1 {
t.Fatalf("get site: %+v %v", got, err)
}
if err := c.UpdateSite(site.ID, "house", nil); err != nil {
t.Fatal(err)
}
if got, _ = c.GetSite(site.ID); got.Name != "house" {
t.Fatalf("rename: %+v", got)
}
port, err := c.CreatePort(client.Port{Name: "web", Proto: "https", EdgeID: edge.ID, Port: 443, Hostname: "a.example.com", Enabled: true,
Targets: []client.Target{{SiteID: site.ID, Host: "10.0.0.2", Port: 80}}})
if err != nil || port.ID == "" {
t.Fatalf("create port: %+v %v", port, err)
}
port.Enabled = false
if _, err := c.UpdatePort(*port); err != nil {
t.Fatal(err)
}
if p, _ := c.GetPort(port.ID); p.Enabled || p.Targets[0].Host != "10.0.0.2" {
t.Fatalf("update port: %+v", p)
}
dom, err := c.CreateDomain(client.Domain{Name: "example.com", EdgeID: edge.ID})
if err != nil {
t.Fatal(err)
}
id, err := c.CreateChannel(false, client.Channel{Name: "ops", Kind: "email", Target: "ops@example.com", Enabled: true})
if err != nil || id == "" {
t.Fatalf("channel id: %q %v", id, err)
}
al, err := c.Alerts(false)
if err != nil || len(al.Channels) != 1 {
t.Fatalf("alerts: %+v %v", al, err)
}
for _, del := range []func() error{
func() error { return c.DeleteChannel(false, id) },
func() error { return c.DeleteDomain(dom.ID) },
func() error { return c.DeletePort(port.ID) },
func() error { return c.DeleteSite(site.ID) },
func() error { return c.DeleteEdge(edge.ID) },
} {
if err := del(); err != nil {
t.Fatal(err)
}
}
if _, err := c.GetSite(site.ID); !client.IsNotFound(err) {
t.Fatalf("want not found, got %v", err)
}
}
func TestBadKeyAndOrgScope(t *testing.T) {
fs := fakehh.New()
defer fs.Close()
if _, err := client.New(fs.URL, "nope", fakehh.OrgID).Sites(); err == nil {
t.Fatal("bad key accepted")
}
c := client.New(fs.URL, fakehh.OrgKey, "")
if _, err := c.Sites(); err == nil {
t.Fatal("expected an error without an org")
}
if _, err := c.CreateEdge(client.Edge{Name: "x", TunnelAddr: "a:1"}); err == nil {
t.Fatal("org key must not create edges")
}
}