Prepare sensitivity dependencies once per recorded operation
This commit is contained in:
@@ -7,6 +7,44 @@ import (
|
||||
"gitea.maximumdirect.net/eric/ConfigKit/internal/document"
|
||||
)
|
||||
|
||||
func TestResolutionSensitivityKeepsLogicalEdgesWithoutSubtreeDuplication(t *testing.T) {
|
||||
t.Parallel()
|
||||
before := parseDocumentForDecode(t, "settings: {a: old, b: old, c: old}\ncredentials: {private: p, public: q, child: r}\nunrelated: visible\n")
|
||||
after := parseDocumentForDecode(t, "settings: {a: new, b: new, c: new}\n")
|
||||
beforeSettings, _ := documentAtPath(before, Keys("settings"))
|
||||
afterSettings, _ := documentAtPath(after, Keys("settings"))
|
||||
beforeChild, _ := documentAtPath(before, Keys("settings", "a"))
|
||||
afterChild, _ := documentAtPath(after, Keys("settings", "a"))
|
||||
first := parseOverrideTestPath(t, "/credentials/private")
|
||||
second := parseOverrideTestPath(t, "/credentials/public")
|
||||
child := parseOverrideTestPath(t, "/credentials/child")
|
||||
builder := newHistoryBuilder()
|
||||
builder.observeBaseline(before)
|
||||
builder.setScratch(before)
|
||||
builder.observeResolutionEvidence([]resolutionSnapshot{
|
||||
{change: Change{Path: Keys("settings"), Origin: Origin{Layer: LayerResolution, Operation: ChangeNormalization}, Dependencies: []Path{first, second}}, before: beforeSettings, after: afterSettings},
|
||||
{change: Change{Path: Keys("settings", "a"), Origin: Origin{Layer: LayerResolution, Operation: ChangeNormalization}, Dependencies: []Path{child}}, before: beforeChild, after: afterChild},
|
||||
})
|
||||
model := builder.freeze()
|
||||
dependencies, inherited := model.sensitivityDependencies()
|
||||
if len(dependencies) != 3 || len(inherited) != 0 {
|
||||
t.Fatalf("got %d ordinary and %d inherited edges; want the three original dependencies", len(dependencies), len(inherited))
|
||||
}
|
||||
for index, expected := range []struct{ target, dependency string }{
|
||||
{"/settings", first.String()}, {"/settings", second.String()}, {"/settings/a", child.String()},
|
||||
} {
|
||||
if dependencies[index].target.String() != expected.target || dependencies[index].dependency.String() != expected.dependency {
|
||||
t.Fatalf("edge %d lost its recorded target/dependency", index)
|
||||
}
|
||||
}
|
||||
classified := classifySecretPaths(nil, func(path Path) bool {
|
||||
return path.String() == child.String()
|
||||
}, Metadata{historyModel: model})
|
||||
if !classified["/settings/a"] || classified["/settings"] || classified["/settings/b"] || classified["/unrelated"] {
|
||||
t.Fatalf("original child dependency omitted by replay grouping or propagated to unrelated values: %#v", classified)
|
||||
}
|
||||
}
|
||||
|
||||
func TestHistoryResolutionRetainsOriginalShapeAttributionBehindReplayGroup(t *testing.T) {
|
||||
before := &document.Node{Kind: document.Mapping, Mapping: []document.Entry{{
|
||||
Key: "0", Value: &document.Node{Kind: document.String, Text: "old"},
|
||||
|
||||
Reference in New Issue
Block a user