package sharedhost_test

import (
	"context"
	"net/url"
	"testing"

	"github.com/stretchr/testify/assert"

	sr "tildegit.org/tjp/sliderule"
	"tildegit.org/tjp/sliderule/contrib/sharedhost"
)

func TestReplaceTilde(t *testing.T) {
	tests := []struct {
		replacement  string
		inputURL     string
		replacedPath string
	}{
		{
			replacement:  "users/",
			inputURL:     "gemini://domain.com/~username/foo/bar",
			replacedPath: "/users/username/foo/bar",
		},
		{
			replacement:  "people-",
			inputURL:     "gemini://domain.com/non/match",
			replacedPath: "/non/match",
		},
		{
			replacement:  "people-",
			inputURL:     "gemini://domain.com/~someone/dir/file",
			replacedPath: "/people-someone/dir/file",
		},
	}

	for _, test := range tests {
		t.Run(test.inputURL, func(t *testing.T) {
			u, err := url.Parse(test.inputURL)
			assert.Nil(t, err)

			originalPath := u.Path

			replacer := sharedhost.ReplaceTilde(test.replacement)
			request := &sr.Request{URL: u}
			handler := replacer(sr.HandlerFunc(func(_ context.Context, request *sr.Request) *sr.Response {
				assert.Equal(t, test.replacedPath, request.Path)
				return &sr.Response{}
			}))

			handler.Handle(context.Background(), request)

			// original request was unmodified
			assert.Equal(t, originalPath, request.Path)
		})
	}
}