66 lines
2.3 KiB
Go
66 lines
2.3 KiB
Go
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)
|
|
}
|
|
}
|