Skip to content

Commit 34dad86

Browse files
Merge pull request #6 from DoWithLogic/5-create-unit-test-and-implementation-mocking
create unit test
2 parents c390995 + 6457a1f commit 34dad86

File tree

15 files changed

+365
-59
lines changed

15 files changed

+365
-59
lines changed

README.md

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -77,17 +77,16 @@ The DIP promotes high-level modules (e.g., use cases) to depend on abstractions
7777
- [ ] Request ID in logger (Header `X-Request-Id: xxx`)
7878
- RESTful
7979
- [x] Create Resource (`POST` verb)
80-
- [ ] Update Resource (`PUT` verb)
81-
- [ ] Partially Update Resource (`PATCH` verb)
80+
- [x] Update Resource (`PUT` verb)
81+
- [x] Partially Update Resource (`PATCH` verb)
8282
- [ ] Find Resource (`GET` verb)
8383
- [ ] Offset Pagination (Query param `?limit=10&page=1`)
8484
- [ ] Sorting (Query param `?sort=fullname DESC,id DESC`)
85-
- [x] Delete resource (`DELETE` verb, idempotent)
8685
- Testing
87-
- [ ] Table Driven Test
88-
- [ ] Mocking
86+
- [x] Table Driven Test
87+
- [x] Mocking
8988
- Others
90-
- [ ] Database migration and seed tool
89+
- [x] Database migration and seed tool
9190
- [ ] Releaser
9291

9392
## How To Run

go.mod

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,19 @@ module github.com/DoWithLogic/golang-clean-architecture
33
go 1.20
44

55
require (
6+
github.com/DATA-DOG/go-sqlmock v1.5.0
67
github.com/go-sql-driver/mysql v1.7.1
78
github.com/invopop/validation v0.3.0
89
github.com/jmoiron/sqlx v1.3.5
910
github.com/labstack/echo/v4 v4.11.1
1011
github.com/rs/zerolog v1.30.0
1112
github.com/spf13/viper v1.16.0
13+
github.com/stretchr/testify v1.8.4
14+
go.uber.org/mock v0.3.0
1215
)
1316

1417
require (
18+
github.com/davecgh/go-spew v1.1.1 // indirect
1519
github.com/fsnotify/fsnotify v1.6.0 // indirect
1620
github.com/hashicorp/hcl v1.0.0 // indirect
1721
github.com/labstack/gommon v0.4.0 // indirect
@@ -22,6 +26,7 @@ require (
2226
github.com/mattn/go-sqlite3 v1.14.17 // indirect
2327
github.com/mitchellh/mapstructure v1.5.0 // indirect
2428
github.com/pelletier/go-toml/v2 v2.0.8 // indirect
29+
github.com/pmezard/go-difflib v1.0.0 // indirect
2530
github.com/spf13/afero v1.9.5 // indirect
2631
github.com/spf13/cast v1.5.1 // indirect
2732
github.com/spf13/jwalterweatherman v1.1.0 // indirect

go.sum

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3f
3838
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
3939
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
4040
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
41+
github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60=
42+
github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
4143
github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d h1:Byv0BzEl3/e6D5CLfI0j/7hiIEtvGVFPCZ7Ei2oq8iQ=
4244
github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
4345
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
@@ -196,8 +198,9 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
196198
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
197199
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
198200
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
199-
github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY=
200201
github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
202+
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
203+
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
201204
github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8=
202205
github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0=
203206
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
@@ -215,6 +218,8 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
215218
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
216219
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
217220
go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
221+
go.uber.org/mock v0.3.0 h1:3mUxI1No2/60yUYax92Pt8eNOEecx2D3lcXZh2NEZJo=
222+
go.uber.org/mock v0.3.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc=
218223
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
219224
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
220225
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=

internal/users/delivery/http/handler/handler.go

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,12 @@ func (h *handlers) CreateUser(c echo.Context) error {
6969
)
7070
}
7171

72-
createdID, err := h.uc.CreateUser(ctx, &entities.Users{Fullname: payload.Fullname, PhoneNumber: payload.PhoneNumber})
72+
argsCreateUser := entities.CreateUser{
73+
FUllName: payload.FullName,
74+
PhoneNumber: payload.PhoneNumber,
75+
}
76+
77+
createdID, err := h.uc.CreateUser(ctx, argsCreateUser)
7378
if err != nil {
7479
return c.JSON(http.StatusInternalServerError, dtos.NewResponseError(
7580
http.StatusInternalServerError,
@@ -125,14 +130,14 @@ func (h *handlers) UpdateUser(c echo.Context) error {
125130
)
126131
}
127132

128-
updateArgs := &entities.UpdateUsers{
133+
argsUpdateUser := entities.UpdateUsers{
129134
UserID: userID,
130135
Fullname: payload.Fullname,
131136
PhoneNumber: payload.Fullname,
132137
UserType: payload.UserType,
133138
}
134139

135-
err = h.uc.UpdateUser(ctx, updateArgs)
140+
err = h.uc.UpdateUser(ctx, argsUpdateUser)
136141
if err != nil {
137142
return c.JSON(http.StatusBadRequest, dtos.NewResponseError(
138143
http.StatusInternalServerError,
@@ -178,7 +183,12 @@ func (h *handlers) UpdateUserStatus(c echo.Context) error {
178183
)
179184
}
180185

181-
err = h.uc.UpdateUserStatus(ctx, &entities.UpdateUsers{UserID: userID, IsActive: payload.IsActive})
186+
argsUpdateUserStatus := entities.UpdateUserStatus{
187+
UserID: userID,
188+
IsActive: payload.IsActive,
189+
}
190+
191+
err = h.uc.UpdateUserStatus(ctx, argsUpdateUserStatus)
182192
if err != nil {
183193
return c.JSON(http.StatusBadRequest, dtos.NewResponseError(
184194
http.StatusInternalServerError,

internal/users/dtos/create_users.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@ package dtos
33
import "github.com/invopop/validation"
44

55
type CreateUserPayload struct {
6-
Fullname string `json:"fullname"`
6+
FullName string `json:"fullname"`
77
PhoneNumber string `json:"phone_number"`
88
}
99

1010
func (cup CreateUserPayload) Validate() error {
1111
return validation.ValidateStruct(&cup,
12-
validation.Field(&cup.Fullname, validation.Required, validation.Length(0, 50)),
12+
validation.Field(&cup.FullName, validation.Required, validation.Length(0, 50)),
1313
validation.Field(&cup.PhoneNumber, validation.Required, validation.Length(0, 13)),
1414
)
1515
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package entities
2+
3+
import "time"
4+
5+
type CreateUser struct {
6+
FUllName string
7+
PhoneNumber string
8+
UserType string
9+
IsActive bool
10+
CreatedAt time.Time
11+
CreatedBy string
12+
}
13+
14+
func NewCreateUser(data CreateUser) CreateUser {
15+
return CreateUser{
16+
FUllName: data.FUllName,
17+
PhoneNumber: data.PhoneNumber,
18+
UserType: UserTypeRegular,
19+
IsActive: true,
20+
CreatedAt: time.Now(),
21+
CreatedBy: "martin",
22+
}
23+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package entities
2+
3+
import "time"
4+
5+
type UpdateUserStatus struct {
6+
UserID int64
7+
IsActive bool
8+
UpdatedAt time.Time
9+
UpdatedBy string
10+
}
11+
12+
func NewUpdateUserStatus(payload UpdateUserStatus) UpdateUserStatus {
13+
return UpdateUserStatus{
14+
UserID: payload.UserID,
15+
IsActive: payload.IsActive,
16+
UpdatedAt: time.Now(),
17+
UpdatedBy: "martin",
18+
}
19+
}

internal/users/entities/update_users.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,17 @@ type UpdateUsers struct {
77
Fullname string
88
PhoneNumber string
99
UserType string
10-
IsActive bool
11-
UpdatedAt string
10+
UpdatedAt time.Time
1211
UpdatedBy string
1312
}
1413

15-
func NewUpdateUsers(data UpdateUsers) *UpdateUsers {
16-
return &UpdateUsers{
14+
func NewUpdateUsers(data UpdateUsers) UpdateUsers {
15+
return UpdateUsers{
1716
UserID: data.UserID,
1817
Fullname: data.Fullname,
1918
PhoneNumber: data.PhoneNumber,
2019
UserType: UserTypeRegular,
21-
UpdatedAt: time.Now().Format("2006-01-02 15:04:05"),
20+
UpdatedAt: time.Now(),
2221
UpdatedBy: "martin",
2322
}
2423
}

internal/users/entities/users.go

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package entities
22

33
import (
44
"errors"
5-
"time"
65
)
76

87
type (
@@ -40,14 +39,3 @@ func (locking *LockingOpt) Validate() error {
4039

4140
return nil
4241
}
43-
44-
func NewUser(data Users) *Users {
45-
return &Users{
46-
Fullname: data.Fullname,
47-
PhoneNumber: data.PhoneNumber,
48-
UserType: UserTypeRegular,
49-
IsActive: true,
50-
CreatedAt: time.Now().Format("2006-01-02 15:04:05"),
51-
CreatedBy: "martin",
52-
}
53-
}

internal/users/mock/repository_mock.go

Lines changed: 94 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)