Select Git revision
error_logging_middleware.go
example_test.go 2.89 KiB
package zap
import (
"context"
"reflect"
"slices"
"testing"
"git.perx.ru/perxis/perxis-go/id"
"git.perx.ru/perxis/perxis-go/logs"
logmocks "git.perx.ru/perxis/perxis-go/logs/mocks"
"git.perx.ru/perxis/perxis-go/pkg/auth"
"git.perx.ru/perxis/perxis-go/pkg/items"
"git.perx.ru/perxis/perxis-go/pkg/users"
usersmocks "git.perx.ru/perxis/perxis-go/pkg/users/mocks"
logzap "git.perx.ru/perxis/perxis-go/zap"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
func TestExample(t *testing.T) {
item := items.NewItem("WPNN", "9VGP", "GxNv", "W0fl", nil, nil)
user := &users.User{ID: "294de355"}
wantEntries := []*logs.Entry{
{
Level: logs.Level(zapcore.InfoLevel),
Message: "Item created",
Component: "Items",
Event: items.EventCreate,
ObjectID: id.MustObjectId(item),
CallerID: id.MustObjectId(user),
Tags: []string{"tag1", "tag2", "tag3"},
},
{
Level: logs.Level(zapcore.WarnLevel),
Message: "Item updated",
Component: "Items",
Event: items.EventUpdate,
ObjectID: id.MustObjectId(item),
CallerID: id.MustObjectId(user),
Attr: map[string]map[string]any{"title": {"old": "old title", "new": "new title"}},
},
}
service := &logmocks.Service{}
service.On("Log", mock.Anything, mock.Anything).
Return(nil).
Run(func(args mock.Arguments) {
entries := args.Get(1).([]*logs.Entry)
require.True(t, slices.EqualFunc(wantEntries, entries, func(wantEntry, gotEntry *logs.Entry) bool {
require.NotEmpty(t, gotEntry.ID)
require.NotEmpty(t, gotEntry.Timestamp)
gotEntry.ID = wantEntry.ID // игнорируем ID
gotEntry.Timestamp = wantEntry.Timestamp // игнорируем Timestamp
return reflect.DeepEqual(wantEntry, gotEntry)
}))
}).
Once()
usersService := &usersmocks.Users{}
usersService.On("GetByIdentity", mock.Anything, "74d90aaf").Return(user, nil).Once()
factory := auth.PrincipalFactory{Users: usersService}
ws := &BufferedWriteSyncer{Service: service}
logger := zap.New(NewCore(ws))
// Пример отправки логов для сервиса Items
{
logger := logger.With(logzap.Component("Items"))
ctx := auth.WithPrincipal(context.Background(), factory.User("74d90aaf"))
// Отправка лога при создании item
logger.Info("Item created",
logzap.Event(items.EventCreate),
logzap.Object(item),
logzap.Caller(ctx, logzap.WithSpace(item.SpaceID)),
logzap.Tags("tag1", "tag2", "tag3"),
)
// Отправка лога при обновлении item
logger.Warn("Item updated",
logzap.Event(items.EventUpdate),
logzap.Object(item),
logzap.Caller(ctx, logzap.WithSpace(item.SpaceID)),
logzap.Attr(map[string]map[string]any{"title": {"old": "old title", "new": "new title"}}),
)
}
err := ws.Stop()
require.NoError(t, err)
service.AssertExpectations(t)
}