This is the test function written only one testcase for successful updation but it is not working here I have only added case for updating and inserting like updating user in user_rec collection and inserting in del_user_col:
func TestDeleteUser(t *testing.T) {
uid := primitive.NewObjectID()
tests := []struct {
name string
userID model.UserID
email string
user model.User
mockUpdateResponse primitive.D
mockInsertResponse primitive.D
mockRemoveResponse primitive.D
expectErr error
}{
{
name: "given valid userID and userName, expect no error",
userID: model.UserID(uid.Hex()),
email: "[email protected]",
user: model.User{
Name: "temp",
},
mockUpdateResponse: bson.D{
{"ok", 1},
{"nModified", 1},
{"value", 1},
},
mockInsertResponse: mtest.CreateSuccessResponse(),
mockRemoveResponse: nil,
expectErr: nil,
},
}
ctx := context.Background()
logger, _ := test.NewNullLogger()
mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
defer mt.Close()
for _, tt := range tests {
mt.Run(tt.name, func(mt *mtest.T) {
mg := Mongo{
conn: &cMongo.Mongo{
Client: mt.Client,
DB: mt.DB,
},
logger: logger,
collUserRec: mt.Coll,
collDeletedUserRec: mt.Coll,
}
var doc bson.D
userBytes, err := bson.Marshal(tt.user)
assert.Nil(t, err)
err = bson.Unmarshal(userBytes, &doc)
assert.Nil(t, err)
mt.AddMockResponses(mtest.CreateCursorResponse(1, "foo.bar", mtest.FirstBatch, doc))
mt.AddMockResponses(tt.mockInsertResponse)
mt.AddMockResponses(tt.mockUpdateResponse)
mt.AddMockResponses(tt.mockRemoveResponse)
err = mg.DeleteUser(ctx, tt.userID, tt.email)
assert.Equal(t, tt.expectErr, err)
})
}
}
function for this is:
func (m *Mongo) DeleteUser(ctx context.Context, userID model.UserID, email string) error {
log := m.logger.WithContext(ctx).WithField("userID", userID).WithField("email", email)
if userID == "" || email == "" {
log.WithError(svc.ErrImportantFieldMissing).Error("userID or email is missing")
return svc.ErrImportantFieldMissing
}
uid, err := primitive.ObjectIDFromHex(userID.String())
if err != nil {
log.WithError(err).Error("error in converting userId to objectID")
return svc.ErrBadInput
}
filter := bson.M{
"_id": uid,
"email": email,
}
var userDoc doc.User
projection := bson.D{{Key: "name", Value: 1}}
option := options.FindOne().SetProjection(projection)
err = m.collUserRec.FindOne(ctx, filter, option).Decode(&userDoc)
if err != nil {
log.WithError(err).Error("error retrieving user document")
return svc.ErrUnexpected
}
err = m.insertUserInDelUserCol(ctx, userID, email, userDoc.Name)
if err != nil {
log.WithError(err).Error("error in adding user in deleted_user_rec")
return err
}
update := bson.M{
"$unset": bson.M{
"email": "",
"name": "",
"apisecret": "",
},
//"$set": bson.M{
// "update_ts": time.Now(),
//},
}
res, err := m.collUserRec.UpdateOne(ctx, filter, update)
if err != nil {
log.WithError(err).Error("error in removing user fields ")
err = m.removeUserFromDelUserRec(ctx, userID)
if err != nil {
log.WithError(err).Error("error in deleting user from del_user_rec if update was unsuccessful")
return errors.New("error in deleting after update error")
}
return svc.ErrUnexpected
}
if res.ModifiedCount > 0 {
log.WithField("userID", userID).Info("removed user fields successfully")
return nil
}
log.WithError(err).Error("error in removing user fields")
err = m.removeUserFromDelUserRec(ctx, userID)
if err != nil {
log.WithError(err).Error("error in deleting user from del_user_rec if update was unsuccessful")
return svc.ErrUnexpected
}
return svc.ErrUnexpected
}
I have tried single test case for success but it is not working please see?