1package imapserver
2
3import (
4 "testing"
5
6 "github.com/mjl-/mox/imapclient"
7)
8
9func TestDelete(t *testing.T) {
10 testDelete(t, false)
11}
12
13func TestDeleteUIDOnly(t *testing.T) {
14 testDelete(t, false)
15}
16
17func testDelete(t *testing.T, uidonly bool) {
18 tc := start(t, uidonly)
19 defer tc.close()
20
21 tc2 := startNoSwitchboard(t, uidonly)
22 defer tc2.closeNoWait()
23
24 tc3 := startNoSwitchboard(t, uidonly)
25 defer tc3.closeNoWait()
26
27 tc.login("mjl@mox.example", password0)
28 tc2.login("mjl@mox.example", password0)
29 tc3.login("mjl@mox.example", password0)
30
31 tc.transactf("bad", "delete") // Missing mailbox.
32 tc.transactf("no", "delete inbox") // Cannot delete inbox.
33 tc.transactf("no", "delete nonexistent") // Cannot delete mailbox that does not exist.
34 tc.transactf("no", `delete "nonexistent"`) // Again, with quoted string syntax.
35 tc.transactf("no", `delete "expungebox"`) // Already removed.
36
37 tc.client.Subscribe("x")
38 tc.transactf("no", "delete x") // Subscription does not mean there is a mailbox that can be deleted.
39
40 tc.client.Create("a/b", nil)
41 tc2.transactf("ok", "noop") // Drain changes.
42 tc3.transactf("ok", "noop")
43
44 // ../rfc/9051:2000
45 tc.transactf("no", "delete a") // Still has child.
46 tc.xcodeWord("HASCHILDREN")
47
48 tc3.client.Enable(imapclient.CapIMAP4rev2) // For \NonExistent support.
49 tc.transactf("ok", "delete a/b")
50 tc2.transactf("ok", "noop")
51 tc2.xuntagged() // No IMAP4rev2, no \NonExistent.
52 tc3.transactf("ok", "noop")
53 tc3.xuntagged(imapclient.UntaggedList{Flags: []string{`\NonExistent`}, Separator: '/', Mailbox: "a/b"})
54
55 tc.transactf("no", "delete a/b") // Already removed.
56 tc.transactf("ok", "delete a") // Parent can now be removed.
57 tc.transactf("ok", `list (subscribed) "" (a/b a) return (subscribed)`)
58 // Subscriptions still exist.
59 tc.xuntagged(
60 imapclient.UntaggedList{Flags: []string{`\Subscribed`, `\NonExistent`}, Separator: '/', Mailbox: "a"},
61 imapclient.UntaggedList{Flags: []string{`\Subscribed`, `\NonExistent`}, Separator: '/', Mailbox: "a/b"},
62 )
63
64 // Let's try again with a message present.
65 tc.client.Create("msgs", nil)
66 tc.client.Append("msgs", makeAppend(exampleMsg))
67 tc.transactf("ok", "delete msgs")
68
69 // Delete for inbox/* is allowed.
70 tc.client.Create("inbox/a", nil)
71 tc.transactf("ok", "delete inbox/a")
72
73}
74