diff options
Diffstat (limited to 'lib/pama/pama_test.go')
-rw-r--r-- | lib/pama/pama_test.go | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/lib/pama/pama_test.go b/lib/pama/pama_test.go new file mode 100644 index 00000000..7a4d1961 --- /dev/null +++ b/lib/pama/pama_test.go @@ -0,0 +1,166 @@ +package pama_test + +import ( + "errors" + + "git.sr.ht/~rjarry/aerc/lib/pama" + "git.sr.ht/~rjarry/aerc/lib/pama/models" +) + +var errNotFound = errors.New("not found") + +func newCommit(id, subj, tag string) models.Commit { + return models.Commit{ID: id, Subject: subj, Tag: tag} +} + +func newTestManager( + commits []string, + subjects []string, + data map[string]models.Project, + current string, +) (pama.PatchManager, models.RevisionController, models.PersistentStorer) { + rc := mockRevctrl{ + commitIDs: commits, + titles: subjects, + } + store := mockStore{ + data: data, + current: current, + } + return pama.FromFunc( + nil, + func(_ string, _ string) (models.RevisionController, error) { + return &rc, nil + }, + func() models.PersistentStorer { + return &store + }, + ), &rc, &store +} + +type mockRevctrl struct { + commitIDs []string + titles []string +} + +func (c *mockRevctrl) Support() bool { + return true +} + +func (c *mockRevctrl) Clean() bool { + return true +} + +func (c *mockRevctrl) Root() (string, error) { + return "", nil +} + +func (c *mockRevctrl) Head() (string, error) { + return c.commitIDs[len(c.commitIDs)-1], nil +} + +func (c *mockRevctrl) History(commit string) ([]string, error) { + for i, s := range c.commitIDs { + if s == commit { + cp := make([]string, len(c.commitIDs[i+1:])) + copy(cp, c.commitIDs[i+1:]) + return cp, nil + } + } + return nil, errNotFound +} + +func (c *mockRevctrl) Exists(commit string) bool { + for _, s := range c.commitIDs { + if s == commit { + return true + } + } + return false +} + +func (c *mockRevctrl) Subject(commit string) string { + for i, s := range c.commitIDs { + if s == commit { + return c.titles[i] + } + } + return "" +} + +func (c *mockRevctrl) Author(commit string) string { + return "" +} + +func (c *mockRevctrl) Date(commit string) string { + return "" +} + +func (c *mockRevctrl) Remove(commit string) error { + for i, s := range c.commitIDs { + if s == commit { + c.commitIDs = append(c.commitIDs[:i], c.commitIDs[i+1:]...) + c.titles = append(c.titles[:i], c.titles[i+1:]...) + // modify commitIDs to simulate a "real" change in + // commit history that will also change all subsequent + // commitIDs + for j := i; j < len(c.commitIDs); j++ { + c.commitIDs[j] += "_new" + } + return nil + } + } + return errNotFound +} + +func (c *mockRevctrl) ApplyCmd() string { + return "" +} + +type mockStore struct { + data map[string]models.Project + current string +} + +func (s *mockStore) StoreProject(p models.Project, ow bool) error { + _, ok := s.data[p.Name] + if ok && !ow { + return errors.New("alreay there") + } + s.data[p.Name] = p + return nil +} + +func (s *mockStore) DeleteProject(name string) error { + delete(s.data, name) + return nil +} + +func (s *mockStore) CurrentName() (string, error) { + return s.current, nil +} + +func (s *mockStore) SetCurrent(c string) error { + s.current = c + return nil +} + +func (s *mockStore) Current() (models.Project, error) { + return s.data[s.current], nil +} + +func (s *mockStore) Names() ([]string, error) { + var names []string + for name := range s.data { + names = append(names, name) + } + return names, nil +} + +func (s *mockStore) Projects() ([]models.Project, error) { + var ps []models.Project + for _, p := range s.data { + ps = append(ps, p) + } + return ps, nil +} |