mirror of https://github.com/helm/helm
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
195 lines
4.2 KiB
195 lines
4.2 KiB
9 years ago
|
/*
|
||
|
Copyright 2015 The Kubernetes Authors All rights reserved.
|
||
|
|
||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
you may not use this file except in compliance with the License.
|
||
|
You may obtain a copy of the License at
|
||
|
|
||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||
|
|
||
|
Unless required by applicable law or agreed to in writing, software
|
||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
See the License for the specific language governing permissions and
|
||
|
limitations under the License.
|
||
|
*/
|
||
|
|
||
|
package expansion
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"reflect"
|
||
|
"strings"
|
||
|
"testing"
|
||
|
|
||
|
"github.com/kubernetes/helm/pkg/chart"
|
||
|
"github.com/kubernetes/helm/pkg/common"
|
||
|
)
|
||
|
|
||
|
func testPropertiesValidation(t *testing.T, req *ServiceRequest, expRequest *ServiceRequest, expError string) {
|
||
|
modifiedRequest, err := ValidateProperties(req)
|
||
|
if err != nil {
|
||
|
message := err.Error()
|
||
|
if expRequest != nil || !strings.Contains(message, expError) {
|
||
|
t.Fatalf("unexpected error: %v\n", err)
|
||
|
}
|
||
|
} else {
|
||
|
if expRequest == nil {
|
||
|
t.Fatalf("expected error did not occur: %s\n", expError)
|
||
|
}
|
||
|
if !reflect.DeepEqual(modifiedRequest, expRequest) {
|
||
|
message := fmt.Sprintf("want:\n%s\nhave:\n%s\n", expRequest, modifiedRequest)
|
||
|
t.Fatalf("output mismatch:\n%s\n", message)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestNoSchema(t *testing.T) {
|
||
|
req := &ServiceRequest{
|
||
|
ChartInvocation: &common.Resource{
|
||
|
Properties: map[string]interface{}{
|
||
|
"prop1": 3.0,
|
||
|
"prop2": "foo",
|
||
|
},
|
||
|
},
|
||
|
Chart: &chart.Content{
|
||
|
Chartfile: &chart.Chartfile{},
|
||
|
Members: []*chart.Member{},
|
||
|
},
|
||
|
}
|
||
|
testPropertiesValidation(t, req, req, "") // Returns it unchanged.
|
||
|
}
|
||
|
|
||
|
func TestSchemaNotFound(t *testing.T) {
|
||
|
testPropertiesValidation(
|
||
|
t,
|
||
|
&ServiceRequest{
|
||
|
ChartInvocation: &common.Resource{
|
||
|
Properties: map[string]interface{}{
|
||
|
"prop1": 3.0,
|
||
|
"prop2": "foo",
|
||
|
},
|
||
|
},
|
||
|
Chart: &chart.Content{
|
||
|
Chartfile: &chart.Chartfile{
|
||
|
Schema: "Schema.yaml",
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
nil, // No response to check.
|
||
|
"The schema referenced from the Chart.yaml cannot be found: Schema.yaml",
|
||
|
)
|
||
|
}
|
||
|
|
||
|
var schemaContent = []byte(`
|
||
|
required: ["prop2"]
|
||
|
additionalProperties: false
|
||
|
properties:
|
||
|
prop1:
|
||
|
description: Nice description.
|
||
|
type: integer
|
||
|
default: 42
|
||
|
prop2:
|
||
|
description: Nice description.
|
||
|
type: string
|
||
|
`)
|
||
|
|
||
|
func TestSchema(t *testing.T) {
|
||
|
req := &ServiceRequest{
|
||
|
ChartInvocation: &common.Resource{
|
||
|
Properties: map[string]interface{}{
|
||
|
"prop1": 3.0,
|
||
|
"prop2": "foo",
|
||
|
},
|
||
|
},
|
||
|
Chart: &chart.Content{
|
||
|
Chartfile: &chart.Chartfile{
|
||
|
Schema: "Schema.yaml",
|
||
|
},
|
||
|
Members: []*chart.Member{
|
||
|
{
|
||
|
Path: "Schema.yaml",
|
||
|
Content: schemaContent,
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
}
|
||
|
// No defaults, returns it unchanged:
|
||
|
testPropertiesValidation(t, req, req, "")
|
||
|
}
|
||
|
|
||
|
func TestBadProperties(t *testing.T) {
|
||
|
testPropertiesValidation(
|
||
|
t,
|
||
|
&ServiceRequest{
|
||
|
ChartInvocation: &common.Resource{
|
||
|
Properties: map[string]interface{}{
|
||
|
"prop1": 3.0,
|
||
|
"prop3": map[string]interface{}{},
|
||
|
},
|
||
|
},
|
||
|
Chart: &chart.Content{
|
||
|
Chartfile: &chart.Chartfile{
|
||
|
Schema: "Schema.yaml",
|
||
|
},
|
||
|
Members: []*chart.Member{
|
||
|
{
|
||
|
Path: "Schema.yaml",
|
||
|
Content: schemaContent,
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
nil,
|
||
|
"Properties failed validation:",
|
||
|
)
|
||
|
}
|
||
|
|
||
|
func TestDefault(t *testing.T) {
|
||
|
testPropertiesValidation(
|
||
|
t,
|
||
|
&ServiceRequest{
|
||
|
ChartInvocation: &common.Resource{
|
||
|
Name: "TestName",
|
||
|
Type: "TestType",
|
||
|
Properties: map[string]interface{}{
|
||
|
"prop2": "ok",
|
||
|
},
|
||
|
},
|
||
|
Chart: &chart.Content{
|
||
|
Chartfile: &chart.Chartfile{
|
||
|
Schema: "Schema.yaml",
|
||
|
},
|
||
|
Members: []*chart.Member{
|
||
|
{
|
||
|
Path: "Schema.yaml",
|
||
|
Content: schemaContent,
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
&ServiceRequest{
|
||
|
ChartInvocation: &common.Resource{
|
||
|
Name: "TestName",
|
||
|
Type: "TestType",
|
||
|
Properties: map[string]interface{}{
|
||
|
"prop1": 42.0,
|
||
|
"prop2": "ok",
|
||
|
},
|
||
|
},
|
||
|
Chart: &chart.Content{
|
||
|
Chartfile: &chart.Chartfile{
|
||
|
Schema: "Schema.yaml",
|
||
|
},
|
||
|
Members: []*chart.Member{
|
||
|
{
|
||
|
Path: "Schema.yaml",
|
||
|
Content: schemaContent,
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
"", // Error
|
||
|
)
|
||
|
}
|