Skip to content
Snippets Groups Projects
Verified Commit e478250f authored by Volker Schukai's avatar Volker Schukai :alien:
Browse files

feat add HasOnChangeHook and RemoveOnChangeHook

parent be8418e6
Branches
Tags
No related merge requests found
......@@ -303,6 +303,14 @@ import (
"gitlab.schukai.com/oss/libraries/go/application/configuration"
)
type ChangeEventHandler struct {
callback func(event configuration.ChangeEvent)
}
func (c *ChangeEventHandler) Handle(event configuration.ChangeEvent) {
c.callback(event)
}
func main() {
config := struct {
Host string
......@@ -314,12 +322,17 @@ func main() {
closeChan := make(chan bool)
s.OnChange(func(event configuration.ChangeEvent) {
var h configuration.EventHook
h = &ChangeEventHandler{
callback: func(event configuration.ChangeEvent) {
log := event.Changlog
msg := fmt.Sprintf("Change from %s to %s", log[0].From, log[0].To)
msg = fmt.Sprintf("Change from %s to %s", log[0].From, log[0].To)
fmt.Println(msg)
closeChan <- true
})
},
}
s.OnChange(h)
c := s.Config()
c.Host = "www.example.com"
......
......@@ -11,16 +11,40 @@ type ChangeEvent struct {
Changlog diff.Changelog
}
type EventHook func(event ChangeEvent)
type EventHook interface {
Handle(event ChangeEvent)
}
// OnChange registers a hook that is called when the configuration changes.
func (s *Settings[C]) OnChange(hook EventHook) *Settings[C] {
s.hooks.change = append(s.hooks.change, hook)
return s
}
// HasOnChangeHook returns true if there are registered hooks.
func (s *Settings[C]) HasOnChangeHook(hook EventHook) *Settings[C] {
for _, h := range s.hooks.change {
if h == hook {
break
}
}
return s
}
// RemoveOnChangeHook removes a change hook from the list of hooks.
func (s *Settings[C]) RemoveOnChangeHook(hook EventHook) *Settings[C] {
for i, h := range s.hooks.change {
if h == hook {
s.hooks.change = append(s.hooks.change[:i], s.hooks.change[i+1:]...)
break
}
}
return s
}
func (s *Settings[C]) notifyChangeHooks(changelog diff.Changelog) *Settings[C] {
for _, h := range s.hooks.change {
h(ChangeEvent{Changlog: changelog})
h.Handle(ChangeEvent{Changlog: changelog})
}
return s
}
......
......@@ -11,6 +11,49 @@ import (
"time"
)
type mockTestEventHandler struct {
EventHook
}
func (m *mockTestEventHandler) Handle(event ChangeEvent) {
// do nothing
}
func TestAddRemoveHook(t *testing.T) {
config := struct {
Host string
}{
Host: "localhost",
}
s := New(config)
var h EventHook
h = &mockTestEventHandler{}
s.OnChange(h)
if len(s.hooks.change) != 1 {
t.Error("Expected 1 got ", len(s.hooks.change))
}
s.RemoveOnChangeHook(h)
if len(s.hooks.change) != 0 {
t.Error("Expected 0 got ", len(s.hooks.change))
}
}
type ChangeEventTester struct {
callback func(event ChangeEvent)
}
func (c *ChangeEventTester) Handle(event ChangeEvent) {
c.callback(event)
}
func TestReadmeExample(t *testing.T) {
config := struct {
......@@ -24,13 +67,19 @@ func TestReadmeExample(t *testing.T) {
closeChan := make(chan bool)
msg := ""
s.OnChange(func(event ChangeEvent) {
var h EventHook
h = &ChangeEventTester{
callback: func(event ChangeEvent) {
log := event.Changlog
msg = fmt.Sprintf("Change from %s to %s", log[0].From, log[0].To)
// for Readme
//fmt.Println(msg)
closeChan <- true
})
},
}
s.OnChange(h)
c := s.Config()
c.Host = "www.example.com"
......@@ -84,10 +133,16 @@ func TestCangeOnChange(t *testing.T) {
closeChan := make(chan bool)
counter := 0
s.OnChange(func(event ChangeEvent) {
var h EventHook
h = &ChangeEventTester{
callback: func(event ChangeEvent) {
counter++
closeChan <- true
})
},
}
s.OnChange(h)
c.A = "b"
s.SetConfig(c)
......
......@@ -271,10 +271,16 @@ func TestConfigurationServePostJson(t *testing.T) {
closeChan := make(chan bool)
counter := 0
s.OnChange(func(event ChangeEvent) {
var h EventHook
h = &ChangeEventTester{
callback: func(event ChangeEvent) {
counter++
closeChan <- true
})
},
}
s.OnChange(h)
// We create a ResponseRecorder (which satisfies http.ResponseWriter) to record the response.
rr := httptest.NewRecorder()
......
......@@ -35,11 +35,16 @@ func TestWatch(t *testing.T) {
signal := make(chan bool)
c.OnChange(func(event ChangeEvent) {
var h EventHook
h = &ChangeEventTester{
callback: func(event ChangeEvent) {
assert.Equal(t, event.Changlog[0].From, "localhost")
assert.Equal(t, event.Changlog[0].To, "example.org")
signal <- true
})
},
}
c.OnChange(h)
c.Watch()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment