🌳
pt0/donateapp/testsF/donateIpfsSuiteAI.mts
9const runDonateIpfsSuite = async (ctx: SuiteRunnerCtx): Promise<SuiteResult> => {
10 const skip = skipUnlessSmokeDeploy(ctx)
11 if (skip) return skip
12 assertDefined(ctx.baseUrl, {ctx})
13 const {baseUrl, singleTestName} = ctx
14 const {tests, test} = createTestCollector()
16 test('ipfs_cid: upload file via token', async () => {
17 const db = getReqKnex()
19 const orderResp = await gqlFetch({
20 baseUrl,
21 query: createDonaOrderGql,
22 variables: {input: {donaRefKind: 'ipfs_cid', amountUsd: 1, charityId: 'mockedfund', expectedUploadSizeMb: 1}},
23 })
24 if (orderResp.errors) return {passed: false, msg: `Order failed: ${orderResp.errors[0]?.message}`}
25 const orderId = orderResp.data.gmCreateDonaOrder.id
27 await mockPaymentForOrder({db, orderId, mockSenderAddr: getPeatScratchWallet().address})
29 const entry = await db('dona_entries').where({id: orderId}).first()
30 if (!entry.upload_token) return {passed: false, msg: 'upload_token not generated'}
31 const uploadToken = entry.upload_token
33 const pngBuffer = genTestPng('ipfs-upload-token')
35 const formData = new FormData()
36 formData.append('file', new Blob([pngBuffer], {type: 'image/png'}), 'test.png')
37 formData.append('entryId', orderId)
38 formData.append('uploadToken', uploadToken)
40 const uploadResp = await fetch(`${baseUrl}/api/upload`, {method: 'POST', body: formData, headers: {...getTestIpHeaders(), ...getTestExceptionHeaders()}})
41 if (uploadResp.status !== 200) {
42 const err = await uploadResp.json()
43 return {passed: false, msg: `Upload failed (${uploadResp.status}): ${err.error}`}
44 }
46 const result = await uploadResp.json()
47 if (!result.cid) return {passed: false, msg: 'No CID returned'}
49 const entryAfter = await db('dona_entries').where({id: orderId}).first()
50 if (!entryAfter.ipfs_cid) return {passed: false, msg: 'ipfs_cid not set after upload'}
51 if (entryAfter.ipfs_cid !== result.cid) return {passed: false, msg: `CID mismatch: ${entryAfter.ipfs_cid} vs ${result.cid}`}
52 if (entryAfter.upload_token) return {passed: false, msg: 'upload_token should be cleared after upload'}
54 const entryResp = await gqlFetch({
55 baseUrl,
56 query: `query($id: ID!) { gqDonaEntryById(id: $id) { pendingUpload ipfsCid } }`,
57 variables: {id: orderId},
58 })
59 const gqlEntry = entryResp.data?.gqDonaEntryById
60 if (gqlEntry?.pendingUpload) return {passed: false, msg: 'pendingUpload still true after upload'}
62 return {passed: true, msg: `CID=${result.cid.slice(0, 12)}...`}
63 })
65 return runTestsWithProgress({tests, suiteName: 'ipfs', singleTestName})
68export const donateIpfsSuiteConfig: SuiteConfig = {name: 'ipfs', runner: runDonateIpfsSuite, deps: ['db']}