From 246d4294cf7272451ff2094b6e7f5e8df2e906f9 Mon Sep 17 00:00:00 2001 From: adlerhurst Date: Thu, 26 Nov 2020 09:19:14 +0100 Subject: [PATCH] fix(eventstore): tests --- .../eventsourcing/eventstore/iam.go | 3 + internal/api/service/service.go | 4 +- internal/eventstore/v2/eventstore.go | 4 +- internal/eventstore/v2/eventstore_test.go | 21 +++---- internal/eventstore/v2/example_test.go | 35 +++--------- internal/eventstore/v2/read_model.go | 6 -- internal/v2/business/iam/idp_oidc_config.go | 9 +++ .../v2/repository/idp/configs_read_model.go | 56 +++++++++++++++++++ internal/v2/repository/member/read_model.go | 3 +- internal/v2/repository/members/read_models.go | 21 +++---- 10 files changed, 97 insertions(+), 65 deletions(-) create mode 100644 internal/v2/repository/idp/configs_read_model.go diff --git a/internal/admin/repository/eventsourcing/eventstore/iam.go b/internal/admin/repository/eventsourcing/eventstore/iam.go index 7740634f77..1b2683dbec 100644 --- a/internal/admin/repository/eventsourcing/eventstore/iam.go +++ b/internal/admin/repository/eventsourcing/eventstore/iam.go @@ -110,6 +110,9 @@ func (repo *IAMRepository) IDPConfigByID(ctx context.Context, idpConfigID string func (repo *IAMRepository) AddOIDCIDPConfig(ctx context.Context, idp *iam_model.IDPConfig) (*iam_model.IDPConfig, error) { idp.AggregateID = repo.SystemDefaults.IamID + if repo.IAMV2 != nil { + return repo.IAMV2.AddIDPConfig(ctx, idp) + } return repo.IAMEventstore.AddIDPConfig(ctx, idp) } diff --git a/internal/api/service/service.go b/internal/api/service/service.go index dd9956f67c..fadd3e7118 100644 --- a/internal/api/service/service.go +++ b/internal/api/service/service.go @@ -6,8 +6,8 @@ type serviceKey struct{} var key *serviceKey = (*serviceKey)(nil) -func WithService(partent context.Context, serviceName string) context.Context { - return context.WithValue(partent, key, serviceName) +func WithService(parent context.Context, serviceName string) context.Context { + return context.WithValue(parent, key, serviceName) } func FromContext(ctx context.Context) string { diff --git a/internal/eventstore/v2/eventstore.go b/internal/eventstore/v2/eventstore.go index 077a01764a..0cd62ba66c 100644 --- a/internal/eventstore/v2/eventstore.go +++ b/internal/eventstore/v2/eventstore.go @@ -125,8 +125,8 @@ func (es *Eventstore) mapEvents(events []*repository.Event) (mappedEvents []Even interceptors, ok := es.eventInterceptors[EventType(event.Type)] if !ok || interceptors.eventMapper == nil { mappedEvents[i] = BaseEventFromRepo(event) - continue - // return nil, errors.ThrowPreconditionFailed(nil, "V2-usujB", "event mapper not defined") + // continue + return nil, errors.ThrowPreconditionFailed(nil, "V2-usujB", "event mapper not defined") } mappedEvents[i], err = interceptors.eventMapper(event) if err != nil { diff --git a/internal/eventstore/v2/eventstore_test.go b/internal/eventstore/v2/eventstore_test.go index eec43fb8cb..fb33ec4508 100644 --- a/internal/eventstore/v2/eventstore_test.go +++ b/internal/eventstore/v2/eventstore_test.go @@ -8,6 +8,7 @@ import ( "testing" "github.com/caos/zitadel/internal/api/authz" + "github.com/caos/zitadel/internal/api/service" "github.com/caos/zitadel/internal/errors" "github.com/caos/zitadel/internal/eventstore/v2/repository" ) @@ -57,7 +58,7 @@ func newTestEvent(description string, data func() interface{}, checkPrevious boo data: data, shouldCheckPrevious: checkPrevious, BaseEvent: *NewBaseEventForPush( - authz.NewMockContext("resourceOwner", "editorUser"), + service.WithService(authz.NewMockContext("resourceOwner", "editorUser"), "editorService"), "test.event", ), } @@ -1142,12 +1143,8 @@ func (r *testReducer) Reduce() error { return nil } -func (r *testReducer) AppendEvents(e ...EventReader) error { - if r.err != nil { - return r.err - } +func (r *testReducer) AppendEvents(e ...EventReader) { r.events = append(r.events, e...) - return nil } func TestEventstore_FilterToReducer(t *testing.T) { @@ -1234,10 +1231,7 @@ func TestEventstore_FilterToReducer(t *testing.T) { { name: "found events", args: args{ - query: &SearchQueryFactory{ - aggregateTypes: []AggregateType{"test.aggregate"}, - columns: repository.ColumnsEvent, - }, + query: NewSearchQueryFactory(repository.ColumnsEvent, "test.aggregate"), readModel: &testReducer{ t: t, expectedLength: 1, @@ -1268,8 +1262,9 @@ func TestEventstore_FilterToReducer(t *testing.T) { columns: repository.ColumnsEvent, }, readModel: &testReducer{ - t: t, - err: errors.ThrowInvalidArgument(nil, "V2-W06TG", "test err"), + t: t, + err: errors.ThrowInvalidArgument(nil, "V2-W06TG", "test err"), + expectedLength: 1, }, }, fields: fields{ @@ -1399,6 +1394,8 @@ func TestEventstore_mapEvents(t *testing.T) { eventMapper: map[EventType]func(*repository.Event) (EventReader, error){}, }, res: res{ + //TODO: as long as not all events are implemented in v2 eventstore doesn't return an error + // afterwards it will return an error on un wantErr: true, }, }, diff --git a/internal/eventstore/v2/example_test.go b/internal/eventstore/v2/example_test.go index 9e7ddde6f3..53e9455bae 100644 --- a/internal/eventstore/v2/example_test.go +++ b/internal/eventstore/v2/example_test.go @@ -3,7 +3,6 @@ package eventstore_test import ( "context" "encoding/json" - "errors" "fmt" "testing" "time" @@ -209,14 +208,7 @@ type UsersReadModel struct { Users []*UserReadModel } -func NewUsersReadModel() *UsersReadModel { - return &UsersReadModel{ - ReadModel: *eventstore.NewReadModel(), - Users: []*UserReadModel{}, - } -} - -func (rm *UsersReadModel) AppendEvents(events ...eventstore.EventReader) (err error) { +func (rm *UsersReadModel) AppendEvents(events ...eventstore.EventReader) { rm.ReadModel.AppendEvents(events...) for _, event := range events { switch e := event.(type) { @@ -224,29 +216,24 @@ func (rm *UsersReadModel) AppendEvents(events ...eventstore.EventReader) (err er //insert user := NewUserReadModel(e.AggregateID()) rm.Users = append(rm.Users, user) - err = user.AppendEvents(e) + user.AppendEvents(e) case *UserFirstNameChangedEvent, *UserPasswordCheckedEvent: //update _, user := rm.userByID(e.AggregateID()) if user == nil { - return errors.New("user not found") + return } - err = user.AppendEvents(e) + user.AppendEvents(e) case *UserDeletedEvent: idx, _ := rm.userByID(e.AggregateID()) if idx < 0 { - return nil + return } copy(rm.Users[idx:], rm.Users[idx+1:]) rm.Users[len(rm.Users)-1] = nil // or the zero value of T rm.Users = rm.Users[:len(rm.Users)-1] } - if err != nil { - return err - } } - - return nil } func (rm *UsersReadModel) Reduce() error { @@ -285,16 +272,10 @@ type UserReadModel struct { func NewUserReadModel(id string) *UserReadModel { return &UserReadModel{ - ReadModel: *eventstore.NewReadModel(), - ID: id, + ID: id, } } -func (rm *UserReadModel) AppendEvents(events ...eventstore.EventReader) error { - rm.ReadModel.AppendEvents(events...) - return nil -} - func (rm *UserReadModel) Reduce() error { for _, event := range rm.ReadModel.Events { switch e := event.(type) { @@ -335,8 +316,8 @@ func TestUserReadModel(t *testing.T) { fmt.Printf("%+v\n", events) - users := NewUsersReadModel() - err = es.FilterToReducer(context.Background(), eventstore.NewSearchQueryFactory(eventstore.ColumnsEvent, "test.user"), users) + users := UsersReadModel{} + err = es.FilterToReducer(context.Background(), eventstore.NewSearchQueryFactory(eventstore.ColumnsEvent, "test.user"), &users) if err != nil { t.Errorf("unexpected error on filter to reducer: %v", err) } diff --git a/internal/eventstore/v2/read_model.go b/internal/eventstore/v2/read_model.go index 96f8be5251..6d1e419fe6 100644 --- a/internal/eventstore/v2/read_model.go +++ b/internal/eventstore/v2/read_model.go @@ -2,12 +2,6 @@ package eventstore import "time" -func NewReadModel() *ReadModel { - return &ReadModel{ - Events: []EventReader{}, - } -} - //ReadModel is the minimum representation of a View model. // It implements a basic reducer // it might be saved in a database or in memory diff --git a/internal/v2/business/iam/idp_oidc_config.go b/internal/v2/business/iam/idp_oidc_config.go index c67372e35d..914e4e3a47 100644 --- a/internal/v2/business/iam/idp_oidc_config.go +++ b/internal/v2/business/iam/idp_oidc_config.go @@ -28,3 +28,12 @@ func (r *Repository) IDPConfigByID(ctx context.Context, idpConfigID string) (*ia return readModelToIDPConfigView(idpConfig), nil } + +func (r *Repository) AddIDPConfig(ctx context.Context, config *iam_model.IDPConfig) (*iam_model.IDPConfig, error) { + iam, err := r.iamByID(ctx, config.AggregateID) + if err != nil { + return nil, err + } + + return nil, nil +} diff --git a/internal/v2/repository/idp/configs_read_model.go b/internal/v2/repository/idp/configs_read_model.go new file mode 100644 index 0000000000..f89d1b9f1d --- /dev/null +++ b/internal/v2/repository/idp/configs_read_model.go @@ -0,0 +1,56 @@ +package idp + +import ( + "github.com/caos/zitadel/internal/eventstore/v2" + "github.com/caos/zitadel/internal/v2/repository/idp/oidc" +) + +type ConfigsReadModel struct { + eventstore.ReadModel + + Configs []*ConfigReadModel +} + +func (rm *ConfigsReadModel) AppendEvents(events ...eventstore.EventReader) { + rm.ReadModel.AppendEvents(events...) + for _, event := range events { + switch event.(type) { + case *oidc.ConfigAddedEvent: + rm.OIDCConfig = &oidc.ConfigReadModel{} + rm.OIDCConfig.AppendEvents(event) + case *oidc.ConfigChangedEvent: + rm.OIDCConfig.AppendEvents(event) + } + } +} + +func (rm *ConfigsReadModel) Reduce() error { + for _, event := range rm.Events { + switch e := event.(type) { + case *ConfigAddedEvent: + rm.ConfigID = e.ConfigID + rm.Name = e.Name + rm.StylingType = e.StylingType + rm.State = ConfigStateActive + case *ConfigChangedEvent: + if e.Name != "" { + rm.Name = e.Name + } + if e.StylingType.Valid() { + rm.StylingType = e.StylingType + } + case *ConfigDeactivatedEvent: + rm.State = ConfigStateInactive + case *ConfigReactivatedEvent: + rm.State = ConfigStateActive + case *ConfigRemovedEvent: + rm.State = ConfigStateRemoved + case *oidc.ConfigAddedEvent: + rm.Type = ConfigTypeOIDC + } + } + if err := rm.OIDCConfig.Reduce(); err != nil { + return err + } + return rm.ReadModel.Reduce() +} diff --git a/internal/v2/repository/member/read_model.go b/internal/v2/repository/member/read_model.go index 97614fd3ed..3023b2eb92 100644 --- a/internal/v2/repository/member/read_model.go +++ b/internal/v2/repository/member/read_model.go @@ -14,8 +14,7 @@ type ReadModel struct { //NewMemberReadModel is the default constructor of ReadModel func NewMemberReadModel(userID string) *ReadModel { return &ReadModel{ - ReadModel: *eventstore.NewReadModel(), - UserID: userID, + UserID: userID, } } diff --git a/internal/v2/repository/members/read_models.go b/internal/v2/repository/members/read_models.go index c51dd0a9f2..f9e15ec089 100644 --- a/internal/v2/repository/members/read_models.go +++ b/internal/v2/repository/members/read_models.go @@ -11,13 +11,6 @@ type ReadModel struct { Members []*member.ReadModel } -func NewMembersReadModel() *ReadModel { - return &ReadModel{ - ReadModel: *eventstore.NewReadModel(), - Members: []*member.ReadModel{}, - } -} - func (rm *ReadModel) MemberByUserID(id string) (idx int, member *member.ReadModel) { for idx, member = range rm.Members { if member.UserID == id { @@ -31,12 +24,12 @@ func (rm *ReadModel) AppendEvents(events ...eventstore.EventReader) { for _, event := range events { switch e := event.(type) { case *member.AddedEvent: - member := member.NewMemberReadModel(e.UserID) - rm.Members = append(rm.Members, member) - member.AppendEvents(e) + m := member.NewMemberReadModel(e.UserID) + rm.Members = append(rm.Members, m) + m.AppendEvents(e) case *member.ChangedEvent: - _, member := rm.MemberByUserID(e.UserID) - member.AppendEvents(e) + _, m := rm.MemberByUserID(e.UserID) + m.AppendEvents(e) case *member.RemovedEvent: idx, _ := rm.MemberByUserID(e.UserID) if idx < 0 { @@ -50,8 +43,8 @@ func (rm *ReadModel) AppendEvents(events ...eventstore.EventReader) { } func (rm *ReadModel) Reduce() (err error) { - for _, member := range rm.Members { - err = member.Reduce() + for _, m := range rm.Members { + err = m.Reduce() if err != nil { return err }