Files
mesh-catalog/modules/mesh-build-node/cmd/mesh-build-node/preview_test.go
T

88 lines
3.6 KiB
Go

package main
import (
"context"
"strings"
"testing"
"git.novox.be/novox/mesh-sdk/go/forgekey"
)
const baseSHA = "abcdef0123456789abcdef0123456789abcdef01"
func commandLines(f *fakeMachine) string {
var out []string
for _, c := range f.calls {
out = append(out, joined(c))
}
return strings.Join(out, "\n")
}
// 1676/AC1: with a base the fetch merges the head onto it through the SDK's merge (the check merge's identity and flags,
// hooks off), and answers the base, the merge commit, the changed paths and the tree, manifest and locks of each module
// directory; the TypeScript modules are installed from the merged tree.
func TestFetchWithABaseMergesAndAnswersThePreview(t *testing.T) {
m, f := fetchMachine(t, typeScriptModule(`{"dependencies":{"@novox/mesh-sdk":"^0.1.6"}}`), nil)
f.answer["git diff"] = forgekey.Ran{Stdout: "modules/m/package.json\n"}
args := map[string]any{"repository": "novox/mesh-catalog", "commit": commitSHA, "base": baseSHA}
out, err := m.fetch(context.Background(), args)
if err != nil {
t.Fatal(err)
}
r := out.(FetchResult)
if r.Base != baseSHA || r.Merge != commitSHA || strings.Join(r.Changed, ",") != "modules/m/package.json" || len(r.Conflicts) != 0 {
t.Errorf("result = %+v", r)
}
if mt, ok := r.Trees["modules/m"]; !ok || mt.Tree != commitSHA || mt.Manifest == "" {
t.Errorf("trees = %+v", r.Trees)
}
if len(r.Modules) != 1 || r.Modules[0] != "modules/m" {
t.Errorf("modules = %v", r.Modules)
}
for _, want := range []string{"fetch --no-tags origin " + baseSHA, "core.hooksPath=/dev/null", "merge --no-ff --no-edit --no-verify"} {
if !strings.Contains(commandLines(f), want) {
t.Errorf("git was not asked %q:\n%s", want, commandLines(f))
}
}
}
// 1676/AC2: a conflict is an answer: the step passes with the files named, no merge commit, and nothing installed.
func TestFetchWithAConflictAnswersTheFilesAndInstallsNothing(t *testing.T) {
files := typeScriptModule(`{"dependencies":{"@novox/mesh-sdk":"^0.1.6","lodash":"^4"}}`)
files["modules/m/package-lock.json"] = `{"lockfileVersion":3}`
m, f := fetchMachine(t, files, nil)
f.answer["git merge"] = forgekey.Ran{Status: 1, Stderr: "CONFLICT\n"}
f.answer["git diff"] = forgekey.Ran{Stdout: "a.ts\nsub/b.ts\n"}
out, err := m.fetch(context.Background(), map[string]any{"repository": "novox/mesh-catalog", "commit": commitSHA, "base": baseSHA})
if err != nil {
t.Fatalf("a conflict failed the step: %v", err)
}
r := out.(FetchResult)
if r.Merge != "" || strings.Join(r.Conflicts, ",") != "a.ts,sub/b.ts" || len(r.Changed) != 0 || len(npmCalls(f)) != 0 {
t.Errorf("result = %+v, npm calls %d", r, len(npmCalls(f)))
}
if !strings.Contains(commandLines(f), "merge --abort") {
t.Errorf("the merge was not undone:\n%s", commandLines(f))
}
}
// 1676/AC3: no base is today's fetch: no merge command, and none of the preview in the answer.
func TestFetchWithoutABaseMakesNoMerge(t *testing.T) {
m, f := fetchMachine(t, typeScriptModule(`{"dependencies":{"@novox/mesh-sdk":"^0.1.6"}}`), nil)
out, err := m.fetch(context.Background(), fetchArgs)
if err != nil {
t.Fatal(err)
}
r := out.(FetchResult)
if strings.Contains(commandLines(f), "merge") || strings.Contains(commandLines(f), "unshallow") || r.Base != "" || r.Merge != "" || r.Trees != nil {
t.Errorf("a fetch without a base merged: %+v\n%s", r, commandLines(f))
}
}
func TestABaseThatIsNotACommitIsRefusedBeforeAnythingRuns(t *testing.T) {
m, f := fetchMachine(t, nil, nil)
if _, err := m.fetch(context.Background(), map[string]any{"repository": "novox/mesh-catalog", "commit": commitSHA, "base": "main"}); err == nil || len(f.calls) != 0 {
t.Errorf("err = %v after %d commands", err, len(f.calls))
}
}