package builder

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

func TestProcessShouldRemoveDockerfileDockerignore(t *testing.T) {
	contextDir, err := ioutil.TempDir("", "builder-dockerignore-process-test")

	if err != nil {
		t.Fatalf("Error with creating temporary directory: %s", err)
	}

	defer os.RemoveAll(contextDir)

	testFilename := filepath.Join(contextDir, "should_stay")
	testContent := "test"
	err = ioutil.WriteFile(testFilename, []byte(testContent), 0777)

	if err != nil {
		t.Fatalf("Error when creating should_stay file: %s", err)
	}

	dockerignoreFilename := filepath.Join(contextDir, ".dockerignore")
	dockerignoreContent := "Dockerfile\n.dockerignore"
	err = ioutil.WriteFile(dockerignoreFilename, []byte(dockerignoreContent), 0777)

	if err != nil {
		t.Fatalf("Error when creating .dockerignore file: %s", err)
	}

	dockerfileFilename := filepath.Join(contextDir, DefaultDockerfileName)
	dockerfileContent := "FROM busybox"
	err = ioutil.WriteFile(dockerfileFilename, []byte(dockerfileContent), 0777)

	if err != nil {
		t.Fatalf("Error when creating Dockerfile file: %s", err)
	}

	modifiableCtx := &tarSumContext{root: contextDir}
	ctx := DockerIgnoreContext{ModifiableContext: modifiableCtx}

	err = ctx.Process([]string{DefaultDockerfileName})

	if err != nil {
		t.Fatalf("Error when executing Process: %s", err)
	}

	files, err := ioutil.ReadDir(contextDir)

	if err != nil {
		t.Fatalf("Could not read directory: %s", err)
	}

	if len(files) != 1 {
		log.Fatal("Directory should contain exactly one file")
	}

	for _, file := range files {
		if "should_stay" != file.Name() {
			log.Fatalf("File %s should not be in the directory", file.Name())
		}
	}

}

func TestProcessNoDockerignore(t *testing.T) {
	contextDir, err := ioutil.TempDir("", "builder-dockerignore-process-test")

	if err != nil {
		t.Fatalf("Error with creating temporary directory: %s", err)
	}

	defer os.RemoveAll(contextDir)

	testFilename := filepath.Join(contextDir, "should_stay")
	testContent := "test"
	err = ioutil.WriteFile(testFilename, []byte(testContent), 0777)

	if err != nil {
		t.Fatalf("Error when creating should_stay file: %s", err)
	}

	dockerfileFilename := filepath.Join(contextDir, DefaultDockerfileName)
	dockerfileContent := "FROM busybox"
	err = ioutil.WriteFile(dockerfileFilename, []byte(dockerfileContent), 0777)

	if err != nil {
		t.Fatalf("Error when creating Dockerfile file: %s", err)
	}

	modifiableCtx := &tarSumContext{root: contextDir}
	ctx := DockerIgnoreContext{ModifiableContext: modifiableCtx}

	ctx.Process([]string{DefaultDockerfileName})

	files, err := ioutil.ReadDir(contextDir)

	if err != nil {
		t.Fatalf("Could not read directory: %s", err)
	}

	if len(files) != 2 {
		log.Fatal("Directory should contain exactly two files")
	}

	for _, file := range files {
		if "should_stay" != file.Name() && DefaultDockerfileName != file.Name() {
			log.Fatalf("File %s should not be in the directory", file.Name())
		}
	}

}

func TestProcessShouldLeaveAllFiles(t *testing.T) {
	contextDir, err := ioutil.TempDir("", "builder-dockerignore-process-test")

	if err != nil {
		t.Fatalf("Error with creating temporary directory: %s", err)
	}

	defer os.RemoveAll(contextDir)

	testFilename := filepath.Join(contextDir, "should_stay")
	testContent := "test"
	err = ioutil.WriteFile(testFilename, []byte(testContent), 0777)

	if err != nil {
		t.Fatalf("Error when creating should_stay file: %s", err)
	}

	dockerignoreFilename := filepath.Join(contextDir, ".dockerignore")
	dockerignoreContent := "input1\ninput2"
	err = ioutil.WriteFile(dockerignoreFilename, []byte(dockerignoreContent), 0777)

	if err != nil {
		t.Fatalf("Error when creating .dockerignore file: %s", err)
	}

	dockerfileFilename := filepath.Join(contextDir, DefaultDockerfileName)
	dockerfileContent := "FROM busybox"
	err = ioutil.WriteFile(dockerfileFilename, []byte(dockerfileContent), 0777)

	if err != nil {
		t.Fatalf("Error when creating Dockerfile file: %s", err)
	}

	modifiableCtx := &tarSumContext{root: contextDir}
	ctx := DockerIgnoreContext{ModifiableContext: modifiableCtx}

	err = ctx.Process([]string{DefaultDockerfileName})

	if err != nil {
		t.Fatalf("Error when executing Process: %s", err)
	}

	files, err := ioutil.ReadDir(contextDir)

	if err != nil {
		t.Fatalf("Could not read directory: %s", err)
	}

	if len(files) != 3 {
		log.Fatal("Directory should contain exactly three files")
	}

	for _, file := range files {
		if "should_stay" != file.Name() && DefaultDockerfileName != file.Name() && ".dockerignore" != file.Name() {
			log.Fatalf("File %s should not be in the directory", file.Name())
		}
	}

}