package composer import ( "encoding/json" "errors" "strings" "testing" ) const demo = `{"module": "demo", "version": "1", "claims": [{"name": "node-files"}]}` // A manifest named by its digest goes on the wire as {"digest": ...}, and Fill puts the bytes the indexer keeps in its // place; a raw manifest goes as itself. func TestAManifestIsItsBytesOrItsDigest(t *testing.T) { r := Request{V: Version, Cases: []Case{{Name: "change", Manifests: map[string]Manifest{ "demo": {Digest: "d1"}, "raw": {Raw: json.RawMessage(`{"module":"raw","version":"1"}`)}}, Kept: map[string]map[string]Manifest{"laptop": {"demo": {Digest: "d1"}}}}}} wire, err := json.Marshal(r) if err != nil { t.Fatal(err) } if !strings.Contains(string(wire), `"demo":{"digest":"d1"}`) || !strings.Contains(string(wire), `"raw":{"module":"raw","version":"1"}`) { t.Fatalf("on the wire: %s", wire) } back, err := Decode(wire) if err != nil { t.Fatal(err) } asked := 0 if err := Fill(&back, func(d string) ([]byte, error) { asked++ if d != "d1" { return nil, errors.New("no such digest") } return []byte(demo), nil }); err != nil { t.Fatal(err) } if asked != 2 || string(back.Cases[0].Manifests["demo"].Raw) != demo || string(back.Cases[0].Kept["laptop"]["demo"].Raw) != demo { t.Fatalf("filled %d times: %+v", asked, back.Cases[0]) } bad := Request{V: Version, Cases: []Case{{Name: "c", Manifests: map[string]Manifest{"x": {Digest: "nope"}}}}} if err := Fill(&bad, func(string) ([]byte, error) { return nil, errors.New("not there") }); err == nil || !strings.Contains(err.Error(), "nope") { t.Fatalf("a digest the indexer does not hold: %v", err) } }