You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
2.8 KiB
87 lines
2.8 KiB
package main
|
|
|
|
import (
|
|
"context"
|
|
"io"
|
|
"net"
|
|
"net/http"
|
|
"testing"
|
|
"time"
|
|
|
|
"mqtt_washingmachine/internal/sensor"
|
|
"mqtt_washingmachine/internal/web"
|
|
)
|
|
|
|
func TestLoadConfigDefaults(t *testing.T) {
|
|
for _, key := range []string{"MQTT_BROKER", "MQTT_TOPIC", "MQTT_USERNAME", "MQTT_PASSWORD", "HTTP_ADDR", "SAMPLE_INTERVAL"} {
|
|
t.Setenv(key, "")
|
|
}
|
|
got, err := loadConfig()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if got.Broker != "tcp://192.168.1.11:1883" || got.Topic != "tele/tasmota_washingmashine_C21183/SENSOR" || got.HTTPAddr != ":8080" || got.SampleInterval != time.Minute || got.Username != "" || got.Password != "" {
|
|
t.Fatalf("defaults: %+v", got)
|
|
}
|
|
}
|
|
|
|
func TestHTTPServerShutdownWithOpenStream(t *testing.T) {
|
|
var sampler sensor.Sampler
|
|
var hub sensor.Hub
|
|
server := newHTTPServer(t.Context(), web.NewHandler(sampler.Status, &hub))
|
|
if server.WriteTimeout != 10*time.Second {
|
|
t.Fatalf("write timeout = %v", server.WriteTimeout)
|
|
}
|
|
listener, err := net.Listen("tcp", "127.0.0.1:0")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer server.Close()
|
|
served := make(chan error, 1)
|
|
go func() { served <- server.Serve(listener) }()
|
|
client := &http.Client{Timeout: 3 * time.Second}
|
|
response, err := client.Get("http://" + listener.Addr().String() + "/api/events")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer response.Body.Close()
|
|
initial := make([]byte, len("event: update\ndata: {}\n\n"))
|
|
if _, err := io.ReadFull(response.Body, initial); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
ctx, cancel := context.WithTimeout(t.Context(), time.Second)
|
|
defer cancel()
|
|
if err := server.Shutdown(ctx); err != nil {
|
|
t.Fatalf("open stream delayed shutdown: %v", err)
|
|
}
|
|
if body, err := io.ReadAll(response.Body); err != nil || len(body) != 0 {
|
|
t.Fatalf("stream did not close cleanly: %q, %v", body, err)
|
|
}
|
|
if err := <-served; err != http.ErrServerClosed {
|
|
t.Fatalf("Serve = %v", err)
|
|
}
|
|
}
|
|
|
|
func TestLoadConfigOverrides(t *testing.T) {
|
|
for key, value := range map[string]string{"MQTT_BROKER": "tcp://localhost:1884", "MQTT_TOPIC": "test/power", "MQTT_USERNAME": "tester", "MQTT_PASSWORD": "test-password", "HTTP_ADDR": "127.0.0.1:9090", "SAMPLE_INTERVAL": "250ms"} {
|
|
t.Setenv(key, value)
|
|
}
|
|
got, err := loadConfig()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if got.Broker != "tcp://localhost:1884" || got.Topic != "test/power" || got.Username != "tester" || got.Password != "test-password" || got.HTTPAddr != "127.0.0.1:9090" || got.SampleInterval != 250*time.Millisecond {
|
|
t.Fatal("environment overrides not applied")
|
|
}
|
|
}
|
|
|
|
func TestLoadConfigRejectsInvalidInterval(t *testing.T) {
|
|
for _, interval := range []string{"nonsense", "0s", "-1s", "60"} {
|
|
t.Run(interval, func(t *testing.T) {
|
|
t.Setenv("SAMPLE_INTERVAL", interval)
|
|
if _, err := loadConfig(); err == nil {
|
|
t.Fatalf("accepted SAMPLE_INTERVAL=%q", interval)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|