1package imapserver
2
3import (
4 "strings"
5 "testing"
6
7 "github.com/mjl-/mox/imapclient"
8)
9
10func TestSelect(t *testing.T) {
11 testSelectExamine(t, false, false)
12}
13
14func TestExamine(t *testing.T) {
15 testSelectExamine(t, true, false)
16}
17
18func TestSelectUIDOnly(t *testing.T) {
19 testSelectExamine(t, false, true)
20}
21
22func TestExamineUIDOnly(t *testing.T) {
23 testSelectExamine(t, true, true)
24}
25
26// select and examine are pretty much the same. but examine opens readonly instead of readwrite.
27func testSelectExamine(t *testing.T, examine, uidonly bool) {
28 defer mockUIDValidity()()
29 tc := start(t, uidonly)
30 defer tc.close()
31
32 tc.login("mjl@mox.example", password0)
33
34 cmd := "select"
35 okcode := "READ-WRITE"
36 if examine {
37 cmd = "examine"
38 okcode = "READ-ONLY"
39 }
40
41 uclosed := imapclient.UntaggedResult{Status: imapclient.OK, Code: imapclient.CodeWord("CLOSED"), Text: "x"}
42 flags := strings.Split(`\Seen \Answered \Flagged \Deleted \Draft $Forwarded $Junk $NotJunk $Phishing $MDNSent`, " ")
43 permflags := strings.Split(`\Seen \Answered \Flagged \Deleted \Draft $Forwarded $Junk $NotJunk $Phishing $MDNSent \*`, " ")
44 uflags := imapclient.UntaggedFlags(flags)
45 upermflags := imapclient.UntaggedResult{Status: imapclient.OK, Code: imapclient.CodePermanentFlags(permflags), Text: "x"}
46 urecent := imapclient.UntaggedRecent(0)
47 uexists0 := imapclient.UntaggedExists(0)
48 uexists1 := imapclient.UntaggedExists(1)
49 uuidval1 := imapclient.UntaggedResult{Status: imapclient.OK, Code: imapclient.CodeUIDValidity(1), Text: "x"}
50 uuidnext1 := imapclient.UntaggedResult{Status: imapclient.OK, Code: imapclient.CodeUIDNext(1), Text: "x"}
51 ulist := imapclient.UntaggedList{Separator: '/', Mailbox: "Inbox"}
52 uunseen := imapclient.UntaggedResult{Status: imapclient.OK, Code: imapclient.CodeUnseen(1), Text: "x"}
53 uuidnext2 := imapclient.UntaggedResult{Status: imapclient.OK, Code: imapclient.CodeUIDNext(2), Text: "x"}
54
55 // Parameter required.
56 tc.transactf("bad", "%s", cmd)
57
58 // Mailbox does not exist.
59 tc.transactf("no", "%s bogus", cmd)
60 tc.transactf("no", "%s expungebox", cmd)
61
62 tc.transactf("ok", "%s inbox", cmd)
63 tc.xuntagged(uflags, upermflags, urecent, uexists0, uuidval1, uuidnext1, ulist)
64 tc.xcodeWord(okcode)
65
66 tc.transactf("ok", `%s "inbox"`, cmd)
67 tc.xuntagged(uclosed, uflags, upermflags, urecent, uexists0, uuidval1, uuidnext1, ulist)
68 tc.xcodeWord(okcode)
69
70 // Append a message. It will be reported as UNSEEN.
71 tc.client.Append("inbox", makeAppend(exampleMsg))
72 tc.transactf("ok", "%s inbox", cmd)
73 if uidonly {
74 tc.xuntagged(uclosed, uflags, upermflags, urecent, uexists1, uuidval1, uuidnext2, ulist)
75 } else {
76 tc.xuntagged(uclosed, uflags, upermflags, urecent, uunseen, uexists1, uuidval1, uuidnext2, ulist)
77 }
78 tc.xcodeWord(okcode)
79
80 // With imap4rev2, we no longer get untagged RECENT or untagged UNSEEN.
81 tc.client.Enable(imapclient.CapIMAP4rev2)
82 tc.transactf("ok", "%s inbox", cmd)
83 tc.xuntagged(uclosed, uflags, upermflags, uexists1, uuidval1, uuidnext2, ulist)
84 tc.xcodeWord(okcode)
85}
86