Skip to content

Commit

Permalink
Add MapStore which implements the Storer interface
Browse files Browse the repository at this point in the history
Adds the Puppy, Storer and MapStore type definitions. MapStore implements
the Storer interface and supplies a NewMapStore factory function.

- Uuid increment is handled internally by MapStore Create
- Read will return an empty Puppy struct if provided uuid doesn't exist
- Update returns a bool whether a matching identifier was modified
- Destroy returns a bool whether a matching identifier was modified

Lab 06 (anz-bank#537)
  • Loading branch information
patrickmarabeas committed Aug 25, 2019
1 parent a0f8dbd commit f8c677d
Show file tree
Hide file tree
Showing 3 changed files with 151 additions and 0 deletions.
56 changes: 56 additions & 0 deletions 06_puppy/patrickmarabeas/mapStore.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package main

type MapStore struct {
uuid uint
store map[uint]Puppy
}

// NewMapStore returns a pointer to a new instance of the MapStore struct which implements the Storer interface.
func NewMapStore() Storer {
return &MapStore{
uuid: 0,
store: map[uint]Puppy{},
}
}

// Create increments the uuid and adds the provided Puppy struct to the store with this identifier.
func (store *MapStore) Create(puppy Puppy) uint {
puppy.ID = store.uuid
store.store[puppy.ID] = puppy
store.uuid++

return puppy.ID
}

// Read returns the puppy matching the provided uuid.
// An empty Puppy struct is returned if the identifier does not exist.
func (store *MapStore) Read(id uint) Puppy {
if _, ok := store.store[id]; ok {
return store.store[id]
}

return Puppy{}
}

// Update modifies the puppy matching the provided uuid in the store with the provided Puppy struct.
// It returns a bool whether a matching identifier was modified or not.
func (store *MapStore) Update(id uint, puppy Puppy) bool {
if _, ok := store.store[id]; !ok {
return false
}

puppy.ID = id
store.store[id] = puppy
return true
}

// Destroy removes the puppy matching the provided uuid from the store.
// It returns a bool whether a matching identifier was deleted or not.
func (store *MapStore) Destroy(id uint) bool {
if _, ok := store.store[id]; !ok {
return false
}

delete(store.store, id)
return true
}
80 changes: 80 additions & 0 deletions 06_puppy/patrickmarabeas/store_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package main

import (
"testing"

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/suite"
)

type StoreSuite struct {
suite.Suite
store Storer
}

func (suite *StoreSuite) TestCreate() {
a := assert.New(suite.T())
id := suite.store.Create(Puppy{Breed: "Wolf", Color: "Grey", Value: "450"})
id2 := suite.store.Create(Puppy{Breed: "Boxer", Color: "Brown", Value: "300"})

a.EqualValues(id+1, id2)
}

func (suite *StoreSuite) TestRead() {
a := assert.New(suite.T())
data := suite.store.Read(0)

a.Equal(data, Puppy{ID: 0, Breed: "Wolf", Color: "Grey", Value: "450"})
}

func (suite *StoreSuite) TestReadNonExistent() {
a := assert.New(suite.T())
success := suite.store.Read(100)

a.Equal(success, Puppy{})
}

func (suite *StoreSuite) TestUpdate() {
a := assert.New(suite.T())
success := suite.store.Update(0, Puppy{Breed: "Doberman", Color: "Black", Value: "500"})
data := suite.store.Read(0)

a.Equal(success, true)
a.Equal(data, Puppy{ID: 0, Breed: "Doberman", Color: "Black", Value: "500"})
}

func (suite *StoreSuite) TestUpdateNonExistent() {
a := assert.New(suite.T())
success := suite.store.Update(100, Puppy{Breed: "Doberman", Color: "Black", Value: "500"})

a.Equal(success, false)
}

func (suite *StoreSuite) TestDestroy() {
a := assert.New(suite.T())
success := suite.store.Destroy(1)
data := suite.store.Read(1)

a.Equal(success, true)
a.Equal(data, Puppy{})
}

func (suite *StoreSuite) TestDestroyNonExistent() {
a := assert.New(suite.T())
success := suite.store.Destroy(100)

a.Equal(success, false)
}

func (suite *StoreSuite) TestIdIncrementOnDelete() {
a := assert.New(suite.T())
id := suite.store.Create(Puppy{Breed: "Greyhound", Color: "Light Brown", Value: "700"})
suite.store.Destroy(id)
newID := suite.store.Create(Puppy{Breed: "Greyhound", Color: "Light Brown", Value: "700"})

a.EqualValues(newID, 3)
}

func TestStore(t *testing.T) {
suite.Run(t, &StoreSuite{store: NewMapStore()})
}
15 changes: 15 additions & 0 deletions 06_puppy/patrickmarabeas/types.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package main

type Puppy struct {
ID uint
Breed string
Color string
Value string
}

type Storer interface {
Create(puppy Puppy) uint
Read(ID uint) Puppy
Update(ID uint, puppy Puppy) bool
Destroy(ID uint) bool
}

0 comments on commit f8c677d

Please sign in to comment.