package main

import (
	"testing"

	"github.com/kataras/iris/v12"
	"github.com/kataras/iris/v12/httptest"
)

// $ go test -v
func TestNewApp(t *testing.T) {
	app := newApp()
	e := httptest.New(t, app, httptest.Strict(true))

	// redirects to /admin without basic auth
	e.GET("/").Expect().Status(httptest.StatusUnauthorized)
	// without basic auth
	e.GET("/admin").Expect().Status(httptest.StatusUnauthorized)

	// with valid basic auth
	e.GET("/admin").WithBasicAuth("myusername", "mypassword").Expect().
		Status(httptest.StatusOK).Body().Equal("/admin myusername:mypassword")
	e.GET("/admin/profile").WithBasicAuth("myusername", "mypassword").Expect().
		Status(httptest.StatusOK).Body().Equal("/admin/profile myusername:mypassword")
	e.GET("/admin/settings").WithBasicAuth("myusername", "mypassword").Expect().
		Status(httptest.StatusOK).Body().Equal("/admin/settings myusername:mypassword")

	// with invalid basic auth
	e.GET("/admin/settings").WithBasicAuth("invalidusername", "invalidpassword").
		Expect().Status(httptest.StatusUnauthorized)
}

func TestHandlerUsingNetHTTP(t *testing.T) {
	handler := func(ctx iris.Context) {
		ctx.WriteString("Hello, World!")
	}

	// A shortcut for net/http/httptest.NewRecorder/NewRequest.
	w := httptest.NewRecorder()
	r := httptest.NewRequest("GET", "/", nil)

	httptest.Do(w, r, handler)
	if expected, got := "Hello, World!", w.Body.String(); expected != got {
		t.Fatalf("expected body: %s but got: %s", expected, got)
	}
}