package validation

import (
	"testing"

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

func TestValidateImageOK(t *testing.T) {
	errs := ValidateImage(&api.Image{
		JSONBase:             kubeapi.JSONBase{ID: "foo"},
		DockerImageReference: "openshift/ruby-19-centos",
	})
	if len(errs) > 0 {
		t.Errorf("Unexpected non-empty error list: %#v", errs)
	}
}

func TestValidateImageMissingFields(t *testing.T) {
	errorCases := map[string]struct {
		I api.Image
		T errors.ValidationErrorType
		F string
	}{
		"missing ID":                   {api.Image{DockerImageReference: "ref"}, errors.ValidationErrorTypeRequired, "ID"},
		"missing DockerImageReference": {api.Image{JSONBase: kubeapi.JSONBase{ID: "foo"}}, errors.ValidationErrorTypeRequired, "DockerImageReference"},
	}

	for k, v := range errorCases {
		errs := ValidateImage(&v.I)
		if len(errs) == 0 {
			t.Errorf("Expected failure for %s", k)
			continue
		}
		for i := range errs {
			if errs[i].(errors.ValidationError).Type != v.T {
				t.Errorf("%s: expected errors to have type %s: %v", k, v.T, errs[i])
			}
			if errs[i].(errors.ValidationError).Field != v.F {
				t.Errorf("%s: expected errors to have field %s: %v", k, v.F, errs[i])
			}
		}
	}
}

func TestValidateImageRepositoryMappingNotOK(t *testing.T) {
	errorCases := map[string]struct {
		I api.ImageRepositoryMapping
		T errors.ValidationErrorType
		F string
	}{
		"missing DockerImageRepository": {
			api.ImageRepositoryMapping{
				Tag: "latest",
				Image: api.Image{
					JSONBase: kubeapi.JSONBase{
						ID: "foo",
					},
					DockerImageReference: "openshift/ruby-19-centos",
				},
			},
			errors.ValidationErrorTypeRequired,
			"DockerImageRepository",
		},
		"missing Tag": {
			api.ImageRepositoryMapping{
				DockerImageRepository: "openshift/ruby-19-centos",
				Image: api.Image{
					JSONBase: kubeapi.JSONBase{
						ID: "foo",
					},
					DockerImageReference: "openshift/ruby-19-centos",
				},
			},
			errors.ValidationErrorTypeRequired,
			"Tag",
		},
		"missing image attributes": {
			api.ImageRepositoryMapping{
				Tag: "latest",
				DockerImageRepository: "openshift/ruby-19-centos",
				Image: api.Image{
					DockerImageReference: "openshift/ruby-19-centos",
				},
			},
			errors.ValidationErrorTypeRequired,
			"image.ID",
		},
	}

	for k, v := range errorCases {
		errs := ValidateImageRepositoryMapping(&v.I)
		if len(errs) == 0 {
			t.Errorf("Expected failure for %s", k)
			continue
		}
		for i := range errs {
			if errs[i].(errors.ValidationError).Type != v.T {
				t.Errorf("%s: expected errors to have type %s: %v", k, v.T, errs[i])
			}
			if errs[i].(errors.ValidationError).Field != v.F {
				t.Errorf("%s: expected errors to have field %s: %v", k, v.F, errs[i])
			}
		}
	}
}