Implement Route.Delete()
Co-authored-by: pancho horrillo <pedrofelipe.horrillo@bbva.com>
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
package state
|
package state
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/BBVA/kapow/internal/server/model"
|
"github.com/BBVA/kapow/internal/server/model"
|
||||||
@@ -43,3 +44,16 @@ func (srl *safeRouteList) List() []model.Route {
|
|||||||
}
|
}
|
||||||
return rs
|
return rs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (srl *safeRouteList) Delete(ID string) error {
|
||||||
|
srl.m.Lock()
|
||||||
|
defer srl.m.Unlock()
|
||||||
|
|
||||||
|
for i := 0; i < len(srl.rs); i++ {
|
||||||
|
if srl.rs[i].ID == ID {
|
||||||
|
srl.rs = append(srl.rs[:i], srl.rs[i+1:]...)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return errors.New("Route not found")
|
||||||
|
}
|
||||||
|
|||||||
@@ -190,3 +190,84 @@ func TestListReturnsANumberedListOfRoutes(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestDeleteReturnsAnErrorOnEmptyListOfRoutes(t *testing.T) {
|
||||||
|
srl := New()
|
||||||
|
|
||||||
|
err := srl.Delete("FOO")
|
||||||
|
|
||||||
|
if err == nil {
|
||||||
|
t.Error("Expected error not returned")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDeleteReturnsNilWhenTheRouteIsInTheList(t *testing.T) {
|
||||||
|
srl := New()
|
||||||
|
srl.rs = append(srl.rs, model.Route{ID: "FOO"})
|
||||||
|
|
||||||
|
err := srl.Delete("FOO")
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Nil was expected but an error was returned %q", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDeleteActuallyRemovesTheElementFromTheList(t *testing.T) {
|
||||||
|
srl := New()
|
||||||
|
srl.rs = append(srl.rs, model.Route{ID: "FOO"})
|
||||||
|
|
||||||
|
_ = srl.Delete("FOO")
|
||||||
|
|
||||||
|
if len(srl.rs) != 0 {
|
||||||
|
t.Error("The route was not removed from the list")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDeleteRemovesARouteFromTheMiddleOfTheList(t *testing.T) {
|
||||||
|
srl := New()
|
||||||
|
srl.rs = append(srl.rs, model.Route{ID: "FOO"})
|
||||||
|
srl.rs = append(srl.rs, model.Route{ID: "BAR"})
|
||||||
|
srl.rs = append(srl.rs, model.Route{ID: "QUX"})
|
||||||
|
|
||||||
|
_ = srl.Delete("BAR")
|
||||||
|
|
||||||
|
if len(srl.rs) != 2 || srl.rs[0].ID != "FOO" || srl.rs[1].ID != "QUX" {
|
||||||
|
t.Error("The route was not properly removed")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDeleteWaitsForWriterToFinishWriting(t *testing.T) {
|
||||||
|
srl := New()
|
||||||
|
|
||||||
|
srl.m.Lock()
|
||||||
|
defer srl.m.Unlock()
|
||||||
|
|
||||||
|
c := make(chan error)
|
||||||
|
go func() { c <- srl.Delete("FOO") }()
|
||||||
|
|
||||||
|
time.Sleep(10 * time.Millisecond)
|
||||||
|
|
||||||
|
select {
|
||||||
|
case <-c:
|
||||||
|
t.Error("Didn't wait for the writer to finish")
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDeleteWaitsForReadersToFinishReading(t *testing.T) {
|
||||||
|
srl := New()
|
||||||
|
|
||||||
|
srl.m.RLock()
|
||||||
|
defer srl.m.RUnlock()
|
||||||
|
|
||||||
|
c := make(chan error)
|
||||||
|
go func() { c <- srl.Delete("FOO") }()
|
||||||
|
|
||||||
|
time.Sleep(10 * time.Millisecond)
|
||||||
|
|
||||||
|
select {
|
||||||
|
case <-c:
|
||||||
|
t.Error("Didn't wait for the reader to finish")
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user