File: sequence_range_test.go

package info (click to toggle)
golang-github-protonmail-gluon 0.17.0-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 16,020 kB
  • sloc: sh: 55; makefile: 5
file content (151 lines) | stat: -rw-r--r-- 4,724 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
package tests

import (
	"testing"
)

func TestSequenceRange(t *testing.T) {
	runOneToOneTestWithAuth(t, defaultServerOptions(t), func(c *testConnection, _ *testSession) {
		c.C("a001 CREATE mbox1")
		c.S("a001 OK CREATE")
		c.C("a002 CREATE mbox2")
		c.S("a002 OK CREATE")
		c.C(`A003 SELECT mbox1`)
		c.Se(`A003 OK [READ-WRITE] SELECT`)

		// return BAD for any sequence range in an empty mailbox
		c.C(`A004 FETCH 1 (FLAGS)`).BAD(`A004`)
		c.C(`A005 FETCH * (FLAGS)`).BAD(`A005`)
		c.C(`A006 FETCH 1:* (FLAGS)`).BAD(`A006`)

		c.doAppend(`mbox1`, buildRFC5322TestLiteral(`To: 1@pm.me`)).expect("OK")
		c.doAppend(`mbox1`, buildRFC5322TestLiteral(`To: 2@pm.me`)).expect("OK")
		c.doAppend(`mbox1`, buildRFC5322TestLiteral(`To: 3@pm.me`)).expect("OK")
		c.doAppend(`mbox1`, buildRFC5322TestLiteral(`To: 4@pm.me`)).expect("OK")
		c.doAppend(`mbox1`, buildRFC5322TestLiteral(`To: 5@pm.me`)).expect("OK")

		// test various set of ranges with STORE, FETCH, MOVE & COPY
		c.C(`A007 FETCH 1 (FLAGS)`)
		c.Sx(`\* 1 FETCH`)
		c.OK(`A007`)
		c.C(`A008 FETCH 6 (FLAGS)`).BAD(`A008`)
		c.C(`A009 FETCH 1,3:4 (FLAGS)`)
		for i := 0; i < 3; i++ {
			c.Sx(`\* \d FETCH`)
		}
		c.OK(`A009`)
		c.C(`A010 STORE 1,2,3,4 +FLAGS (flag)`)
		for i := 0; i < 4; i++ {
			c.Sx(`\* \d FETCH \(FLAGS \(\\Recent flag\)\)`)
		}
		c.OK(`A010`)
		c.C(`A011 COPY 1,3:* mbox2`)
		c.OK(`A011`)
		c.C(`A012 COPY 6:* mbox2`).BAD(`A012`)
		c.C(`A012 COPY 6:* mbox2`).BAD(`A012`)
		c.C(`A013 MOVE 1,5,3 mbox2`)
		c.Sx(`\* OK \[COPYUID`)
		for i := 0; i < 3; i++ {
			c.Sx(`\* \d EXPUNGE`)
		}
		c.OK(`A013`)

		// test ranges given in reverse order
		c.doAppend(`mbox1`, buildRFC5322TestLiteral(`To: 6@pm.me`)).expect("OK")
		c.doAppend(`mbox1`, buildRFC5322TestLiteral(`To: 7@pm.me`)).expect("OK")
		c.C(`A014 STORE 4:2 -FLAGS (flag)`)
		c.Sx(`\* 2 FETCH `) // 2 was the only message in 4:2 to have flag set
		c.OK(`A014`)
		c.C(`A015 COPY *:1 mbox2`)
		c.OK(`A015`)
		c.C(`A016 COPY 7:5 mbox2`).BAD(`A016`)
		c.C(`A017 COPY 4:3,2:1 mbox2`)
		c.OK(`A017`)
	})
}

func TestUIDSequenceRange(t *testing.T) {
	runOneToOneTestWithAuth(t, defaultServerOptions(t), func(c *testConnection, _ *testSession) {
		// UID based operation will send an OK response for any grammatically valid UID sequence set
		// if no message match the UID sequence set, the operations simply return OK with no untagged response before.

		c.C("a001 CREATE mbox1")
		c.S("a001 OK CREATE")
		c.C("a002 CREATE mbox2")
		c.S("a002 OK CREATE")
		c.C(`A003 SELECT mbox1`)
		c.Se(`A003 OK [READ-WRITE] SELECT`)

		// return OK for any UID sequence range in an empty mailbox
		c.C(`A004 UID FETCH 1 (FLAGS)`)
		c.OK(`A004`)
		c.C(`A005 UID FETCH * (FLAGS)`)
		c.OK(`A005`)
		c.C(`A006 UID FETCH 1:* (FLAGS)`)
		c.OK(`A006`)

		c.doAppend(`mbox1`, buildRFC5322TestLiteral(`To: 1@pm.me`)).expect("OK")
		c.doAppend(`mbox1`, buildRFC5322TestLiteral(`To: 2@pm.me`)).expect("OK")
		c.doAppend(`mbox1`, buildRFC5322TestLiteral(`To: 3@pm.me`)).expect("OK")
		c.doAppend(`mbox1`, buildRFC5322TestLiteral(`To: 4@pm.me`)).expect("OK")
		c.doAppend(`mbox1`, buildRFC5322TestLiteral(`To: 5@pm.me`)).expect("OK")

		//// test various set of ranges with STORE, FETCH, MOVE & COPY
		c.C(`A007 UID FETCH 1 (FLAGS)`)
		c.Sx(`\* 1 FETCH`)
		c.OK(`A007`)
		c.C(`A008 UID FETCH 6 (FLAGS)`)
		c.OK(`A008`)
		c.C(`A009 UID FETCH 1,3:4 (FLAGS)`)
		for i := 0; i < 3; i++ {
			c.Sx(`\* \d FETCH .*`)
		}
		c.OK(`A009`)
		c.C(`A010 UID STORE 1,2,3,4 +FLAGS (flag)`)
		for i := 0; i < 4; i++ {
			c.Sx(`\* \d FETCH \(FLAGS \(\\Recent flag\) UID \d\)`)
		}
		c.OK(`A010`)
		c.C(`A011 UID COPY 1,3:* mbox2`)
		c.OK(`A011`)
		c.C(`A012 UID COPY 6:* mbox2`)
		c.OK(`A012`)
		c.C(`A012 UID COPY 1:* mbox2`)
		c.Sx(`A012 OK \[COPYUID`)
		c.C(`A013 UID MOVE 1,5,3 mbox2`)
		c.Sx(`\* OK \[COPYUID`)
		for i := 0; i < 3; i++ {
			c.Sx(`\* \d EXPUNGE`)
		}
		c.OK(`A013`)

		// test ranges given in reverse order
		c.doAppend(`mbox1`, buildRFC5322TestLiteral(`To: 6@pm.me`)).expect("OK")
		c.doAppend(`mbox1`, buildRFC5322TestLiteral(`To: 7@pm.me`)).expect("OK")
		c.C(`A014 UID STORE 4:2 -FLAGS (flag)`)
		for i := 0; i < 2; i++ {
			c.Sx(`\* \d FETCH`)
		}
		c.OK(`A014`)
		c.C(`A015 UID COPY *:1 mbox2`)
		c.OK(`A015`)
		c.C(`A016 UID COPY 7:5 mbox2`)
		c.OK(`A016`)
		c.C(`A017 UID COPY 4:3,1,2:1 mbox2`)
		c.OK(`A017`)
	})
}

func TestWildcard(t *testing.T) {
	runOneToOneTestWithAuth(t, defaultServerOptions(t), func(c *testConnection, _ *testSession) {
		// Create an empty mailbox.
		c.C("tag create mbox").OK("tag")
		c.C("tag select mbox").OK("tag")

		// FETCH with wildcard returns BAD.
		c.C("tag fetch * (flags)").BAD("tag")

		// UID FETCH with wildcard returns OK.
		c.C("tag uid fetch * (flags)").OK("tag")
	})
}