package tree_test import ( "errors" "testing" "lindenii.org/go/furgit/object/id" "lindenii.org/go/furgit/object/tree" "lindenii.org/go/furgit/object/tree/mode" ) func TestInsertRejects(t *testing.T) { t.Parallel() zero := id.SupportedObjectFormats()[0].Zero() for _, tc := range []struct { name string entry tree.Entry }{ {name: "empty-name", entry: tree.Entry{Mode: mode.Regular, Name: []byte(""), ID: zero}}, {name: "slash-name", entry: tree.Entry{Mode: mode.Regular, Name: []byte("a/b"), ID: zero}}, {name: "nul-name", entry: tree.Entry{Mode: mode.Regular, Name: []byte("a\x00b"), ID: zero}}, {name: "invalid-mode", entry: tree.Entry{Mode: mode.Mode(0o100640), Name: []byte("file"), ID: zero}}, } { t.Run(tc.name, func(t *testing.T) { t.Parallel() var tr tree.Tree err := tr.Insert(tc.entry) if !errors.Is(err, tree.ErrInvalidTree) { t.Fatalf("Insert error = %v, want ErrInvalidTree", err) } }) } } func TestInsertRejectsConflict(t *testing.T) { t.Parallel() zero := id.SupportedObjectFormats()[0].Zero() for _, tc := range []struct { name string first tree.Entry second tree.Entry }{ { name: "same-mode", first: tree.Entry{Mode: mode.Regular, Name: []byte("file"), ID: zero}, second: tree.Entry{Mode: mode.Regular, Name: []byte("file"), ID: zero}, }, { name: "blob-then-tree", first: tree.Entry{Mode: mode.Regular, Name: []byte("name"), ID: zero}, second: tree.Entry{Mode: mode.Directory, Name: []byte("name"), ID: zero}, }, { name: "tree-then-blob", first: tree.Entry{Mode: mode.Directory, Name: []byte("name"), ID: zero}, second: tree.Entry{Mode: mode.Regular, Name: []byte("name"), ID: zero}, }, } { t.Run(tc.name, func(t *testing.T) { t.Parallel() var tr tree.Tree err := tr.Insert(tc.first) if err != nil { t.Fatalf("Insert(first): %v", err) } err = tr.Insert(tc.second) if !errors.Is(err, tree.ErrInvalidTree) { t.Fatalf("Insert(second) error = %v, want ErrInvalidTree", err) } }) } }