1package imapserver
2
3import (
4 "testing"
5
6 "github.com/mjl-/mox/imapclient"
7)
8
9func TestExpunge(t *testing.T) {
10 testExpunge(t, false)
11}
12
13func TestExpungeUIDOnly(t *testing.T) {
14 testExpunge(t, true)
15}
16
17func testExpunge(t *testing.T, uidonly bool) {
18 defer mockUIDValidity()()
19 tc := start(t, uidonly)
20 defer tc.close()
21
22 tc2 := startNoSwitchboard(t, uidonly)
23 defer tc2.closeNoWait()
24
25 tc.login("mjl@mox.example", password0)
26 tc.client.Select("inbox")
27
28 tc2.login("mjl@mox.example", password0)
29 tc2.client.Select("inbox")
30
31 tc.transactf("bad", "expunge leftover") // Leftover data.
32 tc.transactf("ok", "expunge") // Nothing to remove though.
33 tc.xuntagged()
34
35 tc.client.Unselect()
36 tc.client.Examine("inbox")
37 tc.transactf("no", "expunge") // Read-only.
38 tc.transactf("no", "uid expunge 1") // Read-only.
39
40 tc.client.Unselect()
41 tc.client.Select("inbox")
42 tc.client.Append("inbox", makeAppend(exampleMsg))
43 tc.client.Append("inbox", makeAppend(exampleMsg))
44 tc.client.Append("inbox", makeAppend(exampleMsg))
45 tc.transactf("ok", "expunge") // Still nothing to remove.
46 tc.xuntagged()
47
48 tc.transactf("ok", `uid store 1,3 +flags.silent \Deleted`)
49
50 tc2.transactf("ok", "noop") // Drain.
51
52 tc.transactf("ok", "expunge")
53 if uidonly {
54 tc.xuntagged(imapclient.UntaggedVanished{UIDs: xparseNumSet("1,3")})
55 } else {
56 tc.xuntagged(imapclient.UntaggedExpunge(1), imapclient.UntaggedExpunge(2))
57 }
58
59 tc2.transactf("ok", "noop") // Drain.
60 if uidonly {
61 tc2.xuntagged(imapclient.UntaggedVanished{UIDs: xparseNumSet("1,3")})
62 } else {
63 tc2.xuntagged(imapclient.UntaggedExpunge(1), imapclient.UntaggedExpunge(2))
64 }
65
66 tc.transactf("ok", "expunge") // Nothing to remove anymore.
67 tc.xuntagged()
68
69 // Only UID 2 is still left. We'll add 3 more. Getting us to UIDs 2,4,5,6.
70 tc.client.Append("inbox", makeAppend(exampleMsg))
71 tc.client.Append("inbox", makeAppend(exampleMsg))
72 tc.client.Append("inbox", makeAppend(exampleMsg))
73
74 tc.transactf("bad", "uid expunge") // Missing uid set.
75 tc.transactf("bad", "uid expunge 1 leftover") // Leftover data.
76 tc.transactf("bad", "uid expunge 1 leftover") // Leftover data.
77
78 tc.transactf("ok", `uid store 2,4,6 +flags.silent \Deleted`)
79
80 tc.transactf("ok", "uid expunge 1")
81 tc.xuntagged() // No match.
82
83 tc2.transactf("ok", "noop") // Drain.
84
85 tc.transactf("ok", "uid expunge 4:6") // Removes UID 4,6 at seqs 2,4.
86 if uidonly {
87 tc.xuntagged(imapclient.UntaggedVanished{UIDs: xparseNumSet("4,6")})
88 } else {
89 tc.xuntagged(imapclient.UntaggedExpunge(2), imapclient.UntaggedExpunge(3))
90 }
91
92 tc2.transactf("ok", "noop")
93 if uidonly {
94 tc2.xuntagged(imapclient.UntaggedVanished{UIDs: xparseNumSet("4,6")})
95 } else {
96 tc2.xuntagged(imapclient.UntaggedExpunge(2), imapclient.UntaggedExpunge(3))
97 }
98}
99