package ledger import ( "context" "errors" domain "gl/domain/ledger" "testing" ) func TestInternalPostingRejectsExternalEvidenceAndMissingActor(t *testing.T) { for _, tc := range []struct { name string change func(*AppendJournalCommand) }{ {"missing actor", func(c *AppendJournalCommand) { c.ActorID = "" }}, {"blockchain hash", func(c *AppendJournalCommand) { c.Blockchain.TransactionHash = "hash" }}, {"external movement", func(c *AppendJournalCommand) { c.Entries[0].Account.Class = domain.AccountClassExternalBlockchain }}, } { t.Run(tc.name, func(t *testing.T) { repository := newRepositoryStub() command := validAppendCommand() command.ActorID = "operator" tc.change(&command) _, err := NewService(repository, fixedID("test")).PostInternalJournal(context.Background(), command) if !errors.Is(err, ErrInvalidArgument) || repository.appendCalls != 0 { t.Fatalf("invalid internal execution reached repository: %v", err) } }) } } func TestInternalExecutionMarksJournalWithoutMutatingCallerMetadata(t *testing.T) { repository := newRepositoryStub() service := NewService(repository, fixedID("test")) command := validAppendCommand() command.ActorID = "operator" command.Metadata = map[string]string{"correlation": "value"} result, err := service.PostInternalJournal(context.Background(), command) if err != nil { t.Fatal(err) } if result.Journal.Metadata[domain.InternalExecutionMetadata] != "GL_ONLY" { t.Fatal("internal provenance missing") } if _, ok := command.Metadata[domain.InternalExecutionMetadata]; ok { t.Fatal("caller metadata mutated") } command.Metadata[domain.InternalExecutionMetadata] = "GL_ONLY" _, err = service.AppendJournal(context.Background(), command) if !errors.Is(err, ErrInvalidArgument) { t.Fatalf("ordinary API accepted internal marker: %v", err) } } func TestAuthorityValidatesInputs(t *testing.T) { service := NewService(newRepositoryStub(), nil) for _, owner := range []string{"", " "} { if _, err := service.UserBalances(context.Background(), "user", owner, nil); !errors.Is(err, ErrInvalidArgument) { t.Fatalf("invalid owner: %v", err) } } if _, err := service.SetOperatingMode(context.Background(), "AUTO", 0, "operator", "outage", false); !errors.Is(err, ErrInvalidArgument) { t.Fatalf("invalid mode: %v", err) } }