From a40053e44d3877d4dde7c7e74ee6ad4da8cce649 Mon Sep 17 00:00:00 2001 From: Wenbo Han Date: Wed, 20 Nov 2024 16:30:46 +0800 Subject: [PATCH 1/2] fix: [#523] [Bug] The same listener can not be registered by multiple events, framework will threw an error: job signature duplicate (#730) --- event/application.go | 18 +++++++--- event/application_test.go | 76 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+), 5 deletions(-) create mode 100644 event/application_test.go diff --git a/event/application.go b/event/application.go index 4a6809163..24c2b76af 100644 --- a/event/application.go +++ b/event/application.go @@ -1,23 +1,28 @@ package event import ( + "slices" + "github.com/goravel/framework/contracts/event" - queuecontract "github.com/goravel/framework/contracts/queue" + "github.com/goravel/framework/contracts/queue" ) type Application struct { events map[event.Event][]event.Listener - queue queuecontract.Queue + queue queue.Queue } -func NewApplication(queue queuecontract.Queue) *Application { +func NewApplication(queue queue.Queue) *Application { return &Application{ queue: queue, } } func (app *Application) Register(events map[event.Event][]event.Listener) { - var jobs []queuecontract.Job + var ( + jobs []queue.Job + jobNames []string + ) if app.events == nil { app.events = map[event.Event][]event.Listener{} @@ -26,7 +31,10 @@ func (app *Application) Register(events map[event.Event][]event.Listener) { for e, listeners := range events { app.events[e] = listeners for _, listener := range listeners { - jobs = append(jobs, listener) + if !slices.Contains(jobNames, listener.Signature()) { + jobs = append(jobs, listener) + jobNames = append(jobNames, listener.Signature()) + } } } diff --git a/event/application_test.go b/event/application_test.go new file mode 100644 index 000000000..0bdd68e2a --- /dev/null +++ b/event/application_test.go @@ -0,0 +1,76 @@ +package event + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + + "github.com/goravel/framework/contracts/event" + "github.com/goravel/framework/contracts/queue" + mocksevent "github.com/goravel/framework/mocks/event" + mocksqueue "github.com/goravel/framework/mocks/queue" +) + +func TestApplication_Register(t *testing.T) { + var ( + mockQueue *mocksqueue.Queue + ) + + tests := []struct { + name string + events func() map[event.Event][]event.Listener + }{ + { + name: "MultipleEvents", + events: func() map[event.Event][]event.Listener { + event1 := mocksevent.NewEvent(t) + event2 := mocksevent.NewEvent(t) + listener1 := mocksevent.NewListener(t) + listener1.EXPECT().Signature().Return("listener1").Twice() + listener2 := mocksevent.NewListener(t) + listener2.EXPECT().Signature().Return("listener2").Times(3) + + mockQueue.EXPECT().Register(mock.MatchedBy(func(listeners []queue.Job) bool { + return assert.ElementsMatch(t, []queue.Job{ + listener1, + listener2, + }, listeners) + })).Once() + + return map[event.Event][]event.Listener{ + event1: { + listener1, + listener2, + }, + event2: { + listener2, + }, + } + }, + }, + { + name: "NoEvents", + events: func() map[event.Event][]event.Listener { + mockQueue.EXPECT().Register([]queue.Job(nil)).Once() + + return nil + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + mockQueue = mocksqueue.NewQueue(t) + app := NewApplication(mockQueue) + + events := tt.events() + app.Register(events) + + assert.Equal(t, len(events), len(app.GetEvents())) + for e, listeners := range events { + assert.ElementsMatch(t, listeners, app.GetEvents()[e]) + } + }) + } +} From d4de868cb507cd18b94eaedff4a6e741b696acbc Mon Sep 17 00:00:00 2001 From: Bowen Date: Wed, 20 Nov 2024 21:40:04 +0800 Subject: [PATCH 2/2] Upgrade v1.14.8 --- support/constant.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/support/constant.go b/support/constant.go index b819d6179..8c81b4697 100644 --- a/support/constant.go +++ b/support/constant.go @@ -1,6 +1,6 @@ package support -const Version string = "v1.14.7" +const Version string = "v1.14.8" const ( EnvRuntime = "runtime"