gavv / httpexpect

End-to-end HTTP and REST API testing for Go.
https://pkg.go.dev/github.com/gavv/httpexpect/v2
MIT License
2.53k stars 238 forks source link

WithPath formats very large or very small floating point numbers in scientific notation #449

Open alvii147 opened 4 days ago

alvii147 commented 4 days ago

Let's set up a simple server that responds to one endpoint /api/{value}, where value is a floating point path parameter:

// main.go
package main

import (
    "fmt"
    "net/http"
)

func handler() http.Handler {
    mux := http.NewServeMux()
    mux.HandleFunc("/api/{value}", func(w http.ResponseWriter, r *http.Request) {
        fmt.Println(r.URL)
        w.WriteHeader(http.StatusOK)
    })

    return mux
}

func main() {
    http.ListenAndServe(":8080", handler())
}

All this server does is print the requested URL. Now let's use WithPath to test this endpoint with a very large value for value:

// main_test.go
package main

import (
    "net/http"
    "net/http/httptest"
    "testing"

    "github.com/gavv/httpexpect/v2"
)

func TestMainHandlers(t *testing.T) {
    server := httptest.NewServer(handler())
    t.Cleanup(server.Close)

    e := httpexpect.Default(t, server.URL)
    e.
        GET("/api/{value}").
        WithPath("value", 5000000.0).
        Expect().
        Status(http.StatusOK)
}

Running go test, this is what we get:

$ go test
/api/5e+06
PASS
ok      github.com/alvii147/httpexpectplayground        0.309s

Notice that the 5000000.0 has been converted to 5e+06. This is not ideal. I think we should avoid scientific notation in these cases.

alvii147 commented 4 days ago

@gavv I can fix this if you agree this is behaviour is not ideal