Skip to content

Commit

Permalink
update mock
Browse files Browse the repository at this point in the history
  • Loading branch information
hwbrzzl committed Mar 3, 2025
1 parent 6206549 commit 50f17a6
Show file tree
Hide file tree
Showing 6 changed files with 365 additions and 11 deletions.
10 changes: 6 additions & 4 deletions contracts/database/db/db.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,20 +39,21 @@ type Query interface {
FirstOr(dest any, callback func() error) error
// FirstOrFail finds the first record that matches the given conditions or throws an error.
FirstOrFail(dest any) error
// decrement
// Decrement the given column's values by the given amounts.
Decrement(column string, value ...uint64) error
// Get Retrieve all rows from the database.
Get(dest any) error
// GroupBy(column string) Query
// GroupByRaw(query string, args ...any) Query
// having
// HavingRaw(query any, args ...any) Query
// increment
// Increment a column's value by a given amount.
Increment(column string, value ...uint64) error
// inRandomOrder
// Insert a new record into the database.
Insert(data any) (*Result, error)
// InsertGetId returns the ID of the inserted row, only supported by MySQL and Sqlite
InsertGetId(data any) (int64, error)
// incrementEach
// Join(table string, on any, args ...any) Query
// Latest Retrieve the latest record from the database.
Latest(dest any, column ...string) error
Expand Down Expand Up @@ -105,7 +106,8 @@ type Query interface {
Update(column any, value ...any) (*Result, error)
// updateOrInsert
// Value(column string, dest any) error
// when
// When executes the callback if the condition is true.
When(condition bool, callback func(query Query) Query) Query
// Where Add a basic where clause to the query.
Where(query any, args ...any) Query
// WhereBetween Add a where between statement to the query.
Expand Down
36 changes: 36 additions & 0 deletions database/db/query.go
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,20 @@ func (r *Query) Count() (int64, error) {
// return nil
// }

func (r *Query) Decrement(column string, value ...uint64) error {
v := uint64(1)
if len(value) > 0 {
v = value[0]
}

_, err := r.Update(column, sq.Expr(fmt.Sprintf("%s - ?", column), v))
if err != nil {
return err
}

return nil
}

func (r *Query) Delete() (*db.Result, error) {
sql, args, err := r.buildDelete()
if err != nil {
Expand Down Expand Up @@ -241,6 +255,20 @@ func (r *Query) Get(dest any) error {
return nil
}

func (r *Query) Increment(column string, value ...uint64) error {
v := uint64(1)
if len(value) > 0 {
v = value[0]
}

_, err := r.Update(column, sq.Expr(fmt.Sprintf("%s + ?", column), v))
if err != nil {
return err
}

return nil
}

func (r *Query) Insert(data any) (*db.Result, error) {
mapData, err := convertToSliceMap(data)
if err != nil {
Expand Down Expand Up @@ -521,6 +549,14 @@ func (r *Query) Update(column any, value ...any) (*db.Result, error) {
// return nil
// }

func (r *Query) When(condition bool, callback func(query db.Query) db.Query) db.Query {
if condition {
return callback(r)
}

return r
}

func (r *Query) Where(query any, args ...any) db.Query {
q := r.clone()
q.conditions.Where = append(q.conditions.Where, Where{
Expand Down
72 changes: 72 additions & 0 deletions database/db/query_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,21 @@ func (s *QueryTestSuite) TestCount() {
s.Equal(int64(1), count)
}

func (s *QueryTestSuite) TestDecrement() {
mockResult := &MockResult{}
mockResult.On("RowsAffected").Return(int64(1), nil)

s.mockDriver.EXPECT().Config().Return(database.Config{}).Once()
s.mockBuilder.EXPECT().Exec("UPDATE users SET age = age - ? WHERE name = ?", uint64(1), "John").Return(mockResult, nil).Once()
s.mockDriver.EXPECT().Explain("UPDATE users SET age = age - ? WHERE name = ?", uint64(1), "John").Return("UPDATE users SET age = age - 1 WHERE name = \"John\"").Once()
s.mockLogger.EXPECT().Trace(s.ctx, s.now, "UPDATE users SET age = age - 1 WHERE name = \"John\"", int64(1), nil).Return().Once()

err := s.query.Where("name", "John").Decrement("age")
s.NoError(err)

mockResult.AssertExpectations(s.T())
}

func (s *QueryTestSuite) TestDelete() {
s.Run("success", func() {
mockResult := &MockResult{}
Expand Down Expand Up @@ -108,6 +123,18 @@ func (s *QueryTestSuite) TestDelete() {
})
}

func (s *QueryTestSuite) TestDistinct() {
var users TestUser

s.mockDriver.EXPECT().Config().Return(database.Config{}).Once()
s.mockBuilder.EXPECT().Get(&users, "SELECT DISTINCT * FROM users WHERE name = ?", "John").Return(nil).Once()
s.mockDriver.EXPECT().Explain("SELECT DISTINCT * FROM users WHERE name = ?", "John").Return("SELECT DISTINCT * FROM users WHERE name = \"John\"").Once()
s.mockLogger.EXPECT().Trace(s.ctx, s.now, "SELECT DISTINCT * FROM users WHERE name = \"John\"", int64(1), nil).Return().Once()

err := s.query.Where("name", "John").Distinct().First(&users)
s.NoError(err)
}

func (s *QueryTestSuite) TestExists() {
var count int64

Expand Down Expand Up @@ -302,6 +329,21 @@ func (s *QueryTestSuite) TestGet() {
})
}

func (s *QueryTestSuite) TestIncrement() {
mockResult := &MockResult{}
mockResult.On("RowsAffected").Return(int64(1), nil)

s.mockDriver.EXPECT().Config().Return(database.Config{}).Once()
s.mockBuilder.EXPECT().Exec("UPDATE users SET age = age + ? WHERE name = ?", uint64(1), "John").Return(mockResult, nil).Once()
s.mockDriver.EXPECT().Explain("UPDATE users SET age = age + ? WHERE name = ?", uint64(1), "John").Return("UPDATE users SET age = age + 1 WHERE name = \"John\"").Once()
s.mockLogger.EXPECT().Trace(s.ctx, s.now, "UPDATE users SET age = age + 1 WHERE name = \"John\"", int64(1), nil).Return().Once()

err := s.query.Where("name", "John").Increment("age")
s.NoError(err)

mockResult.AssertExpectations(s.T())
}

func (s *QueryTestSuite) TestInsert() {
s.Run("empty", func() {
result, err := s.query.Insert(nil)
Expand Down Expand Up @@ -863,6 +905,36 @@ func (s *QueryTestSuite) TestUpdate() {
// s.Equal("John", name)
// }

func (s *QueryTestSuite) TestWhen() {
s.Run("when condition is true", func() {
var user TestUser

s.mockDriver.EXPECT().Config().Return(database.Config{}).Once()
s.mockBuilder.EXPECT().Get(&user, "SELECT * FROM users WHERE (name = ? AND age = ?)", "John", 25).Return(nil).Once()
s.mockDriver.EXPECT().Explain("SELECT * FROM users WHERE (name = ? AND age = ?)", "John", 25).Return("SELECT * FROM users WHERE (name = \"John\" AND age = 25)").Once()
s.mockLogger.EXPECT().Trace(s.ctx, s.now, "SELECT * FROM users WHERE (name = \"John\" AND age = 25)", int64(1), nil).Return().Once()

err := s.query.Where("name", "John").When(true, func(query db.Query) db.Query {
return query.Where("age", 25)
}).First(&user)
s.Nil(err)
})

s.Run("when condition is false", func() {
var user TestUser

s.mockDriver.EXPECT().Config().Return(database.Config{}).Once()
s.mockBuilder.EXPECT().Get(&user, "SELECT * FROM users WHERE name = ?", "John").Return(nil).Once()
s.mockDriver.EXPECT().Explain("SELECT * FROM users WHERE name = ?", "John").Return("SELECT * FROM users WHERE name = \"John\"").Once()
s.mockLogger.EXPECT().Trace(s.ctx, s.now, "SELECT * FROM users WHERE name = \"John\"", int64(1), nil).Return().Once()

err := s.query.Where("name", "John").When(false, func(query db.Query) db.Query {
return query.Where("age", 25)
}).First(&user)
s.Nil(err)
})
}

func (s *QueryTestSuite) TestWhere() {
s.Run("simple condition", func() {
var user TestUser
Expand Down
171 changes: 171 additions & 0 deletions mocks/database/db/Query.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 50f17a6

Please sign in to comment.