aboutsummaryrefslogtreecommitdiff
path: root/cmd/mi/services/switchtracker
diff options
context:
space:
mode:
authorXe Iaso <me@xeiaso.net>2024-05-27 17:46:02 -0400
committerXe Iaso <me@xeiaso.net>2024-05-27 17:46:02 -0400
commitaa017342bfda3e79dee640bcc336bcec5bf0c094 (patch)
treede6b13dc44b6f3a397adbc1b2e757f97fcb76b5d /cmd/mi/services/switchtracker
parent9dc5d4799dce590e0bfb334f6cf47fc1fad47618 (diff)
downloadx-aa017342bfda3e79dee640bcc336bcec5bf0c094.tar.xz
x-aa017342bfda3e79dee640bcc336bcec5bf0c094.zip
cmd/mi/services/switchtracker: fix getting individual switches, add tests
Signed-off-by: Xe Iaso <me@xeiaso.net>
Diffstat (limited to 'cmd/mi/services/switchtracker')
-rw-r--r--cmd/mi/services/switchtracker/switchtracker.go3
-rw-r--r--cmd/mi/services/switchtracker/switchtracker_test.go124
-rw-r--r--cmd/mi/services/switchtracker/testdata/members.json10
3 files changed, 135 insertions, 2 deletions
diff --git a/cmd/mi/services/switchtracker/switchtracker.go b/cmd/mi/services/switchtracker/switchtracker.go
index a7c1631..e7b2c5c 100644
--- a/cmd/mi/services/switchtracker/switchtracker.go
+++ b/cmd/mi/services/switchtracker/switchtracker.go
@@ -13,7 +13,6 @@ import (
)
type SwitchTracker struct {
- db *gorm.DB
dao *models.DAO
}
@@ -65,7 +64,7 @@ func (s *SwitchTracker) Switch(ctx context.Context, req *pb.SwitchReq) (*pb.Swit
slog.Error("can't switch front", "req", req, "err", err)
switch {
case errors.Is(err, models.ErrCantSwitchToYourself):
- twirp.InvalidArgumentError("member_name", "cannot switch to yourself").
+ return nil, twirp.InvalidArgumentError("member_name", "cannot switch to yourself").
WithMeta("member_name", req.GetMemberName())
case errors.Is(err, gorm.ErrRecordNotFound):
return nil, twirp.NotFoundError("can't find current switch")
diff --git a/cmd/mi/services/switchtracker/switchtracker_test.go b/cmd/mi/services/switchtracker/switchtracker_test.go
new file mode 100644
index 0000000..9def86d
--- /dev/null
+++ b/cmd/mi/services/switchtracker/switchtracker_test.go
@@ -0,0 +1,124 @@
+package switchtracker_test
+
+import (
+ "context"
+ "crypto/rand"
+ _ "embed"
+ "encoding/json"
+ "path/filepath"
+ "strings"
+ "testing"
+
+ "github.com/oklog/ulid/v2"
+ "within.website/x/cmd/mi/models"
+ "within.website/x/cmd/mi/services/switchtracker"
+ pb "within.website/x/proto/mi"
+)
+
+var (
+ //go:embed testdata/members.json
+ membersJSON []byte
+)
+
+func TestSwitch(t *testing.T) {
+ ctx, cancel := context.WithCancel(context.Background())
+ defer cancel()
+
+ dir := t.TempDir()
+ dao, err := models.New(filepath.Join(dir, "test.db"))
+ if err != nil {
+ t.Fatalf("failed to create dao: %v", err)
+ }
+
+ st := switchtracker.New(dao)
+
+ // Import members and create root switch
+
+ var members []*models.Member
+ if err := json.Unmarshal(membersJSON, &members); err != nil {
+ t.Fatalf("failed to unmarshal members: %v", err)
+ }
+
+ for _, m := range members {
+ if err := dao.DB().Create(m).Error; err != nil {
+ t.Fatalf("failed to create member: %v", err)
+ }
+ }
+
+ if err := dao.DB().Create(&models.Switch{
+ ID: ulid.MustNew(ulid.Now(), rand.Reader).String(),
+ MemberID: members[0].ID,
+ }).Error; err != nil {
+ t.Fatalf("failed to create root switch: %v", err)
+ }
+
+ resp, err := st.Members(ctx, nil)
+ if err != nil {
+ t.Errorf("failed to get members: %v", err)
+ }
+
+ if len(resp.Members) != len(members) {
+ t.Errorf("expected %d members, got %d", len(members), len(resp.Members))
+ }
+
+ front, err := st.WhoIsFront(ctx, nil)
+ if err != nil {
+ t.Errorf("failed to get front: %v", err)
+ }
+
+ if front.Member.Name != members[0].Name {
+ t.Errorf("expected front to be %s, got %s", members[0].Name, front.Member.Name)
+ }
+
+ _, err = st.Switch(ctx, &pb.SwitchReq{MemberName: members[1].Name})
+ if err != nil {
+ t.Errorf("failed to switch front: %v", err)
+ }
+
+ t.Log("trying to switch to current front")
+ front, err = st.WhoIsFront(ctx, nil)
+ if err != nil {
+ t.Errorf("failed to get front: %v", err)
+ }
+
+ if front.Member.Name != members[1].Name {
+ t.Errorf("expected front to be %s, got %s", members[1].Name, front.Member.Name)
+ }
+
+ front, err = st.WhoIsFront(ctx, nil)
+ if err != nil {
+ t.Errorf("failed to get front: %v", err)
+ }
+
+ _, err = st.Switch(ctx, &pb.SwitchReq{MemberName: front.Member.Name})
+ if err == nil {
+ t.Errorf("expected error, got nil")
+ }
+
+ if !strings.HasSuffix(err.Error(), "cannot switch to yourself") {
+ t.Errorf("expected error to be 'cannot switch to yourself', got %v", err)
+ }
+
+ switches, err := st.ListSwitches(ctx, &pb.ListSwitchesReq{
+ Count: 10,
+ })
+ if err != nil {
+ t.Errorf("failed to list switches: %v", err)
+ }
+
+ for _, s := range switches.Switches {
+ s := s
+ t.Run("get switch "+s.GetSwitch().GetId(), func(t *testing.T) {
+ fc, err := st.GetSwitch(ctx, &pb.GetSwitchReq{
+ Id: s.GetSwitch().GetId(),
+ })
+ if err != nil {
+ t.Errorf("failed to get switch: %v", err)
+ }
+
+ if fc.GetSwitch().GetId() != s.GetSwitch().GetId() {
+ t.Errorf("expected switch ID to be %s, got %s", s.GetSwitch().GetId(), fc.GetSwitch().GetId())
+ }
+ })
+ }
+}
diff --git a/cmd/mi/services/switchtracker/testdata/members.json b/cmd/mi/services/switchtracker/testdata/members.json
new file mode 100644
index 0000000..0b48bc3
--- /dev/null
+++ b/cmd/mi/services/switchtracker/testdata/members.json
@@ -0,0 +1,10 @@
+[
+ {
+ "ID": 1,
+ "Name": "Jessie"
+ },
+ {
+ "ID": 2,
+ "Name": "Sephie"
+ }
+] \ No newline at end of file