mirror of
https://github.com/hanzozt/storage.git
synced 2026-10-30 19:34:03 +00:00
90 lines
2.0 KiB
Go
90 lines
2.0 KiB
Go
package boltz
|
|
|
|
import (
|
|
"github.com/stretchr/testify/require"
|
|
"time"
|
|
)
|
|
|
|
const (
|
|
TestEntityTypeChild = "child"
|
|
TestEntityTypeParent = "parent"
|
|
)
|
|
|
|
func NewTestEventChecker(req *require.Assertions) *TestEventChecker {
|
|
return &TestEventChecker{
|
|
Assertions: req,
|
|
eventC: make(chan *TestEvent, 10),
|
|
errC: make(chan error, 10),
|
|
}
|
|
}
|
|
|
|
type TestEventChecker struct {
|
|
*require.Assertions
|
|
errC chan error
|
|
eventC chan *TestEvent
|
|
}
|
|
|
|
func (self *TestEventChecker) AddHandlers(store Store) {
|
|
for _, eventType := range []EntityEventType{EntityCreated, EntityUpdated, EntityDeleted} {
|
|
entityType := TestEntityTypeParent
|
|
if store.IsChildStore() {
|
|
entityType = TestEntityTypeChild
|
|
}
|
|
store.AddListener(self.newHandler(entityType, eventType).accept, eventType)
|
|
}
|
|
}
|
|
|
|
func (self *TestEventChecker) newHandler(entityType string, eventType EntityEventType) *testEventHandler {
|
|
return &testEventHandler{
|
|
entityType: entityType,
|
|
eventType: eventType,
|
|
eventChecker: self,
|
|
}
|
|
}
|
|
|
|
func (self *TestEventChecker) RequireEvent(entityType string, entity Entity, eventType EntityEventType) Entity {
|
|
select {
|
|
case event := <-self.eventC:
|
|
self.NotNil(event)
|
|
self.Equal(entityType, event.EntityType)
|
|
self.Equal(entity.GetId(), event.Entity.GetId())
|
|
self.Equal(eventType, event.eventType)
|
|
return event.Entity
|
|
case err := <-self.errC:
|
|
self.NoError(err)
|
|
case <-time.After(time.Second):
|
|
self.FailNow("timed out waiting for event")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (self *TestEventChecker) RequireNoEvent() {
|
|
select {
|
|
case event := <-self.eventC:
|
|
self.Nil(event, "no event expected")
|
|
case err := <-self.errC:
|
|
self.NoError(err)
|
|
case <-time.After(100 * time.Millisecond):
|
|
}
|
|
}
|
|
|
|
type testEventHandler struct {
|
|
entityType string
|
|
eventType EntityEventType
|
|
eventChecker *TestEventChecker
|
|
}
|
|
|
|
func (self *testEventHandler) accept(entity Entity) {
|
|
self.eventChecker.eventC <- &TestEvent{
|
|
EntityType: self.entityType,
|
|
Entity: entity,
|
|
eventType: self.eventType,
|
|
}
|
|
}
|
|
|
|
type TestEvent struct {
|
|
EntityType string
|
|
Entity Entity
|
|
eventType EntityEventType
|
|
}
|