Implement Route.Delete()

Co-authored-by: pancho horrillo <pedrofelipe.horrillo@bbva.com>
This commit is contained in:
Roberto Abdelkader Martínez Pérez
2019-10-09 11:44:45 +02:00
parent 0249dc722b
commit 8729e1e492
2 changed files with 95 additions and 0 deletions
+14
View File
@@ -1,6 +1,7 @@
package state
import (
"errors"
"sync"
"github.com/BBVA/kapow/internal/server/model"
@@ -43,3 +44,16 @@ func (srl *safeRouteList) List() []model.Route {
}
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")
}
+81
View File
@@ -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:
}
}