2019-11-28 21:56:04 +01:00
package kv
import (
"errors"
"strings"
"github.com/abronan/valkeyrie/store"
)
func newProviderMock ( kvPairs [ ] * store . KVPair ) * Provider {
return & Provider {
RootKey : "traefik" ,
kvClient : newKvClientMock ( kvPairs , nil ) ,
}
}
2020-05-11 12:06:07 +02:00
// Override Get/List to return a error.
2019-11-28 21:56:04 +01:00
type KvError struct {
Get error
List error
}
2020-05-11 12:06:07 +02:00
// Extremely limited mock store so we can test initialization.
2019-11-28 21:56:04 +01:00
type Mock struct {
Error KvError
KVPairs [ ] * store . KVPair
WatchTreeMethod func ( ) <- chan [ ] * store . KVPair
}
func newKvClientMock ( kvPairs [ ] * store . KVPair , err error ) * Mock {
mock := & Mock {
KVPairs : kvPairs ,
}
if err != nil {
mock . Error = KvError {
Get : err ,
List : err ,
}
}
return mock
}
func ( s * Mock ) Put ( key string , value [ ] byte , opts * store . WriteOptions ) error {
return errors . New ( "method Put not supported" )
}
func ( s * Mock ) Get ( key string , options * store . ReadOptions ) ( * store . KVPair , error ) {
if err := s . Error . Get ; err != nil {
return nil , err
}
for _ , kvPair := range s . KVPairs {
if kvPair . Key == key {
return kvPair , nil
}
}
return nil , store . ErrKeyNotFound
}
func ( s * Mock ) Delete ( key string ) error {
return errors . New ( "method Delete not supported" )
}
2020-05-11 12:06:07 +02:00
// Exists mock.
2019-11-28 21:56:04 +01:00
func ( s * Mock ) Exists ( key string , options * store . ReadOptions ) ( bool , error ) {
if err := s . Error . Get ; err != nil {
return false , err
}
for _ , kvPair := range s . KVPairs {
if strings . HasPrefix ( kvPair . Key , key ) {
return true , nil
}
}
return false , store . ErrKeyNotFound
}
2020-05-11 12:06:07 +02:00
// Watch mock.
2019-11-28 21:56:04 +01:00
func ( s * Mock ) Watch ( key string , stopCh <- chan struct { } , options * store . ReadOptions ) ( <- chan * store . KVPair , error ) {
return nil , errors . New ( "method Watch not supported" )
}
2020-05-11 12:06:07 +02:00
// WatchTree mock.
2019-11-28 21:56:04 +01:00
func ( s * Mock ) WatchTree ( prefix string , stopCh <- chan struct { } , options * store . ReadOptions ) ( <- chan [ ] * store . KVPair , error ) {
return s . WatchTreeMethod ( ) , nil
}
2020-05-11 12:06:07 +02:00
// NewLock mock.
2019-11-28 21:56:04 +01:00
func ( s * Mock ) NewLock ( key string , options * store . LockOptions ) ( store . Locker , error ) {
return nil , errors . New ( "method NewLock not supported" )
}
2020-05-11 12:06:07 +02:00
// List mock.
2019-11-28 21:56:04 +01:00
func ( s * Mock ) List ( prefix string , options * store . ReadOptions ) ( [ ] * store . KVPair , error ) {
if err := s . Error . List ; err != nil {
return nil , err
}
var kv [ ] * store . KVPair
for _ , kvPair := range s . KVPairs {
if strings . HasPrefix ( kvPair . Key , prefix ) { // FIXME && !strings.ContainsAny(strings.TrimPrefix(kvPair.Key, prefix), "/") {
kv = append ( kv , kvPair )
}
}
return kv , nil
}
2020-05-11 12:06:07 +02:00
// DeleteTree mock.
2019-11-28 21:56:04 +01:00
func ( s * Mock ) DeleteTree ( prefix string ) error {
return errors . New ( "method DeleteTree not supported" )
}
2020-05-11 12:06:07 +02:00
// AtomicPut mock.
2019-11-28 21:56:04 +01:00
func ( s * Mock ) AtomicPut ( key string , value [ ] byte , previous * store . KVPair , opts * store . WriteOptions ) ( bool , * store . KVPair , error ) {
return false , nil , errors . New ( "method AtomicPut not supported" )
}
2020-05-11 12:06:07 +02:00
// AtomicDelete mock.
2019-11-28 21:56:04 +01:00
func ( s * Mock ) AtomicDelete ( key string , previous * store . KVPair ) ( bool , error ) {
return false , errors . New ( "method AtomicDelete not supported" )
}
2020-05-11 12:06:07 +02:00
// Close mock.
2019-11-28 21:56:04 +01:00
func ( s * Mock ) Close ( ) { }