package queue import ( "sync" "testing" . "github.com/franela/goblin" "github.com/gin-gonic/gin" ) func TestBuild(t *testing.T) { g := Goblin(t) g.Describe("Queue", func() { g.It("Should publish item", func() { c := new(gin.Context) q := newQueue() ToContext(c, q) w1 := &Work{} w2 := &Work{} Publish(c, w1) Publish(c, w2) g.Assert(len(q.items)).Equal(2) g.Assert(len(q.itemc)).Equal(2) }) g.It("Should remove item", func() { c := new(gin.Context) q := newQueue() ToContext(c, q) w1 := &Work{} w2 := &Work{} w3 := &Work{} Publish(c, w1) Publish(c, w2) Publish(c, w3) Remove(c, w2) g.Assert(len(q.items)).Equal(2) g.Assert(len(q.itemc)).Equal(2) g.Assert(Pull(c)).Equal(w1) g.Assert(Pull(c)).Equal(w3) g.Assert(Remove(c, w2)).Equal(ErrNotFound) }) g.It("Should pull item", func() { c := new(gin.Context) q := New() ToContext(c, q) cn := new(closeNotifier) cn.closec = make(chan bool, 1) w1 := &Work{} w2 := &Work{} Publish(c, w1) g.Assert(Pull(c)).Equal(w1) Publish(c, w2) g.Assert(PullClose(c, cn)).Equal(w2) }) g.It("Should cancel pulling item", func() { c := new(gin.Context) q := New() ToContext(c, q) cn := new(closeNotifier) cn.closec = make(chan bool, 1) var wg sync.WaitGroup go func() { wg.Add(1) g.Assert(PullClose(c, cn) == nil).IsTrue() wg.Done() }() go func() { cn.closec <- true }() wg.Wait() }) }) } type closeNotifier struct { closec chan bool } func (c *closeNotifier) CloseNotify() <-chan bool { return c.closec }