Test_Idempotency() — fiber Function Reference
Architecture documentation for the Test_Idempotency() function in idempotency_test.go from the fiber codebase.
Entity Profile
Dependency Diagram
graph TD 8eb3b619_c7a3_8c58_483b_a96bad8af8ff["Test_Idempotency()"] 94a179ed_b8df_d669_56a8_8e55d7bbb6bf["idempotency_test.go"] 8eb3b619_c7a3_8c58_483b_a96bad8af8ff -->|defined in| 94a179ed_b8df_d669_56a8_8e55d7bbb6bf style 8eb3b619_c7a3_8c58_483b_a96bad8af8ff fill:#6366f1,stroke:#818cf8,color:#fff
Relationship Graph
Source Code
middleware/idempotency/idempotency_test.go lines 26–132
func Test_Idempotency(t *testing.T) {
t.Parallel()
app := fiber.New()
app.Use(func(c fiber.Ctx) error {
if err := c.Next(); err != nil {
return err
}
isMethodSafe := fiber.IsMethodSafe(c.Method())
isIdempotent := IsFromCache(c) || WasPutToCache(c)
hasReqHeader := c.Get("X-Idempotency-Key") != ""
if isMethodSafe {
if isIdempotent {
return errors.New("request with safe HTTP method should not be idempotent")
}
} else {
// Unsafe
if hasReqHeader {
if !isIdempotent {
return errors.New("request with unsafe HTTP method should be idempotent if X-Idempotency-Key request header is set")
}
} else if isIdempotent {
return errors.New("request with unsafe HTTP method should not be idempotent if X-Idempotency-Key request header is not set")
}
}
return nil
})
// Needs to be at least a second as the memory storage doesn't support shorter durations.
const lifetime = 2 * time.Second
app.Use(New(Config{
Lifetime: lifetime,
}))
nextCount := func() func() int {
var count int32
return func() int {
return int(atomic.AddInt32(&count, 1))
}
}()
app.Add([]string{
fiber.MethodGet,
fiber.MethodPost,
}, "/", func(c fiber.Ctx) error {
return c.SendString(strconv.Itoa(nextCount()))
})
app.Post("/slow", func(c fiber.Ctx) error {
time.Sleep(3 * lifetime)
return c.SendString(strconv.Itoa(nextCount()))
})
doReq := func(method, route, idempotencyKey string) string {
req := httptest.NewRequest(method, route, http.NoBody)
if idempotencyKey != "" {
req.Header.Set("X-Idempotency-Key", idempotencyKey)
}
resp, err := app.Test(req, fiber.TestConfig{
Timeout: 15 * time.Second,
FailOnTimeout: true,
})
require.NoError(t, err)
body, err := io.ReadAll(resp.Body)
require.NoError(t, err)
require.Equal(t, fiber.StatusOK, resp.StatusCode, string(body))
return string(body)
}
require.Equal(t, "1", doReq(fiber.MethodGet, "/", ""))
require.Equal(t, "2", doReq(fiber.MethodGet, "/", ""))
require.Equal(t, "3", doReq(fiber.MethodPost, "/", ""))
require.Equal(t, "4", doReq(fiber.MethodPost, "/", ""))
require.Equal(t, "5", doReq(fiber.MethodGet, "/", "00000000-0000-0000-0000-000000000000"))
Domain
Subdomains
Defined In
Source
Frequently Asked Questions
What does Test_Idempotency() do?
Test_Idempotency() is a function in the fiber codebase, defined in middleware/idempotency/idempotency_test.go.
Where is Test_Idempotency() defined?
Test_Idempotency() is defined in middleware/idempotency/idempotency_test.go at line 26.
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free