@volter/twin-gmail 0.0.0-stage → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +35 -2
- package/dist/generated/pack-facts.json +47 -0
- package/dist/journeys/customer-life.json +1013 -0
- package/dist/journeys/decisions.json +77 -0
- package/dist/journeys/demand.json +43 -0
- package/dist/journeys/first-use.json +24 -0
- package/dist/journeys/vendor-examples.json +7 -0
- package/dist/spec/SOURCE.md +13 -0
- package/dist/spec/rfc5321.txt +5323 -0
- package/dist/spec/sources.json +25 -0
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.js +19 -0
- package/dist/src/engine/mail.d.ts +19 -0
- package/dist/src/engine/mail.js +89 -0
- package/dist/src/fetch.d.ts +2 -0
- package/dist/src/fetch.js +18 -0
- package/dist/src/generated/surface.gen.json +1 -0
- package/dist/src/index.d.ts +6 -0
- package/dist/src/index.js +11 -0
- package/dist/src/manifest.d.ts +2 -0
- package/dist/src/manifest.js +68 -0
- package/dist/src/screens/home.d.ts +2 -0
- package/dist/src/screens/home.js +3 -0
- package/dist/src/screens/mail.d.ts +2 -0
- package/dist/src/screens/mail.js +142 -0
- package/dist/src/semantics/around.d.ts +2 -0
- package/dist/src/semantics/around.js +97 -0
- package/dist/src/semantics/index.d.ts +2 -0
- package/dist/src/semantics/index.js +1 -0
- package/dist/src/semantics/shared.d.ts +52 -0
- package/dist/src/semantics/shared.js +97 -0
- package/dist/src/semantics/states.d.ts +4 -0
- package/dist/src/semantics/states.js +33 -0
- package/dist/src/server.d.ts +9 -0
- package/dist/src/server.js +23 -0
- package/dist/src/stream.d.ts +2 -0
- package/dist/src/stream.js +10 -0
- package/generated/pack-facts.json +47 -0
- package/journeys/customer-life.json +1013 -0
- package/journeys/decisions.json +77 -0
- package/journeys/demand.json +43 -0
- package/journeys/first-use.json +24 -0
- package/journeys/vendor-examples.json +7 -0
- package/package.json +52 -4
- package/spec/SOURCE.md +13 -0
- package/spec/rfc5321.txt +5323 -0
- package/spec/sources.json +25 -0
- package/src/cli.ts +20 -0
- package/src/engine/mail.ts +76 -0
- package/src/fetch.ts +19 -0
- package/src/generated/surface.gen.json +1 -0
- package/src/index.ts +13 -0
- package/src/manifest.ts +86 -0
- package/src/screens/home.ts +6 -0
- package/src/screens/mail.ts +128 -0
- package/src/semantics/around.ts +91 -0
- package/src/semantics/index.ts +6 -0
- package/src/semantics/shared.ts +111 -0
- package/src/semantics/states.ts +41 -0
- package/src/server.ts +19 -0
- package/src/stream.ts +11 -0
|
@@ -0,0 +1,1013 @@
|
|
|
1
|
+
{
|
|
2
|
+
"vendor": "gmail",
|
|
3
|
+
"author": "Claude (VO-3832)",
|
|
4
|
+
"about": "Gmail's side of Harbourline's mail over seven weeks (journeys/customer-life.outline.md): its receiving server taking Rallly's mail from Harbourline's relay for two clients' Google accounts, refusing an address no account holds, another domain and a declared size over its limit, keeping a +tag address in the account it tags, and the webmail where each person reads only their own mail, signed in through Google.",
|
|
5
|
+
"companions": [
|
|
6
|
+
"googleoauth"
|
|
7
|
+
],
|
|
8
|
+
"steps": [
|
|
9
|
+
{
|
|
10
|
+
"name": "Before Harbourline's mail: Maya Okafor makes her Google account at Google's sign-up, and is signed in",
|
|
11
|
+
"method": "POST",
|
|
12
|
+
"path": "https://accounts.google.com/signup",
|
|
13
|
+
"headers": {
|
|
14
|
+
"content-type": "application/x-www-form-urlencoded"
|
|
15
|
+
},
|
|
16
|
+
"body": "email=maya.okafor%40gmail.com&password=Maya-Okafor-2026&given_name=Maya&family_name=Okafor",
|
|
17
|
+
"status": 200,
|
|
18
|
+
"expect": [
|
|
19
|
+
{
|
|
20
|
+
"path": "",
|
|
21
|
+
"contains": "maya.okafor@gmail.com"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"path": "",
|
|
25
|
+
"contains": "you are signed in"
|
|
26
|
+
}
|
|
27
|
+
]
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"name": "Tom Brennan makes his Google account the same way",
|
|
31
|
+
"method": "POST",
|
|
32
|
+
"path": "https://accounts.google.com/signup",
|
|
33
|
+
"headers": {
|
|
34
|
+
"content-type": "application/x-www-form-urlencoded"
|
|
35
|
+
},
|
|
36
|
+
"body": "email=tom.brennan%40gmail.com&password=Tom-Brennan-2026&given_name=Tom&family_name=Brennan",
|
|
37
|
+
"status": 200,
|
|
38
|
+
"expect": [
|
|
39
|
+
{
|
|
40
|
+
"path": "",
|
|
41
|
+
"contains": "tom.brennan@gmail.com"
|
|
42
|
+
}
|
|
43
|
+
]
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"name": "Monday 12 January, 09:00: Rallly's first poll is finalized, and Harbourline's relay hands its invitation to Gmail",
|
|
47
|
+
"wait": "16380m"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"name": "The relay connects to Gmail's receiving server and reads its greeting",
|
|
51
|
+
"on": "g1",
|
|
52
|
+
"connect": {},
|
|
53
|
+
"expect": [
|
|
54
|
+
{
|
|
55
|
+
"path": "code",
|
|
56
|
+
"equals": 220
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"path": "text",
|
|
60
|
+
"equals": "mx.google.com ESMTP - gsmtp"
|
|
61
|
+
}
|
|
62
|
+
]
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"name": "EHLO from the relay: what Gmail offers, and no AUTH or STARTTLS here",
|
|
66
|
+
"on": "g1",
|
|
67
|
+
"send": "EHLO relay.harbourline.be",
|
|
68
|
+
"status": 250,
|
|
69
|
+
"expect": [
|
|
70
|
+
{
|
|
71
|
+
"path": "lines.0",
|
|
72
|
+
"equals": "mx.google.com at your service"
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"path": "text",
|
|
76
|
+
"contains": "SIZE 157286400"
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"path": "text",
|
|
80
|
+
"contains": "8BITMIME"
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"path": "text",
|
|
84
|
+
"contains": "SMTPUTF8"
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"path": "text",
|
|
88
|
+
"notContains": "AUTH"
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"path": "text",
|
|
92
|
+
"notContains": "STARTTLS"
|
|
93
|
+
}
|
|
94
|
+
]
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
"name": "MAIL FROM the poll's sender, its size and 8-bit body declared",
|
|
98
|
+
"on": "g1",
|
|
99
|
+
"send": "MAIL FROM:<polls@harbourline.be> SIZE=1400 BODY=8BITMIME",
|
|
100
|
+
"status": 250,
|
|
101
|
+
"expect": [
|
|
102
|
+
{
|
|
103
|
+
"path": "text",
|
|
104
|
+
"equals": "2.1.0 OK - gsmtp"
|
|
105
|
+
}
|
|
106
|
+
]
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
"name": "RCPT TO Maya, whose Google account holds the address",
|
|
110
|
+
"on": "g1",
|
|
111
|
+
"send": "RCPT TO:<maya.okafor@gmail.com>",
|
|
112
|
+
"status": 250,
|
|
113
|
+
"expect": [
|
|
114
|
+
{
|
|
115
|
+
"path": "text",
|
|
116
|
+
"equals": "2.1.5 OK - gsmtp"
|
|
117
|
+
}
|
|
118
|
+
]
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
"name": "RCPT TO Tom, the same message's second recipient",
|
|
122
|
+
"on": "g1",
|
|
123
|
+
"send": "RCPT TO:<tom.brennan@gmail.com>",
|
|
124
|
+
"status": 250,
|
|
125
|
+
"expect": [
|
|
126
|
+
{
|
|
127
|
+
"path": "text",
|
|
128
|
+
"equals": "2.1.5 OK - gsmtp"
|
|
129
|
+
}
|
|
130
|
+
]
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
"name": "DATA",
|
|
134
|
+
"on": "g1",
|
|
135
|
+
"send": "DATA",
|
|
136
|
+
"status": 354,
|
|
137
|
+
"expect": [
|
|
138
|
+
{
|
|
139
|
+
"path": "text",
|
|
140
|
+
"equals": "Go ahead - gsmtp"
|
|
141
|
+
}
|
|
142
|
+
]
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
"name": "the invitation, its text and the calendar event Rallly attaches, then the dot",
|
|
146
|
+
"on": "g1",
|
|
147
|
+
"send": [
|
|
148
|
+
"From: Harbourline Polls <polls@harbourline.be>",
|
|
149
|
+
"To: maya.okafor@gmail.com, tom.brennan@gmail.com",
|
|
150
|
+
"Subject: Harbourline workshop: your date is set",
|
|
151
|
+
"Date: Mon, 12 Jan 2026 09:00:00 +0000",
|
|
152
|
+
"Message-ID: <wk1-final@meet.harbourline.be>",
|
|
153
|
+
"MIME-Version: 1.0",
|
|
154
|
+
"Content-Type: multipart/mixed; boundary=\"hl-final-1\"",
|
|
155
|
+
"",
|
|
156
|
+
"--hl-final-1",
|
|
157
|
+
"Content-Type: text/plain; charset=utf-8",
|
|
158
|
+
"Content-Transfer-Encoding: 7bit",
|
|
159
|
+
"",
|
|
160
|
+
"The workshop is on Thursday 22 January 2026 at 10:00.",
|
|
161
|
+
"",
|
|
162
|
+
"Add it to your calendar with the attached event.",
|
|
163
|
+
"",
|
|
164
|
+
"--hl-final-1",
|
|
165
|
+
"Content-Type: text/calendar; charset=utf-8; method=REQUEST; name=\"workshop.ics\"",
|
|
166
|
+
"Content-Disposition: attachment; filename=\"workshop.ics\"",
|
|
167
|
+
"Content-Transfer-Encoding: base64",
|
|
168
|
+
"",
|
|
169
|
+
"QkVHSU46VkNBTEVOREFSDQpWRVJTSU9OOjIuMA0KUFJPRElEOi0vL1JhbGxseS8vRU4NCk1FVEhPRDpSRVFVRVNUDQpCRUdJTjpWRVZFTlQNClVJRDp3azFAbWVldC5oYXJib3VybGluZS5iZQ0KRFRTVEFSVDoyMDI2MDEyMlQxMDAwMDBaDQpEVEVORDoyMDI2MDEyMlQxMjAwMDBaDQpTVU1NQVJZOkhhcmJvdXJsaW5lIHdvcmtzaG9wDQpFTkQ6VkVWRU5UDQpFTkQ6VkNBTEVOREFSDQo=",
|
|
170
|
+
"--hl-final-1--",
|
|
171
|
+
"."
|
|
172
|
+
],
|
|
173
|
+
"status": 250,
|
|
174
|
+
"expect": [
|
|
175
|
+
{
|
|
176
|
+
"path": "text",
|
|
177
|
+
"equals": "2.0.0 OK - gsmtp"
|
|
178
|
+
}
|
|
179
|
+
]
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
"name": "QUIT",
|
|
183
|
+
"on": "g1",
|
|
184
|
+
"send": "QUIT",
|
|
185
|
+
"status": 221,
|
|
186
|
+
"expect": [
|
|
187
|
+
{
|
|
188
|
+
"path": "text",
|
|
189
|
+
"equals": "2.0.0 closing connection - gsmtp"
|
|
190
|
+
}
|
|
191
|
+
]
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
"name": "Monday 12 January, 18:30: Maya reads her mail",
|
|
195
|
+
"wait": "570m"
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
"name": "Maya opens Gmail in a browser no Google account is signed in to: Gmail sends her to Google's sign-in, her inbox as the page to come back to",
|
|
199
|
+
"method": "GET",
|
|
200
|
+
"path": "https://mail.google.com/mail/u/0/",
|
|
201
|
+
"status": 302,
|
|
202
|
+
"expect": [
|
|
203
|
+
{
|
|
204
|
+
"path": "location",
|
|
205
|
+
"contains": "https://accounts.google.com/ServiceLogin?"
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
"path": "location",
|
|
209
|
+
"contains": "service=mail"
|
|
210
|
+
}
|
|
211
|
+
]
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
"name": "Maya signs in with the address and password the account was made with, and is returned to the inbox",
|
|
215
|
+
"method": "POST",
|
|
216
|
+
"path": "https://accounts.google.com/ServiceLogin",
|
|
217
|
+
"headers": {
|
|
218
|
+
"content-type": "application/x-www-form-urlencoded"
|
|
219
|
+
},
|
|
220
|
+
"body": "email=maya.okafor%40gmail.com&password=Maya-Okafor-2026&continue=https%3A%2F%2Fmail.google.com%2Fmail%2Fu%2F0%2F",
|
|
221
|
+
"status": 302,
|
|
222
|
+
"expect": [
|
|
223
|
+
{
|
|
224
|
+
"path": "location",
|
|
225
|
+
"equals": "https://mail.google.com/mail/u/0/"
|
|
226
|
+
}
|
|
227
|
+
],
|
|
228
|
+
"capture": {
|
|
229
|
+
"maya_sid": "header:set-cookie:SID=([^;]+)"
|
|
230
|
+
}
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
"name": "Her inbox: the invitation at the top, unread",
|
|
234
|
+
"method": "GET",
|
|
235
|
+
"path": "https://mail.google.com/mail/u/0/",
|
|
236
|
+
"headers": {
|
|
237
|
+
"cookie": "SID={maya_sid}"
|
|
238
|
+
},
|
|
239
|
+
"status": 200,
|
|
240
|
+
"expect": [
|
|
241
|
+
{
|
|
242
|
+
"path": "",
|
|
243
|
+
"contains": "Harbourline workshop: your date is set"
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
"path": "",
|
|
247
|
+
"contains": "class=\"row unread\""
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
"path": "",
|
|
251
|
+
"contains": "maya.okafor@gmail.com"
|
|
252
|
+
}
|
|
253
|
+
],
|
|
254
|
+
"capture": {
|
|
255
|
+
"maya_invite": "text:href=\"https://mail.google.com/mail/u/0/inbox/([^\"]+)\""
|
|
256
|
+
}
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
"name": "She opens it: sender, subject, both recipients, the body and the attached event",
|
|
260
|
+
"method": "GET",
|
|
261
|
+
"path": "https://mail.google.com/mail/u/0/inbox/{maya_invite}",
|
|
262
|
+
"headers": {
|
|
263
|
+
"cookie": "SID={maya_sid}"
|
|
264
|
+
},
|
|
265
|
+
"status": 200,
|
|
266
|
+
"expect": [
|
|
267
|
+
{
|
|
268
|
+
"path": "",
|
|
269
|
+
"contains": "Harbourline workshop: your date is set"
|
|
270
|
+
},
|
|
271
|
+
{
|
|
272
|
+
"path": "",
|
|
273
|
+
"contains": "maya.okafor@gmail.com, tom.brennan@gmail.com"
|
|
274
|
+
},
|
|
275
|
+
{
|
|
276
|
+
"path": "",
|
|
277
|
+
"contains": "Thursday 22 January 2026 at 10:00"
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
"path": "",
|
|
281
|
+
"contains": "workshop.ics"
|
|
282
|
+
}
|
|
283
|
+
]
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
"name": "She downloads the calendar event Rallly attached",
|
|
287
|
+
"method": "GET",
|
|
288
|
+
"path": "https://mail.google.com/mail/u/0/inbox/{maya_invite}/attachments/0",
|
|
289
|
+
"headers": {
|
|
290
|
+
"cookie": "SID={maya_sid}"
|
|
291
|
+
},
|
|
292
|
+
"status": 200,
|
|
293
|
+
"expect": [
|
|
294
|
+
{
|
|
295
|
+
"path": "",
|
|
296
|
+
"contains": "BEGIN:VCALENDAR"
|
|
297
|
+
},
|
|
298
|
+
{
|
|
299
|
+
"path": "",
|
|
300
|
+
"contains": "DTSTART:20260122T100000Z"
|
|
301
|
+
}
|
|
302
|
+
]
|
|
303
|
+
},
|
|
304
|
+
{
|
|
305
|
+
"name": "Wednesday 14 January, 10:00: a participant mistypes Tom's address on the next poll",
|
|
306
|
+
"wait": "2370m"
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
"name": "The relay connects",
|
|
310
|
+
"on": "g2",
|
|
311
|
+
"connect": {},
|
|
312
|
+
"expect": [
|
|
313
|
+
{
|
|
314
|
+
"path": "code",
|
|
315
|
+
"equals": 220
|
|
316
|
+
},
|
|
317
|
+
{
|
|
318
|
+
"path": "text",
|
|
319
|
+
"equals": "mx.google.com ESMTP - gsmtp"
|
|
320
|
+
}
|
|
321
|
+
]
|
|
322
|
+
},
|
|
323
|
+
{
|
|
324
|
+
"name": "EHLO from the relay: what Gmail offers, and no AUTH or STARTTLS here",
|
|
325
|
+
"on": "g2",
|
|
326
|
+
"send": "EHLO relay.harbourline.be",
|
|
327
|
+
"status": 250,
|
|
328
|
+
"expect": [
|
|
329
|
+
{
|
|
330
|
+
"path": "lines.0",
|
|
331
|
+
"equals": "mx.google.com at your service"
|
|
332
|
+
},
|
|
333
|
+
{
|
|
334
|
+
"path": "text",
|
|
335
|
+
"contains": "SIZE 157286400"
|
|
336
|
+
},
|
|
337
|
+
{
|
|
338
|
+
"path": "text",
|
|
339
|
+
"contains": "8BITMIME"
|
|
340
|
+
},
|
|
341
|
+
{
|
|
342
|
+
"path": "text",
|
|
343
|
+
"contains": "SMTPUTF8"
|
|
344
|
+
},
|
|
345
|
+
{
|
|
346
|
+
"path": "text",
|
|
347
|
+
"notContains": "AUTH"
|
|
348
|
+
},
|
|
349
|
+
{
|
|
350
|
+
"path": "text",
|
|
351
|
+
"notContains": "STARTTLS"
|
|
352
|
+
}
|
|
353
|
+
]
|
|
354
|
+
},
|
|
355
|
+
{
|
|
356
|
+
"name": "MAIL FROM the poll's sender",
|
|
357
|
+
"on": "g2",
|
|
358
|
+
"send": "MAIL FROM:<polls@harbourline.be> BODY=8BITMIME",
|
|
359
|
+
"status": 250,
|
|
360
|
+
"expect": [
|
|
361
|
+
{
|
|
362
|
+
"path": "text",
|
|
363
|
+
"equals": "2.1.0 OK - gsmtp"
|
|
364
|
+
}
|
|
365
|
+
]
|
|
366
|
+
},
|
|
367
|
+
{
|
|
368
|
+
"name": "RCPT TO the mistyped address: no Google account holds it",
|
|
369
|
+
"on": "g2",
|
|
370
|
+
"send": "RCPT TO:<tom.brenan@gmail.com>",
|
|
371
|
+
"status": 550,
|
|
372
|
+
"expect": [
|
|
373
|
+
{
|
|
374
|
+
"path": "text",
|
|
375
|
+
"equals": "5.1.1 The email account that you tried to reach does not exist. - gsmtp"
|
|
376
|
+
}
|
|
377
|
+
]
|
|
378
|
+
},
|
|
379
|
+
{
|
|
380
|
+
"name": "RCPT TO Maya, taken in the same transaction",
|
|
381
|
+
"on": "g2",
|
|
382
|
+
"send": "RCPT TO:<maya.okafor@gmail.com>",
|
|
383
|
+
"status": 250,
|
|
384
|
+
"expect": [
|
|
385
|
+
{
|
|
386
|
+
"path": "text",
|
|
387
|
+
"equals": "2.1.5 OK - gsmtp"
|
|
388
|
+
}
|
|
389
|
+
]
|
|
390
|
+
},
|
|
391
|
+
{
|
|
392
|
+
"name": "DATA, for the recipient Gmail took",
|
|
393
|
+
"on": "g2",
|
|
394
|
+
"send": "DATA",
|
|
395
|
+
"status": 354,
|
|
396
|
+
"expect": [
|
|
397
|
+
{
|
|
398
|
+
"path": "text",
|
|
399
|
+
"equals": "Go ahead - gsmtp"
|
|
400
|
+
}
|
|
401
|
+
]
|
|
402
|
+
},
|
|
403
|
+
{
|
|
404
|
+
"name": "the comment notification, then the dot",
|
|
405
|
+
"on": "g2",
|
|
406
|
+
"send": [
|
|
407
|
+
"From: Harbourline Polls <polls@harbourline.be>",
|
|
408
|
+
"To: maya.okafor@gmail.com, tom.brenan@gmail.com",
|
|
409
|
+
"Subject: New comment on the February workshop poll",
|
|
410
|
+
"Date: Wed, 14 Jan 2026 10:00:00 +0000",
|
|
411
|
+
"Message-ID: <wk2-comment@meet.harbourline.be>",
|
|
412
|
+
"MIME-Version: 1.0",
|
|
413
|
+
"Content-Type: text/plain; charset=utf-8",
|
|
414
|
+
"Content-Transfer-Encoding: 7bit",
|
|
415
|
+
"",
|
|
416
|
+
"A participant commented on the February workshop poll.",
|
|
417
|
+
"."
|
|
418
|
+
],
|
|
419
|
+
"status": 250,
|
|
420
|
+
"expect": [
|
|
421
|
+
{
|
|
422
|
+
"path": "text",
|
|
423
|
+
"equals": "2.0.0 OK - gsmtp"
|
|
424
|
+
}
|
|
425
|
+
]
|
|
426
|
+
},
|
|
427
|
+
{
|
|
428
|
+
"name": "QUIT",
|
|
429
|
+
"on": "g2",
|
|
430
|
+
"send": "QUIT",
|
|
431
|
+
"status": 221,
|
|
432
|
+
"expect": [
|
|
433
|
+
{
|
|
434
|
+
"path": "text",
|
|
435
|
+
"equals": "2.0.0 closing connection - gsmtp"
|
|
436
|
+
}
|
|
437
|
+
]
|
|
438
|
+
},
|
|
439
|
+
{
|
|
440
|
+
"name": "Monday 19 January, 09:00: Maya changes her Rallly address to maya.okafor+rallly@gmail.com, and Rallly mails it a confirmation",
|
|
441
|
+
"wait": "7140m"
|
|
442
|
+
},
|
|
443
|
+
{
|
|
444
|
+
"name": "The relay connects",
|
|
445
|
+
"on": "g3",
|
|
446
|
+
"connect": {},
|
|
447
|
+
"expect": [
|
|
448
|
+
{
|
|
449
|
+
"path": "code",
|
|
450
|
+
"equals": 220
|
|
451
|
+
},
|
|
452
|
+
{
|
|
453
|
+
"path": "text",
|
|
454
|
+
"equals": "mx.google.com ESMTP - gsmtp"
|
|
455
|
+
}
|
|
456
|
+
]
|
|
457
|
+
},
|
|
458
|
+
{
|
|
459
|
+
"name": "EHLO from the relay: what Gmail offers, and no AUTH or STARTTLS here",
|
|
460
|
+
"on": "g3",
|
|
461
|
+
"send": "EHLO relay.harbourline.be",
|
|
462
|
+
"status": 250,
|
|
463
|
+
"expect": [
|
|
464
|
+
{
|
|
465
|
+
"path": "lines.0",
|
|
466
|
+
"equals": "mx.google.com at your service"
|
|
467
|
+
},
|
|
468
|
+
{
|
|
469
|
+
"path": "text",
|
|
470
|
+
"contains": "SIZE 157286400"
|
|
471
|
+
},
|
|
472
|
+
{
|
|
473
|
+
"path": "text",
|
|
474
|
+
"contains": "8BITMIME"
|
|
475
|
+
},
|
|
476
|
+
{
|
|
477
|
+
"path": "text",
|
|
478
|
+
"contains": "SMTPUTF8"
|
|
479
|
+
},
|
|
480
|
+
{
|
|
481
|
+
"path": "text",
|
|
482
|
+
"notContains": "AUTH"
|
|
483
|
+
},
|
|
484
|
+
{
|
|
485
|
+
"path": "text",
|
|
486
|
+
"notContains": "STARTTLS"
|
|
487
|
+
}
|
|
488
|
+
]
|
|
489
|
+
},
|
|
490
|
+
{
|
|
491
|
+
"name": "MAIL FROM Rallly's sender",
|
|
492
|
+
"on": "g3",
|
|
493
|
+
"send": "MAIL FROM:<polls@harbourline.be> BODY=8BITMIME",
|
|
494
|
+
"status": 250,
|
|
495
|
+
"expect": [
|
|
496
|
+
{
|
|
497
|
+
"path": "text",
|
|
498
|
+
"equals": "2.1.0 OK - gsmtp"
|
|
499
|
+
}
|
|
500
|
+
]
|
|
501
|
+
},
|
|
502
|
+
{
|
|
503
|
+
"name": "RCPT TO Maya's tagged address: Gmail holds it for the account it tags",
|
|
504
|
+
"on": "g3",
|
|
505
|
+
"send": "RCPT TO:<maya.okafor+rallly@gmail.com>",
|
|
506
|
+
"status": 250,
|
|
507
|
+
"expect": [
|
|
508
|
+
{
|
|
509
|
+
"path": "text",
|
|
510
|
+
"equals": "2.1.5 OK - gsmtp"
|
|
511
|
+
}
|
|
512
|
+
]
|
|
513
|
+
},
|
|
514
|
+
{
|
|
515
|
+
"name": "DATA",
|
|
516
|
+
"on": "g3",
|
|
517
|
+
"send": "DATA",
|
|
518
|
+
"status": 354,
|
|
519
|
+
"expect": [
|
|
520
|
+
{
|
|
521
|
+
"path": "text",
|
|
522
|
+
"equals": "Go ahead - gsmtp"
|
|
523
|
+
}
|
|
524
|
+
]
|
|
525
|
+
},
|
|
526
|
+
{
|
|
527
|
+
"name": "the confirmation, then the dot",
|
|
528
|
+
"on": "g3",
|
|
529
|
+
"send": [
|
|
530
|
+
"From: Rallly <polls@harbourline.be>",
|
|
531
|
+
"To: maya.okafor+rallly@gmail.com",
|
|
532
|
+
"Subject: Verify your new email address",
|
|
533
|
+
"Date: Mon, 19 Jan 2026 09:00:00 +0000",
|
|
534
|
+
"Message-ID: <verify-maya@meet.harbourline.be>",
|
|
535
|
+
"MIME-Version: 1.0",
|
|
536
|
+
"Content-Type: text/plain; charset=utf-8",
|
|
537
|
+
"Content-Transfer-Encoding: 7bit",
|
|
538
|
+
"",
|
|
539
|
+
"Confirm maya.okafor+rallly@gmail.com as your Rallly email address: https://meet.harbourline.be/api/user/verify-email-change?token=c41f",
|
|
540
|
+
"."
|
|
541
|
+
],
|
|
542
|
+
"status": 250,
|
|
543
|
+
"expect": [
|
|
544
|
+
{
|
|
545
|
+
"path": "text",
|
|
546
|
+
"equals": "2.0.0 OK - gsmtp"
|
|
547
|
+
}
|
|
548
|
+
]
|
|
549
|
+
},
|
|
550
|
+
{
|
|
551
|
+
"name": "QUIT",
|
|
552
|
+
"on": "g3",
|
|
553
|
+
"send": "QUIT",
|
|
554
|
+
"status": 221,
|
|
555
|
+
"expect": [
|
|
556
|
+
{
|
|
557
|
+
"path": "text",
|
|
558
|
+
"equals": "2.0.0 closing connection - gsmtp"
|
|
559
|
+
}
|
|
560
|
+
]
|
|
561
|
+
},
|
|
562
|
+
{
|
|
563
|
+
"name": "Monday 19 January, 09:20: Maya looks for the confirmation",
|
|
564
|
+
"wait": "20m"
|
|
565
|
+
},
|
|
566
|
+
{
|
|
567
|
+
"name": "Maya opens Gmail in a browser no Google account is signed in to: Gmail sends her to Google's sign-in, her inbox as the page to come back to",
|
|
568
|
+
"method": "GET",
|
|
569
|
+
"path": "https://mail.google.com/mail/u/0/",
|
|
570
|
+
"status": 302,
|
|
571
|
+
"expect": [
|
|
572
|
+
{
|
|
573
|
+
"path": "location",
|
|
574
|
+
"contains": "https://accounts.google.com/ServiceLogin?"
|
|
575
|
+
},
|
|
576
|
+
{
|
|
577
|
+
"path": "location",
|
|
578
|
+
"contains": "service=mail"
|
|
579
|
+
}
|
|
580
|
+
]
|
|
581
|
+
},
|
|
582
|
+
{
|
|
583
|
+
"name": "Maya signs in with the address and password the account was made with, and is returned to the inbox",
|
|
584
|
+
"method": "POST",
|
|
585
|
+
"path": "https://accounts.google.com/ServiceLogin",
|
|
586
|
+
"headers": {
|
|
587
|
+
"content-type": "application/x-www-form-urlencoded"
|
|
588
|
+
},
|
|
589
|
+
"body": "email=maya.okafor%40gmail.com&password=Maya-Okafor-2026&continue=https%3A%2F%2Fmail.google.com%2Fmail%2Fu%2F0%2F",
|
|
590
|
+
"status": 302,
|
|
591
|
+
"expect": [
|
|
592
|
+
{
|
|
593
|
+
"path": "location",
|
|
594
|
+
"equals": "https://mail.google.com/mail/u/0/"
|
|
595
|
+
}
|
|
596
|
+
],
|
|
597
|
+
"capture": {
|
|
598
|
+
"maya_sid2": "header:set-cookie:SID=([^;]+)"
|
|
599
|
+
}
|
|
600
|
+
},
|
|
601
|
+
{
|
|
602
|
+
"name": "It is in her own inbox, above the earlier mail",
|
|
603
|
+
"method": "GET",
|
|
604
|
+
"path": "https://mail.google.com/mail/u/0/",
|
|
605
|
+
"headers": {
|
|
606
|
+
"cookie": "SID={maya_sid2}"
|
|
607
|
+
},
|
|
608
|
+
"status": 200,
|
|
609
|
+
"expect": [
|
|
610
|
+
{
|
|
611
|
+
"path": "",
|
|
612
|
+
"matches": "Verify your new email address.*New comment on the February workshop poll.*Harbourline workshop: your date is set"
|
|
613
|
+
}
|
|
614
|
+
],
|
|
615
|
+
"capture": {
|
|
616
|
+
"maya_verify": "text:href=\"https://mail.google.com/mail/u/0/inbox/([^\"]+)\""
|
|
617
|
+
}
|
|
618
|
+
},
|
|
619
|
+
{
|
|
620
|
+
"name": "She opens it: sent to her tagged address, with the link she follows",
|
|
621
|
+
"method": "GET",
|
|
622
|
+
"path": "https://mail.google.com/mail/u/0/inbox/{maya_verify}",
|
|
623
|
+
"headers": {
|
|
624
|
+
"cookie": "SID={maya_sid2}"
|
|
625
|
+
},
|
|
626
|
+
"status": 200,
|
|
627
|
+
"expect": [
|
|
628
|
+
{
|
|
629
|
+
"path": "",
|
|
630
|
+
"contains": "maya.okafor+rallly@gmail.com"
|
|
631
|
+
},
|
|
632
|
+
{
|
|
633
|
+
"path": "",
|
|
634
|
+
"contains": "https://meet.harbourline.be/api/user/verify-email-change?token=c41f"
|
|
635
|
+
}
|
|
636
|
+
]
|
|
637
|
+
},
|
|
638
|
+
{
|
|
639
|
+
"name": "Tuesday 3 February, 11:00: Wout tests a relay rule that wrongly routes Harbourline's own domain to Gmail",
|
|
640
|
+
"wait": "20260m"
|
|
641
|
+
},
|
|
642
|
+
{
|
|
643
|
+
"name": "The relay connects",
|
|
644
|
+
"on": "g4",
|
|
645
|
+
"connect": {},
|
|
646
|
+
"expect": [
|
|
647
|
+
{
|
|
648
|
+
"path": "code",
|
|
649
|
+
"equals": 220
|
|
650
|
+
},
|
|
651
|
+
{
|
|
652
|
+
"path": "text",
|
|
653
|
+
"equals": "mx.google.com ESMTP - gsmtp"
|
|
654
|
+
}
|
|
655
|
+
]
|
|
656
|
+
},
|
|
657
|
+
{
|
|
658
|
+
"name": "EHLO from the relay: what Gmail offers, and no AUTH or STARTTLS here",
|
|
659
|
+
"on": "g4",
|
|
660
|
+
"send": "EHLO relay.harbourline.be",
|
|
661
|
+
"status": 250,
|
|
662
|
+
"expect": [
|
|
663
|
+
{
|
|
664
|
+
"path": "lines.0",
|
|
665
|
+
"equals": "mx.google.com at your service"
|
|
666
|
+
},
|
|
667
|
+
{
|
|
668
|
+
"path": "text",
|
|
669
|
+
"contains": "SIZE 157286400"
|
|
670
|
+
},
|
|
671
|
+
{
|
|
672
|
+
"path": "text",
|
|
673
|
+
"contains": "8BITMIME"
|
|
674
|
+
},
|
|
675
|
+
{
|
|
676
|
+
"path": "text",
|
|
677
|
+
"contains": "SMTPUTF8"
|
|
678
|
+
},
|
|
679
|
+
{
|
|
680
|
+
"path": "text",
|
|
681
|
+
"notContains": "AUTH"
|
|
682
|
+
},
|
|
683
|
+
{
|
|
684
|
+
"path": "text",
|
|
685
|
+
"notContains": "STARTTLS"
|
|
686
|
+
}
|
|
687
|
+
]
|
|
688
|
+
},
|
|
689
|
+
{
|
|
690
|
+
"name": "MAIL FROM Harbourline's alerts",
|
|
691
|
+
"on": "g4",
|
|
692
|
+
"send": "MAIL FROM:<alerts@harbourline.be>",
|
|
693
|
+
"status": 250,
|
|
694
|
+
"expect": [
|
|
695
|
+
{
|
|
696
|
+
"path": "text",
|
|
697
|
+
"equals": "2.1.0 OK - gsmtp"
|
|
698
|
+
}
|
|
699
|
+
]
|
|
700
|
+
},
|
|
701
|
+
{
|
|
702
|
+
"name": "RCPT TO an address at harbourline.be: Gmail relays for no one, and refuses it",
|
|
703
|
+
"on": "g4",
|
|
704
|
+
"send": "RCPT TO:<ops@harbourline.be>",
|
|
705
|
+
"status": 550
|
|
706
|
+
},
|
|
707
|
+
{
|
|
708
|
+
"name": "QUIT",
|
|
709
|
+
"on": "g4",
|
|
710
|
+
"send": "QUIT",
|
|
711
|
+
"status": 221,
|
|
712
|
+
"expect": [
|
|
713
|
+
{
|
|
714
|
+
"path": "text",
|
|
715
|
+
"equals": "2.0.0 closing connection - gsmtp"
|
|
716
|
+
}
|
|
717
|
+
]
|
|
718
|
+
},
|
|
719
|
+
{
|
|
720
|
+
"name": "Monday 16 February, 14:00: an admin export larger than Gmail takes",
|
|
721
|
+
"wait": "18900m"
|
|
722
|
+
},
|
|
723
|
+
{
|
|
724
|
+
"name": "The relay connects",
|
|
725
|
+
"on": "g5",
|
|
726
|
+
"connect": {},
|
|
727
|
+
"expect": [
|
|
728
|
+
{
|
|
729
|
+
"path": "code",
|
|
730
|
+
"equals": 220
|
|
731
|
+
},
|
|
732
|
+
{
|
|
733
|
+
"path": "text",
|
|
734
|
+
"equals": "mx.google.com ESMTP - gsmtp"
|
|
735
|
+
}
|
|
736
|
+
]
|
|
737
|
+
},
|
|
738
|
+
{
|
|
739
|
+
"name": "EHLO from the relay: what Gmail offers, and no AUTH or STARTTLS here",
|
|
740
|
+
"on": "g5",
|
|
741
|
+
"send": "EHLO relay.harbourline.be",
|
|
742
|
+
"status": 250,
|
|
743
|
+
"expect": [
|
|
744
|
+
{
|
|
745
|
+
"path": "lines.0",
|
|
746
|
+
"equals": "mx.google.com at your service"
|
|
747
|
+
},
|
|
748
|
+
{
|
|
749
|
+
"path": "text",
|
|
750
|
+
"contains": "SIZE 157286400"
|
|
751
|
+
},
|
|
752
|
+
{
|
|
753
|
+
"path": "text",
|
|
754
|
+
"contains": "8BITMIME"
|
|
755
|
+
},
|
|
756
|
+
{
|
|
757
|
+
"path": "text",
|
|
758
|
+
"contains": "SMTPUTF8"
|
|
759
|
+
},
|
|
760
|
+
{
|
|
761
|
+
"path": "text",
|
|
762
|
+
"notContains": "AUTH"
|
|
763
|
+
},
|
|
764
|
+
{
|
|
765
|
+
"path": "text",
|
|
766
|
+
"notContains": "STARTTLS"
|
|
767
|
+
}
|
|
768
|
+
]
|
|
769
|
+
},
|
|
770
|
+
{
|
|
771
|
+
"name": "MAIL FROM with a declared size above the 157,286,400 bytes Gmail advertised: refused before any data",
|
|
772
|
+
"on": "g5",
|
|
773
|
+
"send": "MAIL FROM:<polls@harbourline.be> SIZE=209715200",
|
|
774
|
+
"status": 552,
|
|
775
|
+
"expect": [
|
|
776
|
+
{
|
|
777
|
+
"path": "text",
|
|
778
|
+
"equals": "5.3.4 Your message exceeded Google's message size limits. - gsmtp"
|
|
779
|
+
}
|
|
780
|
+
]
|
|
781
|
+
},
|
|
782
|
+
{
|
|
783
|
+
"name": "QUIT",
|
|
784
|
+
"on": "g5",
|
|
785
|
+
"send": "QUIT",
|
|
786
|
+
"status": 221,
|
|
787
|
+
"expect": [
|
|
788
|
+
{
|
|
789
|
+
"path": "text",
|
|
790
|
+
"equals": "2.0.0 closing connection - gsmtp"
|
|
791
|
+
}
|
|
792
|
+
]
|
|
793
|
+
},
|
|
794
|
+
{
|
|
795
|
+
"name": "Monday 2 March, 09:00: the March poll's reminder goes to Tom",
|
|
796
|
+
"wait": "19860m"
|
|
797
|
+
},
|
|
798
|
+
{
|
|
799
|
+
"name": "The relay connects",
|
|
800
|
+
"on": "g6",
|
|
801
|
+
"connect": {},
|
|
802
|
+
"expect": [
|
|
803
|
+
{
|
|
804
|
+
"path": "code",
|
|
805
|
+
"equals": 220
|
|
806
|
+
},
|
|
807
|
+
{
|
|
808
|
+
"path": "text",
|
|
809
|
+
"equals": "mx.google.com ESMTP - gsmtp"
|
|
810
|
+
}
|
|
811
|
+
]
|
|
812
|
+
},
|
|
813
|
+
{
|
|
814
|
+
"name": "EHLO from the relay: what Gmail offers, and no AUTH or STARTTLS here",
|
|
815
|
+
"on": "g6",
|
|
816
|
+
"send": "EHLO relay.harbourline.be",
|
|
817
|
+
"status": 250,
|
|
818
|
+
"expect": [
|
|
819
|
+
{
|
|
820
|
+
"path": "lines.0",
|
|
821
|
+
"equals": "mx.google.com at your service"
|
|
822
|
+
},
|
|
823
|
+
{
|
|
824
|
+
"path": "text",
|
|
825
|
+
"contains": "SIZE 157286400"
|
|
826
|
+
},
|
|
827
|
+
{
|
|
828
|
+
"path": "text",
|
|
829
|
+
"contains": "8BITMIME"
|
|
830
|
+
},
|
|
831
|
+
{
|
|
832
|
+
"path": "text",
|
|
833
|
+
"contains": "SMTPUTF8"
|
|
834
|
+
},
|
|
835
|
+
{
|
|
836
|
+
"path": "text",
|
|
837
|
+
"notContains": "AUTH"
|
|
838
|
+
},
|
|
839
|
+
{
|
|
840
|
+
"path": "text",
|
|
841
|
+
"notContains": "STARTTLS"
|
|
842
|
+
}
|
|
843
|
+
]
|
|
844
|
+
},
|
|
845
|
+
{
|
|
846
|
+
"name": "MAIL FROM the poll's sender",
|
|
847
|
+
"on": "g6",
|
|
848
|
+
"send": "MAIL FROM:<polls@harbourline.be> BODY=8BITMIME",
|
|
849
|
+
"status": 250,
|
|
850
|
+
"expect": [
|
|
851
|
+
{
|
|
852
|
+
"path": "text",
|
|
853
|
+
"equals": "2.1.0 OK - gsmtp"
|
|
854
|
+
}
|
|
855
|
+
]
|
|
856
|
+
},
|
|
857
|
+
{
|
|
858
|
+
"name": "RCPT TO Tom",
|
|
859
|
+
"on": "g6",
|
|
860
|
+
"send": "RCPT TO:<tom.brennan@gmail.com>",
|
|
861
|
+
"status": 250,
|
|
862
|
+
"expect": [
|
|
863
|
+
{
|
|
864
|
+
"path": "text",
|
|
865
|
+
"equals": "2.1.5 OK - gsmtp"
|
|
866
|
+
}
|
|
867
|
+
]
|
|
868
|
+
},
|
|
869
|
+
{
|
|
870
|
+
"name": "DATA",
|
|
871
|
+
"on": "g6",
|
|
872
|
+
"send": "DATA",
|
|
873
|
+
"status": 354,
|
|
874
|
+
"expect": [
|
|
875
|
+
{
|
|
876
|
+
"path": "text",
|
|
877
|
+
"equals": "Go ahead - gsmtp"
|
|
878
|
+
}
|
|
879
|
+
]
|
|
880
|
+
},
|
|
881
|
+
{
|
|
882
|
+
"name": "the reminder, then the dot",
|
|
883
|
+
"on": "g6",
|
|
884
|
+
"send": [
|
|
885
|
+
"From: Harbourline Polls <polls@harbourline.be>",
|
|
886
|
+
"To: tom.brennan@gmail.com",
|
|
887
|
+
"Subject: Reminder: vote on the March workshop dates",
|
|
888
|
+
"Date: Mon, 2 Mar 2026 09:00:00 +0000",
|
|
889
|
+
"Message-ID: <wk3-reminder@meet.harbourline.be>",
|
|
890
|
+
"MIME-Version: 1.0",
|
|
891
|
+
"Content-Type: text/plain; charset=utf-8",
|
|
892
|
+
"Content-Transfer-Encoding: 7bit",
|
|
893
|
+
"",
|
|
894
|
+
"You have not voted on the March workshop dates yet: https://meet.harbourline.be/invite/wk3",
|
|
895
|
+
"."
|
|
896
|
+
],
|
|
897
|
+
"status": 250,
|
|
898
|
+
"expect": [
|
|
899
|
+
{
|
|
900
|
+
"path": "text",
|
|
901
|
+
"equals": "2.0.0 OK - gsmtp"
|
|
902
|
+
}
|
|
903
|
+
]
|
|
904
|
+
},
|
|
905
|
+
{
|
|
906
|
+
"name": "QUIT",
|
|
907
|
+
"on": "g6",
|
|
908
|
+
"send": "QUIT",
|
|
909
|
+
"status": 221,
|
|
910
|
+
"expect": [
|
|
911
|
+
{
|
|
912
|
+
"path": "text",
|
|
913
|
+
"equals": "2.0.0 closing connection - gsmtp"
|
|
914
|
+
}
|
|
915
|
+
]
|
|
916
|
+
},
|
|
917
|
+
{
|
|
918
|
+
"name": "Monday 2 March, 19:00: Tom reads his mail for the first time since January",
|
|
919
|
+
"wait": "600m"
|
|
920
|
+
},
|
|
921
|
+
{
|
|
922
|
+
"name": "Tom opens Gmail in a browser no Google account is signed in to: Gmail sends him to Google's sign-in, his inbox as the page to come back to",
|
|
923
|
+
"method": "GET",
|
|
924
|
+
"path": "https://mail.google.com/mail/u/0/",
|
|
925
|
+
"status": 302,
|
|
926
|
+
"expect": [
|
|
927
|
+
{
|
|
928
|
+
"path": "location",
|
|
929
|
+
"contains": "https://accounts.google.com/ServiceLogin?"
|
|
930
|
+
},
|
|
931
|
+
{
|
|
932
|
+
"path": "location",
|
|
933
|
+
"contains": "service=mail"
|
|
934
|
+
}
|
|
935
|
+
]
|
|
936
|
+
},
|
|
937
|
+
{
|
|
938
|
+
"name": "Tom signs in with the address and password the account was made with, and is returned to the inbox",
|
|
939
|
+
"method": "POST",
|
|
940
|
+
"path": "https://accounts.google.com/ServiceLogin",
|
|
941
|
+
"headers": {
|
|
942
|
+
"content-type": "application/x-www-form-urlencoded"
|
|
943
|
+
},
|
|
944
|
+
"body": "email=tom.brennan%40gmail.com&password=Tom-Brennan-2026&continue=https%3A%2F%2Fmail.google.com%2Fmail%2Fu%2F0%2F",
|
|
945
|
+
"status": 302,
|
|
946
|
+
"expect": [
|
|
947
|
+
{
|
|
948
|
+
"path": "location",
|
|
949
|
+
"equals": "https://mail.google.com/mail/u/0/"
|
|
950
|
+
}
|
|
951
|
+
],
|
|
952
|
+
"capture": {
|
|
953
|
+
"tom_sid": "header:set-cookie:SID=([^;]+)"
|
|
954
|
+
}
|
|
955
|
+
},
|
|
956
|
+
{
|
|
957
|
+
"name": "His inbox, newest first: the reminder, then January's invitation; nothing of the mistyped address's",
|
|
958
|
+
"method": "GET",
|
|
959
|
+
"path": "https://mail.google.com/mail/u/0/",
|
|
960
|
+
"headers": {
|
|
961
|
+
"cookie": "SID={tom_sid}"
|
|
962
|
+
},
|
|
963
|
+
"status": 200,
|
|
964
|
+
"expect": [
|
|
965
|
+
{
|
|
966
|
+
"path": "",
|
|
967
|
+
"matches": "Reminder: vote on the March workshop dates.*Harbourline workshop: your date is set"
|
|
968
|
+
},
|
|
969
|
+
{
|
|
970
|
+
"path": "",
|
|
971
|
+
"notContains": "New comment on the February workshop poll"
|
|
972
|
+
},
|
|
973
|
+
{
|
|
974
|
+
"path": "",
|
|
975
|
+
"notContains": "Verify your new email address"
|
|
976
|
+
}
|
|
977
|
+
],
|
|
978
|
+
"capture": {
|
|
979
|
+
"tom_reminder": "text:href=\"https://mail.google.com/mail/u/0/inbox/([^\"]+)\""
|
|
980
|
+
}
|
|
981
|
+
},
|
|
982
|
+
{
|
|
983
|
+
"name": "He opens the reminder",
|
|
984
|
+
"method": "GET",
|
|
985
|
+
"path": "https://mail.google.com/mail/u/0/inbox/{tom_reminder}",
|
|
986
|
+
"headers": {
|
|
987
|
+
"cookie": "SID={tom_sid}"
|
|
988
|
+
},
|
|
989
|
+
"status": 200,
|
|
990
|
+
"expect": [
|
|
991
|
+
{
|
|
992
|
+
"path": "",
|
|
993
|
+
"contains": "You have not voted on the March workshop dates yet"
|
|
994
|
+
}
|
|
995
|
+
]
|
|
996
|
+
},
|
|
997
|
+
{
|
|
998
|
+
"name": "Maya had shared the link to her copy of January's invitation; in Tom's mailbox it names nothing",
|
|
999
|
+
"method": "GET",
|
|
1000
|
+
"path": "https://mail.google.com/mail/u/0/inbox/{maya_invite}",
|
|
1001
|
+
"headers": {
|
|
1002
|
+
"cookie": "SID={tom_sid}"
|
|
1003
|
+
},
|
|
1004
|
+
"status": 404,
|
|
1005
|
+
"expect": [
|
|
1006
|
+
{
|
|
1007
|
+
"path": "",
|
|
1008
|
+
"contains": "That message could not be found."
|
|
1009
|
+
}
|
|
1010
|
+
]
|
|
1011
|
+
}
|
|
1012
|
+
]
|
|
1013
|
+
}
|