package catalogue import ( "reflect" "strings" "testing" ) // issue 831: a moved module's merging file is not handed (ADR 0349 clause 17, the lead's limit): the controller // fills and merges it as for a module not moved, and the module's other files stay handed. func TestAMovedModulesMergingFileIsFilledTheOldWayAndItsPlainFileIsHanded(t *testing.T) { raw := strings.Replace(handedNotifier, `{"id":"legacy"`, `{"id":"settings","type":"file","path":"${machine:account-home}/.config/notify/settings.json","owner":"${machine:account}","mode":"0644","template":"files/settings.json","merge":"json","takes-config":["width"]}, {"id":"legacy"`, 1) moved := strings.Replace(raw, `"version":"1",`, `"version":"1","moved":true,`, 1) built := []Built{{Name: "files", Kind: ArtifactArchive, Reference: ArtifactStoreScheme + "notify/files/blobs/sha256:" + strings.Repeat("d", 64), Digest: "sha256:" + strings.Repeat("d", 64), Texts: map[string]string{"rc": notifierText, "settings.json": "{\"theme\": \"dark\"}\n"}}} cb, _ := composeWith(t, notifierOn(t, held(t, raw, built)), handingTo("store:5000")) c, got := composeWith(t, notifierOn(t, held(t, moved, built)), handingTo("store:5000")) var merged, plain map[string]any for _, r := range c.Resources { switch r["id"] { case "notify.settings": merged = r case "notify.configuration": plain = r } } if merged == nil || plain == nil { t.Fatalf("not composed: %s", got) } if text, _ := merged["content"].(string); !strings.Contains(text, `"theme"`) || merged["owner-at-runtime"] != nil { t.Fatalf("the merging file is not filled the old way: %v", merged) } if plain["content"] != nil || plain["owner-at-runtime"] != "owned" { t.Fatalf("the plain file is not handed: %v", plain) } for _, p := range c.Filled { if strings.HasSuffix(p, "settings.json") { t.Fatalf("the merging file is named among the filled files: %v", c.Filled) } } if len(c.Plans["notify"].Files) != 1 || c.Plans["notify"].Files[0].ID != "configuration" { t.Fatalf("the plan is %+v", c.Plans) } if len(c.Unplaced) > 0 { t.Fatalf("unplaced: %v", c.Unplaced) } // byte-identical to the not-moved composition for _, r := range cb.Resources { if r["id"] == "notify.settings" && !reflect.DeepEqual(r, merged) { t.Fatalf("the merging file differs from the not-moved composition:\nbefore %v\nnow %v", r, merged) } } }