Domain-driven acceptance testing for Go.
go get github.com/averspec/aver-gopackage cart_test
import (
"fmt"
"testing"
aver "github.com/averspec/aver-go"
"github.com/averspec/aver-go/protocols/unit"
"github.com/stretchr/testify/assert"
)
// Domain
type CartDomain struct {
AddItem aver.Action[AddItemPayload]
HasItem aver.Assertion[HasItemPayload]
Total aver.Query[struct{}, float64]
}
type AddItemPayload struct{ SKU string; Qty int }
type HasItemPayload struct{ SKU string }
var Cart = aver.NewDomain[CartDomain]("Cart")
// Adapter
var adapter = aver.Implement(Cart, unit.New(NewApp), func(h *aver.HandlerBuilder[CartDomain, *App]) {
aver.OnAction(h, Cart.D.AddItem, func(app *App, p AddItemPayload) error {
app.items[p.SKU] += p.Qty
return nil
})
aver.OnQuery(h, Cart.D.Total, func(app *App, _ struct{}) (float64, error) {
return app.Total(), nil
})
aver.OnAssertion(h, Cart.D.HasItem, func(app *App, p HasItemPayload) error {
if _, ok := app.items[p.SKU]; !ok {
return fmt.Errorf("expected item %s", p.SKU)
}
return nil
})
})
var s = aver.Suite(Cart, adapter)
// Tests
func TestAddItem(t *testing.T) {
s.Run(t, "user adds item to cart", func(ctx *aver.TestContext[CartDomain]) {
aver.When(ctx, Cart.D.AddItem, AddItemPayload{SKU: "ABC", Qty: 2})
total := Cart.D.Total.From(ctx)
assert.Equal(t, 19.98, total)
aver.Then(ctx, Cart.D.HasItem, HasItemPayload{SKU: "ABC"})
})
}Run with go test:
go test ./...