diff options
| author | Xe Iaso <me@xeiaso.net> | 2024-05-27 17:46:02 -0400 |
|---|---|---|
| committer | Xe Iaso <me@xeiaso.net> | 2024-05-27 17:46:02 -0400 |
| commit | aa017342bfda3e79dee640bcc336bcec5bf0c094 (patch) | |
| tree | de6b13dc44b6f3a397adbc1b2e757f97fcb76b5d /cmd/mi/services/switchtracker | |
| parent | 9dc5d4799dce590e0bfb334f6cf47fc1fad47618 (diff) | |
| download | x-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.go | 3 | ||||
| -rw-r--r-- | cmd/mi/services/switchtracker/switchtracker_test.go | 124 | ||||
| -rw-r--r-- | cmd/mi/services/switchtracker/testdata/members.json | 10 |
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 |
