1
0
mirror of https://github.com/alexedwards/scs.git synced 2025-07-13 01:00:17 +02:00
Files
scs/mockstore/store.go
2021-11-22 00:26:54 +01:00

162 lines
3.9 KiB
Go

package mockstore
import (
"bytes"
"time"
)
type expectedDelete struct {
inputToken string
returnErr error
}
type expectedFind struct {
inputToken string
returnB []byte
returnFound bool
returnErr error
}
type expectedCommit struct {
inputToken string
inputB []byte
inputExpiry time.Time
returnErr error
}
type expectedAll struct {
returnMB map[string][]byte
returnErr error
}
type MockStore struct {
deleteExpectations []expectedDelete
findExpectations []expectedFind
commitExpectations []expectedCommit
allExpectations []expectedAll
}
func (m *MockStore) ExpectDelete(token string, err error) {
m.deleteExpectations = append(m.deleteExpectations, expectedDelete{
inputToken: token,
returnErr: err,
})
}
// Delete implements the Store interface
func (m *MockStore) Delete(token string) (err error) {
var (
indexToRemove int
expectationFound bool
)
for i, expectation := range m.deleteExpectations {
if expectation.inputToken == token {
indexToRemove = i
expectationFound = true
break
}
}
if !expectationFound {
panic("store.Delete called unexpectedly")
}
errToReturn := m.deleteExpectations[indexToRemove].returnErr
m.deleteExpectations = m.deleteExpectations[:indexToRemove+copy(m.deleteExpectations[indexToRemove:], m.deleteExpectations[indexToRemove+1:])]
return errToReturn
}
func (m *MockStore) ExpectFind(token string, b []byte, found bool, err error) {
m.findExpectations = append(m.findExpectations, expectedFind{
inputToken: token,
returnB: b,
returnFound: found,
returnErr: err,
})
}
// Find implements the Store interface
func (m *MockStore) Find(token string) (b []byte, found bool, err error) {
var (
indexToRemove int
expectationFound bool
)
for i, expectation := range m.findExpectations {
if expectation.inputToken == token {
indexToRemove = i
expectationFound = true
break
}
}
if !expectationFound {
panic("store.Find called unexpectedly")
}
valueToReturn := m.findExpectations[indexToRemove]
m.findExpectations = m.findExpectations[:indexToRemove+copy(m.findExpectations[indexToRemove:], m.findExpectations[indexToRemove+1:])]
return valueToReturn.returnB, valueToReturn.returnFound, valueToReturn.returnErr
}
func (m *MockStore) ExpectCommit(token string, b []byte, expiry time.Time, err error) {
m.commitExpectations = append(m.commitExpectations, expectedCommit{
inputToken: token,
inputB: b,
inputExpiry: expiry,
returnErr: err,
})
}
// Commit implements the Store interface
func (m *MockStore) Commit(token string, b []byte, expiry time.Time) (err error) {
var (
indexToRemove int
expectationFound bool
)
for i, expectation := range m.commitExpectations {
if expectation.inputToken == token && bytes.Equal(expectation.inputB, b) && expectation.inputExpiry == expiry {
indexToRemove = i
expectationFound = true
break
}
}
if !expectationFound {
panic("store.Commit called unexpectedly")
}
errToReturn := m.commitExpectations[indexToRemove].returnErr
m.commitExpectations = m.commitExpectations[:indexToRemove+copy(m.commitExpectations[indexToRemove:], m.commitExpectations[indexToRemove+1:])]
return errToReturn
}
func (m *MockStore) ExpectAll(mb map[string][]byte, err error) {
m.allExpectations = append(m.allExpectations, expectedAll{
returnMB: mb,
returnErr: err,
})
}
// All implements the IterableStore interface
func (m *MockStore) All() (map[string][]byte, error) {
var (
indexToRemove int
expectationFound bool
)
for i, expectation := range m.allExpectations {
if len(expectation.returnMB) == 3 {
indexToRemove = i
expectationFound = true
break
}
}
if !expectationFound {
panic("store.All called unexpectedly")
}
valueToReturn := m.allExpectations[indexToRemove]
m.allExpectations = m.allExpectations[:indexToRemove+copy(m.allExpectations[indexToRemove:], m.allExpectations[indexToRemove+1:])]
return valueToReturn.returnMB, valueToReturn.returnErr
}