package validation

import (
	"testing"

	kubeapi "github.com/GoogleCloudPlatform/kubernetes/pkg/api"
	errs "github.com/GoogleCloudPlatform/kubernetes/pkg/api/errors"
	"github.com/openshift/origin/pkg/build/api"
)

func TestBuildValdationSuccess(t *testing.T) {
	build := &api.Build{
		JSONBase: kubeapi.JSONBase{ID: "buildID"},
		Input: api.BuildInput{
			SourceURI: "http://github.com/my/repository",
			ImageTag:  "repository/data",
		},
		Status: api.BuildNew,
	}
	if result := ValidateBuild(build); len(result) > 0 {
		t.Errorf("Unexpected validation error returned %v", result)
	}
}

func TestBuildValidationFailure(t *testing.T) {
	build := &api.Build{
		JSONBase: kubeapi.JSONBase{ID: ""},
		Input: api.BuildInput{
			SourceURI: "http://github.com/my/repository",
			ImageTag:  "repository/data",
		},
		Status: api.BuildNew,
	}
	if result := ValidateBuild(build); len(result) != 1 {
		t.Errorf("Unexpected validation result: %v", result)
	}
}

func TestBuildConfigValidationSuccess(t *testing.T) {
	buildConfig := &api.BuildConfig{
		JSONBase: kubeapi.JSONBase{ID: "configID"},
		DesiredInput: api.BuildInput{
			SourceURI: "http://github.com/my/repository",
			ImageTag:  "repository/data",
		},
	}
	if result := ValidateBuildConfig(buildConfig); len(result) > 0 {
		t.Errorf("Unexpected validation error returned %v", result)
	}
}

func TestBuildConfigValidationFailure(t *testing.T) {
	buildConfig := &api.BuildConfig{
		JSONBase: kubeapi.JSONBase{ID: ""},
		DesiredInput: api.BuildInput{
			SourceURI: "http://github.com/my/repository",
			ImageTag:  "repository/data",
		},
	}
	if result := ValidateBuildConfig(buildConfig); len(result) != 1 {
		t.Errorf("Unexpected validation result %v", result)
	}
}

func TestValidateBuildInput(t *testing.T) {
	errorCases := map[string]*api.BuildInput{
		string(errs.ValidationErrorTypeRequired) + "sourceURI": &api.BuildInput{
			SourceURI: "",
			ImageTag:  "repository/data",
		},
		string(errs.ValidationErrorTypeInvalid) + "sourceURI": &api.BuildInput{
			SourceURI: "::",
			ImageTag:  "repository/data",
		},
		string(errs.ValidationErrorTypeRequired) + "imageTag": &api.BuildInput{
			SourceURI: "http://github.com/test/uri",
			ImageTag:  "",
		},
		string(errs.ValidationErrorTypeRequired) + "stiBuild.builderImage": &api.BuildInput{
			SourceURI: "http://github.com/test/uri",
			ImageTag:  "repository/data",
			STIInput: &api.STIBuildInput{
				BuilderImage: "",
			},
		},
	}

	for desc, config := range errorCases {
		errors := validateBuildInput(config)
		if len(errors) != 1 {
			t.Errorf("%s: Unexpected validation result: %v", desc, errors)
		}
		err := errors[0].(errs.ValidationError)
		errDesc := string(err.Type) + err.Field
		if desc != errDesc {
			t.Errorf("Unexpected validation result for %s: expected %s, got %s", err.Field, desc, errDesc)
		}
	}
}