aboutsummaryrefslogtreecommitdiffstats
path: root/lib/pama/pama_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'lib/pama/pama_test.go')
-rw-r--r--lib/pama/pama_test.go166
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
+}