From f41448e85622f635fb5b700afd7c147f15e95215 Mon Sep 17 00:00:00 2001 From: Alexander Goussas Date: Sat, 25 Apr 2026 23:18:15 -0500 Subject: [PATCH] tests: add tests for the member service --- services/member_service.go | 19 ++++++++++ services/member_service_test.go | 65 +++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 services/member_service_test.go diff --git a/services/member_service.go b/services/member_service.go index 9f76b52..98228a6 100644 --- a/services/member_service.go +++ b/services/member_service.go @@ -1,6 +1,9 @@ package services import ( + "errors" + "net/url" + "strings" "sync" "github.com/aloussase/squad-rotation-bot/entities" @@ -27,6 +30,22 @@ func Create() MemberService { } func (ms *memberServiceImpl) CreateMember(name, avatarUrl string) error { + if strings.TrimSpace(name) == "" { + return errors.New("Name cannot be empty") + } + + if strings.TrimSpace(avatarUrl) == "" { + return errors.New("Avatar URL cannot be empty") + } + + if !strings.HasPrefix(avatarUrl, "https://") { + return errors.New("The avatar URL must be a valid HTTPS URL") + } + + if _, err := url.Parse(avatarUrl); err != nil { + return err + } + ms.mu.Lock() defer ms.mu.Unlock() diff --git a/services/member_service_test.go b/services/member_service_test.go new file mode 100644 index 0000000..453c987 --- /dev/null +++ b/services/member_service_test.go @@ -0,0 +1,65 @@ +package services + +import ( + "strings" + "testing" +) + +const ( + VALID_NAME = "Alexander" + VALID_URL = "https://example.com" +) + +func TestMemberServiceRejectsEmptyName(t *testing.T) { + impl := Create() + + err := impl.CreateMember("", VALID_URL) + + if err == nil { + t.Errorf("Expected service to reject empty member name but did not") + } + + if !strings.Contains(strings.ToLower(err.Error()), "name") { + t.Errorf("Expected error to contain 'name', but did not") + } +} + +func TestMemberServiceRejectsEmptyUrl(t *testing.T) { + impl := Create() + + err := impl.CreateMember(VALID_NAME, "") + + if err == nil { + t.Errorf("Expected service to reject empty member avatar URL but did not") + } + + if !strings.Contains(strings.ToLower(err.Error()), "url") { + t.Errorf("Expected error to contain 'url', but did not") + } +} + +func TestMemberServiceRejectsMalformedUrl(t *testing.T) { + impl := Create() + + tt := []string{ + "not a URL", + "https://invalid URL", + } + + for _, x := range tt { + err := impl.CreateMember(VALID_NAME, x) + + if err == nil { + t.Errorf("Expected service to reject invalid member avatar URL but did not: %s", x) + } + + if !strings.Contains(strings.ToLower(err.Error()), "url") { + t.Errorf("Expected error to contain 'url', but did not: %v", err) + } + } + +} + +// TODO: Test happy path + +// TODO: Test concurrent requests -- 2.43.0