3
0

Fix module field default value validation

This commit is contained in:
Tomaž Jerman 2021-05-28 13:53:06 +02:00
parent a31603ee3c
commit a429e1c71c
2 changed files with 46 additions and 4 deletions

View File

@ -589,10 +589,19 @@ func updateModuleFields(ctx context.Context, s store.Storer, new, old *types.Mod
func moduleFieldDefaultPreparer(ctx context.Context, s store.Storer, m *types.Module, newFields types.ModuleFieldSet) (types.ModuleFieldSet, error) {
var err error
// prepare an auxillary module to perform isolated validations on
auxm := &types.Module{
Handle: "aux_module",
NamespaceID: m.NamespaceID,
Fields: types.ModuleFieldSet{nil},
}
for _, f := range newFields {
if f.DefaultValue == nil || len(f.DefaultValue) == 0 {
continue
}
auxm.Fields[0] = f
vv := f.DefaultValue
vv.SetUpdatedFlag(true)
// Module field default values should not have a field name, so let's temporarily add it
@ -601,21 +610,21 @@ func moduleFieldDefaultPreparer(ctx context.Context, s store.Storer, m *types.Mo
return nil
})
if err = RecordValueSanitization(m, vv); err != nil {
if err = RecordValueSanitization(auxm, vv); err != nil {
return nil, err
}
vv = values.Sanitizer().Run(m, vv)
vv = values.Sanitizer().Run(auxm, vv)
r := &types.Record{
Values: vv,
}
rve := defaultValidator().Run(ctx, s, m, r)
rve := defaultValidator().Run(ctx, s, auxm, r)
if !rve.IsValid() {
return nil, rve
}
vv = values.Formatter().Run(m, vv)
vv = values.Formatter().Run(auxm, vv)
// Module field default values should not have a field name, so let's remove it
vv.Walk(func(rv *types.RecordValue) error {

View File

@ -265,6 +265,39 @@ func TestModuleFieldsUpdate(t *testing.T) {
h.a.Equal(m.Fields[1].Kind, "DateTime")
}
func TestModuleFieldsUpdate_defaults(t *testing.T) {
h := newHelper(t)
h.clearModules()
h.allow(types.NamespaceRBACResource.AppendWildcard(), "read")
ns := h.makeNamespace("some-namespace")
m := h.makeModule(ns, "some-module", &types.ModuleField{ID: id.Next(), Kind: "String", Name: "existing", Required: true, DefaultValue: types.RecordValueSet{&types.RecordValue{Value: "test"}}})
h.allow(types.ModuleRBACResource.AppendWildcard(), "update")
f := m.Fields[0]
fjs := fmt.Sprintf(`{ "name": "%s", "fields": [{ "fieldID": "%d", "name": "existing_edited", "kind": "String", "isRequired": true, "defaultValue": [{ "value": "test" }] }, { "name": "new", "kind": "Bool", "defaultValue": [{ "value": "1" }] }] }`, m.Name, f.ID)
h.apiInit().
Post(fmt.Sprintf("/namespace/%d/module/%d", ns.ID, m.ID)).
JSON(fjs).
Expect(t).
Status(http.StatusOK).
Assert(helpers.AssertNoErrors).
End()
m = h.lookupModuleByID(m.ID)
h.a.NotNil(m)
h.a.NotNil(m.Fields)
h.a.Len(m.Fields, 2)
h.a.Equal(m.Fields[0].Kind, "String")
h.a.Len(m.Fields[0].DefaultValue, 1)
h.a.Equal("test", m.Fields[0].DefaultValue[0].Value)
h.a.Equal(m.Fields[1].Kind, "Bool")
h.a.Len(m.Fields[1].DefaultValue, 1)
h.a.Equal("1", m.Fields[1].DefaultValue[0].Value)
}
func TestModuleFieldsDefaultValue(t *testing.T) {
var ns *types.Namespace