From 0da8b295074c87ed1f3f588d99dbcd6f52bcb53a Mon Sep 17 00:00:00 2001 From: Muyao CHEN Date: Wed, 23 Oct 2024 09:54:00 +0200 Subject: [PATCH] test: try to test user repo and event repo --- README.md | 18 ++ go.mod | 1 - go.sum | 2 - internal/howmuch/adapter/repo/event.go | 49 ++-- internal/howmuch/adapter/repo/mock/mock.go | 277 ------------------ internal/howmuch/adapter/repo/sqlc/querier.go | 21 -- internal/howmuch/adapter/repo/sqlc/user.sql | 22 -- .../howmuch/adapter/repo/sqlc/user.sql.go | 22 -- internal/howmuch/adapter/repo/user.go | 17 +- internal/howmuch/usecase/repo/db.go | 4 +- internal/howmuch/usecase/repo/user.go | 6 +- .../usecase/usecase/repomock/testdbrepo.go | 4 +- 12 files changed, 63 insertions(+), 380 deletions(-) delete mode 100644 internal/howmuch/adapter/repo/mock/mock.go diff --git a/README.md b/README.md index a35632e..8eb1930 100644 --- a/README.md +++ b/README.md @@ -546,3 +546,21 @@ I have to figure out how to use the generated mock files. The goals for the next week is to finish the basic operations for each level and run some integration tests with `curl`. + +### 2024/10/22 + +I am facing come difficulties on testing of the `repo` functions. + +First, I have to keep the business logic in the service layer. That means I +have to create the transaction at the service layer. I don't need to depend +on the implementation detail. So I have created a Transaction interface. + +I don't care of the type of `tx` because I will pass it to repo layer and I +suppose that it knows what it is doing. Considering this, my repo `Create` +function will have to take an any and deduct the type of `tx`. So the layer +becomes untestable, because I have to pass a *sql.Tx into it and create a +querier. + +Since this repo layer is just a wrapping layer between the `sqlc.models` and +my own models, I can extract the conversion part to functions and test them. +I'm not testing the whole thing but I test what I can. diff --git a/go.mod b/go.mod index 1be9c2a..f57a788 100644 --- a/go.mod +++ b/go.mod @@ -16,7 +16,6 @@ require ( github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.19.0 github.com/stretchr/testify v1.9.0 - go.uber.org/mock v0.5.0 go.uber.org/zap v1.27.0 golang.org/x/crypto v0.27.0 golang.org/x/net v0.26.0 diff --git a/go.sum b/go.sum index 0d4b894..35d653c 100644 --- a/go.sum +++ b/go.sum @@ -142,8 +142,6 @@ github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65E github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU= -go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= diff --git a/internal/howmuch/adapter/repo/event.go b/internal/howmuch/adapter/repo/event.go index 8ce9e45..53dcfce 100644 --- a/internal/howmuch/adapter/repo/event.go +++ b/internal/howmuch/adapter/repo/event.go @@ -35,12 +35,12 @@ import ( ) type eventRepository struct { - db *sql.DB + queries sqlc.Querier } func NewEventRepository(db *sql.DB) repo.EventRepository { return &eventRepository{ - db: db, + queries: sqlc.New(db), } } @@ -52,18 +52,10 @@ func (e *eventRepository) Create( panic("unimplemented") } -// GetByID implements repo.EventRepository. -func (e *eventRepository) GetByID(ctx context.Context, eventID int) (*model.EventRetrieved, error) { - queries := sqlc.New(e.db) - eventDTO, err := queries.GetEventByID(ctx, int32(eventID)) - if err != nil { - log.ErrorLog("query error", "err", err) - return nil, err - } - +func convToEventRetrieved(eventDTO *sqlc.GetEventByIDRow) (*model.EventRetrieved, error) { // marshal owner and users var owner model.UserBaseRetrieved - err = json.Unmarshal(eventDTO.Owner, &owner) + err := json.Unmarshal(eventDTO.Owner, &owner) if err != nil { // Unexpected log.ErrorLog("json unmarshal error", "err", err) @@ -71,7 +63,7 @@ func (e *eventRepository) GetByID(ctx context.Context, eventID int) (*model.Even } var users []*model.UserBaseRetrieved - err = json.Unmarshal(eventDTO.Owner, &users) + err = json.Unmarshal(eventDTO.Users, &users) if err != nil { // Unexpected log.ErrorLog("json unmarshal error", "err", err) @@ -96,18 +88,18 @@ func (e *eventRepository) GetByID(ctx context.Context, eventID int) (*model.Even return eventRetrieved, nil } -// ListEventsByUserID implements repo.EventRepository. -func (e *eventRepository) ListEventsByUserID( - ctx context.Context, - userID int, -) ([]*model.EventListRetrieved, error) { - queries := sqlc.New(e.db) - eventsDTO, err := queries.ListEventsByUserID(ctx, int32(userID)) +// GetByID implements repo.EventRepository. +func (e *eventRepository) GetByID(ctx context.Context, eventID int) (*model.EventRetrieved, error) { + eventDTO, err := e.queries.GetEventByID(ctx, int32(eventID)) if err != nil { log.ErrorLog("query error", "err", err) return nil, err } + return convToEventRetrieved(&eventDTO) +} + +func convToEventList(eventsDTO []sqlc.ListEventsByUserIDRow) ([]*model.EventListRetrieved, error) { var events []*model.EventListRetrieved for _, evDTO := range eventsDTO { @@ -130,13 +122,26 @@ func (e *eventRepository) ListEventsByUserID( return events, nil } +// ListEventsByUserID implements repo.EventRepository. +func (e *eventRepository) ListEventsByUserID( + ctx context.Context, + userID int, +) ([]*model.EventListRetrieved, error) { + eventsDTO, err := e.queries.ListEventsByUserID(ctx, int32(userID)) + if err != nil { + log.ErrorLog("query error", "err", err) + return nil, err + } + + return convToEventList(eventsDTO) +} + // UpdateInfo implements repo.EventRepository. func (e *eventRepository) UpdateEventByID( ctx context.Context, event *model.EventUpdateEntity, ) error { - queries := sqlc.New(e.db) - err := queries.UpdateEventByID(ctx, sqlc.UpdateEventByIDParams{ + err := e.queries.UpdateEventByID(ctx, sqlc.UpdateEventByIDParams{ ID: int32(event.ID), Name: event.Name, Description: sql.NullString{String: event.Description, Valid: true}, diff --git a/internal/howmuch/adapter/repo/mock/mock.go b/internal/howmuch/adapter/repo/mock/mock.go deleted file mode 100644 index 13aa08c..0000000 --- a/internal/howmuch/adapter/repo/mock/mock.go +++ /dev/null @@ -1,277 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: ./internal/howmuch/adapter/repo/sqlc/querier.go -// -// Generated by this command: -// -// mockgen -source=./internal/howmuch/adapter/repo/sqlc/querier.go -package=mock -// - -// Package mock is a generated GoMock package. -package mock - -import ( - context "context" - reflect "reflect" - - sqlc "git.vinchent.xyz/vinchent/howmuch/internal/howmuch/adapter/repo/sqlc" - gomock "go.uber.org/mock/gomock" -) - -// MockQuerier is a mock of Querier interface. -type MockQuerier struct { - ctrl *gomock.Controller - recorder *MockQuerierMockRecorder -} - -// MockQuerierMockRecorder is the mock recorder for MockQuerier. -type MockQuerierMockRecorder struct { - mock *MockQuerier -} - -// NewMockQuerier creates a new mock instance. -func NewMockQuerier(ctrl *gomock.Controller) *MockQuerier { - mock := &MockQuerier{ctrl: ctrl} - mock.recorder = &MockQuerierMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockQuerier) EXPECT() *MockQuerierMockRecorder { - return m.recorder -} - -// DeleteExpense mocks base method. -func (m *MockQuerier) DeleteExpense(ctx context.Context, id int32) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "DeleteExpense", ctx, id) - ret0, _ := ret[0].(error) - return ret0 -} - -// DeleteExpense indicates an expected call of DeleteExpense. -func (mr *MockQuerierMockRecorder) DeleteExpense(ctx, id any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteExpense", reflect.TypeOf((*MockQuerier)(nil).DeleteExpense), ctx, id) -} - -// DeleteTransactionsOfExpenseID mocks base method. -func (m *MockQuerier) DeleteTransactionsOfExpenseID(ctx context.Context, expenseID int32) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "DeleteTransactionsOfExpenseID", ctx, expenseID) - ret0, _ := ret[0].(error) - return ret0 -} - -// DeleteTransactionsOfExpenseID indicates an expected call of DeleteTransactionsOfExpenseID. -func (mr *MockQuerierMockRecorder) DeleteTransactionsOfExpenseID(ctx, expenseID any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteTransactionsOfExpenseID", reflect.TypeOf((*MockQuerier)(nil).DeleteTransactionsOfExpenseID), ctx, expenseID) -} - -// GetEventByID mocks base method. -func (m *MockQuerier) GetEventByID(ctx context.Context, id int32) (sqlc.GetEventByIDRow, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetEventByID", ctx, id) - ret0, _ := ret[0].(sqlc.GetEventByIDRow) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetEventByID indicates an expected call of GetEventByID. -func (mr *MockQuerierMockRecorder) GetEventByID(ctx, id any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetEventByID", reflect.TypeOf((*MockQuerier)(nil).GetEventByID), ctx, id) -} - -// GetExpenseByID mocks base method. -func (m *MockQuerier) GetExpenseByID(ctx context.Context, id int32) (sqlc.GetExpenseByIDRow, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetExpenseByID", ctx, id) - ret0, _ := ret[0].(sqlc.GetExpenseByIDRow) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetExpenseByID indicates an expected call of GetExpenseByID. -func (mr *MockQuerierMockRecorder) GetExpenseByID(ctx, id any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetExpenseByID", reflect.TypeOf((*MockQuerier)(nil).GetExpenseByID), ctx, id) -} - -// GetUserByEmail mocks base method. -func (m *MockQuerier) GetUserByEmail(ctx context.Context, email string) (sqlc.User, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetUserByEmail", ctx, email) - ret0, _ := ret[0].(sqlc.User) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetUserByEmail indicates an expected call of GetUserByEmail. -func (mr *MockQuerierMockRecorder) GetUserByEmail(ctx, email any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetUserByEmail", reflect.TypeOf((*MockQuerier)(nil).GetUserByEmail), ctx, email) -} - -// GetUserByID mocks base method. -func (m *MockQuerier) GetUserByID(ctx context.Context, id int32) (sqlc.User, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetUserByID", ctx, id) - ret0, _ := ret[0].(sqlc.User) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetUserByID indicates an expected call of GetUserByID. -func (mr *MockQuerierMockRecorder) GetUserByID(ctx, id any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetUserByID", reflect.TypeOf((*MockQuerier)(nil).GetUserByID), ctx, id) -} - -// InsertEvent mocks base method. -func (m *MockQuerier) InsertEvent(ctx context.Context, arg sqlc.InsertEventParams) (sqlc.Event, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "InsertEvent", ctx, arg) - ret0, _ := ret[0].(sqlc.Event) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// InsertEvent indicates an expected call of InsertEvent. -func (mr *MockQuerierMockRecorder) InsertEvent(ctx, arg any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InsertEvent", reflect.TypeOf((*MockQuerier)(nil).InsertEvent), ctx, arg) -} - -// InsertExpense mocks base method. -func (m *MockQuerier) InsertExpense(ctx context.Context, arg sqlc.InsertExpenseParams) (sqlc.Expense, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "InsertExpense", ctx, arg) - ret0, _ := ret[0].(sqlc.Expense) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// InsertExpense indicates an expected call of InsertExpense. -func (mr *MockQuerierMockRecorder) InsertExpense(ctx, arg any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InsertExpense", reflect.TypeOf((*MockQuerier)(nil).InsertExpense), ctx, arg) -} - -// InsertParticipation mocks base method. -func (m *MockQuerier) InsertParticipation(ctx context.Context, arg sqlc.InsertParticipationParams) (sqlc.Participation, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "InsertParticipation", ctx, arg) - ret0, _ := ret[0].(sqlc.Participation) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// InsertParticipation indicates an expected call of InsertParticipation. -func (mr *MockQuerierMockRecorder) InsertParticipation(ctx, arg any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InsertParticipation", reflect.TypeOf((*MockQuerier)(nil).InsertParticipation), ctx, arg) -} - -// InsertTransaction mocks base method. -func (m *MockQuerier) InsertTransaction(ctx context.Context, arg sqlc.InsertTransactionParams) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "InsertTransaction", ctx, arg) - ret0, _ := ret[0].(error) - return ret0 -} - -// InsertTransaction indicates an expected call of InsertTransaction. -func (mr *MockQuerierMockRecorder) InsertTransaction(ctx, arg any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InsertTransaction", reflect.TypeOf((*MockQuerier)(nil).InsertTransaction), ctx, arg) -} - -// InsertUser mocks base method. -func (m *MockQuerier) InsertUser(ctx context.Context, arg sqlc.InsertUserParams) (sqlc.User, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "InsertUser", ctx, arg) - ret0, _ := ret[0].(sqlc.User) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// InsertUser indicates an expected call of InsertUser. -func (mr *MockQuerierMockRecorder) InsertUser(ctx, arg any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InsertUser", reflect.TypeOf((*MockQuerier)(nil).InsertUser), ctx, arg) -} - -// ListEventsByUserID mocks base method. -func (m *MockQuerier) ListEventsByUserID(ctx context.Context, userID int32) ([]sqlc.ListEventsByUserIDRow, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ListEventsByUserID", ctx, userID) - ret0, _ := ret[0].([]sqlc.ListEventsByUserIDRow) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// ListEventsByUserID indicates an expected call of ListEventsByUserID. -func (mr *MockQuerierMockRecorder) ListEventsByUserID(ctx, userID any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListEventsByUserID", reflect.TypeOf((*MockQuerier)(nil).ListEventsByUserID), ctx, userID) -} - -// ListExpensesByEventID mocks base method. -func (m *MockQuerier) ListExpensesByEventID(ctx context.Context, id int32) ([]sqlc.Expense, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ListExpensesByEventID", ctx, id) - ret0, _ := ret[0].([]sqlc.Expense) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// ListExpensesByEventID indicates an expected call of ListExpensesByEventID. -func (mr *MockQuerierMockRecorder) ListExpensesByEventID(ctx, id any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListExpensesByEventID", reflect.TypeOf((*MockQuerier)(nil).ListExpensesByEventID), ctx, id) -} - -// ListExpensesByEventIDByUserID mocks base method. -func (m *MockQuerier) ListExpensesByEventIDByUserID(ctx context.Context, id int32) ([]sqlc.Expense, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ListExpensesByEventIDByUserID", ctx, id) - ret0, _ := ret[0].([]sqlc.Expense) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// ListExpensesByEventIDByUserID indicates an expected call of ListExpensesByEventIDByUserID. -func (mr *MockQuerierMockRecorder) ListExpensesByEventIDByUserID(ctx, id any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListExpensesByEventIDByUserID", reflect.TypeOf((*MockQuerier)(nil).ListExpensesByEventIDByUserID), ctx, id) -} - -// UpdateEventByID mocks base method. -func (m *MockQuerier) UpdateEventByID(ctx context.Context, arg sqlc.UpdateEventByIDParams) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "UpdateEventByID", ctx, arg) - ret0, _ := ret[0].(error) - return ret0 -} - -// UpdateEventByID indicates an expected call of UpdateEventByID. -func (mr *MockQuerierMockRecorder) UpdateEventByID(ctx, arg any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateEventByID", reflect.TypeOf((*MockQuerier)(nil).UpdateEventByID), ctx, arg) -} - -// UpdateExpenseByID mocks base method. -func (m *MockQuerier) UpdateExpenseByID(ctx context.Context, arg sqlc.UpdateExpenseByIDParams) (sqlc.Expense, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "UpdateExpenseByID", ctx, arg) - ret0, _ := ret[0].(sqlc.Expense) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// UpdateExpenseByID indicates an expected call of UpdateExpenseByID. -func (mr *MockQuerierMockRecorder) UpdateExpenseByID(ctx, arg any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateExpenseByID", reflect.TypeOf((*MockQuerier)(nil).UpdateExpenseByID), ctx, arg) -} diff --git a/internal/howmuch/adapter/repo/sqlc/querier.go b/internal/howmuch/adapter/repo/sqlc/querier.go index 9d3a911..601b36f 100644 --- a/internal/howmuch/adapter/repo/sqlc/querier.go +++ b/internal/howmuch/adapter/repo/sqlc/querier.go @@ -19,27 +19,6 @@ type Querier interface { InsertExpense(ctx context.Context, arg InsertExpenseParams) (Expense, error) InsertParticipation(ctx context.Context, arg InsertParticipationParams) (Participation, error) InsertTransaction(ctx context.Context, arg InsertTransactionParams) error - // MIT License - // - // Copyright (c) 2024 vinchent - // - // Permission is hereby granted, free of charge, to any person obtaining a copy - // of this software and associated documentation files (the "Software"), to deal - // in the Software without restriction, including without limitation the rights - // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - // copies of the Software, and to permit persons to whom the Software is - // furnished to do so, subject to the following conditions: - // - // The above copyright notice and this permission notice shall be included in all - // copies or substantial portions of the Software. - // - // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - // SOFTWARE. InsertUser(ctx context.Context, arg InsertUserParams) (User, error) ListEventsByUserID(ctx context.Context, userID int32) ([]ListEventsByUserIDRow, error) ListExpensesByEventID(ctx context.Context, id int32) ([]Expense, error) diff --git a/internal/howmuch/adapter/repo/sqlc/user.sql b/internal/howmuch/adapter/repo/sqlc/user.sql index 3da20fb..0fb3629 100644 --- a/internal/howmuch/adapter/repo/sqlc/user.sql +++ b/internal/howmuch/adapter/repo/sqlc/user.sql @@ -1,25 +1,3 @@ --- MIT License --- --- Copyright (c) 2024 vinchent --- --- Permission is hereby granted, free of charge, to any person obtaining a copy --- of this software and associated documentation files (the "Software"), to deal --- in the Software without restriction, including without limitation the rights --- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell --- copies of the Software, and to permit persons to whom the Software is --- furnished to do so, subject to the following conditions: --- --- The above copyright notice and this permission notice shall be included in all --- copies or substantial portions of the Software. --- --- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR --- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, --- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE --- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER --- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, --- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE --- SOFTWARE. - -- name: InsertUser :one INSERT INTO "user" ( email, first_name, last_name, password, created_at, updated_at diff --git a/internal/howmuch/adapter/repo/sqlc/user.sql.go b/internal/howmuch/adapter/repo/sqlc/user.sql.go index 6f9829f..fa19a61 100644 --- a/internal/howmuch/adapter/repo/sqlc/user.sql.go +++ b/internal/howmuch/adapter/repo/sqlc/user.sql.go @@ -53,7 +53,6 @@ func (q *Queries) GetUserByID(ctx context.Context, id int32) (User, error) { } const insertUser = `-- name: InsertUser :one - INSERT INTO "user" ( email, first_name, last_name, password, created_at, updated_at ) VALUES ( $1, $2, $3, $4, $5, $6 ) @@ -69,27 +68,6 @@ type InsertUserParams struct { UpdatedAt time.Time } -// MIT License -// -// Copyright (c) 2024 vinchent -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. func (q *Queries) InsertUser(ctx context.Context, arg InsertUserParams) (User, error) { row := q.db.QueryRowContext(ctx, insertUser, arg.Email, diff --git a/internal/howmuch/adapter/repo/user.go b/internal/howmuch/adapter/repo/user.go index 0c3872f..3528933 100644 --- a/internal/howmuch/adapter/repo/user.go +++ b/internal/howmuch/adapter/repo/user.go @@ -31,18 +31,17 @@ import ( "git.vinchent.xyz/vinchent/howmuch/internal/howmuch/adapter/repo/sqlc" "git.vinchent.xyz/vinchent/howmuch/internal/howmuch/model" "git.vinchent.xyz/vinchent/howmuch/internal/howmuch/usecase/repo" - "github.com/jackc/pgx/v5" ) type userRepository struct { - db *sql.DB + querier sqlc.Querier } const insertTimeout = 1 * time.Second func NewUserRepository(db *sql.DB) repo.UserRepository { return &userRepository{ - db: db, + querier: sqlc.New(db), } } @@ -66,7 +65,7 @@ func (ur *userRepository) Create( tx, ok := transaction.(*sql.Tx) if !ok { - return nil, errors.New("transaction is not a pgx.Tx") + return nil, errors.New("transaction is not a *sql.Tx") } queries := sqlc.New(tx) @@ -89,9 +88,8 @@ func (ur *userRepository) Create( // GetByEmail if not found, return nil for user but not error. func (ur *userRepository) GetByEmail(ctx context.Context, email string) (*model.UserEntity, error) { - queries := sqlc.New(ur.db) - userDB, err := queries.GetUserByEmail(ctx, email) - if errors.Is(err, pgx.ErrNoRows) { + userDB, err := ur.querier.GetUserByEmail(ctx, email) + if errors.Is(err, sql.ErrNoRows) { // No query error, but user not found return nil, nil } else if err != nil { @@ -110,9 +108,8 @@ func (ur *userRepository) GetByEmail(ctx context.Context, email string) (*model. } func (ur *userRepository) GetByID(ctx context.Context, id int) (*model.UserEntity, error) { - queries := sqlc.New(ur.db) - userDB, err := queries.GetUserByID(ctx, int32(id)) - if errors.Is(err, pgx.ErrNoRows) { + userDB, err := ur.querier.GetUserByID(ctx, int32(id)) + if errors.Is(err, sql.ErrNoRows) { // No query error, but user not found return nil, nil } else if err != nil { diff --git a/internal/howmuch/usecase/repo/db.go b/internal/howmuch/usecase/repo/db.go index 42d9a89..5c82cd0 100644 --- a/internal/howmuch/usecase/repo/db.go +++ b/internal/howmuch/usecase/repo/db.go @@ -22,7 +22,9 @@ package repo -import "context" +import ( + "context" +) type DBRepository interface { Transaction( diff --git a/internal/howmuch/usecase/repo/user.go b/internal/howmuch/usecase/repo/user.go index d6b8742..ff3e3e8 100644 --- a/internal/howmuch/usecase/repo/user.go +++ b/internal/howmuch/usecase/repo/user.go @@ -29,7 +29,11 @@ import ( ) type UserRepository interface { - Create(ctx context.Context, transaction interface{}, u *model.UserEntity) (*model.UserEntity, error) + Create( + ctx context.Context, + transaction interface{}, + u *model.UserEntity, + ) (*model.UserEntity, error) GetByEmail(ctx context.Context, email string) (*model.UserEntity, error) GetByID(ctx context.Context, id int) (*model.UserEntity, error) } diff --git a/internal/howmuch/usecase/usecase/repomock/testdbrepo.go b/internal/howmuch/usecase/usecase/repomock/testdbrepo.go index b24397b..56b341b 100644 --- a/internal/howmuch/usecase/usecase/repomock/testdbrepo.go +++ b/internal/howmuch/usecase/usecase/repomock/testdbrepo.go @@ -22,7 +22,9 @@ package repomock -import "context" +import ( + "context" +) type TestDBRepository struct{}