also looking at this
feat: native trail maps and complete native mobile screens
#1017
60 files
+2505
-823
Review threads live on the whole diff, not on one commit, so none are shown here - a thread's line means something in the branch's final form, and painting it into an intermediate step would put it on code it is not about.
| @@ -58,7 +58,7 @@ export async function runNativeTrailE2e(): Promise<void> { formatting only | ||
| 58 | 58 | throw new Error('Native iOS QA requires a selectable recorded route profile.') |
| 59 | 59 | const endElevation=endpoint.ft===null ? 'elevation unavailable' : `${endpoint.ft} ft` |
| 60 | 60 | const review=`Native QA ${crypto.randomUUID().slice(0,8)}: clear signposts and a beautiful ridge.` |
| 61 | const edit=' Updated after a return visit.' | |
| 61 | const edit='Updated after a return visit.' | |
| 62 | 62 | const readReviews=async()=>{ |
| 63 | 63 | const response=await fetch(`${origin}/api/trails/${trail.id}/reviews`,{cache:'no-store'}) |
| 64 | 64 | if(!response.ok)throw new Error(`Reading persisted reviews failed: ${response.status}`) |
| @@ -88,7 +88,7 @@ export async function runNativeTrailE2e(): Promise<void> { | ||
| 88 | 88 | createdReviewId=rows[0].id |
| 89 | 89 | return new Response('PASS created review text and rating persisted') |
| 90 | 90 | } |
| 91 | if(rows[0].id!==createdReviewId || rows[0].rating!==4 || !rows[0].content.includes(edit.trim())) | |
| 91 | if(rows[0].id!==createdReviewId || rows[0].rating!==4 || rows[0].content!==edit) | |
| 92 | 92 | throw new Error('The native edit did not retain the review identity and persist its new text and rating.') |
| 93 | 93 | return new Response('PASS edited review retained its identity and persisted') |
| 94 | 94 | } |
| @@ -144,7 +144,10 @@ const reviews:SimulatorStep[] = [ | ||
| 144 | 144 | {command:'tapid',text:'trail-write-review'}, |
| 145 | 145 | {command:'expectid',text:'trail-review-composer',seconds:10}, |
| 146 | 146 | {command:'tapid',text:'trail-review-star-4'}, |
| 147 | {command:'typeid',id:'trail-review-content',text:input.edit}, | |
| 147 | {command:'longpressid',text:'trail-review-content'}, | |
| 148 | {command:'tap',text:'Select All'}, | |
| 149 | {command:'type',text:input.edit}, | |
| 150 | {command:'valueid',id:'trail-review-content',text:input.edit}, | |
| 148 | 151 | {command:'scrollto',text:'Save review'}, |
| 149 | 152 | {command:'tapid',text:'trail-review-submit'}, |
| 150 | 153 | {command:'expect',text:input.edit.trim(),seconds:15}, |
| @@ -183,7 +186,7 @@ const sharing:SimulatorStep[] = [ | ||
| 183 | 186 | {command:'expectid',text:'login-email',seconds:10}, |
| 184 | 187 | {command:'valueid',id:'login-email',text:''}, |
| 185 | 188 | {command:'longpressid',text:'login-email'}, |
| 186 | {command:'tapexact',text:'Paste'}, | |
| 189 | {command:'tap',text:'Paste'}, | |
| 187 | 190 | {command:'valueid',id:'login-email',text:`https://wildloop.org/trail/${input.trailId}`}, |
| 188 | 191 | {command:'shot',name:'native-shared-link-pasted'}, |
| 189 | 192 | {command:'tree',name:'native-shared-link-pasted'}, |