From 2c6aacd1fd1c6563a48a8dc3507fa51acf68605d Mon Sep 17 00:00:00 2001
From: miles-grant-ibigroup <miles.grant@ibigroup.com>
Date: Tue, 29 Aug 2023 16:19:20 -0400
Subject: [PATCH 01/13] fix(batch ui): OTP2 fare support

---
 lib/components/narrative/default/default-itinerary.js | 8 ++++----
 lib/util/state.js                                     | 6 ++++--
 2 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/lib/components/narrative/default/default-itinerary.js b/lib/components/narrative/default/default-itinerary.js
index f7f98e49c..bfbf25518 100644
--- a/lib/components/narrative/default/default-itinerary.js
+++ b/lib/components/narrative/default/default-itinerary.js
@@ -20,8 +20,8 @@ import {
   getAccessibilityScoreForItinerary,
   itineraryHasAccessibilityScores
 } from '../../../util/accessibility-routing'
+import { getFare, getTotalFare } from '../../../util/state'
 import { getFirstLegStartTime } from '../../../util/itinerary'
-import { getTotalFare } from '../../../util/state'
 import { Icon, StyledIconWrapperTextAlign } from '../../util/styledIcon'
 import { localizeGradationMap } from '../utils'
 import FieldTripGroupSize from '../../admin/field-trip-itinerary-group-size'
@@ -121,7 +121,7 @@ const ITINERARY_ATTRIBUTES = [
     id: 'cost',
     order: 2,
     render: (itinerary, options, defaultFareType) => {
-      const fare = getTotalFare(itinerary, options.configCosts, defaultFareType)
+      const fare = getFare(itinerary, defaultFareType)
       const currency = getItineraryCost(
         itinerary.legs,
         defaultFareType.mediumId,
@@ -142,11 +142,11 @@ const ITINERARY_ATTRIBUTES = [
       return (
         <FormattedNumber
           // Currency from itinerary fare or from config.
-          currency={currency.code}
+          currency={fare.fareCurrency}
           currencyDisplay="narrowSymbol"
           // eslint-disable-next-line react/style-prop-object
           style="currency"
-          value={fare}
+          value={fare.transitFare + fare.maxTNCFare}
         />
       )
     }
diff --git a/lib/util/state.js b/lib/util/state.js
index 1d2f35f15..c25b0b615 100644
--- a/lib/util/state.js
+++ b/lib/util/state.js
@@ -99,8 +99,10 @@ export function getTotalFare(
   let drivingCost = 0
   let hasBikeshare = false
   let transitFareNotProvided = false
+  let rideHailTrip = false
   itinerary.legs.forEach((leg) => {
-    if (leg.mode === 'CAR') {
+    rideHailTrip = rideHailTrip || leg?.rideHailingEstimate
+    if (leg.mode === 'CAR' && !rideHailTrip) {
       // Convert meters to miles and multiple by cost per mile.
       drivingCost += leg.distance * 0.000621371 * costs.drivingCentsPerMile
     }
@@ -121,7 +123,7 @@ export function getTotalFare(
   if (transitFareNotProvided) return null
   const bikeshareCost = hasBikeshare ? costs.bikeshareTripCostCents : 0
   // If some leg uses driving, add parking cost to the total.
-  if (drivingCost > 0) drivingCost += costs.carParkingCostCents
+  if (drivingCost > 0 && !rideHailTrip) drivingCost += costs.carParkingCostCents
   return bikeshareCost + drivingCost + transitFare + maxTNCFare * 100
 }
 

From dc40b6eee60f212327afdedca7af652cf8493d32 Mon Sep 17 00:00:00 2001
From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com>
Date: Thu, 7 Sep 2023 17:36:52 -0400
Subject: [PATCH 02/13] ci(percy): Use sep key for calltaker, take mobile snaps
 in non-calltaker test.

---
 .github/workflows/percy.yml | 14 +++---
 percy/percy.test.js         | 85 +++++++++++++++++++------------------
 2 files changed, 48 insertions(+), 51 deletions(-)

diff --git a/.github/workflows/percy.yml b/.github/workflows/percy.yml
index ae53907d2..957eafc81 100644
--- a/.github/workflows/percy.yml
+++ b/.github/workflows/percy.yml
@@ -32,18 +32,13 @@ jobs:
         env:
           YAML_CONFIG: /tmp/otp2config.yml
           JS_CONFIG: ./percy/har-mock-config.js
-      - name: Take Percy Snapshots (Desktop)
+      - name: Take Percy Snapshots (Desktop + Mobile)
         run: npx percy exec -- npx jest percy/percy.test.js --force-exit
         env:
           PERCY_TOKEN: ${{ secrets.PERCY_TOKEN_OTP2 }}
-          OTP_RR_UI_MODE: desktop
-      - name: Take Percy Snapshots (Mobile)
-        run: npx percy exec -- npx jest percy/percy.test.js --force-exit
-        env:
-          PERCY_TOKEN: ${{ secrets.PERCY_TOKEN_OTP2 }}
-          OTP_RR_UI_MODE: mobile
-      # Calltaker has a separate config file, so another build should be produced.
+          OTP_RR_UI_MODE: normal
       - name: Build OTP-RR Calltaker
+        # Calltaker has a separate config file, so another build should be produced.
         run: yarn build
         env:
           YAML_CONFIG: /tmp/otp2config.yml
@@ -51,5 +46,6 @@ jobs:
       - name: Take Percy Snapshots (Calltaker)
         run: npx percy exec -- npx jest percy/percy.test.js --force-exit
         env:
-          PERCY_TOKEN: ${{ secrets.PERCY_TOKEN_OTP2 }}
+          # Calltaker has a separate key because the calltaker-specific snapshots are different.
+          PERCY_TOKEN: ${{ secrets.PERCY_TOKEN_CALL_TAKER_OTP2 }}
           OTP_RR_UI_MODE: calltaker
diff --git a/percy/percy.test.js b/percy/percy.test.js
index 462419dcb..9c62e92e7 100644
--- a/percy/percy.test.js
+++ b/percy/percy.test.js
@@ -357,7 +357,49 @@ async function executeTest(page, isMobile, isCallTaker) {
   }
 }
 
-if (OTP_RR_UI_MODE === 'mobile') {
+test('OTP-RR Desktop', async () => {
+  const page = await loadPath('/')
+  await page.setViewport({
+    height: 1080,
+    width: 1920
+  })
+  page.on('console', async (msg) => {
+    const args = await msg.args()
+    args.forEach(async (arg) => {
+      const val = await arg.jsonValue()
+      // value is serializable
+      if (JSON.stringify(val) !== JSON.stringify({})) console.log(val)
+      // value is unserializable (or an empty oject)
+      else {
+        const { description, subtype, type } = arg._remoteObject
+        console.log(
+          `type: ${type}, subtype: ${subtype}, description:\n ${description}`
+        )
+      }
+    })
+  })
+  // log all errors that were logged to the browser console
+  page.on('warn', (warn) => {
+    console.log(warn)
+  })
+  page.on('error', (error) => {
+    console.error(error)
+    console.error(error.stack)
+  })
+  // log all uncaught exceptions
+  page.on('pageerror', (error) => {
+    console.error(`Page Error: ${error}`)
+  })
+  // log all failed requests
+  page.on('requestfailed', (req) => {
+    console.error(`Request failed: ${req.method()} ${req.url()}`)
+  })
+
+  await executeTest(page, false, OTP_RR_UI_MODE === 'calltaker')
+})
+
+if (OTP_RR_UI_MODE !== 'calltaker') {
+  // Non-calltaker test runs both mobile and desktop test.
   test('OTP-RR Mobile', async () => {
     const page = await loadPath('/')
     await page.setUserAgent('android')
@@ -371,45 +413,4 @@ if (OTP_RR_UI_MODE === 'mobile') {
     // Execute the rest of the test
     await executeTest(page, true, false)
   })
-} else {
-  test('OTP-RR Desktop', async () => {
-    const page = await loadPath('/')
-    await page.setViewport({
-      height: 1080,
-      width: 1920
-    })
-    page.on('console', async (msg) => {
-      const args = await msg.args()
-      args.forEach(async (arg) => {
-        const val = await arg.jsonValue()
-        // value is serializable
-        if (JSON.stringify(val) !== JSON.stringify({})) console.log(val)
-        // value is unserializable (or an empty oject)
-        else {
-          const { description, subtype, type } = arg._remoteObject
-          console.log(
-            `type: ${type}, subtype: ${subtype}, description:\n ${description}`
-          )
-        }
-      })
-    })
-    // log all errors that were logged to the browser console
-    page.on('warn', (warn) => {
-      console.log(warn)
-    })
-    page.on('error', (error) => {
-      console.error(error)
-      console.error(error.stack)
-    })
-    // log all uncaught exceptions
-    page.on('pageerror', (error) => {
-      console.error(`Page Error: ${error}`)
-    })
-    // log all failed requests
-    page.on('requestfailed', (req) => {
-      console.error(`Request failed: ${req.method()} ${req.url()}`)
-    })
-
-    await executeTest(page, false, OTP_RR_UI_MODE === 'calltaker')
-  })
 }

From 4b7acc1668f63f8a06e7cc5491abb22319991c80 Mon Sep 17 00:00:00 2001
From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com>
Date: Fri, 8 Sep 2023 12:22:05 -0400
Subject: [PATCH 03/13] test(percy): Create and use mock geocoder responses for
 calltaker.

---
 percy/geocoder-mock.har | 793 ++++++++++++++++++++++++++++++++++++++++
 percy/percy.test.js     |  16 +-
 2 files changed, 808 insertions(+), 1 deletion(-)
 create mode 100644 percy/geocoder-mock.har

diff --git a/percy/geocoder-mock.har b/percy/geocoder-mock.har
new file mode 100644
index 000000000..6d9e46391
--- /dev/null
+++ b/percy/geocoder-mock.har
@@ -0,0 +1,793 @@
+{
+  "log": {
+    "version": "1.2",
+    "creator": {
+      "name": "WebInspector",
+      "version": "537.36"
+    },
+    "pages": [],
+    "entries": [
+      {
+        "request": {
+          "method": "GET",
+          "url": "http://localhost:9977/autocomplete?text=a&layers=address%2Cvenue%2Cstreet%2Cintersection&focus.point.lat=33.749&focus.point.lon=-84.388&boundary.rect.min_lat=32.066&boundary.rect.min_lon=-86.0856&boundary.rect.max_lat=35.7251&boundary.rect.max_lon=-81.9499",
+          "httpVersion": "http/2.0",
+          "queryString": [
+            {
+              "name": "text",
+              "value": "a"
+            },
+            {
+              "name": "layers",
+              "value": "address%2Cvenue%2Cstreet%2Cintersection"
+            },
+            {
+              "name": "focus.point.lat",
+              "value": "33.749"
+            },
+            {
+              "name": "focus.point.lon",
+              "value": "-84.388"
+            },
+            {
+              "name": "boundary.rect.min_lat",
+              "value": "32.066"
+            },
+            {
+              "name": "boundary.rect.min_lon",
+              "value": "-86.0856"
+            },
+            {
+              "name": "boundary.rect.max_lat",
+              "value": "35.7251"
+            },
+            {
+              "name": "boundary.rect.max_lon",
+              "value": "-81.9499"
+            }
+          ],
+          "headersSize": -1,
+          "bodySize": 0
+        },
+        "response": {
+          "status": 200,
+          "statusText": "",
+          "httpVersion": "http/2.0",
+          "content": {
+            "size": 11710,
+            "mimeType": "application/json",
+            "text": ""
+          },
+          "redirectURL": "",
+          "headersSize": -1,
+          "bodySize": -1,
+          "_transferSize": 12109,
+          "_error": null
+        },
+        "serverIPAddress": "[64:ff9b::d21:40f]",
+        "startedDateTime": "2023-09-08T13:53:49.885Z",
+        "time": 449.04499999984364,
+        "timings": {
+          "blocked": 2.153000000224507,
+          "dns": 86.366,
+          "ssl": 73.93199999999999,
+          "connect": 192.28,
+          "send": 7.209000000000003,
+          "wait": 160.31799999995653,
+          "receive": 0.7189999996626284,
+          "_blocked_queueing": 1.352000000224507
+        }
+      },
+      {
+        "request": {
+          "method": "GET",
+          "url": "http://localhost:9977/autocomplete?text=ar&layers=address%2Cvenue%2Cstreet%2Cintersection&focus.point.lat=33.749&focus.point.lon=-84.388&boundary.rect.min_lat=32.066&boundary.rect.min_lon=-86.0856&boundary.rect.max_lat=35.7251&boundary.rect.max_lon=-81.9499",
+          "httpVersion": "http/2.0",
+          "queryString": [
+            {
+              "name": "text",
+              "value": "ar"
+            },
+            {
+              "name": "layers",
+              "value": "address%2Cvenue%2Cstreet%2Cintersection"
+            },
+            {
+              "name": "focus.point.lat",
+              "value": "33.749"
+            },
+            {
+              "name": "focus.point.lon",
+              "value": "-84.388"
+            },
+            {
+              "name": "boundary.rect.min_lat",
+              "value": "32.066"
+            },
+            {
+              "name": "boundary.rect.min_lon",
+              "value": "-86.0856"
+            },
+            {
+              "name": "boundary.rect.max_lat",
+              "value": "35.7251"
+            },
+            {
+              "name": "boundary.rect.max_lon",
+              "value": "-81.9499"
+            }
+          ],
+          "headersSize": -1,
+          "bodySize": 0
+        },
+        "response": {
+          "status": 200,
+          "statusText": "",
+          "httpVersion": "http/2.0",
+          "content": {
+            "size": 10681,
+            "mimeType": "application/json",
+            "text": ""
+          },
+          "redirectURL": "",
+          "headersSize": -1,
+          "bodySize": -1,
+          "_transferSize": 11081,
+          "_error": null
+        },
+        "serverIPAddress": "[64:ff9b::d21:40f]",
+        "startedDateTime": "2023-09-08T13:53:49.902Z",
+        "time": 804.0409999994154,
+        "timings": {
+          "blocked": 181.69800000018896,
+          "dns": -1,
+          "ssl": -1,
+          "connect": -1,
+          "send": 3.2079999999999984,
+          "wait": 618.41899999967,
+          "receive": 0.7159999995565158,
+          "_blocked_queueing": 1.231000000188942
+        }
+      },
+      {
+        "request": {
+          "method": "GET",
+          "url": "http://localhost:9977/autocomplete?text=art&layers=address%2Cvenue%2Cstreet%2Cintersection&focus.point.lat=33.749&focus.point.lon=-84.388&boundary.rect.min_lat=32.066&boundary.rect.min_lon=-86.0856&boundary.rect.max_lat=35.7251&boundary.rect.max_lon=-81.9499",
+          "httpVersion": "http/2.0",
+          "queryString": [
+            {
+              "name": "text",
+              "value": "art"
+            },
+            {
+              "name": "layers",
+              "value": "address%2Cvenue%2Cstreet%2Cintersection"
+            },
+            {
+              "name": "focus.point.lat",
+              "value": "33.749"
+            },
+            {
+              "name": "focus.point.lon",
+              "value": "-84.388"
+            },
+            {
+              "name": "boundary.rect.min_lat",
+              "value": "32.066"
+            },
+            {
+              "name": "boundary.rect.min_lon",
+              "value": "-86.0856"
+            },
+            {
+              "name": "boundary.rect.max_lat",
+              "value": "35.7251"
+            },
+            {
+              "name": "boundary.rect.max_lon",
+              "value": "-81.9499"
+            }
+          ],
+          "headersSize": -1,
+          "bodySize": 0
+        },
+        "response": {
+          "status": 200,
+          "statusText": "",
+          "httpVersion": "http/2.0",
+          "content": {
+            "size": 10853,
+            "mimeType": "application/json",
+            "text": ""
+          },
+          "redirectURL": "",
+          "headersSize": -1,
+          "bodySize": -1,
+          "_transferSize": 11253,
+          "_error": null
+        },
+        "serverIPAddress": "[64:ff9b::d21:40f]",
+        "startedDateTime": "2023-09-08T13:53:49.909Z",
+        "time": 1204.160999999658,
+        "timings": {
+          "blocked": 175.13099999983532,
+          "dns": -1,
+          "ssl": -1,
+          "connect": -1,
+          "send": 2.973000000000013,
+          "wait": 1025.2889999999427,
+          "receive": 0.7679999998799758,
+          "_blocked_queueing": 1.2809999998353305
+        }
+      },
+      {
+        "request": {
+          "method": "GET",
+          "url": "http://localhost:9977/autocomplete?text=arts&layers=address%2Cvenue%2Cstreet%2Cintersection&focus.point.lat=33.749&focus.point.lon=-84.388&boundary.rect.min_lat=32.066&boundary.rect.min_lon=-86.0856&boundary.rect.max_lat=35.7251&boundary.rect.max_lon=-81.9499",
+          "httpVersion": "http/2.0",
+          "queryString": [
+            {
+              "name": "text",
+              "value": "arts"
+            },
+            {
+              "name": "layers",
+              "value": "address%2Cvenue%2Cstreet%2Cintersection"
+            },
+            {
+              "name": "focus.point.lat",
+              "value": "33.749"
+            },
+            {
+              "name": "focus.point.lon",
+              "value": "-84.388"
+            },
+            {
+              "name": "boundary.rect.min_lat",
+              "value": "32.066"
+            },
+            {
+              "name": "boundary.rect.min_lon",
+              "value": "-86.0856"
+            },
+            {
+              "name": "boundary.rect.max_lat",
+              "value": "35.7251"
+            },
+            {
+              "name": "boundary.rect.max_lon",
+              "value": "-81.9499"
+            }
+          ],
+          "headersSize": -1,
+          "bodySize": 0
+        },
+        "response": {
+          "status": 200,
+          "statusText": "",
+          "httpVersion": "http/2.0",
+          "content": {
+            "size": 12368,
+            "mimeType": "application/json",
+            "text": ""
+          },
+          "redirectURL": "",
+          "headersSize": -1,
+          "bodySize": -1,
+          "_transferSize": 12769,
+          "_error": null
+        },
+        "serverIPAddress": "[64:ff9b::d21:40f]",
+        "startedDateTime": "2023-09-08T13:53:49.917Z",
+        "time": 313.9339999997901,
+        "timings": {
+          "blocked": 167.4080000005329,
+          "dns": -1,
+          "ssl": -1,
+          "connect": -1,
+          "send": 2.7959999999999923,
+          "wait": 143.22000000031747,
+          "receive": 0.5099999989397475,
+          "_blocked_queueing": 1.4550000005328911
+        }
+      },
+      {
+        "request": {
+          "method": "GET",
+          "url": "http://localhost:9977/autocomplete?text=arts%20&layers=address%2Cvenue%2Cstreet%2Cintersection&focus.point.lat=33.749&focus.point.lon=-84.388&boundary.rect.min_lat=32.066&boundary.rect.min_lon=-86.0856&boundary.rect.max_lat=35.7251&boundary.rect.max_lon=-81.9499",
+          "httpVersion": "http/2.0",
+          "queryString": [
+            {
+              "name": "text",
+              "value": "arts%20"
+            },
+            {
+              "name": "layers",
+              "value": "address%2Cvenue%2Cstreet%2Cintersection"
+            },
+            {
+              "name": "focus.point.lat",
+              "value": "33.749"
+            },
+            {
+              "name": "focus.point.lon",
+              "value": "-84.388"
+            },
+            {
+              "name": "boundary.rect.min_lat",
+              "value": "32.066"
+            },
+            {
+              "name": "boundary.rect.min_lon",
+              "value": "-86.0856"
+            },
+            {
+              "name": "boundary.rect.max_lat",
+              "value": "35.7251"
+            },
+            {
+              "name": "boundary.rect.max_lon",
+              "value": "-81.9499"
+            }
+          ],
+          "headersSize": -1,
+          "bodySize": 0
+        },
+        "response": {
+          "status": 200,
+          "statusText": "",
+          "httpVersion": "http/2.0",
+          "content": {
+            "size": 12369,
+            "mimeType": "application/json",
+            "text": ""
+          },
+          "redirectURL": "",
+          "headersSize": -1,
+          "bodySize": -1,
+          "_transferSize": 12768,
+          "_error": null
+        },
+        "serverIPAddress": "[64:ff9b::d21:40f]",
+        "startedDateTime": "2023-09-08T13:53:49.923Z",
+        "time": 1060.0050000002739,
+        "timings": {
+          "blocked": 161.1640000008461,
+          "dns": -1,
+          "ssl": -1,
+          "connect": -1,
+          "send": 2.658999999999992,
+          "wait": 895.6010000000988,
+          "receive": 0.5809999993289239,
+          "_blocked_queueing": 1.4210000008461066
+        }
+      },
+      {
+        "request": {
+          "method": "GET",
+          "url": "http://localhost:9977/autocomplete?text=arts%20c&layers=address%2Cvenue%2Cstreet%2Cintersection&focus.point.lat=33.749&focus.point.lon=-84.388&boundary.rect.min_lat=32.066&boundary.rect.min_lon=-86.0856&boundary.rect.max_lat=35.7251&boundary.rect.max_lon=-81.9499",
+          "httpVersion": "http/2.0",
+          "queryString": [
+            {
+              "name": "text",
+              "value": "arts%20c"
+            },
+            {
+              "name": "layers",
+              "value": "address%2Cvenue%2Cstreet%2Cintersection"
+            },
+            {
+              "name": "focus.point.lat",
+              "value": "33.749"
+            },
+            {
+              "name": "focus.point.lon",
+              "value": "-84.388"
+            },
+            {
+              "name": "boundary.rect.min_lat",
+              "value": "32.066"
+            },
+            {
+              "name": "boundary.rect.min_lon",
+              "value": "-86.0856"
+            },
+            {
+              "name": "boundary.rect.max_lat",
+              "value": "35.7251"
+            },
+            {
+              "name": "boundary.rect.max_lon",
+              "value": "-81.9499"
+            }
+          ],
+          "headersSize": -1,
+          "bodySize": 0
+        },
+        "response": {
+          "status": 200,
+          "statusText": "",
+          "httpVersion": "http/2.0",
+          "content": {
+            "size": 10616,
+            "mimeType": "application/json",
+            "text": ""
+          },
+          "redirectURL": "",
+          "headersSize": -1,
+          "bodySize": -1,
+          "_transferSize": 11016,
+          "_error": null
+        },
+        "serverIPAddress": "[64:ff9b::d21:40f]",
+        "startedDateTime": "2023-09-08T13:53:49.932Z",
+        "time": 812.2540000003937,
+        "timings": {
+          "blocked": 152.40299999998243,
+          "dns": -1,
+          "ssl": -1,
+          "connect": -1,
+          "send": 2.4749999999999943,
+          "wait": 656.5110000004352,
+          "receive": 0.8649999999761349,
+          "_blocked_queueing": 1.6279999999824213
+        }
+      },
+      {
+        "request": {
+          "method": "GET",
+          "url": "http://localhost:9977/autocomplete?text=arts%20ce&layers=address%2Cvenue%2Cstreet%2Cintersection&focus.point.lat=33.749&focus.point.lon=-84.388&boundary.rect.min_lat=32.066&boundary.rect.min_lon=-86.0856&boundary.rect.max_lat=35.7251&boundary.rect.max_lon=-81.9499",
+          "httpVersion": "http/2.0",
+          "queryString": [
+            {
+              "name": "text",
+              "value": "arts%20ce"
+            },
+            {
+              "name": "layers",
+              "value": "address%2Cvenue%2Cstreet%2Cintersection"
+            },
+            {
+              "name": "focus.point.lat",
+              "value": "33.749"
+            },
+            {
+              "name": "focus.point.lon",
+              "value": "-84.388"
+            },
+            {
+              "name": "boundary.rect.min_lat",
+              "value": "32.066"
+            },
+            {
+              "name": "boundary.rect.min_lon",
+              "value": "-86.0856"
+            },
+            {
+              "name": "boundary.rect.max_lat",
+              "value": "35.7251"
+            },
+            {
+              "name": "boundary.rect.max_lon",
+              "value": "-81.9499"
+            }
+          ],
+          "headersSize": -1,
+          "bodySize": 0
+        },
+        "response": {
+          "status": 200,
+          "statusText": "",
+          "httpVersion": "http/2.0",
+          "content": {
+            "size": 10608,
+            "mimeType": "application/json",
+            "text": ""
+          },
+          "redirectURL": "",
+          "headersSize": -1,
+          "bodySize": -1,
+          "_transferSize": 11006,
+          "_error": null
+        },
+        "serverIPAddress": "[64:ff9b::d21:40f]",
+        "startedDateTime": "2023-09-08T13:53:49.938Z",
+        "time": 1667.8229999997711,
+        "timings": {
+          "blocked": 147.01800000041595,
+          "dns": -1,
+          "ssl": -1,
+          "connect": -1,
+          "send": 1.9000000000000057,
+          "wait": 1517.6120000000049,
+          "receive": 1.292999999350286,
+          "_blocked_queueing": 1.006000000415952
+        }
+      },
+      {
+        "request": {
+          "method": "GET",
+          "url": "http://localhost:9977/autocomplete?text=arts%20cen&layers=address%2Cvenue%2Cstreet%2Cintersection&focus.point.lat=33.749&focus.point.lon=-84.388&boundary.rect.min_lat=32.066&boundary.rect.min_lon=-86.0856&boundary.rect.max_lat=35.7251&boundary.rect.max_lon=-81.9499",
+          "httpVersion": "http/2.0",
+          "queryString": [
+            {
+              "name": "text",
+              "value": "arts%20cen"
+            },
+            {
+              "name": "layers",
+              "value": "address%2Cvenue%2Cstreet%2Cintersection"
+            },
+            {
+              "name": "focus.point.lat",
+              "value": "33.749"
+            },
+            {
+              "name": "focus.point.lon",
+              "value": "-84.388"
+            },
+            {
+              "name": "boundary.rect.min_lat",
+              "value": "32.066"
+            },
+            {
+              "name": "boundary.rect.min_lon",
+              "value": "-86.0856"
+            },
+            {
+              "name": "boundary.rect.max_lat",
+              "value": "35.7251"
+            },
+            {
+              "name": "boundary.rect.max_lon",
+              "value": "-81.9499"
+            }
+          ],
+          "headersSize": -1,
+          "bodySize": 0
+        },
+        "response": {
+          "status": 200,
+          "statusText": "",
+          "httpVersion": "http/2.0",
+          "content": {
+            "size": 10612,
+            "mimeType": "application/json",
+            "text": ""
+          },
+          "redirectURL": "",
+          "headersSize": -1,
+          "bodySize": -1,
+          "_transferSize": 11011,
+          "_error": null
+        },
+        "serverIPAddress": "[64:ff9b::d21:40f]",
+        "startedDateTime": "2023-09-08T13:53:49.950Z",
+        "time": 1307.301999999254,
+        "timings": {
+          "blocked": 134.52299999937532,
+          "dns": -1,
+          "ssl": -1,
+          "connect": -1,
+          "send": 2.140999999999991,
+          "wait": 1169.752000000069,
+          "receive": 0.8859999998094281,
+          "_blocked_queueing": 1.1479999993753154
+        }
+      },
+      {
+        "request": {
+          "method": "GET",
+          "url": "http://localhost:9977/autocomplete?text=arts%20cent&layers=address%2Cvenue%2Cstreet%2Cintersection&focus.point.lat=33.749&focus.point.lon=-84.388&boundary.rect.min_lat=32.066&boundary.rect.min_lon=-86.0856&boundary.rect.max_lat=35.7251&boundary.rect.max_lon=-81.9499",
+          "httpVersion": "http/2.0",
+          "queryString": [
+            {
+              "name": "text",
+              "value": "arts%20cent"
+            },
+            {
+              "name": "layers",
+              "value": "address%2Cvenue%2Cstreet%2Cintersection"
+            },
+            {
+              "name": "focus.point.lat",
+              "value": "33.749"
+            },
+            {
+              "name": "focus.point.lon",
+              "value": "-84.388"
+            },
+            {
+              "name": "boundary.rect.min_lat",
+              "value": "32.066"
+            },
+            {
+              "name": "boundary.rect.min_lon",
+              "value": "-86.0856"
+            },
+            {
+              "name": "boundary.rect.max_lat",
+              "value": "35.7251"
+            },
+            {
+              "name": "boundary.rect.max_lon",
+              "value": "-81.9499"
+            }
+          ],
+          "headersSize": -1,
+          "bodySize": 0
+        },
+        "response": {
+          "status": 200,
+          "statusText": "",
+          "httpVersion": "http/2.0",
+          "content": {
+            "size": 10616,
+            "mimeType": "application/json",
+            "text": ""
+          },
+          "redirectURL": "",
+          "headersSize": -1,
+          "bodySize": -1,
+          "_transferSize": 11016,
+          "_error": null
+        },
+        "serverIPAddress": "[64:ff9b::d21:40f]",
+        "startedDateTime": "2023-09-08T13:53:49.958Z",
+        "time": 746.1700000003475,
+        "timings": {
+          "blocked": 126.27700000000658,
+          "dns": -1,
+          "ssl": -1,
+          "connect": -1,
+          "send": 2.3049999999999926,
+          "wait": 616.7630000002638,
+          "receive": 0.8250000000771252,
+          "_blocked_queueing": 0.9430000000065775
+        }
+      },
+      {
+        "request": {
+          "method": "GET",
+          "url": "http://localhost:9977/autocomplete?text=arts%20cente&layers=address%2Cvenue%2Cstreet%2Cintersection&focus.point.lat=33.749&focus.point.lon=-84.388&boundary.rect.min_lat=32.066&boundary.rect.min_lon=-86.0856&boundary.rect.max_lat=35.7251&boundary.rect.max_lon=-81.9499",
+          "httpVersion": "http/2.0",
+          "queryString": [
+            {
+              "name": "text",
+              "value": "arts%20cente"
+            },
+            {
+              "name": "layers",
+              "value": "address%2Cvenue%2Cstreet%2Cintersection"
+            },
+            {
+              "name": "focus.point.lat",
+              "value": "33.749"
+            },
+            {
+              "name": "focus.point.lon",
+              "value": "-84.388"
+            },
+            {
+              "name": "boundary.rect.min_lat",
+              "value": "32.066"
+            },
+            {
+              "name": "boundary.rect.min_lon",
+              "value": "-86.0856"
+            },
+            {
+              "name": "boundary.rect.max_lat",
+              "value": "35.7251"
+            },
+            {
+              "name": "boundary.rect.max_lon",
+              "value": "-81.9499"
+            }
+          ],
+          "headersSize": -1,
+          "bodySize": 0
+        },
+        "response": {
+          "status": 200,
+          "statusText": "",
+          "httpVersion": "http/2.0",
+          "content": {
+            "size": 10620,
+            "mimeType": "application/json",
+            "text": ""
+          },
+          "redirectURL": "",
+          "headersSize": -1,
+          "bodySize": -1,
+          "_transferSize": 11020,
+          "_error": null
+        },
+        "serverIPAddress": "[64:ff9b::d21:40f]",
+        "startedDateTime": "2023-09-08T13:53:49.967Z",
+        "time": 1989.0759999998409,
+        "timings": {
+          "blocked": 117.72999999992608,
+          "dns": -1,
+          "ssl": -1,
+          "connect": -1,
+          "send": 2.0219999999999914,
+          "wait": 1868.6450000001512,
+          "receive": 0.6789999997636187,
+          "_blocked_queueing": 1.1549999999260763
+        }
+      },
+      {
+        "request": {
+          "method": "GET",
+          "url": "http://localhost:9977/autocomplete?text=arts%20center&layers=address%2Cvenue%2Cstreet%2Cintersection&focus.point.lat=33.749&focus.point.lon=-84.388&boundary.rect.min_lat=32.066&boundary.rect.min_lon=-86.0856&boundary.rect.max_lat=35.7251&boundary.rect.max_lon=-81.9499",
+          "httpVersion": "http/2.0",
+          "queryString": [
+            {
+              "name": "text",
+              "value": "arts%20center"
+            },
+            {
+              "name": "layers",
+              "value": "address%2Cvenue%2Cstreet%2Cintersection"
+            },
+            {
+              "name": "focus.point.lat",
+              "value": "33.749"
+            },
+            {
+              "name": "focus.point.lon",
+              "value": "-84.388"
+            },
+            {
+              "name": "boundary.rect.min_lat",
+              "value": "32.066"
+            },
+            {
+              "name": "boundary.rect.min_lon",
+              "value": "-86.0856"
+            },
+            {
+              "name": "boundary.rect.max_lat",
+              "value": "35.7251"
+            },
+            {
+              "name": "boundary.rect.max_lon",
+              "value": "-81.9499"
+            }
+          ],
+          "headersSize": -1,
+          "bodySize": 0
+        },
+        "response": {
+          "status": 200,
+          "statusText": "",
+          "httpVersion": "http/2.0",
+          "content": {
+            "size": 12558,
+            "mimeType": "application/json",
+            "text": "{\"geocoding\":{\"version\":\"0.2\",\"attribution\":\"https://geocode.earth/guidelines\",\"query\":{\"text\":\"arts center\",\"parser\":\"pelias\",\"parsed_text\":{\"subject\":\"arts center\",\"street\":\"arts center\"},\"size\":10,\"layers\":[\"address\",\"venue\",\"street\",\"intersection\"],\"sources\":[\"openstreetmap\",\"openaddresses\",\"geonames\",\"whosonfirst\",\"uscensus\"],\"private\":false,\"focus.point.lat\":33.749,\"focus.point.lon\":-84.388,\"boundary.rect.min_lat\":32.066,\"boundary.rect.max_lat\":35.7251,\"boundary.rect.min_lon\":-86.0856,\"boundary.rect.max_lon\":-81.9499,\"lang\":{\"name\":\"English\",\"iso6391\":\"en\",\"iso6393\":\"eng\",\"via\":\"default\",\"defaulted\":true},\"querySize\":20},\"engine\":{\"name\":\"Pelias\",\"author\":\"Mapzen\",\"version\":\"1.0\"},\"timestamp\":1694180535585},\"type\":\"FeatureCollection\",\"features\":[{\"geometry\":{\"type\":\"Point\",\"coordinates\":[-84.387125,33.789283]},\"id\":\"MARTA:68900\",\"properties\":{\"layer\":\"stops\",\"source\":\"otp\",\"name\":\"Arts Center Station (901789)\",\"label\":\"Arts Center Station (901789)\"},\"type\":\"Feature\"},{\"geometry\":{\"type\":\"Point\",\"coordinates\":[-84.38712,33.789418]},\"id\":\"CobbLinc:717\",\"properties\":{\"layer\":\"stops\",\"source\":\"otp\",\"name\":\"Arts Center Station (920907)\",\"label\":\"Arts Center Station (920907)\"},\"type\":\"Feature\"},{\"geometry\":{\"type\":\"Point\",\"coordinates\":[-84.387272,33.788828]},\"id\":\"MARTA:112\",\"properties\":{\"layer\":\"stops\",\"source\":\"otp\",\"name\":\"Arts Center Station (906370)\",\"label\":\"Arts Center Station (906370)\"},\"type\":\"Feature\"},{\"geometry\":{\"type\":\"Point\",\"coordinates\":[-84.387414,33.789669]},\"id\":\"MARTA:111\",\"properties\":{\"layer\":\"stops\",\"source\":\"otp\",\"name\":\"Arts Center Station (906369)\",\"label\":\"Arts Center Station (906369)\"},\"type\":\"Feature\"},{\"geometry\":{\"type\":\"Point\",\"coordinates\":[-84.387692,33.789216]},\"id\":\"Xpress:239\",\"properties\":{\"layer\":\"stops\",\"source\":\"otp\",\"name\":\"Arts Center  Station (400208)\",\"label\":\"Arts Center  Station (400208)\"},\"type\":\"Feature\"},{\"geometry\":{\"type\":\"Point\",\"coordinates\":[-84.386904,33.789285]},\"id\":\"GwinnettCountyTransit:32\",\"properties\":{\"layer\":\"stops\",\"source\":\"otp\",\"name\":\"Arts Center MARTA Station (32)\",\"label\":\"Arts Center MARTA Station (32)\"},\"type\":\"Feature\"},{\"geometry\":{\"type\":\"Point\",\"coordinates\":[-84.386402,33.789213]},\"id\":\"MARTA:99973485\",\"properties\":{\"layer\":\"stops\",\"source\":\"otp\",\"name\":\"Arts Center Way at 15th St (Arts Center Stn - Upper Entrance) (213110)\",\"label\":\"Arts Center Way at 15th St (Arts Center Stn - Upper Entrance) (213110)\"},\"type\":\"Feature\"},{\"geometry\":{\"type\":\"Point\",\"coordinates\":[-84.38568,33.788298]},\"id\":\"MARTA:68056\",\"properties\":{\"layer\":\"stops\",\"source\":\"otp\",\"name\":\"15th St NE at Arts Center Way NE (902514)\",\"label\":\"15th St NE at Arts Center Way NE (902514)\"},\"type\":\"Feature\"},{\"type\":\"Feature\",\"geometry\":{\"type\":\"Point\",\"coordinates\":[-84.387325,33.789121]},\"properties\":{\"id\":\"node/4172450835\",\"gid\":\"openstreetmap:venue:node/4172450835\",\"layer\":\"venue\",\"source\":\"openstreetmap\",\"source_id\":\"node/4172450835\",\"country_code\":\"US\",\"name\":\"Arts Center\",\"distance\":4.467,\"accuracy\":\"point\",\"country\":\"United States\",\"country_gid\":\"whosonfirst:country:85633793\",\"country_a\":\"USA\",\"region\":\"Georgia\",\"region_gid\":\"whosonfirst:region:85688535\",\"region_a\":\"GA\",\"county\":\"Fulton County\",\"county_gid\":\"whosonfirst:county:102083603\",\"county_a\":\"FU\",\"locality\":\"Atlanta\",\"locality_gid\":\"whosonfirst:locality:85936429\",\"continent\":\"North America\",\"continent_gid\":\"whosonfirst:continent:102191575\",\"label\":\"Arts Center, Atlanta, GA, USA\",\"addendum\":{\"osm\":{\"wheelchair\":\"yes\",\"wikidata\":\"Q4801432\"}}}},{\"type\":\"Feature\",\"geometry\":{\"type\":\"Point\",\"coordinates\":[-84.385282,33.789341]},\"properties\":{\"id\":\"way/28961767\",\"gid\":\"openstreetmap:venue:way/28961767\",\"layer\":\"venue\",\"source\":\"openstreetmap\",\"source_id\":\"way/28961767\",\"country_code\":\"US\",\"name\":\"Woodruff Arts Center\",\"housenumber\":\"1314\",\"street\":\"Peachtree Street NE\",\"postalcode\":\"30309\",\"distance\":4.498,\"accuracy\":\"point\",\"country\":\"United States\",\"country_gid\":\"whosonfirst:country:85633793\",\"country_a\":\"USA\",\"region\":\"Georgia\",\"region_gid\":\"whosonfirst:region:85688535\",\"region_a\":\"GA\",\"county\":\"Fulton County\",\"county_gid\":\"whosonfirst:county:102083603\",\"county_a\":\"FU\",\"locality\":\"Atlanta\",\"locality_gid\":\"whosonfirst:locality:85936429\",\"continent\":\"North America\",\"continent_gid\":\"whosonfirst:continent:102191575\",\"label\":\"Woodruff Arts Center, Atlanta, GA, USA\",\"addendum\":{\"osm\":{\"wheelchair\":\"yes\",\"wikidata\":\"Q8033228\",\"website\":\"https://woodruffcenter.org/\"}}},\"bbox\":[-84.3859925,33.7885967,-84.3844398,33.7896945]},{\"type\":\"Feature\",\"geometry\":{\"type\":\"Point\",\"coordinates\":[-84.389529,33.756815]},\"properties\":{\"id\":\"way/252608898\",\"gid\":\"openstreetmap:venue:way/252608898\",\"layer\":\"venue\",\"source\":\"openstreetmap\",\"source_id\":\"way/252608898\",\"country_code\":\"US\",\"name\":\"Rialto Center for the Arts\",\"housenumber\":\"80\",\"street\":\"Forsyth Street NW\",\"postalcode\":\"30303\",\"distance\":0.881,\"accuracy\":\"point\",\"country\":\"United States\",\"country_gid\":\"whosonfirst:country:85633793\",\"country_a\":\"USA\",\"region\":\"Georgia\",\"region_gid\":\"whosonfirst:region:85688535\",\"region_a\":\"GA\",\"county\":\"Fulton County\",\"county_gid\":\"whosonfirst:county:102083603\",\"county_a\":\"FU\",\"locality\":\"Atlanta\",\"locality_gid\":\"whosonfirst:locality:85936429\",\"continent\":\"North America\",\"continent_gid\":\"whosonfirst:continent:102191575\",\"label\":\"Rialto Center for the Arts, Atlanta, GA, USA\",\"addendum\":{\"osm\":{\"wikidata\":\"Q7322136\",\"wikipedia\":\"en:Rialto Center for the Arts\",\"operator\":\"Georgia State University\",\"website\":\"https://rialto.gsu.edu/\",\"phone\":\"+1 404 413 9849\"}}},\"bbox\":[-84.3897872,33.7565707,-84.3892141,33.7570301]},{\"type\":\"Feature\",\"geometry\":{\"type\":\"Point\",\"coordinates\":[-84.388317,33.789408]},\"properties\":{\"id\":\"way/536720728\",\"gid\":\"openstreetmap:venue:way/536720728\",\"layer\":\"venue\",\"source\":\"openstreetmap\",\"source_id\":\"way/536720728\",\"country_code\":\"US\",\"name\":\"Arts Center Tower\",\"housenumber\":\"1270\",\"street\":\"West Peachtree Street NW\",\"distance\":4.498,\"accuracy\":\"point\",\"country\":\"United States\",\"country_gid\":\"whosonfirst:country:85633793\",\"country_a\":\"USA\",\"region\":\"Georgia\",\"region_gid\":\"whosonfirst:region:85688535\",\"region_a\":\"GA\",\"county\":\"Fulton County\",\"county_gid\":\"whosonfirst:county:102083603\",\"county_a\":\"FU\",\"locality\":\"Atlanta\",\"locality_gid\":\"whosonfirst:locality:85936429\",\"continent\":\"North America\",\"continent_gid\":\"whosonfirst:continent:102191575\",\"label\":\"Arts Center Tower, Atlanta, GA, USA\"},\"bbox\":[-84.3885134,33.7891714,-84.3879231,33.7895687]},{\"type\":\"Feature\",\"geometry\":{\"type\":\"Point\",\"coordinates\":[-84.389665,33.792892]},\"properties\":{\"id\":\"way/269541904\",\"gid\":\"openstreetmap:venue:way/269541904\",\"layer\":\"venue\",\"source\":\"openstreetmap\",\"source_id\":\"way/269541904\",\"country_code\":\"US\",\"name\":\"Center for Puppetry Arts\",\"housenumber\":\"1404\",\"street\":\"Spring Street NW\",\"postalcode\":\"30309\",\"distance\":4.888,\"accuracy\":\"point\",\"country\":\"United States\",\"country_gid\":\"whosonfirst:country:85633793\",\"country_a\":\"USA\",\"region\":\"Georgia\",\"region_gid\":\"whosonfirst:region:85688535\",\"region_a\":\"GA\",\"county\":\"Fulton County\",\"county_gid\":\"whosonfirst:county:102083603\",\"county_a\":\"FU\",\"locality\":\"Atlanta\",\"locality_gid\":\"whosonfirst:locality:85936429\",\"continent\":\"North America\",\"continent_gid\":\"whosonfirst:continent:102191575\",\"label\":\"Center for Puppetry Arts, Atlanta, GA, USA\",\"addendum\":{\"osm\":{\"wheelchair\":\"yes\",\"website\":\"https://puppet.org/\",\"phone\":\"+1 404 873 3391\",\"opening_hours\":\"Tu-Fr 09:00-17:00; Sa 10:00-17:00; Su 12:00-17:00\"}}},\"bbox\":[-84.3898377,33.7925985,-84.3893181,33.7932157]},{\"type\":\"Feature\",\"geometry\":{\"type\":\"Point\",\"coordinates\":[-84.386897,33.789283]},\"properties\":{\"id\":\"way/269637886\",\"gid\":\"openstreetmap:venue:way/269637886\",\"layer\":\"venue\",\"source\":\"openstreetmap\",\"source_id\":\"way/269637886\",\"country_code\":\"US\",\"name\":\"MARTA Arts Center Station\",\"distance\":4.485,\"accuracy\":\"point\",\"country\":\"United States\",\"country_gid\":\"whosonfirst:country:85633793\",\"country_a\":\"USA\",\"region\":\"Georgia\",\"region_gid\":\"whosonfirst:region:85688535\",\"region_a\":\"GA\",\"county\":\"Fulton County\",\"county_gid\":\"whosonfirst:county:102083603\",\"county_a\":\"FU\",\"locality\":\"Atlanta\",\"locality_gid\":\"whosonfirst:locality:85936429\",\"continent\":\"North America\",\"continent_gid\":\"whosonfirst:continent:102191575\",\"label\":\"MARTA Arts Center Station, Atlanta, GA, USA\"},\"bbox\":[-84.3872294,33.788859,-84.3867044,33.7898455]},{\"type\":\"Feature\",\"geometry\":{\"type\":\"Point\",\"coordinates\":[-84.416912,33.744017]},\"properties\":{\"id\":\"way/802755819\",\"gid\":\"openstreetmap:venue:way/802755819\",\"layer\":\"venue\",\"source\":\"openstreetmap\",\"source_id\":\"way/802755819\",\"country_code\":\"US\",\"name\":\"Ray Charles Proformance Arts Center\",\"distance\":2.733,\"accuracy\":\"point\",\"country\":\"United States\",\"country_gid\":\"whosonfirst:country:85633793\",\"country_a\":\"USA\",\"region\":\"Georgia\",\"region_gid\":\"whosonfirst:region:85688535\",\"region_a\":\"GA\",\"county\":\"Fulton County\",\"county_gid\":\"whosonfirst:county:102083603\",\"county_a\":\"FU\",\"locality\":\"Atlanta\",\"locality_gid\":\"whosonfirst:locality:85936429\",\"neighbourhood\":\"Harris Chiles\",\"neighbourhood_gid\":\"whosonfirst:neighbourhood:1108798423\",\"continent\":\"North America\",\"continent_gid\":\"whosonfirst:continent:102191575\",\"label\":\"Ray Charles Proformance Arts Center, Atlanta, GA, USA\"},\"bbox\":[-84.417336,33.7436268,-84.4164033,33.7442824]},{\"type\":\"Feature\",\"geometry\":{\"type\":\"Point\",\"coordinates\":[-84.345203,33.781772]},\"properties\":{\"id\":\"node/367912794\",\"gid\":\"openstreetmap:venue:node/367912794\",\"layer\":\"venue\",\"source\":\"openstreetmap\",\"source_id\":\"node/367912794\",\"country_code\":\"US\",\"name\":\"Callanwolde Fine Arts Center\",\"housenumber\":\"980\",\"street\":\"Briarcliff Road NE\",\"distance\":5.385,\"accuracy\":\"point\",\"country\":\"United States\",\"country_gid\":\"whosonfirst:country:85633793\",\"country_a\":\"USA\",\"region\":\"Georgia\",\"region_gid\":\"whosonfirst:region:85688535\",\"region_a\":\"GA\",\"county\":\"DeKalb County\",\"county_gid\":\"whosonfirst:county:102084539\",\"county_a\":\"DA\",\"locality\":\"Druid Hills\",\"locality_gid\":\"whosonfirst:locality:85937251\",\"continent\":\"North America\",\"continent_gid\":\"whosonfirst:continent:102191575\",\"label\":\"Callanwolde Fine Arts Center, Druid Hills, GA, USA\",\"addendum\":{\"osm\":{\"website\":\"https://www.callanwolde.org/\",\"phone\":\"+1-404-872-5338\",\"opening_hours\":\"Mo-Th 09:00-17:00; Fr-Sa 09:00-12:00\"}}}},{\"type\":\"Feature\",\"geometry\":{\"type\":\"Point\",\"coordinates\":[-84.399209,33.774791]},\"properties\":{\"id\":\"way/43332730\",\"gid\":\"openstreetmap:venue:way/43332730\",\"layer\":\"venue\",\"source\":\"openstreetmap\",\"source_id\":\"way/43332730\",\"country_code\":\"US\",\"name\":\"Robert H. Ferst Center for the Arts\",\"distance\":3.053,\"accuracy\":\"point\",\"country\":\"United States\",\"country_gid\":\"whosonfirst:country:85633793\",\"country_a\":\"USA\",\"region\":\"Georgia\",\"region_gid\":\"whosonfirst:region:85688535\",\"region_a\":\"GA\",\"county\":\"Fulton County\",\"county_gid\":\"whosonfirst:county:102083603\",\"county_a\":\"FU\",\"locality\":\"Atlanta\",\"locality_gid\":\"whosonfirst:locality:85936429\",\"neighbourhood\":\"Georgia Tech\",\"neighbourhood_gid\":\"whosonfirst:neighbourhood:1108798439\",\"continent\":\"North America\",\"continent_gid\":\"whosonfirst:continent:102191575\",\"label\":\"Robert H. Ferst Center for the Arts, Atlanta, GA, USA\",\"addendum\":{\"osm\":{\"wikidata\":\"Q5445560\"}}},\"bbox\":[-84.3994357,33.7747789,-84.3989903,33.7754228]},{\"type\":\"Feature\",\"geometry\":{\"type\":\"Point\",\"coordinates\":[-84.392316,33.750426]},\"properties\":{\"id\":\"node/3499486829\",\"gid\":\"openstreetmap:venue:node/3499486829\",\"layer\":\"venue\",\"source\":\"openstreetmap\",\"source_id\":\"node/3499486829\",\"country_code\":\"US\",\"name\":\"FUSE Arts Center (C4 Atlanta)\",\"housenumber\":\"132\",\"street\":\"Mitchell Street SW\",\"postalcode\":\"30303\",\"distance\":0.43,\"accuracy\":\"point\",\"country\":\"United States\",\"country_gid\":\"whosonfirst:country:85633793\",\"country_a\":\"USA\",\"region\":\"Georgia\",\"region_gid\":\"whosonfirst:region:85688535\",\"region_a\":\"GA\",\"county\":\"Fulton County\",\"county_gid\":\"whosonfirst:county:102083603\",\"county_a\":\"FU\",\"locality\":\"Atlanta\",\"locality_gid\":\"whosonfirst:locality:85936429\",\"continent\":\"North America\",\"continent_gid\":\"whosonfirst:continent:102191575\",\"label\":\"FUSE Arts Center (C4 Atlanta), Atlanta, GA, USA\",\"addendum\":{\"osm\":{\"website\":\"https://www.c4atlanta.org\",\"phone\":\"+1-404-969-2787\"}}}}],\"bbox\":[-84.417336,33.7436268,-84.345203,33.7932157],\"isomorphicMapzenSearchQuery\":{\"api_key\":\"ge-0624346c114543d5\",\"text\":\"arts center\",\"layers\":\"address,venue,street,intersection\",\"focus.point.lat\":33.749,\"focus.point.lon\":-84.388,\"boundary.rect.min_lat\":32.066,\"boundary.rect.min_lon\":-86.0856,\"boundary.rect.max_lat\":35.7251,\"boundary.rect.max_lon\":-81.9499}}"
+          },
+          "redirectURL": "",
+          "headersSize": -1,
+          "bodySize": -1,
+          "_transferSize": 12959,
+          "_error": null
+        },
+        "serverIPAddress": "[64:ff9b::d21:40f]",
+        "startedDateTime": "2023-09-08T13:53:49.974Z",
+        "time": 1773.866000000453,
+        "timings": {
+          "blocked": 111.16500000039605,
+          "dns": -1,
+          "ssl": -1,
+          "connect": -1,
+          "send": 1.6709999999999923,
+          "wait": 1659.9850000000804,
+          "receive": 1.044999999976426,
+          "_blocked_queueing": 1.194000000396045
+        }
+      }
+    ]
+  }
+}
\ No newline at end of file
diff --git a/percy/percy.test.js b/percy/percy.test.js
index 9c62e92e7..e6862a86e 100644
--- a/percy/percy.test.js
+++ b/percy/percy.test.js
@@ -22,6 +22,7 @@ const percySnapshotWithWait = async (page, name, enableJavaScript) => {
 let browser
 const serveAbortController = new AbortController()
 const harAbortController = new AbortController()
+const geocoderAbortController = new AbortController()
 
 /**
  * Loads a path
@@ -49,6 +50,15 @@ beforeAll(async () => {
       signal: harAbortController.signal
     }).stdout.pipe(process.stdout)
 
+    // Launch mock geocoder server
+    execa(
+      'yarn',
+      ['percy-har-express', '-p', '9977', 'percy/geocoder-mock.har'],
+      {
+        signal: geocoderAbortController.signal
+      }
+    ).stdout.pipe(process.stdout)
+
     // Web security is disabled to allow requests to the mock OTP server
     browser = await puppeteer.launch({
       args: ['--disable-web-security']
@@ -66,6 +76,7 @@ afterAll(async () => {
   try {
     serveAbortController.abort()
     harAbortController.abort()
+    geocoderAbortController.abort()
     await browser.close()
   } catch (error) {
     console.log(error)
@@ -73,7 +84,7 @@ afterAll(async () => {
   console.log('Closed mock server and headless browser')
 })
 
-// Puppeteer can take a long time to load, espeically in some ci environments
+// Puppeteer can take a long time to load, especially in some ci environments
 jest.setTimeout(600000)
 
 async function executeTest(page, isMobile, isCallTaker) {
@@ -153,6 +164,7 @@ async function executeTest(page, isMobile, isCallTaker) {
     // Fill in new origin
     await page.hover('.from-form-control')
     await page.focus('.from-form-control')
+    // FIXME: Characters are typed very fast, but each stroke still triggers a geocoder call.
     await page.keyboard.type('Opus Music')
     await page.waitForTimeout(2000)
     await page.keyboard.press('ArrowDown')
@@ -161,6 +173,7 @@ async function executeTest(page, isMobile, isCallTaker) {
 
     // Fill in new destination
     await page.focus('.to-form-control')
+    // FIXME: Characters are typed very fast, but each stroke still triggers a geocoder call.
     await page.keyboard.type('908981')
     await page.waitForTimeout(2000)
     await page.keyboard.press('ArrowDown')
@@ -196,6 +209,7 @@ async function executeTest(page, isMobile, isCallTaker) {
     )
     await page.waitForSelector('.intermediate-place-0-form-control')
     await page.focus('.intermediate-place-0-form-control')
+    // FIXME: Characters are typed very fast, but each stroke still triggers a geocoder call.
     await page.keyboard.type('arts center')
     await page.waitForTimeout(2000)
     await page.keyboard.press('ArrowDown')

From 4a262a6fa10fcc098d9fbf4eaf194a9289304018 Mon Sep 17 00:00:00 2001
From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com>
Date: Fri, 8 Sep 2023 16:11:53 -0400
Subject: [PATCH 04/13] test(percy): Use different mock files for normal vs
 calltaker

---
 ...r-mock.har => geocoder-mock-calltaker.har} |   18 +-
 percy/geocoder-mock-normal.har                | 1130 +++++++++++++++++
 percy/percy.test.js                           |    7 +-
 3 files changed, 1145 insertions(+), 10 deletions(-)
 rename percy/{geocoder-mock.har => geocoder-mock-calltaker.har} (99%)
 create mode 100644 percy/geocoder-mock-normal.har

diff --git a/percy/geocoder-mock.har b/percy/geocoder-mock-calltaker.har
similarity index 99%
rename from percy/geocoder-mock.har
rename to percy/geocoder-mock-calltaker.har
index 6d9e46391..447fc319f 100644
--- a/percy/geocoder-mock.har
+++ b/percy/geocoder-mock-calltaker.har
@@ -125,7 +125,7 @@
           "statusText": "",
           "httpVersion": "http/2.0",
           "content": {
-            "size": 10681,
+            "size": 0,
             "mimeType": "application/json",
             "text": ""
           },
@@ -196,7 +196,7 @@
           "statusText": "",
           "httpVersion": "http/2.0",
           "content": {
-            "size": 10853,
+            "size": 0,
             "mimeType": "application/json",
             "text": ""
           },
@@ -267,7 +267,7 @@
           "statusText": "",
           "httpVersion": "http/2.0",
           "content": {
-            "size": 12368,
+            "size": 0,
             "mimeType": "application/json",
             "text": ""
           },
@@ -338,7 +338,7 @@
           "statusText": "",
           "httpVersion": "http/2.0",
           "content": {
-            "size": 12369,
+            "size": 0,
             "mimeType": "application/json",
             "text": ""
           },
@@ -409,7 +409,7 @@
           "statusText": "",
           "httpVersion": "http/2.0",
           "content": {
-            "size": 10616,
+            "size": 0,
             "mimeType": "application/json",
             "text": ""
           },
@@ -480,7 +480,7 @@
           "statusText": "",
           "httpVersion": "http/2.0",
           "content": {
-            "size": 10608,
+            "size": 0,
             "mimeType": "application/json",
             "text": ""
           },
@@ -551,7 +551,7 @@
           "statusText": "",
           "httpVersion": "http/2.0",
           "content": {
-            "size": 10612,
+            "size": 0,
             "mimeType": "application/json",
             "text": ""
           },
@@ -622,7 +622,7 @@
           "statusText": "",
           "httpVersion": "http/2.0",
           "content": {
-            "size": 10616,
+            "size": 0,
             "mimeType": "application/json",
             "text": ""
           },
@@ -693,7 +693,7 @@
           "statusText": "",
           "httpVersion": "http/2.0",
           "content": {
-            "size": 10620,
+            "size": 0,
             "mimeType": "application/json",
             "text": ""
           },
diff --git a/percy/geocoder-mock-normal.har b/percy/geocoder-mock-normal.har
new file mode 100644
index 000000000..5d6763cd2
--- /dev/null
+++ b/percy/geocoder-mock-normal.har
@@ -0,0 +1,1130 @@
+{
+  "log": {
+    "version": "1.2",
+    "creator": {
+      "name": "WebInspector",
+      "version": "537.36"
+    },
+    "pages": [],
+    "entries": [
+      {
+        "request": {
+          "method": "GET",
+          "url": "http://localhost:9977/autocomplete?text=O&layers=address%2Cvenue%2Cstreet%2Cintersection&focus.point.lat=33.749&focus.point.lon=-84.388&boundary.rect.min_lat=32.066&boundary.rect.min_lon=-86.0856&boundary.rect.max_lat=35.7251&boundary.rect.max_lon=-81.9499",
+          "httpVersion": "http/2.0",
+          "queryString": [
+            {
+              "name": "text",
+              "value": "O"
+            },
+            {
+              "name": "layers",
+              "value": "address%2Cvenue%2Cstreet%2Cintersection"
+            },
+            {
+              "name": "focus.point.lat",
+              "value": "33.749"
+            },
+            {
+              "name": "focus.point.lon",
+              "value": "-84.388"
+            },
+            {
+              "name": "boundary.rect.min_lat",
+              "value": "32.066"
+            },
+            {
+              "name": "boundary.rect.min_lon",
+              "value": "-86.0856"
+            },
+            {
+              "name": "boundary.rect.max_lat",
+              "value": "35.7251"
+            },
+            {
+              "name": "boundary.rect.max_lon",
+              "value": "-81.9499"
+            }
+          ],
+          "headersSize": -1,
+          "bodySize": 0
+        },
+        "response": {
+          "status": 200,
+          "statusText": "OK",
+          "httpVersion": "http/2.0",
+          "content": {
+            "size": 0,
+            "mimeType": "application/json",
+            "text": ""
+          },
+          "redirectURL": "",
+          "headersSize": -1,
+          "bodySize": -1,
+          "_transferSize": 12785,
+          "_error": null
+        },
+        "serverIPAddress": "[64:ff9b::de1:2f3f]",
+        "startedDateTime": "2023-09-08T14:07:22.644Z",
+        "time": 2125.9739999999583,
+        "timings": {
+          "blocked": 15.940999999456107,
+          "dns": 73.76899999999999,
+          "ssl": 1088.1299999999999,
+          "connect": 1244.485,
+          "send": 4.813000000000102,
+          "wait": 786.1689999998994,
+          "receive": 0.7970000006025657,
+          "_blocked_queueing": 1.1159999994561076
+        }
+      },
+      {
+        "request": {
+          "method": "GET",
+          "url": "http://localhost:9977/autocomplete?text=Op&layers=address%2Cvenue%2Cstreet%2Cintersection&focus.point.lat=33.749&focus.point.lon=-84.388&boundary.rect.min_lat=32.066&boundary.rect.min_lon=-86.0856&boundary.rect.max_lat=35.7251&boundary.rect.max_lon=-81.9499",
+          "httpVersion": "http/2.0",
+          "queryString": [
+            {
+              "name": "text",
+              "value": "Op"
+            },
+            {
+              "name": "layers",
+              "value": "address%2Cvenue%2Cstreet%2Cintersection"
+            },
+            {
+              "name": "focus.point.lat",
+              "value": "33.749"
+            },
+            {
+              "name": "focus.point.lon",
+              "value": "-84.388"
+            },
+            {
+              "name": "boundary.rect.min_lat",
+              "value": "32.066"
+            },
+            {
+              "name": "boundary.rect.min_lon",
+              "value": "-86.0856"
+            },
+            {
+              "name": "boundary.rect.max_lat",
+              "value": "35.7251"
+            },
+            {
+              "name": "boundary.rect.max_lon",
+              "value": "-81.9499"
+            }
+          ],
+          "headersSize": -1,
+          "bodySize": 0
+        },
+        "response": {
+          "status": 200,
+          "statusText": "",
+          "httpVersion": "http/2.0",
+          "content": {
+            "size": 0,
+            "mimeType": "application/json",
+            "text": ""
+          },
+          "redirectURL": "",
+          "headersSize": -1,
+          "bodySize": -1,
+          "_transferSize": 11262,
+          "_error": null
+        },
+        "serverIPAddress": "[64:ff9b::de1:2f3f]",
+        "startedDateTime": "2023-09-08T14:07:22.656Z",
+        "time": 2307.477999999719,
+        "timings": {
+          "blocked": 1250.2649999995253,
+          "dns": -1,
+          "ssl": -1,
+          "connect": -1,
+          "send": 2.7480000000000473,
+          "wait": 1053.786999999859,
+          "receive": 0.6780000003345776,
+          "_blocked_queueing": 3.2949999995253165
+        }
+      },
+      {
+        "request": {
+          "method": "GET",
+          "url": "http://localhost:9977/autocomplete?text=Opu&layers=address%2Cvenue%2Cstreet%2Cintersection&focus.point.lat=33.749&focus.point.lon=-84.388&boundary.rect.min_lat=32.066&boundary.rect.min_lon=-86.0856&boundary.rect.max_lat=35.7251&boundary.rect.max_lon=-81.9499",
+          "httpVersion": "http/2.0",
+          "queryString": [
+            {
+              "name": "text",
+              "value": "Opu"
+            },
+            {
+              "name": "layers",
+              "value": "address%2Cvenue%2Cstreet%2Cintersection"
+            },
+            {
+              "name": "focus.point.lat",
+              "value": "33.749"
+            },
+            {
+              "name": "focus.point.lon",
+              "value": "-84.388"
+            },
+            {
+              "name": "boundary.rect.min_lat",
+              "value": "32.066"
+            },
+            {
+              "name": "boundary.rect.min_lon",
+              "value": "-86.0856"
+            },
+            {
+              "name": "boundary.rect.max_lat",
+              "value": "35.7251"
+            },
+            {
+              "name": "boundary.rect.max_lon",
+              "value": "-81.9499"
+            }
+          ],
+          "headersSize": -1,
+          "bodySize": 0
+        },
+        "response": {
+          "status": 200,
+          "statusText": "",
+          "httpVersion": "http/2.0",
+          "content": {
+            "size": 0,
+            "mimeType": "application/json",
+            "text": ""
+          },
+          "redirectURL": "",
+          "headersSize": -1,
+          "bodySize": -1,
+          "_transferSize": 5615,
+          "_error": null
+        },
+        "serverIPAddress": "[64:ff9b::de1:2f3f]",
+        "startedDateTime": "2023-09-08T14:07:22.663Z",
+        "time": 2034.0139999998428,
+        "timings": {
+          "blocked": 1243.6879999990954,
+          "dns": -1,
+          "ssl": -1,
+          "connect": -1,
+          "send": 2.394999999999982,
+          "wait": 787.3710000003423,
+          "receive": 0.5600000004051253,
+          "_blocked_queueing": 3.059999999095453
+        }
+      },
+      {
+        "request": {
+          "method": "GET",
+          "url": "http://localhost:9977/autocomplete?text=Opus&layers=address%2Cvenue%2Cstreet%2Cintersection&focus.point.lat=33.749&focus.point.lon=-84.388&boundary.rect.min_lat=32.066&boundary.rect.min_lon=-86.0856&boundary.rect.max_lat=35.7251&boundary.rect.max_lon=-81.9499",
+          "httpVersion": "http/2.0",
+          "queryString": [
+            {
+              "name": "text",
+              "value": "Opus"
+            },
+            {
+              "name": "layers",
+              "value": "address%2Cvenue%2Cstreet%2Cintersection"
+            },
+            {
+              "name": "focus.point.lat",
+              "value": "33.749"
+            },
+            {
+              "name": "focus.point.lon",
+              "value": "-84.388"
+            },
+            {
+              "name": "boundary.rect.min_lat",
+              "value": "32.066"
+            },
+            {
+              "name": "boundary.rect.min_lon",
+              "value": "-86.0856"
+            },
+            {
+              "name": "boundary.rect.max_lat",
+              "value": "35.7251"
+            },
+            {
+              "name": "boundary.rect.max_lon",
+              "value": "-81.9499"
+            }
+          ],
+          "headersSize": -1,
+          "bodySize": 0
+        },
+        "response": {
+          "status": 200,
+          "statusText": "",
+          "httpVersion": "http/2.0",
+          "content": {
+            "size": 0,
+            "mimeType": "application/json",
+            "text": ""
+          },
+          "redirectURL": "",
+          "headersSize": -1,
+          "bodySize": -1,
+          "_transferSize": 5619,
+          "_error": null
+        },
+        "serverIPAddress": "[64:ff9b::de1:2f3f]",
+        "startedDateTime": "2023-09-08T14:07:22.666Z",
+        "time": 1865.16599999959,
+        "timings": {
+          "blocked": 1240.8119999999617,
+          "dns": -1,
+          "ssl": -1,
+          "connect": -1,
+          "send": 2.0030000000001564,
+          "wait": 621.6149999996674,
+          "receive": 0.735999999960768,
+          "_blocked_queueing": 4.472999999961758
+        }
+      },
+      {
+        "request": {
+          "method": "GET",
+          "url": "http://localhost:9977/autocomplete?text=Opus%20&layers=address%2Cvenue%2Cstreet%2Cintersection&focus.point.lat=33.749&focus.point.lon=-84.388&boundary.rect.min_lat=32.066&boundary.rect.min_lon=-86.0856&boundary.rect.max_lat=35.7251&boundary.rect.max_lon=-81.9499",
+          "httpVersion": "http/2.0",
+          "queryString": [
+            {
+              "name": "text",
+              "value": "Opus%20"
+            },
+            {
+              "name": "layers",
+              "value": "address%2Cvenue%2Cstreet%2Cintersection"
+            },
+            {
+              "name": "focus.point.lat",
+              "value": "33.749"
+            },
+            {
+              "name": "focus.point.lon",
+              "value": "-84.388"
+            },
+            {
+              "name": "boundary.rect.min_lat",
+              "value": "32.066"
+            },
+            {
+              "name": "boundary.rect.min_lon",
+              "value": "-86.0856"
+            },
+            {
+              "name": "boundary.rect.max_lat",
+              "value": "35.7251"
+            },
+            {
+              "name": "boundary.rect.max_lon",
+              "value": "-81.9499"
+            }
+          ],
+          "headersSize": -1,
+          "bodySize": 0
+        },
+        "response": {
+          "status": 200,
+          "statusText": "",
+          "httpVersion": "http/2.0",
+          "content": {
+            "size": 0,
+            "mimeType": "application/json",
+            "text": ""
+          },
+          "redirectURL": "",
+          "headersSize": -1,
+          "bodySize": -1,
+          "_transferSize": 5621,
+          "_error": null
+        },
+        "serverIPAddress": "[64:ff9b::de1:2f3f]",
+        "startedDateTime": "2023-09-08T14:07:22.676Z",
+        "time": 2317.60100000065,
+        "timings": {
+          "blocked": 1231.086000000746,
+          "dns": -1,
+          "ssl": -1,
+          "connect": -1,
+          "send": 1.884999999999991,
+          "wait": 1083.7900000002057,
+          "receive": 0.8399999996981933,
+          "_blocked_queueing": 8.215000000745931
+        }
+      },
+      {
+        "request": {
+          "method": "GET",
+          "url": "http://localhost:9977/autocomplete?text=Opus%20M&layers=address%2Cvenue%2Cstreet%2Cintersection&focus.point.lat=33.749&focus.point.lon=-84.388&boundary.rect.min_lat=32.066&boundary.rect.min_lon=-86.0856&boundary.rect.max_lat=35.7251&boundary.rect.max_lon=-81.9499",
+          "httpVersion": "http/2.0",
+          "queryString": [
+            {
+              "name": "text",
+              "value": "Opus%20M"
+            },
+            {
+              "name": "layers",
+              "value": "address%2Cvenue%2Cstreet%2Cintersection"
+            },
+            {
+              "name": "focus.point.lat",
+              "value": "33.749"
+            },
+            {
+              "name": "focus.point.lon",
+              "value": "-84.388"
+            },
+            {
+              "name": "boundary.rect.min_lat",
+              "value": "32.066"
+            },
+            {
+              "name": "boundary.rect.min_lon",
+              "value": "-86.0856"
+            },
+            {
+              "name": "boundary.rect.max_lat",
+              "value": "35.7251"
+            },
+            {
+              "name": "boundary.rect.max_lon",
+              "value": "-81.9499"
+            }
+          ],
+          "headersSize": -1,
+          "bodySize": 0
+        },
+        "response": {
+          "status": 200,
+          "statusText": "",
+          "httpVersion": "http/2.0",
+          "content": {
+            "size": 0,
+            "mimeType": "application/json",
+            "text": ""
+          },
+          "redirectURL": "",
+          "headersSize": -1,
+          "bodySize": -1,
+          "_transferSize": 3972,
+          "_error": null
+        },
+        "serverIPAddress": "[64:ff9b::de1:2f3f]",
+        "startedDateTime": "2023-09-08T14:07:22.679Z",
+        "time": 1605.46499999964,
+        "timings": {
+          "blocked": 1227.7660000004744,
+          "dns": -1,
+          "ssl": -1,
+          "connect": -1,
+          "send": 2.2730000000001382,
+          "wait": 339.82599999991635,
+          "receive": 35.59999999924912,
+          "_blocked_queueing": 5.936000000474451
+        }
+      },
+      {
+        "request": {
+          "method": "GET",
+          "url": "http://localhost:9977/autocomplete?text=Opus%20Mu&layers=address%2Cvenue%2Cstreet%2Cintersection&focus.point.lat=33.749&focus.point.lon=-84.388&boundary.rect.min_lat=32.066&boundary.rect.min_lon=-86.0856&boundary.rect.max_lat=35.7251&boundary.rect.max_lon=-81.9499",
+          "httpVersion": "http/2.0",
+          "queryString": [
+            {
+              "name": "text",
+              "value": "Opus%20Mu"
+            },
+            {
+              "name": "layers",
+              "value": "address%2Cvenue%2Cstreet%2Cintersection"
+            },
+            {
+              "name": "focus.point.lat",
+              "value": "33.749"
+            },
+            {
+              "name": "focus.point.lon",
+              "value": "-84.388"
+            },
+            {
+              "name": "boundary.rect.min_lat",
+              "value": "32.066"
+            },
+            {
+              "name": "boundary.rect.min_lon",
+              "value": "-86.0856"
+            },
+            {
+              "name": "boundary.rect.max_lat",
+              "value": "35.7251"
+            },
+            {
+              "name": "boundary.rect.max_lon",
+              "value": "-81.9499"
+            }
+          ],
+          "headersSize": -1,
+          "bodySize": 0
+        },
+        "response": {
+          "status": 200,
+          "statusText": "",
+          "httpVersion": "http/2.0",
+          "content": {
+            "size": 0,
+            "mimeType": "application/json",
+            "text": ""
+          },
+          "redirectURL": "",
+          "headersSize": -1,
+          "bodySize": -1,
+          "_transferSize": 2370,
+          "_error": null
+        },
+        "serverIPAddress": "[64:ff9b::de1:2f3f]",
+        "startedDateTime": "2023-09-08T14:07:22.682Z",
+        "time": 1566.6149999997288,
+        "timings": {
+          "blocked": 1225.0449999998693,
+          "dns": -1,
+          "ssl": -1,
+          "connect": -1,
+          "send": 2.119999999999891,
+          "wait": 338.85400000000004,
+          "receive": 0.5959999998594867,
+          "_blocked_queueing": 3.5189999998692656
+        }
+      },
+      {
+        "request": {
+          "method": "GET",
+          "url": "http://localhost:9977/autocomplete?text=Opus%20Mus&layers=address%2Cvenue%2Cstreet%2Cintersection&focus.point.lat=33.749&focus.point.lon=-84.388&boundary.rect.min_lat=32.066&boundary.rect.min_lon=-86.0856&boundary.rect.max_lat=35.7251&boundary.rect.max_lon=-81.9499",
+          "httpVersion": "http/2.0",
+          "queryString": [
+            {
+              "name": "text",
+              "value": "Opus%20Mus"
+            },
+            {
+              "name": "layers",
+              "value": "address%2Cvenue%2Cstreet%2Cintersection"
+            },
+            {
+              "name": "focus.point.lat",
+              "value": "33.749"
+            },
+            {
+              "name": "focus.point.lon",
+              "value": "-84.388"
+            },
+            {
+              "name": "boundary.rect.min_lat",
+              "value": "32.066"
+            },
+            {
+              "name": "boundary.rect.min_lon",
+              "value": "-86.0856"
+            },
+            {
+              "name": "boundary.rect.max_lat",
+              "value": "35.7251"
+            },
+            {
+              "name": "boundary.rect.max_lon",
+              "value": "-81.9499"
+            }
+          ],
+          "headersSize": -1,
+          "bodySize": 0
+        },
+        "response": {
+          "status": 200,
+          "statusText": "",
+          "httpVersion": "http/2.0",
+          "content": {
+            "size": 0,
+            "mimeType": "application/json",
+            "text": ""
+          },
+          "redirectURL": "",
+          "headersSize": -1,
+          "bodySize": -1,
+          "_transferSize": 2367,
+          "_error": null
+        },
+        "serverIPAddress": "[64:ff9b::de1:2f3f]",
+        "startedDateTime": "2023-09-08T14:07:22.690Z",
+        "time": 2356.9259999994756,
+        "timings": {
+          "blocked": 1217.2119999999413,
+          "dns": -1,
+          "ssl": -1,
+          "connect": -1,
+          "send": 1.7999999999999545,
+          "wait": 1136.8809999999824,
+          "receive": 1.0329999995519756,
+          "_blocked_queueing": 4.3009999999412685
+        }
+      },
+      {
+        "request": {
+          "method": "GET",
+          "url": "http://localhost:9977/autocomplete?text=Opus%20Musi&layers=address%2Cvenue%2Cstreet%2Cintersection&focus.point.lat=33.749&focus.point.lon=-84.388&boundary.rect.min_lat=32.066&boundary.rect.min_lon=-86.0856&boundary.rect.max_lat=35.7251&boundary.rect.max_lon=-81.9499",
+          "httpVersion": "http/2.0",
+          "queryString": [
+            {
+              "name": "text",
+              "value": "Opus%20Musi"
+            },
+            {
+              "name": "layers",
+              "value": "address%2Cvenue%2Cstreet%2Cintersection"
+            },
+            {
+              "name": "focus.point.lat",
+              "value": "33.749"
+            },
+            {
+              "name": "focus.point.lon",
+              "value": "-84.388"
+            },
+            {
+              "name": "boundary.rect.min_lat",
+              "value": "32.066"
+            },
+            {
+              "name": "boundary.rect.min_lon",
+              "value": "-86.0856"
+            },
+            {
+              "name": "boundary.rect.max_lat",
+              "value": "35.7251"
+            },
+            {
+              "name": "boundary.rect.max_lon",
+              "value": "-81.9499"
+            }
+          ],
+          "headersSize": -1,
+          "bodySize": 0
+        },
+        "response": {
+          "status": 200,
+          "statusText": "",
+          "httpVersion": "http/2.0",
+          "content": {
+            "size": 0,
+            "mimeType": "application/json",
+            "text": ""
+          },
+          "redirectURL": "",
+          "headersSize": -1,
+          "bodySize": -1,
+          "_transferSize": 2379,
+          "_error": null
+        },
+        "serverIPAddress": "[64:ff9b::de1:2f3f]",
+        "startedDateTime": "2023-09-08T14:07:22.699Z",
+        "time": 2625.739999999496,
+        "timings": {
+          "blocked": 1208.077999999743,
+          "dns": -1,
+          "ssl": -1,
+          "connect": -1,
+          "send": 1.5919999999998709,
+          "wait": 1415.6090000001211,
+          "receive": 0.46099999963189475,
+          "_blocked_queueing": 3.523999999742955
+        }
+      },
+      {
+        "request": {
+          "method": "GET",
+          "url": "http://localhost:9977/autocomplete?text=Opus%20Music&layers=address%2Cvenue%2Cstreet%2Cintersection&focus.point.lat=33.749&focus.point.lon=-84.388&boundary.rect.min_lat=32.066&boundary.rect.min_lon=-86.0856&boundary.rect.max_lat=35.7251&boundary.rect.max_lon=-81.9499",
+          "httpVersion": "http/2.0",
+          "queryString": [
+            {
+              "name": "text",
+              "value": "Opus%20Music"
+            },
+            {
+              "name": "layers",
+              "value": "address%2Cvenue%2Cstreet%2Cintersection"
+            },
+            {
+              "name": "focus.point.lat",
+              "value": "33.749"
+            },
+            {
+              "name": "focus.point.lon",
+              "value": "-84.388"
+            },
+            {
+              "name": "boundary.rect.min_lat",
+              "value": "32.066"
+            },
+            {
+              "name": "boundary.rect.min_lon",
+              "value": "-86.0856"
+            },
+            {
+              "name": "boundary.rect.max_lat",
+              "value": "35.7251"
+            },
+            {
+              "name": "boundary.rect.max_lon",
+              "value": "-81.9499"
+            }
+          ],
+          "headersSize": -1,
+          "bodySize": 0
+        },
+        "response": {
+          "status": 200,
+          "statusText": "",
+          "httpVersion": "http/2.0",
+          "content": {
+            "size": 5231,
+            "mimeType": "application/json",
+            "text": "{\"geocoding\":{\"version\":\"0.2\",\"attribution\":\"https://geocode.earth/guidelines\",\"query\":{\"text\":\"Opus\",\"parser\":\"pelias\",\"parsed_text\":{\"subject\":\"Opus\"},\"size\":10,\"layers\":[\"address\",\"venue\",\"street\",\"intersection\"],\"sources\":[\"openstreetmap\",\"openaddresses\",\"geonames\",\"whosonfirst\",\"uscensus\"],\"private\":false,\"focus.point.lat\":33.749,\"focus.point.lon\":-84.388,\"boundary.rect.min_lat\":32.066,\"boundary.rect.max_lat\":35.7251,\"boundary.rect.min_lon\":-86.0856,\"boundary.rect.max_lon\":-81.9499,\"lang\":{\"name\":\"English\",\"iso6391\":\"en\",\"iso6393\":\"eng\",\"via\":\"default\",\"defaulted\":true},\"querySize\":20},\"engine\":{\"name\":\"Pelias\",\"author\":\"Mapzen\",\"version\":\"1.0\"},\"timestamp\":1694202052257},\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"geometry\":{\"type\":\"Point\",\"coordinates\":[-84.300178,33.77505]},\"properties\":{\"id\":\"node/556611976\",\"gid\":\"openstreetmap:venue:node/556611976\",\"layer\":\"venue\",\"source\":\"openstreetmap\",\"source_id\":\"node/556611976\",\"country_code\":\"US\",\"name\":\"Opus Music Store\",\"housenumber\":\"308D\",\"distance\":8.629,\"accuracy\":\"point\",\"country\":\"United States\",\"country_gid\":\"whosonfirst:country:85633793\",\"country_a\":\"USA\",\"region\":\"Georgia\",\"region_gid\":\"whosonfirst:region:85688535\",\"region_a\":\"GA\",\"county\":\"DeKalb County\",\"county_gid\":\"whosonfirst:county:102084539\",\"county_a\":\"DA\",\"locality\":\"Decatur\",\"locality_gid\":\"whosonfirst:locality:85936441\",\"continent\":\"North America\",\"continent_gid\":\"whosonfirst:continent:102191575\",\"label\":\"Opus Music Store, Decatur, GA, USA\",\"addendum\":{\"osm\":{\"website\":\"http://www.opusmusicstore.com/\",\"phone\":\"+1 404 370 0507\"}}}},{\"type\":\"Feature\",\"geometry\":{\"type\":\"Point\",\"coordinates\":[-84.385934,33.787145]},\"properties\":{\"id\":\"way/885660365\",\"gid\":\"openstreetmap:venue:way/885660365\",\"layer\":\"venue\",\"source\":\"openstreetmap\",\"source_id\":\"way/885660365\",\"country_code\":\"US\",\"name\":\"2 Opus Place (construction)\",\"distance\":4.251,\"accuracy\":\"point\",\"country\":\"United States\",\"country_gid\":\"whosonfirst:country:85633793\",\"country_a\":\"USA\",\"region\":\"Georgia\",\"region_gid\":\"whosonfirst:region:85688535\",\"region_a\":\"GA\",\"county\":\"Fulton County\",\"county_gid\":\"whosonfirst:county:102083603\",\"county_a\":\"FU\",\"locality\":\"Atlanta\",\"locality_gid\":\"whosonfirst:locality:85936429\",\"continent\":\"North America\",\"continent_gid\":\"whosonfirst:continent:102191575\",\"label\":\"2 Opus Place (construction), Atlanta, GA, USA\"},\"bbox\":[-84.3866911,33.7867611,-84.385266,33.7874624]},{\"type\":\"Feature\",\"geometry\":{\"type\":\"Point\",\"coordinates\":[-85.211688,35.00657]},\"properties\":{\"id\":\"way/51791114\",\"gid\":\"openstreetmap:venue:way/51791114\",\"layer\":\"venue\",\"source\":\"openstreetmap\",\"source_id\":\"way/51791114\",\"country_code\":\"US\",\"name\":\"Opus Inspection\",\"distance\":159.136,\"accuracy\":\"point\",\"country\":\"United States\",\"country_gid\":\"whosonfirst:country:85633793\",\"country_a\":\"USA\",\"region\":\"Tennessee\",\"region_gid\":\"whosonfirst:region:85688701\",\"region_a\":\"TN\",\"county\":\"Hamilton County\",\"county_gid\":\"whosonfirst:county:102087185\",\"county_a\":\"HL\",\"locality\":\"Chattanooga\",\"locality_gid\":\"whosonfirst:locality:101723043\",\"continent\":\"North America\",\"continent_gid\":\"whosonfirst:continent:102191575\",\"label\":\"Opus Inspection, Chattanooga, TN, USA\"},\"bbox\":[-85.2118453,35.0064715,-85.21153,35.0067042]},{\"type\":\"Feature\",\"geometry\":{\"type\":\"Point\",\"coordinates\":[-82.230045,33.55809]},\"properties\":{\"id\":\"w577848242-n5538625175-w577848271\",\"gid\":\"openstreetmap:intersection:w577848242-n5538625175-w577848271\",\"layer\":\"intersection\",\"source\":\"openstreetmap\",\"source_id\":\"w577848242-n5538625175-w577848271\",\"country_code\":\"US\",\"name\":\"Bent Creek Drive & Magnum Opus Way\",\"street\":\"Bent Creek Drive\",\"distance\":201.084,\"accuracy\":\"centroid\",\"country\":\"United States\",\"country_gid\":\"whosonfirst:country:85633793\",\"country_a\":\"USA\",\"region\":\"Georgia\",\"region_gid\":\"whosonfirst:region:85688535\",\"region_a\":\"GA\",\"county\":\"Columbia County\",\"county_gid\":\"whosonfirst:county:102082315\",\"county_a\":\"CI\",\"continent\":\"North America\",\"continent_gid\":\"whosonfirst:continent:102191575\",\"label\":\"Bent Creek Drive & Magnum Opus Way, Columbia County, GA, USA\"}},{\"type\":\"Feature\",\"geometry\":{\"type\":\"Point\",\"coordinates\":[-82.22882,33.559832]},\"properties\":{\"id\":\"polyline:18601022\",\"gid\":\"openstreetmap:street:polyline:18601022\",\"layer\":\"street\",\"source\":\"openstreetmap\",\"source_id\":\"polyline:18601022\",\"country_code\":\"US\",\"name\":\"Magnum Opus Way\",\"street\":\"Magnum Opus Way\",\"distance\":201.175,\"accuracy\":\"centroid\",\"country\":\"United States\",\"country_gid\":\"whosonfirst:country:85633793\",\"country_a\":\"USA\",\"region\":\"Georgia\",\"region_gid\":\"whosonfirst:region:85688535\",\"region_a\":\"GA\",\"county\":\"Columbia County\",\"county_gid\":\"whosonfirst:county:102082315\",\"county_a\":\"CI\",\"continent\":\"North America\",\"continent_gid\":\"whosonfirst:continent:102191575\",\"label\":\"Magnum Opus Way, Columbia County, GA, USA\"},\"bbox\":[-82.230045,33.55809,-82.227691,33.561696]}],\"bbox\":[-85.2118453,33.55809,-82.227691,35.0067042],\"isomorphicMapzenSearchQuery\":{\"api_key\":\"ge-0624346c114543d5\",\"text\":\"Opus\",\"layers\":\"address,venue,street,intersection\",\"focus.point.lat\":33.749,\"focus.point.lon\":-84.388,\"boundary.rect.min_lat\":32.066,\"boundary.rect.min_lon\":-86.0856,\"boundary.rect.max_lat\":35.7251,\"boundary.rect.max_lon\":-81.9499}}"
+          },
+          "redirectURL": "",
+          "headersSize": -1,
+          "bodySize": -1,
+          "_transferSize": 2351,
+          "_error": null
+        },
+        "serverIPAddress": "[64:ff9b::de1:2f3f]",
+        "startedDateTime": "2023-09-08T14:07:22.703Z",
+        "time": 2622.787999999673,
+        "timings": {
+          "blocked": 1203.8749999999998,
+          "dns": -1,
+          "ssl": -1,
+          "connect": -1,
+          "send": 1.731999999999971,
+          "wait": 1416.4810000000764,
+          "receive": 0.699999999596912,
+          "_blocked_queueing": 3.0169999999998254
+        }
+      },
+
+      {
+        "request": {
+          "bodySize": 0,
+          "method": "GET",
+          "url": "http://localhost:9977/autocomplete?text=9&layers=address%2Cvenue%2Cstreet%2Cintersection&focus.point.lat=33.749&focus.point.lon=-84.388&boundary.rect.min_lat=32.066&boundary.rect.min_lon=-86.0856&boundary.rect.max_lat=35.7251&boundary.rect.max_lon=-81.9499",
+          "httpVersion": "",
+          "queryString": [
+            {
+              "name": "text",
+              "value": "9"
+            },
+            {
+              "name": "layers",
+              "value": "address,venue,street,intersection"
+            },
+            {
+              "name": "focus.point.lat",
+              "value": "33.749"
+            },
+            {
+              "name": "focus.point.lon",
+              "value": "-84.388"
+            },
+            {
+              "name": "boundary.rect.min_lat",
+              "value": "32.066"
+            },
+            {
+              "name": "boundary.rect.min_lon",
+              "value": "-86.0856"
+            },
+            {
+              "name": "boundary.rect.max_lat",
+              "value": "35.7251"
+            },
+            {
+              "name": "boundary.rect.max_lon",
+              "value": "-81.9499"
+            }
+          ],
+          "headersSize": 730
+        },
+        "response": {
+          "status": 0,
+          "statusText": "",
+          "httpVersion": "",
+          "content": {
+            "mimeType": "",
+            "size": 0,
+            "encoding": "base64",
+            "text": ""
+          },
+          "redirectURL": "",
+          "headersSize": 0,
+          "bodySize": 0
+        },
+        "cache": {},
+        "timings": {
+          "blocked": 0,
+          "dns": 0,
+          "connect": 0,
+          "ssl": 0,
+          "send": 0,
+          "wait": 0,
+          "receive": 0
+        },
+        "time": 0
+      },
+      {
+        "request": {
+          "bodySize": 0,
+          "method": "GET",
+          "url": "http://localhost:9977/autocomplete?text=90&layers=address%2Cvenue%2Cstreet%2Cintersection&focus.point.lat=33.749&focus.point.lon=-84.388&boundary.rect.min_lat=32.066&boundary.rect.min_lon=-86.0856&boundary.rect.max_lat=35.7251&boundary.rect.max_lon=-81.9499",
+          "httpVersion": "",
+          "queryString": [
+            {
+              "name": "text",
+              "value": "90"
+            },
+            {
+              "name": "layers",
+              "value": "address,venue,street,intersection"
+            },
+            {
+              "name": "focus.point.lat",
+              "value": "33.749"
+            },
+            {
+              "name": "focus.point.lon",
+              "value": "-84.388"
+            },
+            {
+              "name": "boundary.rect.min_lat",
+              "value": "32.066"
+            },
+            {
+              "name": "boundary.rect.min_lon",
+              "value": "-86.0856"
+            },
+            {
+              "name": "boundary.rect.max_lat",
+              "value": "35.7251"
+            },
+            {
+              "name": "boundary.rect.max_lon",
+              "value": "-81.9499"
+            }
+          ],
+          "headersSize": 731
+        },
+        "response": {
+          "status": 0,
+          "statusText": "",
+          "httpVersion": "",
+          "content": {
+            "mimeType": "",
+            "size": 0,
+            "encoding": "base64",
+            "text": ""
+          },
+          "redirectURL": "",
+          "headersSize": 0,
+          "bodySize": 0
+        },
+        "cache": {},
+        "timings": {
+          "blocked": 0,
+          "dns": 0,
+          "connect": 0,
+          "ssl": 0,
+          "send": 0,
+          "wait": 0,
+          "receive": 0
+        },
+        "time": 0
+      },
+      {
+        "request": {
+          "bodySize": 0,
+          "method": "GET",
+          "url": "http://localhost:9977/autocomplete?text=908&layers=address%2Cvenue%2Cstreet%2Cintersection&focus.point.lat=33.749&focus.point.lon=-84.388&boundary.rect.min_lat=32.066&boundary.rect.min_lon=-86.0856&boundary.rect.max_lat=35.7251&boundary.rect.max_lon=-81.9499",
+          "httpVersion": "",
+          "queryString": [
+            {
+              "name": "text",
+              "value": "908"
+            },
+            {
+              "name": "layers",
+              "value": "address,venue,street,intersection"
+            },
+            {
+              "name": "focus.point.lat",
+              "value": "33.749"
+            },
+            {
+              "name": "focus.point.lon",
+              "value": "-84.388"
+            },
+            {
+              "name": "boundary.rect.min_lat",
+              "value": "32.066"
+            },
+            {
+              "name": "boundary.rect.min_lon",
+              "value": "-86.0856"
+            },
+            {
+              "name": "boundary.rect.max_lat",
+              "value": "35.7251"
+            },
+            {
+              "name": "boundary.rect.max_lon",
+              "value": "-81.9499"
+            }
+          ],
+          "headersSize": 732
+        },
+        "response": {
+          "status": 0,
+          "statusText": "",
+          "httpVersion": "",
+          "content": {
+            "mimeType": "",
+            "size": 0,
+            "encoding": "base64",
+            "text": ""
+          },
+          "redirectURL": "",
+          "headersSize": 0,
+          "bodySize": 0
+        },
+        "cache": {},
+        "timings": {
+          "blocked": 0,
+          "dns": 0,
+          "connect": 0,
+          "ssl": 0,
+          "send": 0,
+          "wait": 0,
+          "receive": 0
+        },
+        "time": 0
+      },
+      {
+        "request": {
+          "bodySize": 0,
+          "method": "GET",
+          "url": "http://localhost:9977/autocomplete?text=9089&layers=address%2Cvenue%2Cstreet%2Cintersection&focus.point.lat=33.749&focus.point.lon=-84.388&boundary.rect.min_lat=32.066&boundary.rect.min_lon=-86.0856&boundary.rect.max_lat=35.7251&boundary.rect.max_lon=-81.9499",
+          "httpVersion": "",
+          "queryString": [
+            {
+              "name": "text",
+              "value": "9089"
+            },
+            {
+              "name": "layers",
+              "value": "address,venue,street,intersection"
+            },
+            {
+              "name": "focus.point.lat",
+              "value": "33.749"
+            },
+            {
+              "name": "focus.point.lon",
+              "value": "-84.388"
+            },
+            {
+              "name": "boundary.rect.min_lat",
+              "value": "32.066"
+            },
+            {
+              "name": "boundary.rect.min_lon",
+              "value": "-86.0856"
+            },
+            {
+              "name": "boundary.rect.max_lat",
+              "value": "35.7251"
+            },
+            {
+              "name": "boundary.rect.max_lon",
+              "value": "-81.9499"
+            }
+          ],
+          "headersSize": 733
+        },
+        "response": {
+          "status": 0,
+          "statusText": "",
+          "httpVersion": "",
+          "content": {
+            "mimeType": "",
+            "size": 0,
+            "encoding": "base64",
+            "text": ""
+          },
+          "redirectURL": "",
+          "headersSize": 0,
+          "bodySize": 0
+        },
+        "cache": {},
+        "timings": {
+          "blocked": 0,
+          "dns": 0,
+          "connect": 0,
+          "ssl": 0,
+          "send": 0,
+          "wait": 0,
+          "receive": 0
+        },
+        "time": 0
+      },
+      {
+        "request": {
+          "bodySize": 0,
+          "method": "GET",
+          "url": "http://localhost:9977/autocomplete?text=90898&layers=address%2Cvenue%2Cstreet%2Cintersection&focus.point.lat=33.749&focus.point.lon=-84.388&boundary.rect.min_lat=32.066&boundary.rect.min_lon=-86.0856&boundary.rect.max_lat=35.7251&boundary.rect.max_lon=-81.9499",
+          "httpVersion": "",
+          "queryString": [
+            {
+              "name": "text",
+              "value": "90898"
+            },
+            {
+              "name": "layers",
+              "value": "address,venue,street,intersection"
+            },
+            {
+              "name": "focus.point.lat",
+              "value": "33.749"
+            },
+            {
+              "name": "focus.point.lon",
+              "value": "-84.388"
+            },
+            {
+              "name": "boundary.rect.min_lat",
+              "value": "32.066"
+            },
+            {
+              "name": "boundary.rect.min_lon",
+              "value": "-86.0856"
+            },
+            {
+              "name": "boundary.rect.max_lat",
+              "value": "35.7251"
+            },
+            {
+              "name": "boundary.rect.max_lon",
+              "value": "-81.9499"
+            }
+          ],
+          "headersSize": 735
+        },
+        "response": {
+          "status": 0,
+          "statusText": "",
+          "httpVersion": "",
+          "content": {
+            "mimeType": "",
+            "size": 0,
+            "encoding": "base64",
+            "text": ""
+          },
+          "redirectURL": "",
+          "headersSize": 0,
+          "bodySize": 0
+        },
+        "cache": {},
+        "timings": {
+          "blocked": 0,
+          "dns": 0,
+          "connect": 0,
+          "ssl": 0,
+          "send": 0,
+          "wait": 0,
+          "receive": 0
+        },
+        "time": 0
+      },
+      {
+        "request": {
+          "bodySize": 0,
+          "method": "GET",
+          "url": "http://localhost:9977/autocomplete?text=908981&layers=address%2Cvenue%2Cstreet%2Cintersection&focus.point.lat=33.749&focus.point.lon=-84.388&boundary.rect.min_lat=32.066&boundary.rect.min_lon=-86.0856&boundary.rect.max_lat=35.7251&boundary.rect.max_lon=-81.9499",
+          "httpVersion": "HTTP/2",
+          "queryString": [
+            {
+              "name": "text",
+              "value": "908981"
+            },
+            {
+              "name": "layers",
+              "value": "address,venue,street,intersection"
+            },
+            {
+              "name": "focus.point.lat",
+              "value": "33.749"
+            },
+            {
+              "name": "focus.point.lon",
+              "value": "-84.388"
+            },
+            {
+              "name": "boundary.rect.min_lat",
+              "value": "32.066"
+            },
+            {
+              "name": "boundary.rect.min_lon",
+              "value": "-86.0856"
+            },
+            {
+              "name": "boundary.rect.max_lat",
+              "value": "35.7251"
+            },
+            {
+              "name": "boundary.rect.max_lon",
+              "value": "-81.9499"
+            }
+          ],
+          "headersSize": 736
+        },
+        "response": {
+          "status": 200,
+          "statusText": "OK",
+          "httpVersion": "HTTP/2",
+          "content": {
+            "mimeType": "application/json",
+            "size": 12687,
+            "text": "{\"features\":[{\"geometry\":{\"type\":\"Point\",\"coordinates\":[-84.391397,33.753837]},\"id\":\"MARTA:797\",\"properties\":{\"layer\":\"stops\",\"source\":\"otp\",\"name\":\"Five Points Station (908981)\",\"label\":\"Five Points Station (908981)\"},\"type\":\"Feature\"}],\"type\":\"FeatureCollection\"}"
+          },
+          "redirectURL": "",
+          "headersSize": 547,
+          "bodySize": 13234
+        },
+        "cache": {},
+        "timings": {
+          "blocked": 0,
+          "dns": 0,
+          "connect": 0,
+          "ssl": 0,
+          "send": 0,
+          "wait": 199,
+          "receive": 0
+        },
+        "time": 199
+      }
+    ]
+  }
+}
\ No newline at end of file
diff --git a/percy/percy.test.js b/percy/percy.test.js
index e6862a86e..87b5b1ec3 100644
--- a/percy/percy.test.js
+++ b/percy/percy.test.js
@@ -53,7 +53,12 @@ beforeAll(async () => {
     // Launch mock geocoder server
     execa(
       'yarn',
-      ['percy-har-express', '-p', '9977', 'percy/geocoder-mock.har'],
+      [
+        'percy-har-express',
+        '-p',
+        '9977',
+        `percy/geocoder-mock-${OTP_RR_UI_MODE}.har`
+      ],
       {
         signal: geocoderAbortController.signal
       }

From 6870b139e50fe9be954879271489e0bf111bee49 Mon Sep 17 00:00:00 2001
From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com>
Date: Fri, 8 Sep 2023 16:16:46 -0400
Subject: [PATCH 05/13] test(percy): Remove sv info from mocks

---
 percy/geocoder-mock-calltaker.har | 11 -----------
 percy/geocoder-mock-normal.har    | 10 ----------
 percy/mock.har                    | 23 -----------------------
 3 files changed, 44 deletions(-)

diff --git a/percy/geocoder-mock-calltaker.har b/percy/geocoder-mock-calltaker.har
index 447fc319f..0a93718b8 100644
--- a/percy/geocoder-mock-calltaker.har
+++ b/percy/geocoder-mock-calltaker.har
@@ -64,7 +64,6 @@
           "_transferSize": 12109,
           "_error": null
         },
-        "serverIPAddress": "[64:ff9b::d21:40f]",
         "startedDateTime": "2023-09-08T13:53:49.885Z",
         "time": 449.04499999984364,
         "timings": {
@@ -135,7 +134,6 @@
           "_transferSize": 11081,
           "_error": null
         },
-        "serverIPAddress": "[64:ff9b::d21:40f]",
         "startedDateTime": "2023-09-08T13:53:49.902Z",
         "time": 804.0409999994154,
         "timings": {
@@ -206,7 +204,6 @@
           "_transferSize": 11253,
           "_error": null
         },
-        "serverIPAddress": "[64:ff9b::d21:40f]",
         "startedDateTime": "2023-09-08T13:53:49.909Z",
         "time": 1204.160999999658,
         "timings": {
@@ -277,7 +274,6 @@
           "_transferSize": 12769,
           "_error": null
         },
-        "serverIPAddress": "[64:ff9b::d21:40f]",
         "startedDateTime": "2023-09-08T13:53:49.917Z",
         "time": 313.9339999997901,
         "timings": {
@@ -348,7 +344,6 @@
           "_transferSize": 12768,
           "_error": null
         },
-        "serverIPAddress": "[64:ff9b::d21:40f]",
         "startedDateTime": "2023-09-08T13:53:49.923Z",
         "time": 1060.0050000002739,
         "timings": {
@@ -419,7 +414,6 @@
           "_transferSize": 11016,
           "_error": null
         },
-        "serverIPAddress": "[64:ff9b::d21:40f]",
         "startedDateTime": "2023-09-08T13:53:49.932Z",
         "time": 812.2540000003937,
         "timings": {
@@ -490,7 +484,6 @@
           "_transferSize": 11006,
           "_error": null
         },
-        "serverIPAddress": "[64:ff9b::d21:40f]",
         "startedDateTime": "2023-09-08T13:53:49.938Z",
         "time": 1667.8229999997711,
         "timings": {
@@ -561,7 +554,6 @@
           "_transferSize": 11011,
           "_error": null
         },
-        "serverIPAddress": "[64:ff9b::d21:40f]",
         "startedDateTime": "2023-09-08T13:53:49.950Z",
         "time": 1307.301999999254,
         "timings": {
@@ -632,7 +624,6 @@
           "_transferSize": 11016,
           "_error": null
         },
-        "serverIPAddress": "[64:ff9b::d21:40f]",
         "startedDateTime": "2023-09-08T13:53:49.958Z",
         "time": 746.1700000003475,
         "timings": {
@@ -703,7 +694,6 @@
           "_transferSize": 11020,
           "_error": null
         },
-        "serverIPAddress": "[64:ff9b::d21:40f]",
         "startedDateTime": "2023-09-08T13:53:49.967Z",
         "time": 1989.0759999998409,
         "timings": {
@@ -774,7 +764,6 @@
           "_transferSize": 12959,
           "_error": null
         },
-        "serverIPAddress": "[64:ff9b::d21:40f]",
         "startedDateTime": "2023-09-08T13:53:49.974Z",
         "time": 1773.866000000453,
         "timings": {
diff --git a/percy/geocoder-mock-normal.har b/percy/geocoder-mock-normal.har
index 5d6763cd2..39164fea8 100644
--- a/percy/geocoder-mock-normal.har
+++ b/percy/geocoder-mock-normal.har
@@ -64,7 +64,6 @@
           "_transferSize": 12785,
           "_error": null
         },
-        "serverIPAddress": "[64:ff9b::de1:2f3f]",
         "startedDateTime": "2023-09-08T14:07:22.644Z",
         "time": 2125.9739999999583,
         "timings": {
@@ -135,7 +134,6 @@
           "_transferSize": 11262,
           "_error": null
         },
-        "serverIPAddress": "[64:ff9b::de1:2f3f]",
         "startedDateTime": "2023-09-08T14:07:22.656Z",
         "time": 2307.477999999719,
         "timings": {
@@ -206,7 +204,6 @@
           "_transferSize": 5615,
           "_error": null
         },
-        "serverIPAddress": "[64:ff9b::de1:2f3f]",
         "startedDateTime": "2023-09-08T14:07:22.663Z",
         "time": 2034.0139999998428,
         "timings": {
@@ -277,7 +274,6 @@
           "_transferSize": 5619,
           "_error": null
         },
-        "serverIPAddress": "[64:ff9b::de1:2f3f]",
         "startedDateTime": "2023-09-08T14:07:22.666Z",
         "time": 1865.16599999959,
         "timings": {
@@ -348,7 +344,6 @@
           "_transferSize": 5621,
           "_error": null
         },
-        "serverIPAddress": "[64:ff9b::de1:2f3f]",
         "startedDateTime": "2023-09-08T14:07:22.676Z",
         "time": 2317.60100000065,
         "timings": {
@@ -419,7 +414,6 @@
           "_transferSize": 3972,
           "_error": null
         },
-        "serverIPAddress": "[64:ff9b::de1:2f3f]",
         "startedDateTime": "2023-09-08T14:07:22.679Z",
         "time": 1605.46499999964,
         "timings": {
@@ -490,7 +484,6 @@
           "_transferSize": 2370,
           "_error": null
         },
-        "serverIPAddress": "[64:ff9b::de1:2f3f]",
         "startedDateTime": "2023-09-08T14:07:22.682Z",
         "time": 1566.6149999997288,
         "timings": {
@@ -561,7 +554,6 @@
           "_transferSize": 2367,
           "_error": null
         },
-        "serverIPAddress": "[64:ff9b::de1:2f3f]",
         "startedDateTime": "2023-09-08T14:07:22.690Z",
         "time": 2356.9259999994756,
         "timings": {
@@ -632,7 +624,6 @@
           "_transferSize": 2379,
           "_error": null
         },
-        "serverIPAddress": "[64:ff9b::de1:2f3f]",
         "startedDateTime": "2023-09-08T14:07:22.699Z",
         "time": 2625.739999999496,
         "timings": {
@@ -703,7 +694,6 @@
           "_transferSize": 2351,
           "_error": null
         },
-        "serverIPAddress": "[64:ff9b::de1:2f3f]",
         "startedDateTime": "2023-09-08T14:07:22.703Z",
         "time": 2622.787999999673,
         "timings": {
diff --git a/percy/mock.har b/percy/mock.har
index 64f8ee2a4..168b2f6c5 100644
--- a/percy/mock.har
+++ b/percy/mock.har
@@ -35,7 +35,6 @@
           "_transferSize": 9618,
           "_error": null
         },
-        "serverIPAddress": "23.22.4.67",
         "startedDateTime": "2023-08-09T14:44:09.561Z",
         "time": 221.89399999479065,
         "timings": {
@@ -77,7 +76,6 @@
           "_transferSize": 9618,
           "_error": null
         },
-        "serverIPAddress": "23.22.4.67",
         "startedDateTime": "2023-08-09T14:44:09.561Z",
         "time": 221.89399999479065,
         "timings": {
@@ -119,7 +117,6 @@
           "_transferSize": 76937,
           "_error": null
         },
-        "serverIPAddress": "35.173.73.127",
         "startedDateTime": "2023-08-03T20:49:50.033Z",
         "time": 590.6560000003083,
         "timings": {
@@ -161,7 +158,6 @@
           "_transferSize": 7340,
           "_error": null
         },
-        "serverIPAddress": "35.173.73.127",
         "startedDateTime": "2023-08-03T20:49:50.036Z",
         "time": 257.49999999970896,
         "timings": {
@@ -203,7 +199,6 @@
           "_transferSize": 40856,
           "_error": null
         },
-        "serverIPAddress": "52.20.220.65",
         "startedDateTime": "2023-08-04T20:40:31.694Z",
         "time": 82.74900000105845,
         "timings": {
@@ -241,7 +236,6 @@
           "_transferSize": 5438,
           "_error": null
         },
-        "serverIPAddress": "3.222.122.125",
         "startedDateTime": "2023-08-04T20:59:03.536Z",
         "time": 54.81599999620812,
         "timings": {
@@ -279,7 +273,6 @@
           "_transferSize": 38256,
           "_error": null
         },
-        "serverIPAddress": "3.222.122.125",
         "startedDateTime": "2023-08-04T20:59:03.536Z",
         "time": 60.42699999670731,
         "timings": {
@@ -321,7 +314,6 @@
           "_transferSize": 2433,
           "_error": null
         },
-        "serverIPAddress": "34.195.110.47",
         "startedDateTime": "2023-08-04T21:29:23.087Z",
         "time": 66.22100000095088,
         "timings": {
@@ -368,7 +360,6 @@
           "_transferSize": 1604,
           "_error": null
         },
-        "serverIPAddress": "34.195.110.47",
         "startedDateTime": "2023-08-04T21:29:23.171Z",
         "time": 51.44000000291271,
         "timings": {
@@ -410,7 +401,6 @@
           "_transferSize": 2002,
           "_error": null
         },
-        "serverIPAddress": "34.195.110.47",
         "startedDateTime": "2023-08-04T21:29:23.176Z",
         "time": 58.54399999952875,
         "timings": {
@@ -452,7 +442,6 @@
           "_transferSize": 7459,
           "_error": null
         },
-        "serverIPAddress": "34.195.110.47",
         "startedDateTime": "2023-08-04T21:29:23.177Z",
         "time": 57.214999993448146,
         "timings": {
@@ -495,7 +484,6 @@
           "_transferSize": 27049,
           "_error": null
         },
-        "serverIPAddress": "34.238.57.75",
         "startedDateTime": "2023-08-07T19:09:16.223Z",
         "time": 66.91099999807193,
         "timings": {
@@ -537,7 +525,6 @@
           "_transferSize": 33935,
           "_error": null
         },
-        "serverIPAddress": "44.207.110.234",
         "startedDateTime": "2023-08-07T19:49:43.900Z",
         "time": 168.25500000049942,
         "timings": {
@@ -596,7 +583,6 @@
           "_transferSize": 1191061,
           "_error": null
         },
-        "serverIPAddress": "3.232.128.121",
         "startedDateTime": "2023-08-07T21:13:12.901Z",
         "time": 327.1550000026764,
         "timings": {
@@ -638,7 +624,6 @@
           "_transferSize": 25417,
           "_error": null
         },
-        "serverIPAddress": "54.86.250.244",
         "startedDateTime": "2023-08-07T20:31:47.159Z",
         "time": 305.05600000105915,
         "timings": {
@@ -680,7 +665,6 @@
           "_transferSize": 1077,
           "_error": null
         },
-        "serverIPAddress": "3.220.60.180",
         "startedDateTime": "2023-08-08T20:29:50.871Z",
         "time": 62.50199999703909,
         "timings": {
@@ -722,7 +706,6 @@
           "_transferSize": 1077,
           "_error": null
         },
-        "serverIPAddress": "3.220.60.180",
         "startedDateTime": "2023-08-08T20:29:50.871Z",
         "time": 62.50199999703909,
         "timings": {
@@ -764,7 +747,6 @@
           "_transferSize": 1077,
           "_error": null
         },
-        "serverIPAddress": "3.220.60.180",
         "startedDateTime": "2023-08-08T20:29:50.871Z",
         "time": 62.50199999703909,
         "timings": {
@@ -806,7 +788,6 @@
           "_transferSize": 1077,
           "_error": null
         },
-        "serverIPAddress": "3.220.60.180",
         "startedDateTime": "2023-08-08T20:29:50.871Z",
         "time": 62.50199999703909,
         "timings": {
@@ -848,7 +829,6 @@
           "_transferSize": 31570,
           "_error": null
         },
-        "serverIPAddress": "3.220.60.180",
         "startedDateTime": "2023-08-08T14:50:06.820Z",
         "time": 189.288999999917,
         "timings": {
@@ -885,7 +865,6 @@
           "_transferSize": 21813,
           "_error": null
         },
-        "serverIPAddress": "3.220.60.180",
         "startedDateTime": "2023-08-08T14:50:06.819Z",
         "time": 185.85299999995186,
         "timings": {
@@ -927,7 +906,6 @@
           "_transferSize": 4511,
           "_error": null
         },
-        "serverIPAddress": "3.220.60.180",
         "startedDateTime": "2023-08-08T14:50:07.079Z",
         "time": 57.98200000026554,
         "timings": {
@@ -969,7 +947,6 @@
           "_transferSize": 43200,
           "_error": null
         },
-        "serverIPAddress": "3.220.60.180",
         "startedDateTime": "2023-08-08T14:50:07.080Z",
         "time": 65.15599999966071,
         "timings": {

From 10e612a0eb46c90cb7ef902925672ee04415216f Mon Sep 17 00:00:00 2001
From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com>
Date: Fri, 8 Sep 2023 18:04:06 -0400
Subject: [PATCH 06/13] test(percy): Tighten up mocks

---
 percy/geocoder-mock-calltaker.har | 20 +++----
 percy/geocoder-mock-normal.har    | 99 ++++++++++++-------------------
 2 files changed, 49 insertions(+), 70 deletions(-)

diff --git a/percy/geocoder-mock-calltaker.har b/percy/geocoder-mock-calltaker.har
index 0a93718b8..895bf6a9b 100644
--- a/percy/geocoder-mock-calltaker.har
+++ b/percy/geocoder-mock-calltaker.har
@@ -56,7 +56,7 @@
           "content": {
             "size": 11710,
             "mimeType": "application/json",
-            "text": ""
+            "text": "{\"features\":[]}"
           },
           "redirectURL": "",
           "headersSize": -1,
@@ -126,7 +126,7 @@
           "content": {
             "size": 0,
             "mimeType": "application/json",
-            "text": ""
+            "text": "{\"features\":[]}"
           },
           "redirectURL": "",
           "headersSize": -1,
@@ -196,7 +196,7 @@
           "content": {
             "size": 0,
             "mimeType": "application/json",
-            "text": ""
+            "text": "{\"features\":[]}"
           },
           "redirectURL": "",
           "headersSize": -1,
@@ -266,7 +266,7 @@
           "content": {
             "size": 0,
             "mimeType": "application/json",
-            "text": ""
+            "text": "{\"features\":[]}"
           },
           "redirectURL": "",
           "headersSize": -1,
@@ -336,7 +336,7 @@
           "content": {
             "size": 0,
             "mimeType": "application/json",
-            "text": ""
+            "text": "{\"features\":[]}"
           },
           "redirectURL": "",
           "headersSize": -1,
@@ -406,7 +406,7 @@
           "content": {
             "size": 0,
             "mimeType": "application/json",
-            "text": ""
+            "text": "{\"features\":[]}"
           },
           "redirectURL": "",
           "headersSize": -1,
@@ -476,7 +476,7 @@
           "content": {
             "size": 0,
             "mimeType": "application/json",
-            "text": ""
+            "text": "{\"features\":[]}"
           },
           "redirectURL": "",
           "headersSize": -1,
@@ -546,7 +546,7 @@
           "content": {
             "size": 0,
             "mimeType": "application/json",
-            "text": ""
+            "text": "{\"features\":[]}"
           },
           "redirectURL": "",
           "headersSize": -1,
@@ -616,7 +616,7 @@
           "content": {
             "size": 0,
             "mimeType": "application/json",
-            "text": ""
+            "text": "{\"features\":[]}"
           },
           "redirectURL": "",
           "headersSize": -1,
@@ -686,7 +686,7 @@
           "content": {
             "size": 0,
             "mimeType": "application/json",
-            "text": ""
+            "text": "{\"features\":[]}"
           },
           "redirectURL": "",
           "headersSize": -1,
diff --git a/percy/geocoder-mock-normal.har b/percy/geocoder-mock-normal.har
index 39164fea8..e33efa664 100644
--- a/percy/geocoder-mock-normal.har
+++ b/percy/geocoder-mock-normal.har
@@ -56,9 +56,8 @@
           "content": {
             "size": 0,
             "mimeType": "application/json",
-            "text": ""
+            "text": "{\"features\":[]}"
           },
-          "redirectURL": "",
           "headersSize": -1,
           "bodySize": -1,
           "_transferSize": 12785,
@@ -126,9 +125,8 @@
           "content": {
             "size": 0,
             "mimeType": "application/json",
-            "text": ""
+            "text": "{\"features\":[]}"
           },
-          "redirectURL": "",
           "headersSize": -1,
           "bodySize": -1,
           "_transferSize": 11262,
@@ -196,9 +194,8 @@
           "content": {
             "size": 0,
             "mimeType": "application/json",
-            "text": ""
+            "text": "{\"features\":[]}"
           },
-          "redirectURL": "",
           "headersSize": -1,
           "bodySize": -1,
           "_transferSize": 5615,
@@ -266,9 +263,8 @@
           "content": {
             "size": 0,
             "mimeType": "application/json",
-            "text": ""
+            "text": "{\"features\":[]}"
           },
-          "redirectURL": "",
           "headersSize": -1,
           "bodySize": -1,
           "_transferSize": 5619,
@@ -336,9 +332,8 @@
           "content": {
             "size": 0,
             "mimeType": "application/json",
-            "text": ""
+            "text": "{\"features\":[]}"
           },
-          "redirectURL": "",
           "headersSize": -1,
           "bodySize": -1,
           "_transferSize": 5621,
@@ -406,9 +401,8 @@
           "content": {
             "size": 0,
             "mimeType": "application/json",
-            "text": ""
+            "text": "{\"features\":[]}"
           },
-          "redirectURL": "",
           "headersSize": -1,
           "bodySize": -1,
           "_transferSize": 3972,
@@ -476,9 +470,8 @@
           "content": {
             "size": 0,
             "mimeType": "application/json",
-            "text": ""
+            "text": "{\"features\":[]}"
           },
-          "redirectURL": "",
           "headersSize": -1,
           "bodySize": -1,
           "_transferSize": 2370,
@@ -546,9 +539,8 @@
           "content": {
             "size": 0,
             "mimeType": "application/json",
-            "text": ""
+            "text": "{\"features\":[]}"
           },
-          "redirectURL": "",
           "headersSize": -1,
           "bodySize": -1,
           "_transferSize": 2367,
@@ -616,9 +608,8 @@
           "content": {
             "size": 0,
             "mimeType": "application/json",
-            "text": ""
+            "text": "{\"features\":[]}"
           },
-          "redirectURL": "",
           "headersSize": -1,
           "bodySize": -1,
           "_transferSize": 2379,
@@ -688,7 +679,6 @@
             "mimeType": "application/json",
             "text": "{\"geocoding\":{\"version\":\"0.2\",\"attribution\":\"https://geocode.earth/guidelines\",\"query\":{\"text\":\"Opus\",\"parser\":\"pelias\",\"parsed_text\":{\"subject\":\"Opus\"},\"size\":10,\"layers\":[\"address\",\"venue\",\"street\",\"intersection\"],\"sources\":[\"openstreetmap\",\"openaddresses\",\"geonames\",\"whosonfirst\",\"uscensus\"],\"private\":false,\"focus.point.lat\":33.749,\"focus.point.lon\":-84.388,\"boundary.rect.min_lat\":32.066,\"boundary.rect.max_lat\":35.7251,\"boundary.rect.min_lon\":-86.0856,\"boundary.rect.max_lon\":-81.9499,\"lang\":{\"name\":\"English\",\"iso6391\":\"en\",\"iso6393\":\"eng\",\"via\":\"default\",\"defaulted\":true},\"querySize\":20},\"engine\":{\"name\":\"Pelias\",\"author\":\"Mapzen\",\"version\":\"1.0\"},\"timestamp\":1694202052257},\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"geometry\":{\"type\":\"Point\",\"coordinates\":[-84.300178,33.77505]},\"properties\":{\"id\":\"node/556611976\",\"gid\":\"openstreetmap:venue:node/556611976\",\"layer\":\"venue\",\"source\":\"openstreetmap\",\"source_id\":\"node/556611976\",\"country_code\":\"US\",\"name\":\"Opus Music Store\",\"housenumber\":\"308D\",\"distance\":8.629,\"accuracy\":\"point\",\"country\":\"United States\",\"country_gid\":\"whosonfirst:country:85633793\",\"country_a\":\"USA\",\"region\":\"Georgia\",\"region_gid\":\"whosonfirst:region:85688535\",\"region_a\":\"GA\",\"county\":\"DeKalb County\",\"county_gid\":\"whosonfirst:county:102084539\",\"county_a\":\"DA\",\"locality\":\"Decatur\",\"locality_gid\":\"whosonfirst:locality:85936441\",\"continent\":\"North America\",\"continent_gid\":\"whosonfirst:continent:102191575\",\"label\":\"Opus Music Store, Decatur, GA, USA\",\"addendum\":{\"osm\":{\"website\":\"http://www.opusmusicstore.com/\",\"phone\":\"+1 404 370 0507\"}}}},{\"type\":\"Feature\",\"geometry\":{\"type\":\"Point\",\"coordinates\":[-84.385934,33.787145]},\"properties\":{\"id\":\"way/885660365\",\"gid\":\"openstreetmap:venue:way/885660365\",\"layer\":\"venue\",\"source\":\"openstreetmap\",\"source_id\":\"way/885660365\",\"country_code\":\"US\",\"name\":\"2 Opus Place (construction)\",\"distance\":4.251,\"accuracy\":\"point\",\"country\":\"United States\",\"country_gid\":\"whosonfirst:country:85633793\",\"country_a\":\"USA\",\"region\":\"Georgia\",\"region_gid\":\"whosonfirst:region:85688535\",\"region_a\":\"GA\",\"county\":\"Fulton County\",\"county_gid\":\"whosonfirst:county:102083603\",\"county_a\":\"FU\",\"locality\":\"Atlanta\",\"locality_gid\":\"whosonfirst:locality:85936429\",\"continent\":\"North America\",\"continent_gid\":\"whosonfirst:continent:102191575\",\"label\":\"2 Opus Place (construction), Atlanta, GA, USA\"},\"bbox\":[-84.3866911,33.7867611,-84.385266,33.7874624]},{\"type\":\"Feature\",\"geometry\":{\"type\":\"Point\",\"coordinates\":[-85.211688,35.00657]},\"properties\":{\"id\":\"way/51791114\",\"gid\":\"openstreetmap:venue:way/51791114\",\"layer\":\"venue\",\"source\":\"openstreetmap\",\"source_id\":\"way/51791114\",\"country_code\":\"US\",\"name\":\"Opus Inspection\",\"distance\":159.136,\"accuracy\":\"point\",\"country\":\"United States\",\"country_gid\":\"whosonfirst:country:85633793\",\"country_a\":\"USA\",\"region\":\"Tennessee\",\"region_gid\":\"whosonfirst:region:85688701\",\"region_a\":\"TN\",\"county\":\"Hamilton County\",\"county_gid\":\"whosonfirst:county:102087185\",\"county_a\":\"HL\",\"locality\":\"Chattanooga\",\"locality_gid\":\"whosonfirst:locality:101723043\",\"continent\":\"North America\",\"continent_gid\":\"whosonfirst:continent:102191575\",\"label\":\"Opus Inspection, Chattanooga, TN, USA\"},\"bbox\":[-85.2118453,35.0064715,-85.21153,35.0067042]},{\"type\":\"Feature\",\"geometry\":{\"type\":\"Point\",\"coordinates\":[-82.230045,33.55809]},\"properties\":{\"id\":\"w577848242-n5538625175-w577848271\",\"gid\":\"openstreetmap:intersection:w577848242-n5538625175-w577848271\",\"layer\":\"intersection\",\"source\":\"openstreetmap\",\"source_id\":\"w577848242-n5538625175-w577848271\",\"country_code\":\"US\",\"name\":\"Bent Creek Drive & Magnum Opus Way\",\"street\":\"Bent Creek Drive\",\"distance\":201.084,\"accuracy\":\"centroid\",\"country\":\"United States\",\"country_gid\":\"whosonfirst:country:85633793\",\"country_a\":\"USA\",\"region\":\"Georgia\",\"region_gid\":\"whosonfirst:region:85688535\",\"region_a\":\"GA\",\"county\":\"Columbia County\",\"county_gid\":\"whosonfirst:county:102082315\",\"county_a\":\"CI\",\"continent\":\"North America\",\"continent_gid\":\"whosonfirst:continent:102191575\",\"label\":\"Bent Creek Drive & Magnum Opus Way, Columbia County, GA, USA\"}},{\"type\":\"Feature\",\"geometry\":{\"type\":\"Point\",\"coordinates\":[-82.22882,33.559832]},\"properties\":{\"id\":\"polyline:18601022\",\"gid\":\"openstreetmap:street:polyline:18601022\",\"layer\":\"street\",\"source\":\"openstreetmap\",\"source_id\":\"polyline:18601022\",\"country_code\":\"US\",\"name\":\"Magnum Opus Way\",\"street\":\"Magnum Opus Way\",\"distance\":201.175,\"accuracy\":\"centroid\",\"country\":\"United States\",\"country_gid\":\"whosonfirst:country:85633793\",\"country_a\":\"USA\",\"region\":\"Georgia\",\"region_gid\":\"whosonfirst:region:85688535\",\"region_a\":\"GA\",\"county\":\"Columbia County\",\"county_gid\":\"whosonfirst:county:102082315\",\"county_a\":\"CI\",\"continent\":\"North America\",\"continent_gid\":\"whosonfirst:continent:102191575\",\"label\":\"Magnum Opus Way, Columbia County, GA, USA\"},\"bbox\":[-82.230045,33.55809,-82.227691,33.561696]}],\"bbox\":[-85.2118453,33.55809,-82.227691,35.0067042],\"isomorphicMapzenSearchQuery\":{\"api_key\":\"ge-0624346c114543d5\",\"text\":\"Opus\",\"layers\":\"address,venue,street,intersection\",\"focus.point.lat\":33.749,\"focus.point.lon\":-84.388,\"boundary.rect.min_lat\":32.066,\"boundary.rect.min_lon\":-86.0856,\"boundary.rect.max_lat\":35.7251,\"boundary.rect.max_lon\":-81.9499}}"
           },
-          "redirectURL": "",
           "headersSize": -1,
           "bodySize": -1,
           "_transferSize": 2351,
@@ -713,7 +703,7 @@
           "bodySize": 0,
           "method": "GET",
           "url": "http://localhost:9977/autocomplete?text=9&layers=address%2Cvenue%2Cstreet%2Cintersection&focus.point.lat=33.749&focus.point.lon=-84.388&boundary.rect.min_lat=32.066&boundary.rect.min_lon=-86.0856&boundary.rect.max_lat=35.7251&boundary.rect.max_lon=-81.9499",
-          "httpVersion": "",
+          "httpVersion": "HTTP/2",
           "queryString": [
             {
               "name": "text",
@@ -751,16 +741,14 @@
           "headersSize": 730
         },
         "response": {
-          "status": 0,
-          "statusText": "",
-          "httpVersion": "",
+          "status": 200,
+          "statusText": "OK",
+          "httpVersion": "HTTP/2",
           "content": {
-            "mimeType": "",
+            "mimeType": "application/json",
             "size": 0,
-            "encoding": "base64",
-            "text": ""
+            "text": "{\"features\":[]}"
           },
-          "redirectURL": "",
           "headersSize": 0,
           "bodySize": 0
         },
@@ -781,7 +769,7 @@
           "bodySize": 0,
           "method": "GET",
           "url": "http://localhost:9977/autocomplete?text=90&layers=address%2Cvenue%2Cstreet%2Cintersection&focus.point.lat=33.749&focus.point.lon=-84.388&boundary.rect.min_lat=32.066&boundary.rect.min_lon=-86.0856&boundary.rect.max_lat=35.7251&boundary.rect.max_lon=-81.9499",
-          "httpVersion": "",
+          "httpVersion": "HTTP/2",
           "queryString": [
             {
               "name": "text",
@@ -819,16 +807,14 @@
           "headersSize": 731
         },
         "response": {
-          "status": 0,
-          "statusText": "",
-          "httpVersion": "",
+          "status": 200,
+          "statusText": "OK",
+          "httpVersion": "HTTP/2",
           "content": {
-            "mimeType": "",
+            "mimeType": "application/json",
             "size": 0,
-            "encoding": "base64",
-            "text": ""
+            "text": "{\"features\":[]}"
           },
-          "redirectURL": "",
           "headersSize": 0,
           "bodySize": 0
         },
@@ -849,7 +835,7 @@
           "bodySize": 0,
           "method": "GET",
           "url": "http://localhost:9977/autocomplete?text=908&layers=address%2Cvenue%2Cstreet%2Cintersection&focus.point.lat=33.749&focus.point.lon=-84.388&boundary.rect.min_lat=32.066&boundary.rect.min_lon=-86.0856&boundary.rect.max_lat=35.7251&boundary.rect.max_lon=-81.9499",
-          "httpVersion": "",
+          "httpVersion": "HTTP/2",
           "queryString": [
             {
               "name": "text",
@@ -887,16 +873,14 @@
           "headersSize": 732
         },
         "response": {
-          "status": 0,
-          "statusText": "",
-          "httpVersion": "",
+          "status": 200,
+          "statusText": "OK",
+          "httpVersion": "HTTP/2",
           "content": {
-            "mimeType": "",
+            "mimeType": "application/json",
             "size": 0,
-            "encoding": "base64",
-            "text": ""
+            "text": "{\"features\":[]}"
           },
-          "redirectURL": "",
           "headersSize": 0,
           "bodySize": 0
         },
@@ -917,7 +901,7 @@
           "bodySize": 0,
           "method": "GET",
           "url": "http://localhost:9977/autocomplete?text=9089&layers=address%2Cvenue%2Cstreet%2Cintersection&focus.point.lat=33.749&focus.point.lon=-84.388&boundary.rect.min_lat=32.066&boundary.rect.min_lon=-86.0856&boundary.rect.max_lat=35.7251&boundary.rect.max_lon=-81.9499",
-          "httpVersion": "",
+          "httpVersion": "HTTP/2",
           "queryString": [
             {
               "name": "text",
@@ -955,16 +939,14 @@
           "headersSize": 733
         },
         "response": {
-          "status": 0,
-          "statusText": "",
-          "httpVersion": "",
+          "status": 200,
+          "statusText": "OK",
+          "httpVersion": "HTTP/2",
           "content": {
-            "mimeType": "",
+            "mimeType": "application/json",
             "size": 0,
-            "encoding": "base64",
-            "text": ""
+            "text": "{\"features\":[]}"
           },
-          "redirectURL": "",
           "headersSize": 0,
           "bodySize": 0
         },
@@ -985,7 +967,7 @@
           "bodySize": 0,
           "method": "GET",
           "url": "http://localhost:9977/autocomplete?text=90898&layers=address%2Cvenue%2Cstreet%2Cintersection&focus.point.lat=33.749&focus.point.lon=-84.388&boundary.rect.min_lat=32.066&boundary.rect.min_lon=-86.0856&boundary.rect.max_lat=35.7251&boundary.rect.max_lon=-81.9499",
-          "httpVersion": "",
+          "httpVersion": "HTTP/2",
           "queryString": [
             {
               "name": "text",
@@ -1023,16 +1005,14 @@
           "headersSize": 735
         },
         "response": {
-          "status": 0,
-          "statusText": "",
-          "httpVersion": "",
+          "status": 200,
+          "statusText": "OK",
+          "httpVersion": "HTTP/2",
           "content": {
-            "mimeType": "",
+            "mimeType": "application/json",
             "size": 0,
-            "encoding": "base64",
-            "text": ""
+            "text": "{\"features\":[]}"
           },
-          "redirectURL": "",
           "headersSize": 0,
           "bodySize": 0
         },
@@ -1099,7 +1079,6 @@
             "size": 12687,
             "text": "{\"features\":[{\"geometry\":{\"type\":\"Point\",\"coordinates\":[-84.391397,33.753837]},\"id\":\"MARTA:797\",\"properties\":{\"layer\":\"stops\",\"source\":\"otp\",\"name\":\"Five Points Station (908981)\",\"label\":\"Five Points Station (908981)\"},\"type\":\"Feature\"}],\"type\":\"FeatureCollection\"}"
           },
-          "redirectURL": "",
           "headersSize": 547,
           "bodySize": 13234
         },

From c331c12f4c1b0bc028c82455fb3fc912394a0724 Mon Sep 17 00:00:00 2001
From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com>
Date: Fri, 8 Sep 2023 18:05:40 -0400
Subject: [PATCH 07/13] test(percy): Add delay between location keystrokes

---
 percy/percy.test.js | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/percy/percy.test.js b/percy/percy.test.js
index 87b5b1ec3..5c2f07931 100644
--- a/percy/percy.test.js
+++ b/percy/percy.test.js
@@ -170,7 +170,7 @@ async function executeTest(page, isMobile, isCallTaker) {
     await page.hover('.from-form-control')
     await page.focus('.from-form-control')
     // FIXME: Characters are typed very fast, but each stroke still triggers a geocoder call.
-    await page.keyboard.type('Opus Music')
+    await page.keyboard.type('Opus Music', { delay: 100 })
     await page.waitForTimeout(2000)
     await page.keyboard.press('ArrowDown')
     await page.waitForTimeout(200)
@@ -179,7 +179,7 @@ async function executeTest(page, isMobile, isCallTaker) {
     // Fill in new destination
     await page.focus('.to-form-control')
     // FIXME: Characters are typed very fast, but each stroke still triggers a geocoder call.
-    await page.keyboard.type('908981')
+    await page.keyboard.type('908981', { delay: 100 })
     await page.waitForTimeout(2000)
     await page.keyboard.press('ArrowDown')
     await page.waitForTimeout(200)
@@ -215,7 +215,7 @@ async function executeTest(page, isMobile, isCallTaker) {
     await page.waitForSelector('.intermediate-place-0-form-control')
     await page.focus('.intermediate-place-0-form-control')
     // FIXME: Characters are typed very fast, but each stroke still triggers a geocoder call.
-    await page.keyboard.type('arts center')
+    await page.keyboard.type('arts center', { delay: 100 })
     await page.waitForTimeout(2000)
     await page.keyboard.press('ArrowDown')
     await page.waitForTimeout(200)

From e1dda38aafd528aa3584e5e82c85bf53c9eeb4e7 Mon Sep 17 00:00:00 2001
From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com>
Date: Tue, 12 Sep 2023 16:02:09 -0400
Subject: [PATCH 08/13] ci(percy): Use new config that uses mock geocoder

---
 .github/workflows/percy.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/percy.yml b/.github/workflows/percy.yml
index 957eafc81..3f12e171a 100644
--- a/.github/workflows/percy.yml
+++ b/.github/workflows/percy.yml
@@ -25,7 +25,7 @@ jobs:
       - name: Download OTP2 config file
         run: curl $PERCY_OTP2_CONFIG_URL --output /tmp/otp2config.yml
         env:
-          PERCY_OTP2_CONFIG_URL: ${{ secrets.PERCY_MOCKOTP2_CONFIG_URL_METRO_MODE_SELECTOR }}
+          PERCY_OTP2_CONFIG_URL: ${{ secrets.PERCY_MOCK_OTP2_GEOCODER_CONFIG }}
       - name: Build OTP-RR
         # Artifacts are shared between desktop and mobile tests (but not call-taker).
         run: yarn build

From 56a230be2189b7f0867aa5ff1abdddebe85f36ed Mon Sep 17 00:00:00 2001
From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com>
Date: Wed, 13 Sep 2023 10:28:10 -0400
Subject: [PATCH 09/13] ci(percy): Remove --force-exit option for percy jest.

---
 .github/workflows/percy.yml | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/.github/workflows/percy.yml b/.github/workflows/percy.yml
index 3f12e171a..2abae2be2 100644
--- a/.github/workflows/percy.yml
+++ b/.github/workflows/percy.yml
@@ -33,7 +33,7 @@ jobs:
           YAML_CONFIG: /tmp/otp2config.yml
           JS_CONFIG: ./percy/har-mock-config.js
       - name: Take Percy Snapshots (Desktop + Mobile)
-        run: npx percy exec -- npx jest percy/percy.test.js --force-exit
+        run: npx percy exec -- npx jest percy/percy.test.js
         env:
           PERCY_TOKEN: ${{ secrets.PERCY_TOKEN_OTP2 }}
           OTP_RR_UI_MODE: normal
@@ -44,7 +44,7 @@ jobs:
           YAML_CONFIG: /tmp/otp2config.yml
           JS_CONFIG: ./percy/har-mock-config-call-taker.js
       - name: Take Percy Snapshots (Calltaker)
-        run: npx percy exec -- npx jest percy/percy.test.js --force-exit
+        run: npx percy exec -- npx jest percy/percy.test.js
         env:
           # Calltaker has a separate key because the calltaker-specific snapshots are different.
           PERCY_TOKEN: ${{ secrets.PERCY_TOKEN_CALL_TAKER_OTP2 }}

From c192fed8b19ce60057514fa0cadb1090e110f611 Mon Sep 17 00:00:00 2001
From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com>
Date: Wed, 13 Sep 2023 11:44:10 -0400
Subject: [PATCH 10/13] Revert "ci(percy): Remove --force-exit option for percy
 jest."

This reverts commit 56a230be2189b7f0867aa5ff1abdddebe85f36ed.
---
 .github/workflows/percy.yml | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/.github/workflows/percy.yml b/.github/workflows/percy.yml
index 2abae2be2..3f12e171a 100644
--- a/.github/workflows/percy.yml
+++ b/.github/workflows/percy.yml
@@ -33,7 +33,7 @@ jobs:
           YAML_CONFIG: /tmp/otp2config.yml
           JS_CONFIG: ./percy/har-mock-config.js
       - name: Take Percy Snapshots (Desktop + Mobile)
-        run: npx percy exec -- npx jest percy/percy.test.js
+        run: npx percy exec -- npx jest percy/percy.test.js --force-exit
         env:
           PERCY_TOKEN: ${{ secrets.PERCY_TOKEN_OTP2 }}
           OTP_RR_UI_MODE: normal
@@ -44,7 +44,7 @@ jobs:
           YAML_CONFIG: /tmp/otp2config.yml
           JS_CONFIG: ./percy/har-mock-config-call-taker.js
       - name: Take Percy Snapshots (Calltaker)
-        run: npx percy exec -- npx jest percy/percy.test.js
+        run: npx percy exec -- npx jest percy/percy.test.js --force-exit
         env:
           # Calltaker has a separate key because the calltaker-specific snapshots are different.
           PERCY_TOKEN: ${{ secrets.PERCY_TOKEN_CALL_TAKER_OTP2 }}

From 2a72f3483ef3bde220699ac920ea484fa0952c33 Mon Sep 17 00:00:00 2001
From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com>
Date: Wed, 13 Sep 2023 11:46:04 -0400
Subject: [PATCH 11/13] test(percy): Use different UI port for calltaker vs
 normal.

---
 percy/percy.test.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/percy/percy.test.js b/percy/percy.test.js
index 5c2f07931..8dea1f8c1 100644
--- a/percy/percy.test.js
+++ b/percy/percy.test.js
@@ -7,7 +7,7 @@ const percySnapshot = require('@percy/puppeteer')
 
 const { OTP_RR_UI_MODE } = process.env
 
-const MOCK_SERVER_PORT = 5486
+const MOCK_SERVER_PORT = OTP_RR_UI_MODE === 'calltaker' ? 5487 : 5486
 
 // Puppeteer can take a long time to load, especially in some ci environments
 jest.setTimeout(600000)

From babf7e22be51f0e75421c63ae0909f4a7e42c542 Mon Sep 17 00:00:00 2001
From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com>
Date: Wed, 13 Sep 2023 12:52:04 -0400
Subject: [PATCH 12/13] test(percy): Differentiate mobile snapshot names.

---
 percy/percy.test.js | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/percy/percy.test.js b/percy/percy.test.js
index 8dea1f8c1..fcf9bd8cb 100644
--- a/percy/percy.test.js
+++ b/percy/percy.test.js
@@ -16,7 +16,11 @@ jest.setTimeout(600000)
 const PERCY_EXTRA_WAIT = 5000
 const percySnapshotWithWait = async (page, name, enableJavaScript) => {
   await page.waitForTimeout(PERCY_EXTRA_WAIT)
-  await percySnapshot(page, `${name} [${OTP_RR_UI_MODE}]`, { enableJavaScript })
+  await percySnapshot(
+    page,
+    `${name} [${OTP_RR_UI_MODE}${page.isMobile ? '/mobile' : ''}]`,
+    { enableJavaScript }
+  )
 }
 
 let browser
@@ -421,6 +425,7 @@ if (OTP_RR_UI_MODE !== 'calltaker') {
   // Non-calltaker test runs both mobile and desktop test.
   test('OTP-RR Mobile', async () => {
     const page = await loadPath('/')
+    page.isMobile = true
     await page.setUserAgent('android')
     await page.setViewport({
       height: 1134,

From d7f8c8c786fd200b2139fe3ddfac6522ad76390d Mon Sep 17 00:00:00 2001
From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com>
Date: Thu, 14 Sep 2023 09:35:23 -0400
Subject: [PATCH 13/13] ci(percy): Separate calltaker snapshots to a separate
 job.

---
 .github/workflows/percy.yml | 18 +++++++++++++++++-
 percy/percy.test.js         |  2 +-
 2 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/.github/workflows/percy.yml b/.github/workflows/percy.yml
index 3f12e171a..c5e878b72 100644
--- a/.github/workflows/percy.yml
+++ b/.github/workflows/percy.yml
@@ -10,7 +10,6 @@ on:
 jobs:
   run-pixel-tests:
     runs-on: ubuntu-latest
-
     steps:
       - uses: actions/checkout@v2
         with:
@@ -37,6 +36,23 @@ jobs:
         env:
           PERCY_TOKEN: ${{ secrets.PERCY_TOKEN_OTP2 }}
           OTP_RR_UI_MODE: normal
+  run-pixel-tests-calltaker:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v2
+        with:
+          # This allows us to work with the repository during the lint step
+          fetch-depth: 2
+      - name: Use Node.js 16.x
+        uses: actions/setup-node@v1
+        with:
+          node-version: 16.x
+      - name: Install npm packages using cache
+        uses: bahmutov/npm-install@v1
+      - name: Download OTP2 config file
+        run: curl $PERCY_OTP2_CONFIG_URL --output /tmp/otp2config.yml
+        env:
+          PERCY_OTP2_CONFIG_URL: ${{ secrets.PERCY_MOCK_OTP2_GEOCODER_CONFIG }}
       - name: Build OTP-RR Calltaker
         # Calltaker has a separate config file, so another build should be produced.
         run: yarn build
diff --git a/percy/percy.test.js b/percy/percy.test.js
index fcf9bd8cb..24bedcc0a 100644
--- a/percy/percy.test.js
+++ b/percy/percy.test.js
@@ -7,7 +7,7 @@ const percySnapshot = require('@percy/puppeteer')
 
 const { OTP_RR_UI_MODE } = process.env
 
-const MOCK_SERVER_PORT = OTP_RR_UI_MODE === 'calltaker' ? 5487 : 5486
+const MOCK_SERVER_PORT = 5486
 
 // Puppeteer can take a long time to load, especially in some ci environments
 jest.setTimeout(600000)