diff --git a/main.go b/main.go index 3017c07..451a6c4 100644 --- a/main.go +++ b/main.go @@ -224,9 +224,13 @@ func addParentPathComments(parentDoc *ParsedDocument) error { default: pathComment(parentSection, parentDoc.Path) case *jwcc.Array: - pathComment(parentSection.Value.(*jwcc.Array).Values[0], parentDoc.Path) + if len(parentSection.Value.(*jwcc.Array).Values) != 0 { + pathComment(parentSection.Value.(*jwcc.Array).Values[0], parentDoc.Path) + } case *jwcc.Object: - pathComment(parentSection.Value.(*jwcc.Object).Members[0], parentDoc.Path) + if len(parentSection.Value.(*jwcc.Object).Members) != 0 { + pathComment(parentSection.Value.(*jwcc.Object).Members[0], parentDoc.Path) + } } } return nil diff --git a/main_test.go b/main_test.go index 74602b7..b63306c 100644 --- a/main_test.go +++ b/main_test.go @@ -438,7 +438,6 @@ func TestHandleArray(t *testing.T) { handlerFn("acls", parentDoc.Path, parentDoc.Object, "CHILD", childSection) mergedValues := parentDoc.Object.Find("acls").Value.(*jwcc.Array).Values - if len(mergedValues) != 2 { t.Fatalf("section [%v] should be [1], not [%v]", "acls", len(mergedValues)) } @@ -471,7 +470,6 @@ func TestHandleObject(t *testing.T) { handlerFn("groups", parentDoc.Path, parentDoc.Object, "CHILD", childSection) mergedValues := parentDoc.Object.Find("groups").Value.(*jwcc.Object).Members - if len(mergedValues) != 3 { t.Fatalf("section [%v] should be [1], not [%v]", "groups", len(mergedValues)) } @@ -520,6 +518,146 @@ func TestHandleAutoApprovers(t *testing.T) { } } +func TestEmptyParentObject(t *testing.T) { + parent, err := jwcc.Parse(strings.NewReader(`{"hosts":{}}`)) + if err != nil { + t.Fatalf("expected no error, got [%v]", err) + } + parentDoc := &ParsedDocument{ + Object: parent.Value.(*jwcc.Object), + Path: "parent", + } + + child, err := jwcc.Parse(strings.NewReader(`{ + "hosts": { + "host1": "100.99.98.97", + } + }`)) + if err != nil { + t.Fatalf("expected no error, got [%v]", err) + } + + childDoc := &ParsedDocument{ + Object: child.Value.(*jwcc.Object), + Path: "child", + } + + err = mergeDocs(preDefinedAclSections, parentDoc, []*ParsedDocument{childDoc}) + if err != nil { + t.Fatalf("expected no error, got [%v]", err) + } + + mergedValues := parentDoc.Object.Find("hosts").Value.(*jwcc.Object).Members + if len(mergedValues) != 1 { + t.Fatalf("section [%v] should be [1], not [%v]", "hosts", len(mergedValues)) + } +} + +func TestEmptyParentArray(t *testing.T) { + parent, err := jwcc.Parse(strings.NewReader(`{"acls":[]}`)) + if err != nil { + t.Fatalf("expected no error, got [%v]", err) + } + parentDoc := &ParsedDocument{ + Object: parent.Value.(*jwcc.Object), + Path: "parent", + } + + child, err := jwcc.Parse(strings.NewReader(`{ + "acls": [ + {"action": "accept", "src": ["finance1"], "dst": ["tag:demo-infra:22"]}, + ] + }`)) + if err != nil { + t.Fatalf("expected no error, got [%v]", err) + } + + childDoc := &ParsedDocument{ + Object: child.Value.(*jwcc.Object), + Path: "child", + } + + err = mergeDocs(preDefinedAclSections, parentDoc, []*ParsedDocument{childDoc}) + if err != nil { + t.Fatalf("expected no error, got [%v]", err) + } + + mergedValues := parentDoc.Object.Find("acls").Value.(*jwcc.Array).Values + if len(mergedValues) != 1 { + t.Fatalf("section [%v] should be [1], not [%v]", "acls", len(mergedValues)) + } +} + +func TestEmptyChildObject(t *testing.T) { + parent, err := jwcc.Parse(strings.NewReader(`{ + "hosts": { + "host1": "100.99.98.97", + } + }`)) + if err != nil { + t.Fatalf("expected no error, got [%v]", err) + } + parentDoc := &ParsedDocument{ + Object: parent.Value.(*jwcc.Object), + Path: "parent", + } + + child, err := jwcc.Parse(strings.NewReader(`{"hosts":{}}`)) + if err != nil { + t.Fatalf("expected no error, got [%v]", err) + } + + childDoc := &ParsedDocument{ + Object: child.Value.(*jwcc.Object), + Path: "child", + } + + err = mergeDocs(preDefinedAclSections, parentDoc, []*ParsedDocument{childDoc}) + if err != nil { + t.Fatalf("expected no error, got [%v]", err) + } + + mergedValues := parentDoc.Object.Find("hosts").Value.(*jwcc.Object).Members + if len(mergedValues) != 1 { + t.Fatalf("section [%v] should be [1], not [%v]", "hosts", len(mergedValues)) + } +} + +func TestEmptyChildArray(t *testing.T) { + parent, err := jwcc.Parse(strings.NewReader(`{ + "acls": [ + {"action": "accept", "src": ["finance1"], "dst": ["tag:demo-infra:22"]}, + ] + }`)) + if err != nil { + t.Fatalf("expected no error, got [%v]", err) + } + parentDoc := &ParsedDocument{ + Object: parent.Value.(*jwcc.Object), + Path: "parent", + } + + child, err := jwcc.Parse(strings.NewReader(`{"acls":[]}`)) + if err != nil { + t.Fatalf("expected no error, got [%v]", err) + } + + childDoc := &ParsedDocument{ + Object: child.Value.(*jwcc.Object), + Path: "child", + } + + err = mergeDocs(preDefinedAclSections, parentDoc, []*ParsedDocument{childDoc}) + if err != nil { + t.Fatalf("expected no error, got [%v]", err) + } + + mergedValues := parentDoc.Object.Find("acls").Value.(*jwcc.Array).Values + if len(mergedValues) != 1 { + t.Fatalf("section [%v] should be [1], not [%v]", "acls", len(mergedValues)) + } +} + func TestSort(t *testing.T) { parent, err := jwcc.Parse(strings.NewReader(ACL_PARENT)) if err != nil {