// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package web

import (
	"errors"
	"io/ioutil"
	"os"
	"path/filepath"
	"testing"
)

func TestGetFileURL(t *testing.T) {
	const content = "Hello, file!\n"

	f, err := ioutil.TempFile("", "web-TestGetFileURL")
	if err != nil {
		t.Fatal(err)
	}
	defer os.Remove(f.Name())

	if _, err := f.WriteString(content); err != nil {
		t.Error(err)
	}
	if err := f.Close(); err != nil {
		t.Fatal(err)
	}

	u, err := urlFromFilePath(f.Name())
	if err != nil {
		t.Fatal(err)
	}

	b, err := GetBytes(u)
	if err != nil {
		t.Fatalf("GetBytes(%v) = _, %v", u, err)
	}
	if string(b) != content {
		t.Fatalf("after writing %q to %s, GetBytes(%v) read %q", content, f.Name(), u, b)
	}
}

func TestGetNonexistentFile(t *testing.T) {
	path, err := filepath.Abs("nonexistent")
	if err != nil {
		t.Fatal(err)
	}

	u, err := urlFromFilePath(path)
	if err != nil {
		t.Fatal(err)
	}

	b, err := GetBytes(u)
	if !errors.Is(err, os.ErrNotExist) {
		t.Fatalf("GetBytes(%v) = %q, %v; want _, os.ErrNotExist", u, b, err)
	}
}
