From 32190b70365e3110c47a8940a43be360e6cc2778 Mon Sep 17 00:00:00 2001 From: Drew Bednar Date: Sun, 23 Feb 2025 10:37:12 -0500 Subject: [PATCH] Adding mock services --- cmd/ratchetd/testutils_test.go | 2 -- internal/model/mock/snippets.go | 35 +++++++++++++++++++++++++++++++++ internal/model/mock/user.go | 34 ++++++++++++++++++++++++++++++++ internal/server/server.go | 2 ++ 4 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 internal/model/mock/snippets.go create mode 100644 internal/model/mock/user.go diff --git a/cmd/ratchetd/testutils_test.go b/cmd/ratchetd/testutils_test.go index fafee70..1c53e32 100644 --- a/cmd/ratchetd/testutils_test.go +++ b/cmd/ratchetd/testutils_test.go @@ -14,9 +14,7 @@ import ( // Create a newTestApplication helper which returns an instance of our // application struct containing mocked dependencies. func newTestApplication(t *testing.T) *server.RatchetApp { - rs := server.NewRatchetApp(slog.New(slog.NewTextHandler(io.Discard, nil)), nil, nil, nil) - return rs } diff --git a/internal/model/mock/snippets.go b/internal/model/mock/snippets.go new file mode 100644 index 0000000..1c0fad0 --- /dev/null +++ b/internal/model/mock/snippets.go @@ -0,0 +1,35 @@ +package mock + +import ( + "database/sql" + "time" + + "git.runcible.io/learning/ratchet/internal/model" +) + +var mockSnippet = model.Snippet{ + ID: 1, + Title: sql.NullString{String: "Hello golang mocking", Valid: true}, + Content: sql.NullString{String: "Hello golang mocking", Valid: true}, + CreatedAt: time.Now(), + UpdatedAt: time.Now(), + ExpiresAt: time.Now(), +} + +type SnippetService struct{} + +func (s *SnippetService) Insert(title, content string, expiresAt int) (int, error) { + return 2, nil +} + +func (s *SnippetService) Get(id int) (model.Snippet, error) { + if id == mockSnippet.ID { + return mockSnippet, nil + } else { + return model.Snippet{}, model.ErrNoRecord + } +} + +func (s *SnippetService) Lastest() ([]model.Snippet, error) { + return []model.Snippet{mockSnippet}, nil +} diff --git a/internal/model/mock/user.go b/internal/model/mock/user.go new file mode 100644 index 0000000..53e1a46 --- /dev/null +++ b/internal/model/mock/user.go @@ -0,0 +1,34 @@ +package mock + +import "git.runcible.io/learning/ratchet/internal/model" + +var MockEmail = "drew@fake.com" +var MockPassword = "thisisinsecure" + +type UserService struct{} + +func (u *UserService) Insert(name, email, password string) (int, error) { + switch email { + case "dupe@example.com": + return 0, model.ErrDuplicateEmail + default: + return 1, nil + } +} + +func (u *UserService) Authenticate(email, password string) (int, error) { + if email == MockEmail && password == MockPassword { + return 1, nil + } + + return 0, model.ErrInvalidCredentials +} + +func (u *UserService) Exists(id int) (bool, error) { + switch id { + case 1: + return true, nil + default: + return false, nil + } +} diff --git a/internal/server/server.go b/internal/server/server.go index bb47ca6..bf78ad8 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -23,6 +23,8 @@ type RatchetApp struct { sessionManager *scs.SessionManager } +// TODO this function presents some challenges because it both instantiates new data objects +// and configures route / middleware setup func NewRatchetApp(logger *slog.Logger, tc *TemplateCache, db *sql.DB, sm *scs.SessionManager) *RatchetApp { rs := new(RatchetApp) rs.logger = logger