package dockerfile // import "github.com/docker/docker/builder/dockerfile"

import (
	"net/http"
	"testing"

	"github.com/docker/docker/pkg/containerfs"
	"github.com/gotestyourself/gotestyourself/fs"
	"github.com/stretchr/testify/assert"
)

func TestIsExistingDirectory(t *testing.T) {
	tmpfile := fs.NewFile(t, "file-exists-test", fs.WithContent("something"))
	defer tmpfile.Remove()
	tmpdir := fs.NewDir(t, "dir-exists-test")
	defer tmpdir.Remove()

	var testcases = []struct {
		doc      string
		path     string
		expected bool
	}{
		{
			doc:      "directory exists",
			path:     tmpdir.Path(),
			expected: true,
		},
		{
			doc:      "path doesn't exist",
			path:     "/bogus/path/does/not/exist",
			expected: false,
		},
		{
			doc:      "file exists",
			path:     tmpfile.Path(),
			expected: false,
		},
	}

	for _, testcase := range testcases {
		result, err := isExistingDirectory(&copyEndpoint{driver: containerfs.NewLocalDriver(), path: testcase.path})
		if !assert.NoError(t, err) {
			continue
		}
		assert.Equal(t, testcase.expected, result, testcase.doc)
	}
}

func TestGetFilenameForDownload(t *testing.T) {
	var testcases = []struct {
		path        string
		disposition string
		expected    string
	}{
		{
			path:     "http://www.example.com/",
			expected: "",
		},
		{
			path:     "http://www.example.com/xyz",
			expected: "xyz",
		},
		{
			path:     "http://www.example.com/xyz.html",
			expected: "xyz.html",
		},
		{
			path:     "http://www.example.com/xyz/",
			expected: "",
		},
		{
			path:     "http://www.example.com/xyz/uvw",
			expected: "uvw",
		},
		{
			path:     "http://www.example.com/xyz/uvw.html",
			expected: "uvw.html",
		},
		{
			path:     "http://www.example.com/xyz/uvw/",
			expected: "",
		},
		{
			path:     "/",
			expected: "",
		},
		{
			path:     "/xyz",
			expected: "xyz",
		},
		{
			path:     "/xyz.html",
			expected: "xyz.html",
		},
		{
			path:     "/xyz/",
			expected: "",
		},
		{
			path:        "/xyz/",
			disposition: "attachment; filename=xyz.html",
			expected:    "xyz.html",
		},
		{
			disposition: "",
			expected:    "",
		},
		{
			disposition: "attachment; filename=xyz",
			expected:    "xyz",
		},
		{
			disposition: "attachment; filename=xyz.html",
			expected:    "xyz.html",
		},
		{
			disposition: "attachment; filename=\"xyz\"",
			expected:    "xyz",
		},
		{
			disposition: "attachment; filename=\"xyz.html\"",
			expected:    "xyz.html",
		},
		{
			disposition: "attachment; filename=\"/xyz.html\"",
			expected:    "xyz.html",
		},
		{
			disposition: "attachment; filename=\"/xyz/uvw\"",
			expected:    "uvw",
		},
		{
			disposition: "attachment; filename=\"Naïve file.txt\"",
			expected:    "Naïve file.txt",
		},
	}
	for _, testcase := range testcases {
		resp := http.Response{
			Header: make(map[string][]string),
		}
		if testcase.disposition != "" {
			resp.Header.Add("Content-Disposition", testcase.disposition)
		}
		filename := getFilenameForDownload(testcase.path, &resp)
		assert.Equal(t, testcase.expected, filename)
	}
}
