@@ -10,7 +10,8 @@ import {
1010
1111const LIVE_TEST_TIMEOUT_MS = 60_000 ;
1212const mutationEnabled =
13- process . env . GMAIL_LIVE_TEST === "1" && process . env . GMAIL_LIVE_MUTATION_TEST === "1" ;
13+ process . env . GMAIL_LIVE_TEST === "1" &&
14+ process . env . GMAIL_LIVE_MUTATION_TEST === "1" ;
1415
1516if ( ! mutationEnabled ) {
1617 test . skip ( "Gmail mutations require GMAIL_LIVE_TEST=1 and GMAIL_LIVE_MUTATION_TEST=1" , ( ) => { } ) ;
@@ -33,112 +34,141 @@ if (!mutationEnabled) {
3334 }
3435 } ) ;
3536
36- test ( "creates and cleans up a draft, then restores fixture labels" , async ( ) => {
37- const signal = new AbortController ( ) . signal ;
38- const run = ( name : string , arguments_ : Record < string , unknown > ) =>
39- harness . tools . run (
40- { id : `live-${ name } ` , name, arguments : arguments_ } ,
41- signal ,
42- ) ;
43- const subject = `interchange-gmail-live-${ crypto . randomUUID ( ) } ` ;
44- draftSubjects . add ( subject ) ;
45-
46- const draftResult = await run ( "gmail_create_draft" , {
47- subject,
48- body : "Standalone Gmail live-test draft." ,
49- } ) ;
50- const draftId = getString ( toolData ( draftResult , "gmail_create_draft" ) , "id" ) ;
51- if ( draftId === undefined ) throw new Error ( "gmail_create_draft did not return an ID" ) ;
52-
53- const listDraftsResult = await run ( "gmail_list_drafts" , {
54- query : `subject:${ subject } ` ,
55- } ) ;
56- const drafts = getArray ( toolData ( listDraftsResult , "gmail_list_drafts" ) , "drafts" ) ?? [ ] ;
57- expect (
58- drafts . some (
59- ( draft ) => isRecord ( draft ) && getString ( draft , "id" ) === draftId ,
60- ) ,
61- ) . toBe ( true ) ;
62-
63- const originalMessage = await run ( "gmail_get_message" , {
64- messageId : harness . fixture . messageId ,
65- messageFormat : "METADATA_ONLY" ,
66- } ) ;
67- const messageWasStarred = ( getArray (
68- toolData ( originalMessage , "gmail_get_message" ) ,
69- "labelIds" ,
70- ) ?? [ ] ) . includes ( "STARRED" ) ;
37+ test (
38+ "creates and cleans up a draft, then restores fixture labels" ,
39+ async ( ) => {
40+ const signal = new AbortController ( ) . signal ;
41+ const run = ( name : string , arguments_ : Record < string , unknown > ) =>
42+ harness . tools . run (
43+ { id : `live-${ name } ` , name, arguments : arguments_ } ,
44+ signal ,
45+ ) ;
46+ const subject = `interchange-gmail-live-${ crypto . randomUUID ( ) } ` ;
47+ draftSubjects . add ( subject ) ;
7148
72- const originalThread = await run ( "gmail_get_thread" , {
73- threadId : harness . fixture . threadId ,
74- messageFormat : "METADATA_ONLY" ,
75- } ) ;
76- const originalMessages = getArray (
77- toolData ( originalThread , "gmail_get_thread" ) ,
78- "messages" ,
79- ) ?? [ ] ;
80- const originalMessageData = originalMessages [ 0 ] ;
81- const threadWasStarred =
82- isRecord ( originalMessageData ) &&
83- ( getArray ( originalMessageData , "labelIds" ) ?? [ ] ) . includes ( "STARRED" ) ;
49+ const draftResult = await run ( "gmail_create_draft" , {
50+ subject,
51+ body : "Standalone Gmail live-test draft." ,
52+ } ) ;
53+ const draftId = getString (
54+ toolData ( draftResult , "gmail_create_draft" ) ,
55+ "id" ,
56+ ) ;
57+ if ( draftId === undefined )
58+ throw new Error ( "gmail_create_draft did not return an ID" ) ;
8459
85- try {
86- const labelMessage = await run ( "gmail_label_message" , {
87- messageId : harness . fixture . messageId ,
88- labelIds : [ "STARRED" ] ,
60+ const listDraftsResult = await run ( "gmail_list_drafts" , {
61+ query : `subject:${ subject } ` ,
8962 } ) ;
63+ const drafts =
64+ getArray ( toolData ( listDraftsResult , "gmail_list_drafts" ) , "drafts" ) ??
65+ [ ] ;
9066 expect (
91- ( getArray ( toolData ( labelMessage , "gmail_label_message" ) , "labelIds" ) ?? [ ] ) . includes (
92- "STARRED" ,
67+ drafts . some (
68+ ( draft ) => isRecord ( draft ) && getString ( draft , "id" ) === draftId ,
9369 ) ,
9470 ) . toBe ( true ) ;
9571
96- const unlabelMessage = await run ( "gmail_unlabel_message " , {
72+ const originalMessage = await run ( "gmail_get_message " , {
9773 messageId : harness . fixture . messageId ,
98- labelIds : [ "STARRED" ] ,
74+ messageFormat : "METADATA_ONLY" ,
9975 } ) ;
100- expect (
101- ( getArray ( toolData ( unlabelMessage , "gmail_unlabel_message" ) , "labelIds" ) ?? [ ] ) . includes (
102- "STARRED" ,
103- ) ,
104- ) . toBe ( false ) ;
76+ const messageWasStarred = (
77+ getArray (
78+ toolData ( originalMessage , "gmail_get_message" ) ,
79+ "labelIds" ,
80+ ) ?? [ ]
81+ ) . includes ( "STARRED" ) ;
10582
106- const labelThread = await run ( "gmail_label_thread " , {
83+ const originalThread = await run ( "gmail_get_thread " , {
10784 threadId : harness . fixture . threadId ,
108- labelIds : [ "STARRED" ] ,
85+ messageFormat : "METADATA_ONLY" ,
10986 } ) ;
110- expect (
111- ( getArray ( toolData ( labelThread , "gmail_label_thread " ) , "messages" ) ?? [ ] ) . every (
112- ( message ) =>
113- isRecord ( message ) &&
114- ( getArray ( message , "labelIds" ) ?? [ ] ) . includes ( "STARRED" ) ,
115- ) ,
116- ) . toBe ( true ) ;
87+ const originalMessages =
88+ getArray ( toolData ( originalThread , "gmail_get_thread " ) , "messages" ) ??
89+ [ ] ;
90+ const originalMessageData = originalMessages [ 0 ] ;
91+ const threadWasStarred =
92+ isRecord ( originalMessageData ) &&
93+ ( getArray ( originalMessageData , "labelIds" ) ?? [ ] ) . includes ( "STARRED" ) ;
11794
118- const unlabelThread = await run ( "gmail_unlabel_thread" , {
119- threadId : harness . fixture . threadId ,
120- labelIds : [ "STARRED" ] ,
121- } ) ;
122- expect (
123- ( getArray ( toolData ( unlabelThread , "gmail_unlabel_thread" ) , "messages" ) ?? [ ] ) . every (
124- ( message ) =>
125- ! isRecord ( message ) ||
126- ! ( getArray ( message , "labelIds" ) ?? [ ] ) . includes ( "STARRED" ) ,
127- ) ,
128- ) . toBe ( true ) ;
129- } finally {
13095 try {
131- await run (
132- messageWasStarred ? "gmail_label_message" : "gmail_unlabel_message" ,
133- { messageId : harness . fixture . messageId , labelIds : [ "STARRED" ] } ,
134- ) ;
96+ const labelMessage = await run ( "gmail_label_message" , {
97+ messageId : harness . fixture . messageId ,
98+ labelIds : [ "STARRED" ] ,
99+ } ) ;
100+ expect (
101+ (
102+ getArray (
103+ toolData ( labelMessage , "gmail_label_message" ) ,
104+ "labelIds" ,
105+ ) ?? [ ]
106+ ) . includes ( "STARRED" ) ,
107+ ) . toBe ( true ) ;
108+
109+ const unlabelMessage = await run ( "gmail_unlabel_message" , {
110+ messageId : harness . fixture . messageId ,
111+ labelIds : [ "STARRED" ] ,
112+ } ) ;
113+ expect (
114+ (
115+ getArray (
116+ toolData ( unlabelMessage , "gmail_unlabel_message" ) ,
117+ "labelIds" ,
118+ ) ?? [ ]
119+ ) . includes ( "STARRED" ) ,
120+ ) . toBe ( false ) ;
121+
122+ const labelThread = await run ( "gmail_label_thread" , {
123+ threadId : harness . fixture . threadId ,
124+ labelIds : [ "STARRED" ] ,
125+ } ) ;
126+ expect (
127+ (
128+ getArray (
129+ toolData ( labelThread , "gmail_label_thread" ) ,
130+ "messages" ,
131+ ) ?? [ ]
132+ ) . every (
133+ ( message ) =>
134+ isRecord ( message ) &&
135+ ( getArray ( message , "labelIds" ) ?? [ ] ) . includes ( "STARRED" ) ,
136+ ) ,
137+ ) . toBe ( true ) ;
138+
139+ const unlabelThread = await run ( "gmail_unlabel_thread" , {
140+ threadId : harness . fixture . threadId ,
141+ labelIds : [ "STARRED" ] ,
142+ } ) ;
143+ expect (
144+ (
145+ getArray (
146+ toolData ( unlabelThread , "gmail_unlabel_thread" ) ,
147+ "messages" ,
148+ ) ?? [ ]
149+ ) . every (
150+ ( message ) =>
151+ ! isRecord ( message ) ||
152+ ! ( getArray ( message , "labelIds" ) ?? [ ] ) . includes ( "STARRED" ) ,
153+ ) ,
154+ ) . toBe ( true ) ;
135155 } finally {
136- await run (
137- threadWasStarred ? "gmail_label_thread" : "gmail_unlabel_thread" ,
138- { threadId : harness . fixture . threadId , labelIds : [ "STARRED" ] } ,
139- ) ;
156+ try {
157+ await run (
158+ messageWasStarred
159+ ? "gmail_label_message"
160+ : "gmail_unlabel_message" ,
161+ { messageId : harness . fixture . messageId , labelIds : [ "STARRED" ] } ,
162+ ) ;
163+ } finally {
164+ await run (
165+ threadWasStarred ? "gmail_label_thread" : "gmail_unlabel_thread" ,
166+ { threadId : harness . fixture . threadId , labelIds : [ "STARRED" ] } ,
167+ ) ;
168+ }
140169 }
141- }
142- } , LIVE_TEST_TIMEOUT_MS ) ;
170+ } ,
171+ LIVE_TEST_TIMEOUT_MS ,
172+ ) ;
143173 } ) ;
144174}
0 commit comments