From 24c2ecfa4be4eab96610d34d25ca79f86821c935 Mon Sep 17 00:00:00 2001 From: David Stotijn Date: Sat, 4 Jan 2025 00:39:40 +0100 Subject: [PATCH] Remove database mocks, replace `Service` interface indirection --- go.mod | 2 +- pkg/api/resolvers.go | 8 +- pkg/proj/proj.go | 54 ++-- pkg/reqlog/repo_mock_test.go | 291 ------------------- pkg/reqlog/reqlog.go | 44 +-- pkg/reqlog/reqlog_test.go | 65 ++--- pkg/sender/repo_mock_test.go | 292 ------------------- pkg/sender/reqlog_mock_test.go | 498 --------------------------------- pkg/sender/sender.go | 42 +-- pkg/sender/sender_test.go | 130 ++++----- tools.go | 1 - 11 files changed, 133 insertions(+), 1294 deletions(-) delete mode 100644 pkg/reqlog/repo_mock_test.go delete mode 100644 pkg/sender/repo_mock_test.go delete mode 100644 pkg/sender/reqlog_mock_test.go diff --git a/go.mod b/go.mod index b2b6795..79af44c 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,6 @@ require ( github.com/dgraph-io/badger/v3 v3.2103.2 github.com/google/go-cmp v0.5.6 github.com/gorilla/mux v1.7.4 - github.com/matryer/moq v0.2.5 github.com/mitchellh/go-homedir v1.1.0 github.com/oklog/ulid v1.3.1 github.com/peterbourgon/ff/v3 v3.1.2 @@ -40,6 +39,7 @@ require ( github.com/josharian/intern v1.0.0 // indirect github.com/klauspost/compress v1.12.3 // indirect github.com/mailru/easyjson v0.7.7 // indirect + github.com/matryer/moq v0.2.5 // indirect github.com/mitchellh/mapstructure v1.1.2 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/russross/blackfriday/v2 v2.0.1 // indirect diff --git a/pkg/api/resolvers.go b/pkg/api/resolvers.go index f0421cd..1727125 100644 --- a/pkg/api/resolvers.go +++ b/pkg/api/resolvers.go @@ -40,10 +40,10 @@ var revHTTPProtocolMap = map[HTTPProtocol]string{ } type Resolver struct { - ProjectService proj.Service - RequestLogService reqlog.Service + ProjectService *proj.Service + RequestLogService *reqlog.Service InterceptService *intercept.Service - SenderService sender.Service + SenderService *sender.Service } type ( @@ -865,7 +865,7 @@ func parseInterceptItem(item intercept.Item) (req HTTPRequest, err error) { return req, nil } -func parseProject(projSvc proj.Service, p proj.Project) Project { +func parseProject(projSvc *proj.Service, p proj.Project) Project { project := Project{ ID: p.ID, Name: p.Name, diff --git a/pkg/proj/proj.go b/pkg/proj/proj.go index 66654ad..f3bfde0 100644 --- a/pkg/proj/proj.go +++ b/pkg/proj/proj.go @@ -21,27 +21,11 @@ import ( //nolint:gosec var ulidEntropy = rand.New(rand.NewSource(time.Now().UnixNano())) -// Service is used for managing projects. -type Service interface { - CreateProject(ctx context.Context, name string) (Project, error) - OpenProject(ctx context.Context, projectID ulid.ULID) (Project, error) - CloseProject() error - DeleteProject(ctx context.Context, projectID ulid.ULID) error - ActiveProject(ctx context.Context) (Project, error) - IsProjectActive(projectID ulid.ULID) bool - Projects(ctx context.Context) ([]Project, error) - Scope() *scope.Scope - SetScopeRules(ctx context.Context, rules []scope.Rule) error - SetRequestLogFindFilter(ctx context.Context, filter reqlog.FindRequestsFilter) error - SetSenderRequestFindFilter(ctx context.Context, filter sender.FindRequestsFilter) error - UpdateInterceptSettings(ctx context.Context, settings intercept.Settings) error -} - -type service struct { +type Service struct { repo Repository interceptSvc *intercept.Service - reqLogSvc reqlog.Service - senderSvc sender.Service + reqLogSvc *reqlog.Service + senderSvc *sender.Service scope *scope.Scope activeProjectID ulid.ULID mu sync.RWMutex @@ -87,14 +71,14 @@ var nameRegexp = regexp.MustCompile(`^[\w\d\s]+$`) type Config struct { Repository Repository InterceptService *intercept.Service - ReqLogService reqlog.Service - SenderService sender.Service + ReqLogService *reqlog.Service + SenderService *sender.Service Scope *scope.Scope } // NewService returns a new Service. -func NewService(cfg Config) (Service, error) { - return &service{ +func NewService(cfg Config) (*Service, error) { + return &Service{ repo: cfg.Repository, interceptSvc: cfg.InterceptService, reqLogSvc: cfg.ReqLogService, @@ -103,7 +87,7 @@ func NewService(cfg Config) (Service, error) { }, nil } -func (svc *service) CreateProject(ctx context.Context, name string) (Project, error) { +func (svc *Service) CreateProject(ctx context.Context, name string) (Project, error) { if !nameRegexp.MatchString(name) { return Project{}, ErrInvalidName } @@ -122,7 +106,7 @@ func (svc *service) CreateProject(ctx context.Context, name string) (Project, er } // CloseProject closes the currently open project (if there is one). -func (svc *service) CloseProject() error { +func (svc *Service) CloseProject() error { svc.mu.Lock() defer svc.mu.Unlock() @@ -148,7 +132,7 @@ func (svc *service) CloseProject() error { } // DeleteProject removes a project from the repository. -func (svc *service) DeleteProject(ctx context.Context, projectID ulid.ULID) error { +func (svc *Service) DeleteProject(ctx context.Context, projectID ulid.ULID) error { if svc.activeProjectID.Compare(projectID) == 0 { return fmt.Errorf("proj: project (%v) is active", projectID.String()) } @@ -161,7 +145,7 @@ func (svc *service) DeleteProject(ctx context.Context, projectID ulid.ULID) erro } // OpenProject sets a project as the currently active project. -func (svc *service) OpenProject(ctx context.Context, projectID ulid.ULID) (Project, error) { +func (svc *Service) OpenProject(ctx context.Context, projectID ulid.ULID) (Project, error) { svc.mu.Lock() defer svc.mu.Unlock() @@ -203,7 +187,7 @@ func (svc *service) OpenProject(ctx context.Context, projectID ulid.ULID) (Proje return project, nil } -func (svc *service) ActiveProject(ctx context.Context) (Project, error) { +func (svc *Service) ActiveProject(ctx context.Context) (Project, error) { activeProjectID := svc.activeProjectID if activeProjectID.Compare(ulid.ULID{}) == 0 { return Project{}, ErrNoProject @@ -219,7 +203,7 @@ func (svc *service) ActiveProject(ctx context.Context) (Project, error) { return project, nil } -func (svc *service) Projects(ctx context.Context) ([]Project, error) { +func (svc *Service) Projects(ctx context.Context) ([]Project, error) { projects, err := svc.repo.Projects(ctx) if err != nil { return nil, fmt.Errorf("proj: could not get projects: %w", err) @@ -228,11 +212,11 @@ func (svc *service) Projects(ctx context.Context) ([]Project, error) { return projects, nil } -func (svc *service) Scope() *scope.Scope { +func (svc *Service) Scope() *scope.Scope { return svc.scope } -func (svc *service) SetScopeRules(ctx context.Context, rules []scope.Rule) error { +func (svc *Service) SetScopeRules(ctx context.Context, rules []scope.Rule) error { project, err := svc.ActiveProject(ctx) if err != nil { return err @@ -250,7 +234,7 @@ func (svc *service) SetScopeRules(ctx context.Context, rules []scope.Rule) error return nil } -func (svc *service) SetRequestLogFindFilter(ctx context.Context, filter reqlog.FindRequestsFilter) error { +func (svc *Service) SetRequestLogFindFilter(ctx context.Context, filter reqlog.FindRequestsFilter) error { project, err := svc.ActiveProject(ctx) if err != nil { return err @@ -271,7 +255,7 @@ func (svc *service) SetRequestLogFindFilter(ctx context.Context, filter reqlog.F return nil } -func (svc *service) SetSenderRequestFindFilter(ctx context.Context, filter sender.FindRequestsFilter) error { +func (svc *Service) SetSenderRequestFindFilter(ctx context.Context, filter sender.FindRequestsFilter) error { project, err := svc.ActiveProject(ctx) if err != nil { return err @@ -292,11 +276,11 @@ func (svc *service) SetSenderRequestFindFilter(ctx context.Context, filter sende return nil } -func (svc *service) IsProjectActive(projectID ulid.ULID) bool { +func (svc *Service) IsProjectActive(projectID ulid.ULID) bool { return projectID.Compare(svc.activeProjectID) == 0 } -func (svc *service) UpdateInterceptSettings(ctx context.Context, settings intercept.Settings) error { +func (svc *Service) UpdateInterceptSettings(ctx context.Context, settings intercept.Settings) error { project, err := svc.ActiveProject(ctx) if err != nil { return err diff --git a/pkg/reqlog/repo_mock_test.go b/pkg/reqlog/repo_mock_test.go deleted file mode 100644 index 295cba0..0000000 --- a/pkg/reqlog/repo_mock_test.go +++ /dev/null @@ -1,291 +0,0 @@ -// Code generated by moq; DO NOT EDIT. -// github.com/matryer/moq - -package reqlog_test - -import ( - "context" - "github.com/dstotijn/hetty/pkg/reqlog" - "github.com/dstotijn/hetty/pkg/scope" - "github.com/oklog/ulid" - "sync" -) - -// Ensure, that RepoMock does implement reqlog.Repository. -// If this is not the case, regenerate this file with moq. -var _ reqlog.Repository = &RepoMock{} - -// RepoMock is a mock implementation of reqlog.Repository. -// -// func TestSomethingThatUsesRepository(t *testing.T) { -// -// // make and configure a mocked reqlog.Repository -// mockedRepository := &RepoMock{ -// ClearRequestLogsFunc: func(ctx context.Context, projectID ulid.ULID) error { -// panic("mock out the ClearRequestLogs method") -// }, -// FindRequestLogByIDFunc: func(ctx context.Context, id ulid.ULID) (reqlog.RequestLog, error) { -// panic("mock out the FindRequestLogByID method") -// }, -// FindRequestLogsFunc: func(ctx context.Context, filter reqlog.FindRequestsFilter, scopeMoqParam *scope.Scope) ([]reqlog.RequestLog, error) { -// panic("mock out the FindRequestLogs method") -// }, -// StoreRequestLogFunc: func(ctx context.Context, reqLog reqlog.RequestLog) error { -// panic("mock out the StoreRequestLog method") -// }, -// StoreResponseLogFunc: func(ctx context.Context, reqLogID ulid.ULID, resLog reqlog.ResponseLog) error { -// panic("mock out the StoreResponseLog method") -// }, -// } -// -// // use mockedRepository in code that requires reqlog.Repository -// // and then make assertions. -// -// } -type RepoMock struct { - // ClearRequestLogsFunc mocks the ClearRequestLogs method. - ClearRequestLogsFunc func(ctx context.Context, projectID ulid.ULID) error - - // FindRequestLogByIDFunc mocks the FindRequestLogByID method. - FindRequestLogByIDFunc func(ctx context.Context, id ulid.ULID) (reqlog.RequestLog, error) - - // FindRequestLogsFunc mocks the FindRequestLogs method. - FindRequestLogsFunc func(ctx context.Context, filter reqlog.FindRequestsFilter, scopeMoqParam *scope.Scope) ([]reqlog.RequestLog, error) - - // StoreRequestLogFunc mocks the StoreRequestLog method. - StoreRequestLogFunc func(ctx context.Context, reqLog reqlog.RequestLog) error - - // StoreResponseLogFunc mocks the StoreResponseLog method. - StoreResponseLogFunc func(ctx context.Context, reqLogID ulid.ULID, resLog reqlog.ResponseLog) error - - // calls tracks calls to the methods. - calls struct { - // ClearRequestLogs holds details about calls to the ClearRequestLogs method. - ClearRequestLogs []struct { - // Ctx is the ctx argument value. - Ctx context.Context - // ProjectID is the projectID argument value. - ProjectID ulid.ULID - } - // FindRequestLogByID holds details about calls to the FindRequestLogByID method. - FindRequestLogByID []struct { - // Ctx is the ctx argument value. - Ctx context.Context - // ID is the id argument value. - ID ulid.ULID - } - // FindRequestLogs holds details about calls to the FindRequestLogs method. - FindRequestLogs []struct { - // Ctx is the ctx argument value. - Ctx context.Context - // Filter is the filter argument value. - Filter reqlog.FindRequestsFilter - // ScopeMoqParam is the scopeMoqParam argument value. - ScopeMoqParam *scope.Scope - } - // StoreRequestLog holds details about calls to the StoreRequestLog method. - StoreRequestLog []struct { - // Ctx is the ctx argument value. - Ctx context.Context - // ReqLog is the reqLog argument value. - ReqLog reqlog.RequestLog - } - // StoreResponseLog holds details about calls to the StoreResponseLog method. - StoreResponseLog []struct { - // Ctx is the ctx argument value. - Ctx context.Context - // ReqLogID is the reqLogID argument value. - ReqLogID ulid.ULID - // ResLog is the resLog argument value. - ResLog reqlog.ResponseLog - } - } - lockClearRequestLogs sync.RWMutex - lockFindRequestLogByID sync.RWMutex - lockFindRequestLogs sync.RWMutex - lockStoreRequestLog sync.RWMutex - lockStoreResponseLog sync.RWMutex -} - -// ClearRequestLogs calls ClearRequestLogsFunc. -func (mock *RepoMock) ClearRequestLogs(ctx context.Context, projectID ulid.ULID) error { - if mock.ClearRequestLogsFunc == nil { - panic("RepoMock.ClearRequestLogsFunc: method is nil but Repository.ClearRequestLogs was just called") - } - callInfo := struct { - Ctx context.Context - ProjectID ulid.ULID - }{ - Ctx: ctx, - ProjectID: projectID, - } - mock.lockClearRequestLogs.Lock() - mock.calls.ClearRequestLogs = append(mock.calls.ClearRequestLogs, callInfo) - mock.lockClearRequestLogs.Unlock() - return mock.ClearRequestLogsFunc(ctx, projectID) -} - -// ClearRequestLogsCalls gets all the calls that were made to ClearRequestLogs. -// Check the length with: -// len(mockedRepository.ClearRequestLogsCalls()) -func (mock *RepoMock) ClearRequestLogsCalls() []struct { - Ctx context.Context - ProjectID ulid.ULID -} { - var calls []struct { - Ctx context.Context - ProjectID ulid.ULID - } - mock.lockClearRequestLogs.RLock() - calls = mock.calls.ClearRequestLogs - mock.lockClearRequestLogs.RUnlock() - return calls -} - -// FindRequestLogByID calls FindRequestLogByIDFunc. -func (mock *RepoMock) FindRequestLogByID(ctx context.Context, id ulid.ULID) (reqlog.RequestLog, error) { - if mock.FindRequestLogByIDFunc == nil { - panic("RepoMock.FindRequestLogByIDFunc: method is nil but Repository.FindRequestLogByID was just called") - } - callInfo := struct { - Ctx context.Context - ID ulid.ULID - }{ - Ctx: ctx, - ID: id, - } - mock.lockFindRequestLogByID.Lock() - mock.calls.FindRequestLogByID = append(mock.calls.FindRequestLogByID, callInfo) - mock.lockFindRequestLogByID.Unlock() - return mock.FindRequestLogByIDFunc(ctx, id) -} - -// FindRequestLogByIDCalls gets all the calls that were made to FindRequestLogByID. -// Check the length with: -// len(mockedRepository.FindRequestLogByIDCalls()) -func (mock *RepoMock) FindRequestLogByIDCalls() []struct { - Ctx context.Context - ID ulid.ULID -} { - var calls []struct { - Ctx context.Context - ID ulid.ULID - } - mock.lockFindRequestLogByID.RLock() - calls = mock.calls.FindRequestLogByID - mock.lockFindRequestLogByID.RUnlock() - return calls -} - -// FindRequestLogs calls FindRequestLogsFunc. -func (mock *RepoMock) FindRequestLogs(ctx context.Context, filter reqlog.FindRequestsFilter, scopeMoqParam *scope.Scope) ([]reqlog.RequestLog, error) { - if mock.FindRequestLogsFunc == nil { - panic("RepoMock.FindRequestLogsFunc: method is nil but Repository.FindRequestLogs was just called") - } - callInfo := struct { - Ctx context.Context - Filter reqlog.FindRequestsFilter - ScopeMoqParam *scope.Scope - }{ - Ctx: ctx, - Filter: filter, - ScopeMoqParam: scopeMoqParam, - } - mock.lockFindRequestLogs.Lock() - mock.calls.FindRequestLogs = append(mock.calls.FindRequestLogs, callInfo) - mock.lockFindRequestLogs.Unlock() - return mock.FindRequestLogsFunc(ctx, filter, scopeMoqParam) -} - -// FindRequestLogsCalls gets all the calls that were made to FindRequestLogs. -// Check the length with: -// len(mockedRepository.FindRequestLogsCalls()) -func (mock *RepoMock) FindRequestLogsCalls() []struct { - Ctx context.Context - Filter reqlog.FindRequestsFilter - ScopeMoqParam *scope.Scope -} { - var calls []struct { - Ctx context.Context - Filter reqlog.FindRequestsFilter - ScopeMoqParam *scope.Scope - } - mock.lockFindRequestLogs.RLock() - calls = mock.calls.FindRequestLogs - mock.lockFindRequestLogs.RUnlock() - return calls -} - -// StoreRequestLog calls StoreRequestLogFunc. -func (mock *RepoMock) StoreRequestLog(ctx context.Context, reqLog reqlog.RequestLog) error { - if mock.StoreRequestLogFunc == nil { - panic("RepoMock.StoreRequestLogFunc: method is nil but Repository.StoreRequestLog was just called") - } - callInfo := struct { - Ctx context.Context - ReqLog reqlog.RequestLog - }{ - Ctx: ctx, - ReqLog: reqLog, - } - mock.lockStoreRequestLog.Lock() - mock.calls.StoreRequestLog = append(mock.calls.StoreRequestLog, callInfo) - mock.lockStoreRequestLog.Unlock() - return mock.StoreRequestLogFunc(ctx, reqLog) -} - -// StoreRequestLogCalls gets all the calls that were made to StoreRequestLog. -// Check the length with: -// len(mockedRepository.StoreRequestLogCalls()) -func (mock *RepoMock) StoreRequestLogCalls() []struct { - Ctx context.Context - ReqLog reqlog.RequestLog -} { - var calls []struct { - Ctx context.Context - ReqLog reqlog.RequestLog - } - mock.lockStoreRequestLog.RLock() - calls = mock.calls.StoreRequestLog - mock.lockStoreRequestLog.RUnlock() - return calls -} - -// StoreResponseLog calls StoreResponseLogFunc. -func (mock *RepoMock) StoreResponseLog(ctx context.Context, reqLogID ulid.ULID, resLog reqlog.ResponseLog) error { - if mock.StoreResponseLogFunc == nil { - panic("RepoMock.StoreResponseLogFunc: method is nil but Repository.StoreResponseLog was just called") - } - callInfo := struct { - Ctx context.Context - ReqLogID ulid.ULID - ResLog reqlog.ResponseLog - }{ - Ctx: ctx, - ReqLogID: reqLogID, - ResLog: resLog, - } - mock.lockStoreResponseLog.Lock() - mock.calls.StoreResponseLog = append(mock.calls.StoreResponseLog, callInfo) - mock.lockStoreResponseLog.Unlock() - return mock.StoreResponseLogFunc(ctx, reqLogID, resLog) -} - -// StoreResponseLogCalls gets all the calls that were made to StoreResponseLog. -// Check the length with: -// len(mockedRepository.StoreResponseLogCalls()) -func (mock *RepoMock) StoreResponseLogCalls() []struct { - Ctx context.Context - ReqLogID ulid.ULID - ResLog reqlog.ResponseLog -} { - var calls []struct { - Ctx context.Context - ReqLogID ulid.ULID - ResLog reqlog.ResponseLog - } - mock.lockStoreResponseLog.RLock() - calls = mock.calls.StoreResponseLog - mock.lockStoreResponseLog.RUnlock() - return calls -} diff --git a/pkg/reqlog/reqlog.go b/pkg/reqlog/reqlog.go index 53d6047..a489be6 100644 --- a/pkg/reqlog/reqlog.go +++ b/pkg/reqlog/reqlog.go @@ -51,21 +51,7 @@ type ResponseLog struct { Body []byte } -type Service interface { - FindRequests(ctx context.Context) ([]RequestLog, error) - FindRequestLogByID(ctx context.Context, id ulid.ULID) (RequestLog, error) - ClearRequests(ctx context.Context, projectID ulid.ULID) error - RequestModifier(next proxy.RequestModifyFunc) proxy.RequestModifyFunc - ResponseModifier(next proxy.ResponseModifyFunc) proxy.ResponseModifyFunc - SetActiveProjectID(id ulid.ULID) - ActiveProjectID() ulid.ULID - SetBypassOutOfScopeRequests(bool) - BypassOutOfScopeRequests() bool - SetFindReqsFilter(filter FindRequestsFilter) - FindReqsFilter() FindRequestsFilter -} - -type service struct { +type Service struct { bypassOutOfScopeRequests bool findReqsFilter FindRequestsFilter activeProjectID ulid.ULID @@ -86,8 +72,8 @@ type Config struct { Logger log.Logger } -func NewService(cfg Config) Service { - s := &service{ +func NewService(cfg Config) *Service { + s := &Service{ repo: cfg.Repository, scope: cfg.Scope, logger: cfg.Logger, @@ -100,19 +86,19 @@ func NewService(cfg Config) Service { return s } -func (svc *service) FindRequests(ctx context.Context) ([]RequestLog, error) { +func (svc *Service) FindRequests(ctx context.Context) ([]RequestLog, error) { return svc.repo.FindRequestLogs(ctx, svc.findReqsFilter, svc.scope) } -func (svc *service) FindRequestLogByID(ctx context.Context, id ulid.ULID) (RequestLog, error) { +func (svc *Service) FindRequestLogByID(ctx context.Context, id ulid.ULID) (RequestLog, error) { return svc.repo.FindRequestLogByID(ctx, id) } -func (svc *service) ClearRequests(ctx context.Context, projectID ulid.ULID) error { +func (svc *Service) ClearRequests(ctx context.Context, projectID ulid.ULID) error { return svc.repo.ClearRequestLogs(ctx, projectID) } -func (svc *service) storeResponse(ctx context.Context, reqLogID ulid.ULID, res *http.Response) error { +func (svc *Service) storeResponse(ctx context.Context, reqLogID ulid.ULID, res *http.Response) error { resLog, err := ParseHTTPResponse(res) if err != nil { return err @@ -121,7 +107,7 @@ func (svc *service) storeResponse(ctx context.Context, reqLogID ulid.ULID, res * return svc.repo.StoreResponseLog(ctx, reqLogID, resLog) } -func (svc *service) RequestModifier(next proxy.RequestModifyFunc) proxy.RequestModifyFunc { +func (svc *Service) RequestModifier(next proxy.RequestModifyFunc) proxy.RequestModifyFunc { return func(req *http.Request) { next(req) @@ -199,7 +185,7 @@ func (svc *service) RequestModifier(next proxy.RequestModifyFunc) proxy.RequestM } } -func (svc *service) ResponseModifier(next proxy.ResponseModifyFunc) proxy.ResponseModifyFunc { +func (svc *Service) ResponseModifier(next proxy.ResponseModifyFunc) proxy.ResponseModifyFunc { return func(res *http.Response) error { if err := next(res); err != nil { return err @@ -241,27 +227,27 @@ func (svc *service) ResponseModifier(next proxy.ResponseModifyFunc) proxy.Respon } } -func (svc *service) SetActiveProjectID(id ulid.ULID) { +func (svc *Service) SetActiveProjectID(id ulid.ULID) { svc.activeProjectID = id } -func (svc *service) ActiveProjectID() ulid.ULID { +func (svc *Service) ActiveProjectID() ulid.ULID { return svc.activeProjectID } -func (svc *service) SetFindReqsFilter(filter FindRequestsFilter) { +func (svc *Service) SetFindReqsFilter(filter FindRequestsFilter) { svc.findReqsFilter = filter } -func (svc *service) FindReqsFilter() FindRequestsFilter { +func (svc *Service) FindReqsFilter() FindRequestsFilter { return svc.findReqsFilter } -func (svc *service) SetBypassOutOfScopeRequests(bypass bool) { +func (svc *Service) SetBypassOutOfScopeRequests(bypass bool) { svc.bypassOutOfScopeRequests = bypass } -func (svc *service) BypassOutOfScopeRequests() bool { +func (svc *Service) BypassOutOfScopeRequests() bool { return svc.bypassOutOfScopeRequests } diff --git a/pkg/reqlog/reqlog_test.go b/pkg/reqlog/reqlog_test.go index 25eebeb..a90706d 100644 --- a/pkg/reqlog/reqlog_test.go +++ b/pkg/reqlog/reqlog_test.go @@ -1,7 +1,5 @@ package reqlog_test -//go:generate go run github.com/matryer/moq -out repo_mock_test.go -pkg reqlog_test . Repository:RepoMock - import ( "context" "io" @@ -15,6 +13,8 @@ import ( "github.com/google/go-cmp/cmp" "github.com/oklog/ulid" + badgerdb "github.com/dgraph-io/badger/v3" + "github.com/dstotijn/hetty/pkg/db/badger" "github.com/dstotijn/hetty/pkg/proxy" "github.com/dstotijn/hetty/pkg/reqlog" "github.com/dstotijn/hetty/pkg/scope" @@ -25,13 +25,13 @@ var ulidEntropy = rand.New(rand.NewSource(time.Now().UnixNano())) //nolint:paralleltest func TestRequestModifier(t *testing.T) { - repoMock := &RepoMock{ - StoreRequestLogFunc: func(_ context.Context, _ reqlog.RequestLog) error { - return nil - }, + db, err := badger.OpenDatabase(badgerdb.DefaultOptions("").WithInMemory(true)) + if err != nil { + t.Fatalf("failed to open database: %v", err) } + svc := reqlog.NewService(reqlog.Config{ - Repository: repoMock, + Repository: db, Scope: &scope.Scope{}, }) svc.SetActiveProjectID(ulid.MustNew(ulid.Timestamp(time.Now()), ulidEntropy)) @@ -47,13 +47,8 @@ func TestRequestModifier(t *testing.T) { reqModFn(req) t.Run("request log was stored in repository", func(t *testing.T) { - gotCount := len(repoMock.StoreRequestLogCalls()) - if expCount := 1; expCount != gotCount { - t.Fatalf("incorrect `proj.Service.AddRequestLog` calls (expected: %v, got: %v)", expCount, gotCount) - } - exp := reqlog.RequestLog{ - ID: ulid.ULID{}, // Empty value + ID: reqID, ProjectID: svc.ActiveProjectID(), Method: req.Method, URL: req.URL, @@ -61,8 +56,11 @@ func TestRequestModifier(t *testing.T) { Header: req.Header, Body: []byte("modified body"), } - got := repoMock.StoreRequestLogCalls()[0].ReqLog - got.ID = ulid.ULID{} // Override to empty value so we can compare against expected value. + + got, err := svc.FindRequestLogByID(context.Background(), reqID) + if err != nil { + t.Fatalf("failed to find request by id: %v", err) + } if diff := cmp.Diff(exp, got); diff != "" { t.Fatalf("request log not equal (-exp, +got):\n%v", diff) @@ -72,13 +70,13 @@ func TestRequestModifier(t *testing.T) { //nolint:paralleltest func TestResponseModifier(t *testing.T) { - repoMock := &RepoMock{ - StoreResponseLogFunc: func(_ context.Context, _ ulid.ULID, _ reqlog.ResponseLog) error { - return nil - }, + db, err := badger.OpenDatabase(badgerdb.DefaultOptions("").WithInMemory(true)) + if err != nil { + t.Fatalf("failed to open database: %v", err) } + svc := reqlog.NewService(reqlog.Config{ - Repository: repoMock, + Repository: db, }) svc.SetActiveProjectID(ulid.MustNew(ulid.Timestamp(time.Now()), ulidEntropy)) @@ -92,6 +90,13 @@ func TestResponseModifier(t *testing.T) { reqLogID := ulid.MustNew(ulid.Timestamp(time.Now()), ulidEntropy) req = req.WithContext(context.WithValue(req.Context(), reqlog.ReqLogIDKey, reqLogID)) + err = db.StoreRequestLog(context.Background(), reqlog.RequestLog{ + ID: reqLogID, + }) + if err != nil { + t.Fatalf("failed to store request log: %v", err) + } + res := &http.Response{ Request: req, Body: io.NopCloser(strings.NewReader("bar")), @@ -104,23 +109,15 @@ func TestResponseModifier(t *testing.T) { t.Run("request log was stored in repository", func(t *testing.T) { // Dirty (but simple) wait for other goroutine to finish calling repository. time.Sleep(10 * time.Millisecond) - got := len(repoMock.StoreResponseLogCalls()) - if exp := 1; exp != got { - t.Fatalf("incorrect `proj.Service.AddResponseLog` calls (expected: %v, got: %v)", exp, got) + + got, err := svc.FindRequestLogByID(context.Background(), reqLogID) + if err != nil { + t.Fatalf("failed to find request by id: %v", err) } t.Run("ran next modifier first, before calling repository", func(t *testing.T) { - got := repoMock.StoreResponseLogCalls()[0].ResLog.Body - if exp := "modified body"; exp != string(got) { - t.Fatalf("incorrect `ResponseLog.Body` value (expected: %v, got: %v)", exp, string(got)) - } - }) - - t.Run("called repository with request log id", func(t *testing.T) { - got := repoMock.StoreResponseLogCalls()[0].ReqLogID - if exp := reqLogID; exp.Compare(got) != 0 { - t.Fatalf("incorrect `reqLogID` argument for `Repository.AddResponseLogCalls` (expected: %v, got: %v)", - exp.String(), got.String()) + if exp := "modified body"; exp != string(got.Response.Body) { + t.Fatalf("incorrect `ResponseLog.Body` value (expected: %v, got: %v)", exp, string(got.Response.Body)) } }) }) diff --git a/pkg/sender/repo_mock_test.go b/pkg/sender/repo_mock_test.go deleted file mode 100644 index 96181fc..0000000 --- a/pkg/sender/repo_mock_test.go +++ /dev/null @@ -1,292 +0,0 @@ -// Code generated by moq; DO NOT EDIT. -// github.com/matryer/moq - -package sender_test - -import ( - "context" - "github.com/dstotijn/hetty/pkg/reqlog" - "github.com/dstotijn/hetty/pkg/scope" - "github.com/dstotijn/hetty/pkg/sender" - "github.com/oklog/ulid" - "sync" -) - -// Ensure, that RepoMock does implement sender.Repository. -// If this is not the case, regenerate this file with moq. -var _ sender.Repository = &RepoMock{} - -// RepoMock is a mock implementation of sender.Repository. -// -// func TestSomethingThatUsesRepository(t *testing.T) { -// -// // make and configure a mocked sender.Repository -// mockedRepository := &RepoMock{ -// DeleteSenderRequestsFunc: func(ctx context.Context, projectID ulid.ULID) error { -// panic("mock out the DeleteSenderRequests method") -// }, -// FindSenderRequestByIDFunc: func(ctx context.Context, id ulid.ULID) (sender.Request, error) { -// panic("mock out the FindSenderRequestByID method") -// }, -// FindSenderRequestsFunc: func(ctx context.Context, filter sender.FindRequestsFilter, scopeMoqParam *scope.Scope) ([]sender.Request, error) { -// panic("mock out the FindSenderRequests method") -// }, -// StoreResponseLogFunc: func(ctx context.Context, reqLogID ulid.ULID, resLog reqlog.ResponseLog) error { -// panic("mock out the StoreResponseLog method") -// }, -// StoreSenderRequestFunc: func(ctx context.Context, req sender.Request) error { -// panic("mock out the StoreSenderRequest method") -// }, -// } -// -// // use mockedRepository in code that requires sender.Repository -// // and then make assertions. -// -// } -type RepoMock struct { - // DeleteSenderRequestsFunc mocks the DeleteSenderRequests method. - DeleteSenderRequestsFunc func(ctx context.Context, projectID ulid.ULID) error - - // FindSenderRequestByIDFunc mocks the FindSenderRequestByID method. - FindSenderRequestByIDFunc func(ctx context.Context, id ulid.ULID) (sender.Request, error) - - // FindSenderRequestsFunc mocks the FindSenderRequests method. - FindSenderRequestsFunc func(ctx context.Context, filter sender.FindRequestsFilter, scopeMoqParam *scope.Scope) ([]sender.Request, error) - - // StoreResponseLogFunc mocks the StoreResponseLog method. - StoreResponseLogFunc func(ctx context.Context, reqLogID ulid.ULID, resLog reqlog.ResponseLog) error - - // StoreSenderRequestFunc mocks the StoreSenderRequest method. - StoreSenderRequestFunc func(ctx context.Context, req sender.Request) error - - // calls tracks calls to the methods. - calls struct { - // DeleteSenderRequests holds details about calls to the DeleteSenderRequests method. - DeleteSenderRequests []struct { - // Ctx is the ctx argument value. - Ctx context.Context - // ProjectID is the projectID argument value. - ProjectID ulid.ULID - } - // FindSenderRequestByID holds details about calls to the FindSenderRequestByID method. - FindSenderRequestByID []struct { - // Ctx is the ctx argument value. - Ctx context.Context - // ID is the id argument value. - ID ulid.ULID - } - // FindSenderRequests holds details about calls to the FindSenderRequests method. - FindSenderRequests []struct { - // Ctx is the ctx argument value. - Ctx context.Context - // Filter is the filter argument value. - Filter sender.FindRequestsFilter - // ScopeMoqParam is the scopeMoqParam argument value. - ScopeMoqParam *scope.Scope - } - // StoreResponseLog holds details about calls to the StoreResponseLog method. - StoreResponseLog []struct { - // Ctx is the ctx argument value. - Ctx context.Context - // ReqLogID is the reqLogID argument value. - ReqLogID ulid.ULID - // ResLog is the resLog argument value. - ResLog reqlog.ResponseLog - } - // StoreSenderRequest holds details about calls to the StoreSenderRequest method. - StoreSenderRequest []struct { - // Ctx is the ctx argument value. - Ctx context.Context - // Req is the req argument value. - Req sender.Request - } - } - lockDeleteSenderRequests sync.RWMutex - lockFindSenderRequestByID sync.RWMutex - lockFindSenderRequests sync.RWMutex - lockStoreResponseLog sync.RWMutex - lockStoreSenderRequest sync.RWMutex -} - -// DeleteSenderRequests calls DeleteSenderRequestsFunc. -func (mock *RepoMock) DeleteSenderRequests(ctx context.Context, projectID ulid.ULID) error { - if mock.DeleteSenderRequestsFunc == nil { - panic("RepoMock.DeleteSenderRequestsFunc: method is nil but Repository.DeleteSenderRequests was just called") - } - callInfo := struct { - Ctx context.Context - ProjectID ulid.ULID - }{ - Ctx: ctx, - ProjectID: projectID, - } - mock.lockDeleteSenderRequests.Lock() - mock.calls.DeleteSenderRequests = append(mock.calls.DeleteSenderRequests, callInfo) - mock.lockDeleteSenderRequests.Unlock() - return mock.DeleteSenderRequestsFunc(ctx, projectID) -} - -// DeleteSenderRequestsCalls gets all the calls that were made to DeleteSenderRequests. -// Check the length with: -// len(mockedRepository.DeleteSenderRequestsCalls()) -func (mock *RepoMock) DeleteSenderRequestsCalls() []struct { - Ctx context.Context - ProjectID ulid.ULID -} { - var calls []struct { - Ctx context.Context - ProjectID ulid.ULID - } - mock.lockDeleteSenderRequests.RLock() - calls = mock.calls.DeleteSenderRequests - mock.lockDeleteSenderRequests.RUnlock() - return calls -} - -// FindSenderRequestByID calls FindSenderRequestByIDFunc. -func (mock *RepoMock) FindSenderRequestByID(ctx context.Context, id ulid.ULID) (sender.Request, error) { - if mock.FindSenderRequestByIDFunc == nil { - panic("RepoMock.FindSenderRequestByIDFunc: method is nil but Repository.FindSenderRequestByID was just called") - } - callInfo := struct { - Ctx context.Context - ID ulid.ULID - }{ - Ctx: ctx, - ID: id, - } - mock.lockFindSenderRequestByID.Lock() - mock.calls.FindSenderRequestByID = append(mock.calls.FindSenderRequestByID, callInfo) - mock.lockFindSenderRequestByID.Unlock() - return mock.FindSenderRequestByIDFunc(ctx, id) -} - -// FindSenderRequestByIDCalls gets all the calls that were made to FindSenderRequestByID. -// Check the length with: -// len(mockedRepository.FindSenderRequestByIDCalls()) -func (mock *RepoMock) FindSenderRequestByIDCalls() []struct { - Ctx context.Context - ID ulid.ULID -} { - var calls []struct { - Ctx context.Context - ID ulid.ULID - } - mock.lockFindSenderRequestByID.RLock() - calls = mock.calls.FindSenderRequestByID - mock.lockFindSenderRequestByID.RUnlock() - return calls -} - -// FindSenderRequests calls FindSenderRequestsFunc. -func (mock *RepoMock) FindSenderRequests(ctx context.Context, filter sender.FindRequestsFilter, scopeMoqParam *scope.Scope) ([]sender.Request, error) { - if mock.FindSenderRequestsFunc == nil { - panic("RepoMock.FindSenderRequestsFunc: method is nil but Repository.FindSenderRequests was just called") - } - callInfo := struct { - Ctx context.Context - Filter sender.FindRequestsFilter - ScopeMoqParam *scope.Scope - }{ - Ctx: ctx, - Filter: filter, - ScopeMoqParam: scopeMoqParam, - } - mock.lockFindSenderRequests.Lock() - mock.calls.FindSenderRequests = append(mock.calls.FindSenderRequests, callInfo) - mock.lockFindSenderRequests.Unlock() - return mock.FindSenderRequestsFunc(ctx, filter, scopeMoqParam) -} - -// FindSenderRequestsCalls gets all the calls that were made to FindSenderRequests. -// Check the length with: -// len(mockedRepository.FindSenderRequestsCalls()) -func (mock *RepoMock) FindSenderRequestsCalls() []struct { - Ctx context.Context - Filter sender.FindRequestsFilter - ScopeMoqParam *scope.Scope -} { - var calls []struct { - Ctx context.Context - Filter sender.FindRequestsFilter - ScopeMoqParam *scope.Scope - } - mock.lockFindSenderRequests.RLock() - calls = mock.calls.FindSenderRequests - mock.lockFindSenderRequests.RUnlock() - return calls -} - -// StoreResponseLog calls StoreResponseLogFunc. -func (mock *RepoMock) StoreResponseLog(ctx context.Context, reqLogID ulid.ULID, resLog reqlog.ResponseLog) error { - if mock.StoreResponseLogFunc == nil { - panic("RepoMock.StoreResponseLogFunc: method is nil but Repository.StoreResponseLog was just called") - } - callInfo := struct { - Ctx context.Context - ReqLogID ulid.ULID - ResLog reqlog.ResponseLog - }{ - Ctx: ctx, - ReqLogID: reqLogID, - ResLog: resLog, - } - mock.lockStoreResponseLog.Lock() - mock.calls.StoreResponseLog = append(mock.calls.StoreResponseLog, callInfo) - mock.lockStoreResponseLog.Unlock() - return mock.StoreResponseLogFunc(ctx, reqLogID, resLog) -} - -// StoreResponseLogCalls gets all the calls that were made to StoreResponseLog. -// Check the length with: -// len(mockedRepository.StoreResponseLogCalls()) -func (mock *RepoMock) StoreResponseLogCalls() []struct { - Ctx context.Context - ReqLogID ulid.ULID - ResLog reqlog.ResponseLog -} { - var calls []struct { - Ctx context.Context - ReqLogID ulid.ULID - ResLog reqlog.ResponseLog - } - mock.lockStoreResponseLog.RLock() - calls = mock.calls.StoreResponseLog - mock.lockStoreResponseLog.RUnlock() - return calls -} - -// StoreSenderRequest calls StoreSenderRequestFunc. -func (mock *RepoMock) StoreSenderRequest(ctx context.Context, req sender.Request) error { - if mock.StoreSenderRequestFunc == nil { - panic("RepoMock.StoreSenderRequestFunc: method is nil but Repository.StoreSenderRequest was just called") - } - callInfo := struct { - Ctx context.Context - Req sender.Request - }{ - Ctx: ctx, - Req: req, - } - mock.lockStoreSenderRequest.Lock() - mock.calls.StoreSenderRequest = append(mock.calls.StoreSenderRequest, callInfo) - mock.lockStoreSenderRequest.Unlock() - return mock.StoreSenderRequestFunc(ctx, req) -} - -// StoreSenderRequestCalls gets all the calls that were made to StoreSenderRequest. -// Check the length with: -// len(mockedRepository.StoreSenderRequestCalls()) -func (mock *RepoMock) StoreSenderRequestCalls() []struct { - Ctx context.Context - Req sender.Request -} { - var calls []struct { - Ctx context.Context - Req sender.Request - } - mock.lockStoreSenderRequest.RLock() - calls = mock.calls.StoreSenderRequest - mock.lockStoreSenderRequest.RUnlock() - return calls -} diff --git a/pkg/sender/reqlog_mock_test.go b/pkg/sender/reqlog_mock_test.go deleted file mode 100644 index 6977de5..0000000 --- a/pkg/sender/reqlog_mock_test.go +++ /dev/null @@ -1,498 +0,0 @@ -// Code generated by moq; DO NOT EDIT. -// github.com/matryer/moq - -package sender_test - -import ( - "context" - "github.com/dstotijn/hetty/pkg/proxy" - "github.com/dstotijn/hetty/pkg/reqlog" - "github.com/oklog/ulid" - "sync" -) - -// Ensure, that ReqLogServiceMock does implement reqlog.Service. -// If this is not the case, regenerate this file with moq. -var _ reqlog.Service = &ReqLogServiceMock{} - -// ReqLogServiceMock is a mock implementation of reqlog.Service. -// -// func TestSomethingThatUsesService(t *testing.T) { -// -// // make and configure a mocked reqlog.Service -// mockedService := &ReqLogServiceMock{ -// ActiveProjectIDFunc: func() ulid.ULID { -// panic("mock out the ActiveProjectID method") -// }, -// BypassOutOfScopeRequestsFunc: func() bool { -// panic("mock out the BypassOutOfScopeRequests method") -// }, -// ClearRequestsFunc: func(ctx context.Context, projectID ulid.ULID) error { -// panic("mock out the ClearRequests method") -// }, -// FindReqsFilterFunc: func() reqlog.FindRequestsFilter { -// panic("mock out the FindReqsFilter method") -// }, -// FindRequestLogByIDFunc: func(ctx context.Context, id ulid.ULID) (reqlog.RequestLog, error) { -// panic("mock out the FindRequestLogByID method") -// }, -// FindRequestsFunc: func(ctx context.Context) ([]reqlog.RequestLog, error) { -// panic("mock out the FindRequests method") -// }, -// RequestModifierFunc: func(next proxy.RequestModifyFunc) proxy.RequestModifyFunc { -// panic("mock out the RequestModifier method") -// }, -// ResponseModifierFunc: func(next proxy.ResponseModifyFunc) proxy.ResponseModifyFunc { -// panic("mock out the ResponseModifier method") -// }, -// SetActiveProjectIDFunc: func(id ulid.ULID) { -// panic("mock out the SetActiveProjectID method") -// }, -// SetBypassOutOfScopeRequestsFunc: func(b bool) { -// panic("mock out the SetBypassOutOfScopeRequests method") -// }, -// SetFindReqsFilterFunc: func(filter reqlog.FindRequestsFilter) { -// panic("mock out the SetFindReqsFilter method") -// }, -// } -// -// // use mockedService in code that requires reqlog.Service -// // and then make assertions. -// -// } -type ReqLogServiceMock struct { - // ActiveProjectIDFunc mocks the ActiveProjectID method. - ActiveProjectIDFunc func() ulid.ULID - - // BypassOutOfScopeRequestsFunc mocks the BypassOutOfScopeRequests method. - BypassOutOfScopeRequestsFunc func() bool - - // ClearRequestsFunc mocks the ClearRequests method. - ClearRequestsFunc func(ctx context.Context, projectID ulid.ULID) error - - // FindReqsFilterFunc mocks the FindReqsFilter method. - FindReqsFilterFunc func() reqlog.FindRequestsFilter - - // FindRequestLogByIDFunc mocks the FindRequestLogByID method. - FindRequestLogByIDFunc func(ctx context.Context, id ulid.ULID) (reqlog.RequestLog, error) - - // FindRequestsFunc mocks the FindRequests method. - FindRequestsFunc func(ctx context.Context) ([]reqlog.RequestLog, error) - - // RequestModifierFunc mocks the RequestModifier method. - RequestModifierFunc func(next proxy.RequestModifyFunc) proxy.RequestModifyFunc - - // ResponseModifierFunc mocks the ResponseModifier method. - ResponseModifierFunc func(next proxy.ResponseModifyFunc) proxy.ResponseModifyFunc - - // SetActiveProjectIDFunc mocks the SetActiveProjectID method. - SetActiveProjectIDFunc func(id ulid.ULID) - - // SetBypassOutOfScopeRequestsFunc mocks the SetBypassOutOfScopeRequests method. - SetBypassOutOfScopeRequestsFunc func(b bool) - - // SetFindReqsFilterFunc mocks the SetFindReqsFilter method. - SetFindReqsFilterFunc func(filter reqlog.FindRequestsFilter) - - // calls tracks calls to the methods. - calls struct { - // ActiveProjectID holds details about calls to the ActiveProjectID method. - ActiveProjectID []struct { - } - // BypassOutOfScopeRequests holds details about calls to the BypassOutOfScopeRequests method. - BypassOutOfScopeRequests []struct { - } - // ClearRequests holds details about calls to the ClearRequests method. - ClearRequests []struct { - // Ctx is the ctx argument value. - Ctx context.Context - // ProjectID is the projectID argument value. - ProjectID ulid.ULID - } - // FindReqsFilter holds details about calls to the FindReqsFilter method. - FindReqsFilter []struct { - } - // FindRequestLogByID holds details about calls to the FindRequestLogByID method. - FindRequestLogByID []struct { - // Ctx is the ctx argument value. - Ctx context.Context - // ID is the id argument value. - ID ulid.ULID - } - // FindRequests holds details about calls to the FindRequests method. - FindRequests []struct { - // Ctx is the ctx argument value. - Ctx context.Context - } - // RequestModifier holds details about calls to the RequestModifier method. - RequestModifier []struct { - // Next is the next argument value. - Next proxy.RequestModifyFunc - } - // ResponseModifier holds details about calls to the ResponseModifier method. - ResponseModifier []struct { - // Next is the next argument value. - Next proxy.ResponseModifyFunc - } - // SetActiveProjectID holds details about calls to the SetActiveProjectID method. - SetActiveProjectID []struct { - // ID is the id argument value. - ID ulid.ULID - } - // SetBypassOutOfScopeRequests holds details about calls to the SetBypassOutOfScopeRequests method. - SetBypassOutOfScopeRequests []struct { - // B is the b argument value. - B bool - } - // SetFindReqsFilter holds details about calls to the SetFindReqsFilter method. - SetFindReqsFilter []struct { - // Filter is the filter argument value. - Filter reqlog.FindRequestsFilter - } - } - lockActiveProjectID sync.RWMutex - lockBypassOutOfScopeRequests sync.RWMutex - lockClearRequests sync.RWMutex - lockFindReqsFilter sync.RWMutex - lockFindRequestLogByID sync.RWMutex - lockFindRequests sync.RWMutex - lockRequestModifier sync.RWMutex - lockResponseModifier sync.RWMutex - lockSetActiveProjectID sync.RWMutex - lockSetBypassOutOfScopeRequests sync.RWMutex - lockSetFindReqsFilter sync.RWMutex -} - -// ActiveProjectID calls ActiveProjectIDFunc. -func (mock *ReqLogServiceMock) ActiveProjectID() ulid.ULID { - if mock.ActiveProjectIDFunc == nil { - panic("ReqLogServiceMock.ActiveProjectIDFunc: method is nil but Service.ActiveProjectID was just called") - } - callInfo := struct { - }{} - mock.lockActiveProjectID.Lock() - mock.calls.ActiveProjectID = append(mock.calls.ActiveProjectID, callInfo) - mock.lockActiveProjectID.Unlock() - return mock.ActiveProjectIDFunc() -} - -// ActiveProjectIDCalls gets all the calls that were made to ActiveProjectID. -// Check the length with: -// len(mockedService.ActiveProjectIDCalls()) -func (mock *ReqLogServiceMock) ActiveProjectIDCalls() []struct { -} { - var calls []struct { - } - mock.lockActiveProjectID.RLock() - calls = mock.calls.ActiveProjectID - mock.lockActiveProjectID.RUnlock() - return calls -} - -// BypassOutOfScopeRequests calls BypassOutOfScopeRequestsFunc. -func (mock *ReqLogServiceMock) BypassOutOfScopeRequests() bool { - if mock.BypassOutOfScopeRequestsFunc == nil { - panic("ReqLogServiceMock.BypassOutOfScopeRequestsFunc: method is nil but Service.BypassOutOfScopeRequests was just called") - } - callInfo := struct { - }{} - mock.lockBypassOutOfScopeRequests.Lock() - mock.calls.BypassOutOfScopeRequests = append(mock.calls.BypassOutOfScopeRequests, callInfo) - mock.lockBypassOutOfScopeRequests.Unlock() - return mock.BypassOutOfScopeRequestsFunc() -} - -// BypassOutOfScopeRequestsCalls gets all the calls that were made to BypassOutOfScopeRequests. -// Check the length with: -// len(mockedService.BypassOutOfScopeRequestsCalls()) -func (mock *ReqLogServiceMock) BypassOutOfScopeRequestsCalls() []struct { -} { - var calls []struct { - } - mock.lockBypassOutOfScopeRequests.RLock() - calls = mock.calls.BypassOutOfScopeRequests - mock.lockBypassOutOfScopeRequests.RUnlock() - return calls -} - -// ClearRequests calls ClearRequestsFunc. -func (mock *ReqLogServiceMock) ClearRequests(ctx context.Context, projectID ulid.ULID) error { - if mock.ClearRequestsFunc == nil { - panic("ReqLogServiceMock.ClearRequestsFunc: method is nil but Service.ClearRequests was just called") - } - callInfo := struct { - Ctx context.Context - ProjectID ulid.ULID - }{ - Ctx: ctx, - ProjectID: projectID, - } - mock.lockClearRequests.Lock() - mock.calls.ClearRequests = append(mock.calls.ClearRequests, callInfo) - mock.lockClearRequests.Unlock() - return mock.ClearRequestsFunc(ctx, projectID) -} - -// ClearRequestsCalls gets all the calls that were made to ClearRequests. -// Check the length with: -// len(mockedService.ClearRequestsCalls()) -func (mock *ReqLogServiceMock) ClearRequestsCalls() []struct { - Ctx context.Context - ProjectID ulid.ULID -} { - var calls []struct { - Ctx context.Context - ProjectID ulid.ULID - } - mock.lockClearRequests.RLock() - calls = mock.calls.ClearRequests - mock.lockClearRequests.RUnlock() - return calls -} - -// FindReqsFilter calls FindReqsFilterFunc. -func (mock *ReqLogServiceMock) FindReqsFilter() reqlog.FindRequestsFilter { - if mock.FindReqsFilterFunc == nil { - panic("ReqLogServiceMock.FindReqsFilterFunc: method is nil but Service.FindReqsFilter was just called") - } - callInfo := struct { - }{} - mock.lockFindReqsFilter.Lock() - mock.calls.FindReqsFilter = append(mock.calls.FindReqsFilter, callInfo) - mock.lockFindReqsFilter.Unlock() - return mock.FindReqsFilterFunc() -} - -// FindReqsFilterCalls gets all the calls that were made to FindReqsFilter. -// Check the length with: -// len(mockedService.FindReqsFilterCalls()) -func (mock *ReqLogServiceMock) FindReqsFilterCalls() []struct { -} { - var calls []struct { - } - mock.lockFindReqsFilter.RLock() - calls = mock.calls.FindReqsFilter - mock.lockFindReqsFilter.RUnlock() - return calls -} - -// FindRequestLogByID calls FindRequestLogByIDFunc. -func (mock *ReqLogServiceMock) FindRequestLogByID(ctx context.Context, id ulid.ULID) (reqlog.RequestLog, error) { - if mock.FindRequestLogByIDFunc == nil { - panic("ReqLogServiceMock.FindRequestLogByIDFunc: method is nil but Service.FindRequestLogByID was just called") - } - callInfo := struct { - Ctx context.Context - ID ulid.ULID - }{ - Ctx: ctx, - ID: id, - } - mock.lockFindRequestLogByID.Lock() - mock.calls.FindRequestLogByID = append(mock.calls.FindRequestLogByID, callInfo) - mock.lockFindRequestLogByID.Unlock() - return mock.FindRequestLogByIDFunc(ctx, id) -} - -// FindRequestLogByIDCalls gets all the calls that were made to FindRequestLogByID. -// Check the length with: -// len(mockedService.FindRequestLogByIDCalls()) -func (mock *ReqLogServiceMock) FindRequestLogByIDCalls() []struct { - Ctx context.Context - ID ulid.ULID -} { - var calls []struct { - Ctx context.Context - ID ulid.ULID - } - mock.lockFindRequestLogByID.RLock() - calls = mock.calls.FindRequestLogByID - mock.lockFindRequestLogByID.RUnlock() - return calls -} - -// FindRequests calls FindRequestsFunc. -func (mock *ReqLogServiceMock) FindRequests(ctx context.Context) ([]reqlog.RequestLog, error) { - if mock.FindRequestsFunc == nil { - panic("ReqLogServiceMock.FindRequestsFunc: method is nil but Service.FindRequests was just called") - } - callInfo := struct { - Ctx context.Context - }{ - Ctx: ctx, - } - mock.lockFindRequests.Lock() - mock.calls.FindRequests = append(mock.calls.FindRequests, callInfo) - mock.lockFindRequests.Unlock() - return mock.FindRequestsFunc(ctx) -} - -// FindRequestsCalls gets all the calls that were made to FindRequests. -// Check the length with: -// len(mockedService.FindRequestsCalls()) -func (mock *ReqLogServiceMock) FindRequestsCalls() []struct { - Ctx context.Context -} { - var calls []struct { - Ctx context.Context - } - mock.lockFindRequests.RLock() - calls = mock.calls.FindRequests - mock.lockFindRequests.RUnlock() - return calls -} - -// RequestModifier calls RequestModifierFunc. -func (mock *ReqLogServiceMock) RequestModifier(next proxy.RequestModifyFunc) proxy.RequestModifyFunc { - if mock.RequestModifierFunc == nil { - panic("ReqLogServiceMock.RequestModifierFunc: method is nil but Service.RequestModifier was just called") - } - callInfo := struct { - Next proxy.RequestModifyFunc - }{ - Next: next, - } - mock.lockRequestModifier.Lock() - mock.calls.RequestModifier = append(mock.calls.RequestModifier, callInfo) - mock.lockRequestModifier.Unlock() - return mock.RequestModifierFunc(next) -} - -// RequestModifierCalls gets all the calls that were made to RequestModifier. -// Check the length with: -// len(mockedService.RequestModifierCalls()) -func (mock *ReqLogServiceMock) RequestModifierCalls() []struct { - Next proxy.RequestModifyFunc -} { - var calls []struct { - Next proxy.RequestModifyFunc - } - mock.lockRequestModifier.RLock() - calls = mock.calls.RequestModifier - mock.lockRequestModifier.RUnlock() - return calls -} - -// ResponseModifier calls ResponseModifierFunc. -func (mock *ReqLogServiceMock) ResponseModifier(next proxy.ResponseModifyFunc) proxy.ResponseModifyFunc { - if mock.ResponseModifierFunc == nil { - panic("ReqLogServiceMock.ResponseModifierFunc: method is nil but Service.ResponseModifier was just called") - } - callInfo := struct { - Next proxy.ResponseModifyFunc - }{ - Next: next, - } - mock.lockResponseModifier.Lock() - mock.calls.ResponseModifier = append(mock.calls.ResponseModifier, callInfo) - mock.lockResponseModifier.Unlock() - return mock.ResponseModifierFunc(next) -} - -// ResponseModifierCalls gets all the calls that were made to ResponseModifier. -// Check the length with: -// len(mockedService.ResponseModifierCalls()) -func (mock *ReqLogServiceMock) ResponseModifierCalls() []struct { - Next proxy.ResponseModifyFunc -} { - var calls []struct { - Next proxy.ResponseModifyFunc - } - mock.lockResponseModifier.RLock() - calls = mock.calls.ResponseModifier - mock.lockResponseModifier.RUnlock() - return calls -} - -// SetActiveProjectID calls SetActiveProjectIDFunc. -func (mock *ReqLogServiceMock) SetActiveProjectID(id ulid.ULID) { - if mock.SetActiveProjectIDFunc == nil { - panic("ReqLogServiceMock.SetActiveProjectIDFunc: method is nil but Service.SetActiveProjectID was just called") - } - callInfo := struct { - ID ulid.ULID - }{ - ID: id, - } - mock.lockSetActiveProjectID.Lock() - mock.calls.SetActiveProjectID = append(mock.calls.SetActiveProjectID, callInfo) - mock.lockSetActiveProjectID.Unlock() - mock.SetActiveProjectIDFunc(id) -} - -// SetActiveProjectIDCalls gets all the calls that were made to SetActiveProjectID. -// Check the length with: -// len(mockedService.SetActiveProjectIDCalls()) -func (mock *ReqLogServiceMock) SetActiveProjectIDCalls() []struct { - ID ulid.ULID -} { - var calls []struct { - ID ulid.ULID - } - mock.lockSetActiveProjectID.RLock() - calls = mock.calls.SetActiveProjectID - mock.lockSetActiveProjectID.RUnlock() - return calls -} - -// SetBypassOutOfScopeRequests calls SetBypassOutOfScopeRequestsFunc. -func (mock *ReqLogServiceMock) SetBypassOutOfScopeRequests(b bool) { - if mock.SetBypassOutOfScopeRequestsFunc == nil { - panic("ReqLogServiceMock.SetBypassOutOfScopeRequestsFunc: method is nil but Service.SetBypassOutOfScopeRequests was just called") - } - callInfo := struct { - B bool - }{ - B: b, - } - mock.lockSetBypassOutOfScopeRequests.Lock() - mock.calls.SetBypassOutOfScopeRequests = append(mock.calls.SetBypassOutOfScopeRequests, callInfo) - mock.lockSetBypassOutOfScopeRequests.Unlock() - mock.SetBypassOutOfScopeRequestsFunc(b) -} - -// SetBypassOutOfScopeRequestsCalls gets all the calls that were made to SetBypassOutOfScopeRequests. -// Check the length with: -// len(mockedService.SetBypassOutOfScopeRequestsCalls()) -func (mock *ReqLogServiceMock) SetBypassOutOfScopeRequestsCalls() []struct { - B bool -} { - var calls []struct { - B bool - } - mock.lockSetBypassOutOfScopeRequests.RLock() - calls = mock.calls.SetBypassOutOfScopeRequests - mock.lockSetBypassOutOfScopeRequests.RUnlock() - return calls -} - -// SetFindReqsFilter calls SetFindReqsFilterFunc. -func (mock *ReqLogServiceMock) SetFindReqsFilter(filter reqlog.FindRequestsFilter) { - if mock.SetFindReqsFilterFunc == nil { - panic("ReqLogServiceMock.SetFindReqsFilterFunc: method is nil but Service.SetFindReqsFilter was just called") - } - callInfo := struct { - Filter reqlog.FindRequestsFilter - }{ - Filter: filter, - } - mock.lockSetFindReqsFilter.Lock() - mock.calls.SetFindReqsFilter = append(mock.calls.SetFindReqsFilter, callInfo) - mock.lockSetFindReqsFilter.Unlock() - mock.SetFindReqsFilterFunc(filter) -} - -// SetFindReqsFilterCalls gets all the calls that were made to SetFindReqsFilter. -// Check the length with: -// len(mockedService.SetFindReqsFilterCalls()) -func (mock *ReqLogServiceMock) SetFindReqsFilterCalls() []struct { - Filter reqlog.FindRequestsFilter -} { - var calls []struct { - Filter reqlog.FindRequestsFilter - } - mock.lockSetFindReqsFilter.RLock() - calls = mock.calls.SetFindReqsFilter - mock.lockSetFindReqsFilter.RUnlock() - return calls -} diff --git a/pkg/sender/sender.go b/pkg/sender/sender.go index 68e7cd5..9a5197a 100644 --- a/pkg/sender/sender.go +++ b/pkg/sender/sender.go @@ -30,24 +30,12 @@ var ( ErrRequestNotFound = errors.New("sender: request not found") ) -type Service interface { - FindRequestByID(ctx context.Context, id ulid.ULID) (Request, error) - FindRequests(ctx context.Context) ([]Request, error) - CreateOrUpdateRequest(ctx context.Context, req Request) (Request, error) - CloneFromRequestLog(ctx context.Context, reqLogID ulid.ULID) (Request, error) - DeleteRequests(ctx context.Context, projectID ulid.ULID) error - SendRequest(ctx context.Context, id ulid.ULID) (Request, error) - SetActiveProjectID(ulid.ULID) - SetFindReqsFilter(filter FindRequestsFilter) - FindReqsFilter() FindRequestsFilter -} - -type service struct { +type Service struct { activeProjectID ulid.ULID findReqsFilter FindRequestsFilter scope *scope.Scope repo Repository - reqLogSvc reqlog.Service + reqLogSvc *reqlog.Service httpClient *http.Client } @@ -60,7 +48,7 @@ type FindRequestsFilter struct { type Config struct { Scope *scope.Scope Repository Repository - ReqLogService reqlog.Service + ReqLogService *reqlog.Service HTTPClient *http.Client } @@ -68,8 +56,8 @@ type SendError struct { err error } -func NewService(cfg Config) Service { - svc := &service{ +func NewService(cfg Config) *Service { + svc := &Service{ repo: cfg.Repository, reqLogSvc: cfg.ReqLogService, httpClient: defaultHTTPClient, @@ -97,7 +85,7 @@ type Request struct { Response *reqlog.ResponseLog } -func (svc *service) FindRequestByID(ctx context.Context, id ulid.ULID) (Request, error) { +func (svc *Service) FindRequestByID(ctx context.Context, id ulid.ULID) (Request, error) { req, err := svc.repo.FindSenderRequestByID(ctx, id) if err != nil { return Request{}, fmt.Errorf("sender: failed to find request: %w", err) @@ -106,11 +94,11 @@ func (svc *service) FindRequestByID(ctx context.Context, id ulid.ULID) (Request, return req, nil } -func (svc *service) FindRequests(ctx context.Context) ([]Request, error) { +func (svc *Service) FindRequests(ctx context.Context) ([]Request, error) { return svc.repo.FindSenderRequests(ctx, svc.findReqsFilter, svc.scope) } -func (svc *service) CreateOrUpdateRequest(ctx context.Context, req Request) (Request, error) { +func (svc *Service) CreateOrUpdateRequest(ctx context.Context, req Request) (Request, error) { if svc.activeProjectID.Compare(ulid.ULID{}) == 0 { return Request{}, ErrProjectIDMustBeSet } @@ -141,7 +129,7 @@ func (svc *service) CreateOrUpdateRequest(ctx context.Context, req Request) (Req return req, nil } -func (svc *service) CloneFromRequestLog(ctx context.Context, reqLogID ulid.ULID) (Request, error) { +func (svc *Service) CloneFromRequestLog(ctx context.Context, reqLogID ulid.ULID) (Request, error) { if svc.activeProjectID.Compare(ulid.ULID{}) == 0 { return Request{}, ErrProjectIDMustBeSet } @@ -170,15 +158,15 @@ func (svc *service) CloneFromRequestLog(ctx context.Context, reqLogID ulid.ULID) return req, nil } -func (svc *service) SetFindReqsFilter(filter FindRequestsFilter) { +func (svc *Service) SetFindReqsFilter(filter FindRequestsFilter) { svc.findReqsFilter = filter } -func (svc *service) FindReqsFilter() FindRequestsFilter { +func (svc *Service) FindReqsFilter() FindRequestsFilter { return svc.findReqsFilter } -func (svc *service) SendRequest(ctx context.Context, id ulid.ULID) (Request, error) { +func (svc *Service) SendRequest(ctx context.Context, id ulid.ULID) (Request, error) { req, err := svc.repo.FindSenderRequestByID(ctx, id) if err != nil { return Request{}, fmt.Errorf("sender: failed to find request: %w", err) @@ -219,7 +207,7 @@ func parseHTTPRequest(ctx context.Context, req Request) (*http.Request, error) { return httpReq, nil } -func (svc *service) sendHTTPRequest(httpReq *http.Request) (reqlog.ResponseLog, error) { +func (svc *Service) sendHTTPRequest(httpReq *http.Request) (reqlog.ResponseLog, error) { res, err := svc.httpClient.Do(httpReq) if err != nil { return reqlog.ResponseLog{}, &SendError{err} @@ -234,11 +222,11 @@ func (svc *service) sendHTTPRequest(httpReq *http.Request) (reqlog.ResponseLog, return resLog, err } -func (svc *service) SetActiveProjectID(id ulid.ULID) { +func (svc *Service) SetActiveProjectID(id ulid.ULID) { svc.activeProjectID = id } -func (svc *service) DeleteRequests(ctx context.Context, projectID ulid.ULID) error { +func (svc *Service) DeleteRequests(ctx context.Context, projectID ulid.ULID) error { return svc.repo.DeleteSenderRequests(ctx, projectID) } diff --git a/pkg/sender/sender_test.go b/pkg/sender/sender_test.go index 253dff8..8ca5481 100644 --- a/pkg/sender/sender_test.go +++ b/pkg/sender/sender_test.go @@ -1,8 +1,5 @@ package sender_test -//go:generate go run github.com/matryer/moq -out reqlog_mock_test.go -pkg sender_test ../reqlog Service:ReqLogServiceMock -//go:generate go run github.com/matryer/moq -out repo_mock_test.go -pkg sender_test . Repository:RepoMock - import ( "context" "errors" @@ -14,9 +11,12 @@ import ( "testing" "time" + badgerdb "github.com/dgraph-io/badger/v3" "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" "github.com/oklog/ulid" + "github.com/dstotijn/hetty/pkg/db/badger" "github.com/dstotijn/hetty/pkg/reqlog" "github.com/dstotijn/hetty/pkg/sender" ) @@ -54,13 +54,13 @@ func TestStoreRequest(t *testing.T) { t.Run("with active project", func(t *testing.T) { t.Parallel() - repoMock := &RepoMock{ - StoreSenderRequestFunc: func(ctx context.Context, req sender.Request) error { - return nil - }, + db, err := badger.OpenDatabase(badgerdb.DefaultOptions("").WithInMemory(true)) + if err != nil { + t.Fatalf("failed to open database: %v", err) } + svc := sender.NewService(sender.Config{ - Repository: repoMock, + Repository: db, }) projectID := ulid.MustNew(ulid.Timestamp(time.Now()), ulidEntropy) @@ -94,18 +94,18 @@ func TestStoreRequest(t *testing.T) { t.Fatal("expected request ID to be non-empty value") } - if len(repoMock.StoreSenderRequestCalls()) != 1 { - t.Fatal("expected `svc.repo.StoreSenderRequest()` to have been called 1 time") + diff := cmp.Diff(exp, got, cmpopts.IgnoreFields(sender.Request{}, "ID")) + if diff != "" { + t.Fatalf("request not equal (-exp, +got):\n%v", diff) } - if diff := cmp.Diff(got, repoMock.StoreSenderRequestCalls()[0].Req); diff != "" { - t.Fatalf("repo call arg not equal (-exp, +got):\n%v", diff) + got, err = db.FindSenderRequestByID(context.Background(), got.ID) + if err != nil { + t.Fatalf("failed to find request by ID: %v", err) } - // Reset ID to make comparison with expected easier. - got.ID = ulid.ULID{} - - if diff := cmp.Diff(exp, got); diff != "" { + diff = cmp.Diff(exp, got, cmpopts.IgnoreFields(sender.Request{}, "ID")) + if diff != "" { t.Fatalf("request not equal (-exp, +got):\n%v", diff) } }) @@ -130,6 +130,13 @@ func TestCloneFromRequestLog(t *testing.T) { t.Run("with active project", func(t *testing.T) { t.Parallel() + db, err := badger.OpenDatabase(badgerdb.DefaultOptions("").WithInMemory(true)) + if err != nil { + t.Fatalf("failed to open database: %v", err) + } + + defer db.Close() + reqLog := reqlog.RequestLog{ ID: reqLogID, ProjectID: ulid.MustNew(ulid.Timestamp(time.Now()), ulidEntropy), @@ -142,19 +149,15 @@ func TestCloneFromRequestLog(t *testing.T) { Body: []byte("foobar"), } - reqLogMock := &ReqLogServiceMock{ - FindRequestLogByIDFunc: func(ctx context.Context, id ulid.ULID) (reqlog.RequestLog, error) { - return reqLog, nil - }, - } - repoMock := &RepoMock{ - StoreSenderRequestFunc: func(ctx context.Context, req sender.Request) error { - return nil - }, + if err := db.StoreRequestLog(context.Background(), reqLog); err != nil { + t.Fatalf("failed to store request log: %v", err) } + svc := sender.NewService(sender.Config{ - ReqLogService: reqLogMock, - Repository: repoMock, + ReqLogService: reqlog.NewService(reqlog.Config{ + Repository: db, + }), + Repository: db, }) projectID := ulid.MustNew(ulid.Timestamp(time.Now()), ulidEntropy) @@ -177,30 +180,8 @@ func TestCloneFromRequestLog(t *testing.T) { t.Fatalf("unexpected error cloning from request log: %v", err) } - if len(reqLogMock.FindRequestLogByIDCalls()) != 1 { - t.Fatal("expected `svc.reqLogSvc.FindRequestLogByID()` to have been called 1 time") - } - - if got := reqLogMock.FindRequestLogByIDCalls()[0].ID; reqLogID.Compare(got) != 0 { - t.Fatalf("reqlog service call arg `id` not equal (expected: %q, got: %q)", reqLogID, got) - } - - if got.ID.Compare(ulid.ULID{}) == 0 { - t.Fatal("expected request ID to be non-empty value") - } - - if len(repoMock.StoreSenderRequestCalls()) != 1 { - t.Fatal("expected `svc.repo.StoreSenderRequest()` to have been called 1 time") - } - - if diff := cmp.Diff(got, repoMock.StoreSenderRequestCalls()[0].Req); diff != "" { - t.Fatalf("repo call arg not equal (-exp, +got):\n%v", diff) - } - - // Reset ID to make comparison with expected easier. - got.ID = ulid.ULID{} - - if diff := cmp.Diff(exp, got); diff != "" { + diff := cmp.Diff(exp, got, cmpopts.IgnoreFields(sender.Request{}, "ID")) + if diff != "" { t.Fatalf("request not equal (-exp, +got):\n%v", diff) } }) @@ -209,6 +190,11 @@ func TestCloneFromRequestLog(t *testing.T) { func TestSendRequest(t *testing.T) { t.Parallel() + db, err := badger.OpenDatabase(badgerdb.DefaultOptions("").WithInMemory(true)) + if err != nil { + t.Fatalf("failed to open database: %v", err) + } + date := time.Now().Format(http.TimeFormat) ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { @@ -233,19 +219,18 @@ func TestSendRequest(t *testing.T) { Body: []byte("foobar"), } - repoMock := &RepoMock{ - FindSenderRequestByIDFunc: func(ctx context.Context, id ulid.ULID) (sender.Request, error) { - return req, nil - }, - StoreResponseLogFunc: func(ctx context.Context, reqLogID ulid.ULID, resLog reqlog.ResponseLog) error { - return nil - }, + if err := db.StoreSenderRequest(context.Background(), req); err != nil { + t.Fatalf("failed to store request: %v", err) } + svc := sender.NewService(sender.Config{ - Repository: repoMock, + ReqLogService: reqlog.NewService(reqlog.Config{ + Repository: db, + }), + Repository: db, }) - exp := reqlog.ResponseLog{ + exp := &reqlog.ResponseLog{ Proto: "HTTP/1.1", StatusCode: http.StatusOK, Status: "200 OK", @@ -263,27 +248,8 @@ func TestSendRequest(t *testing.T) { t.Fatalf("unexpected error sending request: %v", err) } - if len(repoMock.FindSenderRequestByIDCalls()) != 1 { - t.Fatal("expected `svc.repo.FindSenderRequestByID()` to have been called 1 time") - } - - if diff := cmp.Diff(reqID, repoMock.FindSenderRequestByIDCalls()[0].ID); diff != "" { - t.Fatalf("call arg `id` for `svc.repo.FindSenderRequestByID()` not equal (-exp, +got):\n%v", diff) - } - - if len(repoMock.StoreResponseLogCalls()) != 1 { - t.Fatal("expected `svc.repo.StoreResponseLog()` to have been called 1 time") - } - - if diff := cmp.Diff(reqID, repoMock.StoreResponseLogCalls()[0].ReqLogID); diff != "" { - t.Fatalf("call arg `reqLogID` for `svc.repo.StoreResponseLog()` not equal (-exp, +got):\n%v", diff) - } - - if diff := cmp.Diff(exp, repoMock.StoreResponseLogCalls()[0].ResLog); diff != "" { - t.Fatalf("call arg `resLog` for `svc.repo.StoreResponseLog()` not equal (-exp, +got):\n%v", diff) - } - - if diff := cmp.Diff(repoMock.StoreResponseLogCalls()[0].ResLog, *got.Response); diff != "" { - t.Fatalf("returned response log value and persisted value not equal (-exp, +got):\n%v", diff) + diff := cmp.Diff(exp, got.Response, cmpopts.IgnoreFields(sender.Request{}, "ID")) + if diff != "" { + t.Fatalf("request not equal (-exp, +got):\n%v", diff) } } diff --git a/tools.go b/tools.go index d67f1c0..fcdeac4 100644 --- a/tools.go +++ b/tools.go @@ -5,5 +5,4 @@ package tools import ( _ "github.com/99designs/gqlgen" - _ "github.com/matryer/moq" )