package webserver import ( "fmt" "testing" "time" "go.uber.org/zap/zaptest" "github.com/strimertul/strimertul/database" ) func TestNewServer(t *testing.T) { logger := zaptest.NewLogger(t) client, _ := database.CreateInMemoryLocalClient(t) defer database.CleanupLocalClient(client) _, err := NewServer(client, logger, DefaultServerFactory) if err != nil { t.Fatal(err) } } func TestNewServerWithTestFactory(t *testing.T) { logger := zaptest.NewLogger(t) client, _ := database.CreateInMemoryLocalClient(t) defer database.CleanupLocalClient(client) testServer := NewTestServer() _, err := NewServer(client, logger, testServer.Factory()) if err != nil { t.Fatal(err) } } func TestListen(t *testing.T) { logger := zaptest.NewLogger(t) client, _ := database.CreateInMemoryLocalClient(t) defer database.CleanupLocalClient(client) // Create a test server testServer := NewTestServer() server, err := NewServer(client, logger, testServer.Factory()) if err != nil { t.Fatal(err) } // Start the server finished := make(chan struct{}) go func() { err := server.Listen() if err != nil { t.Error(err) } finished <- struct{}{} }() // Wait for the server to start up so we can get the client testServer.Wait() // Make a request to the server httpClient := testServer.Client() resp, err := httpClient.Get(fmt.Sprintf("%s/health", testServer.URL())) if err != nil { t.Fatal(err) } if resp.StatusCode != 200 { t.Fatalf("Expected 200, got %d", resp.StatusCode) } // Close the server err = server.Close() if err != nil { t.Fatal(err) } // Make sure the related goroutines have terminated select { case <-finished: case <-time.After(time.Second * 2): t.Fatal("Server did not shut down in time") } } func TestGeneratePassword(t *testing.T) { // Generate a bunch of passwords and make sure they are different and sufficiently long passwords := make(map[string]bool) for i := 0; i < 100; i++ { password := generatePassword() if len(password) < 8 { t.Fatalf("Password '%s' is empty or too short", password) } if passwords[password] { t.Fatal("Duplicate password") } passwords[password] = true } }