Skip to content

Commit

Permalink
Add unit tests for identity.go, comment Identity struct to require to…
Browse files Browse the repository at this point in the history
… work properly, add Identity.ID() testing to typed collection unit tests
  • Loading branch information
mAdkins committed Aug 26, 2022
1 parent 2ce65d5 commit f4601e1
Show file tree
Hide file tree
Showing 4 changed files with 110 additions and 26 deletions.
11 changes: 9 additions & 2 deletions mdb/identity.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import (
)

// Identifier provides an interface to items that use the primitive Mongo ObjectID.
// When embedding this always use:
// mdb.Identifier `bson:"inline"`
type Identifier interface {
ID() primitive.ObjectID
IDfilter() bson.D
Expand All @@ -21,7 +23,12 @@ func (idm *Identity) ID() primitive.ObjectID {
return idm.ObjectID
}

// Filter returns a Mongo filter object for the item's ID.
// IDfilter method returns a Mongo filter object for the item's ID.
func (idm *Identity) IDfilter() bson.D {
return bson.D{{"_id", idm.ObjectID}}
return IDfilter(idm.ObjectID)
}

// IDfilter function returns a Mongo filter object for the specified ObjectID.
func IDfilter(id primitive.ObjectID) bson.D {
return bson.D{{"_id", id}}
}
69 changes: 69 additions & 0 deletions mdb/identity_db_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package mdb

import (
"testing"

"github.com/stretchr/testify/suite"
"go.mongodb.org/mongo-driver/bson"
)

type identityTestSuite struct {
AccessTestSuite
collection *Collection
}

func TestIdentitySuite(t *testing.T) {
suite.Run(t, new(identityTestSuite))
}

func (suite *identityTestSuite) SetupSuite() {
suite.AccessTestSuite.SetupSuite()
var err error
suite.collection, err = ConnectCollection(suite.access, testCollection)
suite.Require().NoError(err)
suite.NotNil(suite.collection)
suite.Require().NoError(suite.collection.DeleteAll())
}

func (suite *identityTestSuite) TearDownTest() {
suite.NoError(suite.collection.DeleteAll())
}

const findable = "findable"

type identified struct {
Identity `bson:"inline"`
Text string
}

func (suite *identityTestSuite) TestIndex() {
ind := new(identified)
suite.Require().NoError(suite.collection.Create(ind))
ind.Text = findable
suite.Require().NoError(suite.collection.Create(ind))
found := suite.findStruct(bson.D{{"text", findable}})
// Do we have an ID?
suite.Require().NotNil(found.ObjectID)
suite.Require().NotNil(found.ID())
suite.Equal(found.ObjectID, found.ID())
suite.NotEmpty(found.ID())
foundID := found.ID()
// Use IDfilter() to find the item.
found = suite.findStruct(found.IDfilter())
suite.Require().NotNil(found.ID())
suite.NotEmpty(found.ID())
suite.Equal(foundID, found.ID())
}

func (suite *identityTestSuite) findStruct(filter bson.D) *identified {
found, err := suite.collection.Find(filter)
suite.Require().NoError(err)
suite.Require().NotNil(found)
// Convert bson.D nested structure to identified struct.
var bytes []byte
bytes, err = bson.Marshal(found)
suite.Require().NoError(err)
newInd := new(identified)
suite.Require().NoError(bson.Unmarshal(bytes, newInd))
return newInd
}
14 changes: 6 additions & 8 deletions mdb/simple_types_for_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,15 +28,13 @@ var SimpleValidatorJSON = `{

var _ Identifier = &SimpleItem{}

// var _ Expirable = &SimpleItem{}

type SimpleItem struct {
Identity
Alpha string `bson:",omitempty"`
Bravo int `bson:",omitempty"`
Charlie string `bson:",omitempty"`
Delta int `bson:",omitempty"`
expires time.Time
Identity `bson:"inline"`
Alpha string `bson:",omitempty"`
Bravo int `bson:",omitempty"`
Charlie string `bson:",omitempty"`
Delta int `bson:",omitempty"`
expires time.Time
}

func (si *SimpleItem) ExpireAfter(duration time.Duration) {
Expand Down
42 changes: 26 additions & 16 deletions mdb/typed_collection_db_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,19 +64,22 @@ func (suite *typedTestSuite) TestFindOrCreate() {
suite.Nil(item)
item, err = suite.typed.FindOrCreate(SimpleItem2.Filter(), SimpleItem2)
suite.Require().NoError(err)
suite.NotNil(item)
suite.NotNil(item.ID())
suite.Require().NotNil(item)
suite.Require().NotNil(item.ID())
suite.NotEmpty(item.ID())
itemID := item.ID()
item, err = suite.typed.Find(SimpleItem2.Filter())
suite.Require().NoError(err)
suite.NotNil(item)
suite.NotNil(item.ID())
suite.Require().NotNil(item)
suite.Require().NotNil(item.ID())
suite.NotEmpty(item.ID())
suite.Equal(itemID, item.ID())
item2, err := suite.typed.FindOrCreate(SimpleItem2.Filter(), SimpleItem2)
suite.Require().NoError(err)
suite.NotNil(item2)
suite.Require().NotNil(item2)
suite.Equal(item, item2)
suite.Equal(itemID, item2.ObjectID)
suite.Require().NotNil(item2.ID())
suite.Equal(itemID, item2.ID())
}

func (suite *typedTestSuite) TestCreateFindDelete() {
Expand Down Expand Up @@ -147,8 +150,9 @@ func (suite *typedTestSuite) TestReplace() {
suite.Require().NoError(suite.typed.Create(SimpleItem1))
item, err := suite.typed.Find(SimpleItem1.Filter())
suite.Require().NoError(err)
suite.NotNil(item)
suite.NotNil(item.ID())
suite.Require().NotNil(item)
suite.Require().NotNil(item.ID())
suite.NotEmpty(item.ID())
itemID := item.ID()
suite.Equal("one", item.Alpha)
// Replace with new value:
Expand All @@ -158,16 +162,18 @@ func (suite *typedTestSuite) TestReplace() {
item, err = suite.typed.Find(SimpleItem1x.Filter()) // look for new item
suite.Require().NoError(err) // found
suite.Require().NotNil(item)
suite.NotNil(item.ID())
suite.Require().NotNil(item.ID())
suite.NotEmpty(item.ID())
suite.Equal(itemID, item.ID())
suite.Equal("xRay", item.Alpha)
// Replace with same value:
err = suite.typed.Replace(SimpleItem1x, SimpleItem1x)
suite.Require().ErrorIs(err, errNoItemModified)
item, err = suite.typed.Find(SimpleItem1x.Filter())
suite.Require().NoError(err)
suite.NotNil(item)
suite.NotNil(item.ID())
suite.Require().NotNil(item)
suite.Require().NotNil(item.ID())
suite.NotEmpty(item.ID())
suite.Equal(itemID, item.ID())
suite.Equal("xRay", item.Alpha)
// No match for filter:
Expand All @@ -178,8 +184,9 @@ func (suite *typedTestSuite) TestReplace() {
suite.NoError(suite.typed.Replace(NoFilter(), SimpleItem3))
item, err = suite.typed.Find(SimpleItem3.Filter())
suite.Require().NoError(err)
suite.NotNil(item)
suite.NotNil(item.ID)
suite.Require().NotNil(item)
suite.Require().NotNil(item.ID)
suite.NotEmpty(item.ID())
suite.Equal("three", item.Alpha)
suite.Equal(itemID, item.ID())
}
Expand Down Expand Up @@ -210,8 +217,9 @@ func (suite *typedTestSuite) TestUpdate() {
suite.Require().NoError(suite.typed.Create(SimpleItem1))
item, err := suite.typed.Find(SimpleItem1.Filter())
suite.Require().NoError(err)
suite.NotNil(item)
suite.NotNil(item.ID())
suite.Require().NotNil(item)
suite.Require().NotNil(item.ID())
suite.NotEmpty(item.ID())
itemID := item.ID()
suite.Equal("one", item.Alpha)
suite.Equal(SimpleCharlie1, item.Charlie)
Expand All @@ -224,7 +232,9 @@ func (suite *typedTestSuite) TestUpdate() {
}))
item, err = suite.typed.Find(SimpleItem1.Filter())
suite.Require().NoError(err)
suite.NotNil(item)
suite.Require().NotNil(item)
suite.Require().NotNil(item.ID())
suite.NotEmpty(item.ID())
suite.Equal(itemID, item.ID())
suite.Equal("One more time", item.Charlie)
suite.Equal(3, item.Delta)
Expand Down

0 comments on commit f4601e1

Please sign in to comment.