package main import ( "testing" "time" ) func TestServiceCRUD(t *testing.T) { store, err := openStore(":memory:") if err != nil { t.Fatal(err) } defer store.Close() v, err := store.SaveService(MonitoredService{Name: "Test", URL: "https://example.test", CheckType: "http", ExpectedCode: 204, TimeoutSeconds: 2, Enabled: true}) if err != nil || v.ID == 0 { t.Fatalf("save: %+v %v", v, err) } items, err := store.Services() if err != nil || len(items) != 1 { t.Fatalf("list: %+v %v", items, err) } if err := store.DeleteService(v.ID); err != nil { t.Fatal(err) } } func TestValidateServiceAllowsLocalAddress(t *testing.T) { v := MonitoredService{Name: "Host", LocalAddress: "192.168.0.12", CheckType: "ping", TimeoutSeconds: 5} if err := validateService(v); err != nil { t.Fatal(err) } } func TestValidateServiceChecksBothHTTPAddresses(t *testing.T) { v := MonitoredService{Name: "Gitea", URL: "https://git.example.test", LocalAddress: "192.168.0.6:3000", CheckType: "http", TimeoutSeconds: 5} if err := validateService(v); err == nil { t.Fatal("expected invalid local HTTP address") } v.LocalAddress = "https://192.168.0.6:3000" if err := validateService(v); err != nil { t.Fatal(err) } } func TestHTTPServiceTransportHasBoundedIdlePool(t *testing.T) { if serviceHTTPClient.Transport != serviceHTTPTransport { t.Fatal("проверки сервисов должны использовать общий HTTP transport") } if serviceHTTPTransport.IdleConnTimeout < time.Second { t.Fatal("idle-соединения должны автоматически закрываться") } if serviceHTTPTransport.MaxIdleConnsPerHost < 1 || serviceHTTPTransport.MaxIdleConnsPerHost > 4 { t.Fatalf("небезопасный размер пула на хост: %d", serviceHTTPTransport.MaxIdleConnsPerHost) } }