package httputils

import (
	"fmt"
	"net/http"
	"net/url"
	"testing"
)

func TestGetDurationSuccess(t *testing.T) {
	f := func(s string, dExpected int64) {
		t.Helper()
		urlStr := fmt.Sprintf("http://foo.bar/baz?s=%s", url.QueryEscape(s))
		r, err := http.NewRequest(http.MethodGet, urlStr, nil)
		if err != nil {
			t.Fatalf("unexpected error in NewRequest: %s", err)
		}

		// Verify defaultValue
		d, err := GetDuration(r, "foo", 123456)
		if err != nil {
			t.Fatalf("unexpected error when obtaining default time from GetDuration(%q): %s", s, err)
		}
		if d != 123456 {
			t.Fatalf("unexpected default value for GetDuration(%q); got %d; want %d", s, d, 123456)
		}

		// Verify dExpected
		d, err = GetDuration(r, "s", 123)
		if err != nil {
			t.Fatalf("unexpected error in GetDuration(%q): %s", s, err)
		}
		if d != dExpected {
			t.Fatalf("unexpected timestamp for GetDuration(%q); got %d; want %d", s, d, dExpected)
		}
	}

	f("1.234", 1234)
	f("1.23ms", 1)
	f("1.23s", 1230)
	f("2s56ms", 2056)
	f("2s-5ms", 1995)
	f("5m3.5s", 303500)
	f("2h", 7200000)
	f("1d", 24*3600*1000)
	f("7d5h4m3s534ms", 623043534)
}

func TestGetDurationError(t *testing.T) {
	f := func(s string) {
		t.Helper()
		urlStr := fmt.Sprintf("http://foo.bar/baz?s=%s", url.QueryEscape(s))
		r, err := http.NewRequest(http.MethodGet, urlStr, nil)
		if err != nil {
			t.Fatalf("unexpected error in NewRequest: %s", err)
		}

		if _, err := GetDuration(r, "s", 123); err == nil {
			t.Fatalf("expecting non-nil error in GetDuration(%q)", s)
		}
	}

	// Negative durations aren't supported
	f("-1.234")

	// Invalid duration
	f("foo")

	// Invalid suffix
	f("1md")
}