From 14f0828d839d003f58a80f807e4039624d93eec4 Mon Sep 17 00:00:00 2001 From: Jakub Magiera Date: Tue, 3 Nov 2026 15:22:43 +0100 Subject: [PATCH 1/2] Extend search golden master: autocomplete call sites and Onyx updates --- .../unit/OptionsListUtilsSearchParityTest.ts | 214 +- .../OptionsListUtilsSearchParityTest.ts.snap | 2253 ++++++++++++++++- .../searchParity/generateSearchFixture.ts | 293 ++- 3 files changed, 2747 insertions(+), 13 deletions(-) diff --git a/tests/unit/OptionsListUtilsSearchParityTest.ts b/tests/unit/OptionsListUtilsSearchParityTest.ts index 5b70e2a224cc..6cc9d189601e 100644 --- a/tests/unit/OptionsListUtilsSearchParityTest.ts +++ b/tests/unit/OptionsListUtilsSearchParityTest.ts @@ -11,6 +11,7 @@ import { hydrateContactOption, } from '@libs/OptionsListUtils'; import type {OptionsResult} from '@libs/OptionsListUtils/types'; +import {getExpensifyTeamExclusions} from '@libs/PolicyUtils'; import initOnyxDerivedValues from '@userActions/OnyxDerived'; @@ -23,11 +24,21 @@ import type {Report, Rule} from '@src/types/onyx'; import type {OnyxCollection} from 'react-native-onyx'; import type {TupleToUnion} from 'type-fest'; +import {deepEqual} from 'fast-equals'; import Onyx from 'react-native-onyx'; import type {SearchFixture} from '../utils/searchParity/generateSearchFixture'; -import {ACCOUNT_IDS, CURRENT_USER_EMAIL, generateSearchFixture, POLICY_IDS, SEARCH_QUERIES, writeSearchFixtureToOnyx} from '../utils/searchParity/generateSearchFixture'; +import { + ACCOUNT_IDS, + CURRENT_USER_EMAIL, + generateSearchFixture, + POLICY_IDS, + SEARCH_FIXTURE_UPDATES, + SEARCH_QUERIES, + writeSearchFixtureToOnyx, + writeSearchFixtureUpdateToOnyx, +} from '../utils/searchParity/generateSearchFixture'; import {convertToDisplayString, convertToDisplayStringWithoutCurrency, formatPhoneNumber, localeCompare, translateLocal} from '../utils/TestHelper'; import waitForBatchedUpdates from '../utils/waitForBatchedUpdates'; @@ -84,13 +95,19 @@ function serializeOption(option: SearchOptionData | null | undefined, {isUserToI /** What the screen shows: one flat list of rows, in order. */ type DisplayedResult = {displayedRows: SearchOptionData[]; hasMore?: boolean}; -function serializeResult(result: OptionsResult | DisplayedResult) { +/** The only section useAutocompleteSuggestions reads from a result, so it is the only one recorded: personalDetails for the participant filters, recentReports for in:. */ +type SectionResult = {personalDetails: SearchOptionData[]} | {recentReports: SearchOptionData[]}; + +function serializeResult(result: OptionsResult | DisplayedResult | SectionResult) { if ('displayedRows' in result) { return { displayedRows: result.displayedRows.map((option) => serializeOption(option)), hasMore: !!result.hasMore, }; } + if (!('options' in result)) { + return Object.fromEntries(Object.entries(result).map(([section, options]) => [section, options.map((option) => serializeOption(option))])); + } const {options, hasMore} = result; return { recentReports: options.recentReports.map((option) => serializeOption(option)), @@ -178,9 +195,9 @@ function buildSearchRouterIdleOptionList(sourceFixture: SearchFixture, maxRecent // Passed to combineOrderingOfReportsAndPersonalDetails. Only affects workspace chat ordering, which displayed passes do not show. const ACTIVE_POLICY_ID = POLICY_IDS.OWN; -type SearchCallSite = (options: OptionList, query: string) => OptionsResult | DisplayedResult; +type SearchCallSite = (options: OptionList, query: string) => OptionsResult | DisplayedResult | SectionResult; -const CALL_SITE_NAMES = ['searchRouterLocal', 'searchRouterDisplayed'] as const; +const CALL_SITE_NAMES = ['searchRouterLocal', 'searchRouterDisplayed', 'autocompleteParticipants', 'autocompleteIn'] as const; type SearchCallSiteName = TupleToUnion; @@ -208,6 +225,13 @@ function createCallSites(sourceFixture: SearchFixture) { const {sortedActions, lastActions, transactionThreadIDs} = sourceFixture.derived.sortedReportActions; const visibleReportActionsData = sourceFixture.derived.visibleReportActions; + // Adds a matching contact to team exclusions to verify that excluded contacts are filtered out + const excludedFromSuggestions = { + ...getExpensifyTeamExclusions(sourceFixture.personalDetails, sourceFixture.policies, CURRENT_USER_EMAIL), + // eslint-disable-next-line @typescript-eslint/naming-convention -- a login is not a camelCase identifier + 'alex.smith2@example.com': true, + }; + // Configuration every getSearchOptions screen passes const baseSearchConfig = { dateFnsLocale: undefined, @@ -292,11 +316,70 @@ function createCallSites(sourceFixture: SearchFixture) { hasMore: result.hasMore, }; }, + + // The to: and from: participant filters of useAutocompleteSuggestions (src/hooks/useAutocompleteSuggestions.ts), which only read personalDetails. + // The config is copied from that hook, so keep the two in sync. Sharing it would mean changing production code, which the golden master PR leaves out. + // isDefaultRoomsBetaEnabled is true as in the SearchRouter call sites above, whereas the hook receives the account's beta flag from SearchAutocompleteList. + // excludedFromSuggestions is what the hook builds with getExpensifyTeamExclusions (as memberExclusions), plus one extra login so a matching contact is excluded. + // maxResults is the literal 10 the hook uses, because no shared constant exists. + // The hook also drops rows without text or already typed for the same filter. That filter reads the typed query rather than the search, and every recorded row has text, so it is not replicated. + autocompleteParticipants: (options, query) => ({ + personalDetails: getSearchOptions({ + ...commonSearchConfig, + options, + isDefaultRoomsBetaEnabled: true, + isUsedInChatFinder: true, + includeReadOnly: true, + searchQuery: query, + maxResults: 10, + includeUserToInvite: false, + includeRecentReports: false, + includeCurrentUser: true, + shouldShowGBR: true, + excludeFromSuggestionsOnly: excludedFromSuggestions, + }).options.personalDetails, + }), + + // The in: room filter of useAutocompleteSuggestions (src/hooks/useAutocompleteSuggestions.ts), which only reads recentReports. + // The config is copied from that hook, so keep the two in sync. As above, isDefaultRoomsBetaEnabled is fixed to true, maxResults is the hook's literal 10, and the hook's filter of rows without text or already typed is not replicated. + autocompleteIn: (options, query) => ({ + recentReports: getSearchOptions({ + ...commonSearchConfig, + options, + isDefaultRoomsBetaEnabled: true, + isUsedInChatFinder: true, + includeReadOnly: true, + searchQuery: query, + maxResults: 10, + includeUserToInvite: false, + includeRecentReports: true, + includeCurrentUser: false, + shouldShowGBR: true, + }).options.recentReports, + }), } satisfies Record; return {searchCallSites, serverPassConfig}; } +type SearchRouterCallSite = 'searchRouterLocal' | 'searchRouterDisplayed'; + +type OptionListKind = 'searching' | 'searchRouterIdle'; + +const BLANK_QUERY_OPTION_LIST: Record = { + searchRouterLocal: 'searchRouterIdle', + searchRouterDisplayed: 'searchRouterIdle', + autocompleteParticipants: 'searching', + autocompleteIn: 'searching', +}; + +function getOptionListKind(callSite: SearchCallSiteName, query: string): OptionListKind { + if (query.trim()) { + return 'searching'; + } + return BLANK_QUERY_OPTION_LIST[callSite]; +} + // Reports returned by the SearchAutocompleteList server pass in Auth ranking order, including a self-DM that the pass drops and reports the canonical filter rejects. const SERVER_PASS_REPORT_NAMES = [ '#admins', @@ -345,6 +428,69 @@ function withFocusedReport(reportID: string, run: () => T): T { } } +/** Replaces everything in Onyx with the given account and returns what Onyx derived from it. */ +async function resetOnyxTo(sourceFixture: SearchFixture) { + await Onyx.clear(); + return writeSearchFixtureToOnyx(sourceFixture); +} + +/** Builds the option list each call site searches, so a call site can run any query. */ +function buildOptionListsByKind(sourceFixture: SearchFixture): Record { + return { + searching: buildOptionList(sourceFixture, {isSearching: true}), + searchRouterIdle: buildSearchRouterIdleOptionList(sourceFixture, SEARCH_ROUTER_OPTIONS_CONFIG.maxRecentReports), + }; +} + +/** Runs every call site over every query, each against the list it searches, and serializes the results. */ +function runCallSites(sourceFixture: SearchFixture, queries: string[]) { + const optionListsByKind = buildOptionListsByKind(sourceFixture); + const {searchCallSites} = createCallSites(sourceFixture); + return Object.fromEntries( + CALL_SITE_NAMES.map((callSite) => [ + callSite, + Object.fromEntries(queries.map((query) => [query, serializeResult(searchCallSites[callSite](optionListsByKind[getOptionListKind(callSite, query)], query))])), + ]), + ); +} + +/** Queries that reach what SEARCH_FIXTURE_UPDATES change, before or after the change, plus the idle lists. */ +const UPDATE_QUERIES = ['', 'town', 'announce', 'admins', 'vit', 'atlas', 'workspace', 'nora', 'robert', 'bob', 'cyd', 'ismail', 'sleeping', 'empty', 'rene']; + +type CallSiteResults = ReturnType; + +const SEARCH_ROUTER_CALL_SITES: ReadonlySet = new Set(['searchRouterLocal', 'searchRouterDisplayed']); + +/** Keeps only the SearchRouter call sites' results, the ones whose results the option index replaces and the update snapshot records. */ +function getSearchRouterResults(results: CallSiteResults): CallSiteResults { + return Object.fromEntries(Object.entries(results).filter(([callSite]) => SEARCH_ROUTER_CALL_SITES.has(callSite))); +} + +/** What the update test records, for the SearchRouter call sites only: the results the golden master lacks before any update, then what each update changed. */ +type UpdatesRecord = { + beforeUpdates: CallSiteResults; + updates: Array<{afterUpdate: string; changedResults: CallSiteResults}>; +}; + +/** Keeps the call site results that differ from the previous ones, so an update records only what it changed. */ +function getChangedResults(previousResults: CallSiteResults, results: CallSiteResults): CallSiteResults { + const changedResults: CallSiteResults = {}; + for (const [callSite, resultsByQuery] of Object.entries(results)) { + const changedResultsByQuery = Object.fromEntries(Object.entries(resultsByQuery).filter(([query, result]) => !deepEqual(result, previousResults[callSite]?.[query]))); + if (Object.keys(changedResultsByQuery).length > 0) { + changedResults[callSite] = changedResultsByQuery; + } + } + return changedResults; +} + +/** Keeps the call site results for queries the golden master does not already record for the fixture account. */ +function getResultsOutsideGoldenMaster(results: CallSiteResults): CallSiteResults { + return Object.fromEntries( + Object.entries(results).map(([callSite, resultsByQuery]) => [callSite, Object.fromEntries(Object.entries(resultsByQuery).filter(([query]) => !SEARCH_QUERIES.includes(query)))]), + ); +} + /** Computes every recorded pass over the fixture, starting from cold caches. */ function computeGoldenMaster(sourceFixture: SearchFixture) { const {searchCallSites, serverPassConfig} = createCallSites(sourceFixture); @@ -365,11 +511,11 @@ function computeGoldenMaster(sourceFixture: SearchFixture) { }; // The SearchRouter starts at the production cap, and its loadAll effect expands a list that has fewer than 20 rows, so a blank query never searches the small idle list - const getCallSiteOptionList = (query: string) => (query.trim() ? searching : searchRouterIdleAtProductionCap); + const getCallSiteOptionList = (callSite: SearchCallSiteName, query: string) => (getOptionListKind(callSite, query) === 'searching' ? searching : searchRouterIdleAtProductionCap); const callSites = Object.fromEntries( CALL_SITE_NAMES.map((callSite) => [ callSite, - Object.fromEntries(SEARCH_QUERIES.map((query) => [query, serializeResult(searchCallSites[callSite](getCallSiteOptionList(query), query))])), + Object.fromEntries(SEARCH_QUERIES.map((query) => [query, serializeResult(searchCallSites[callSite](getCallSiteOptionList(callSite, query), query))])), ]), ); @@ -454,4 +600,60 @@ describe('OptionsListUtils search parity (golden master)', () => { // Then all match the recorded golden master, with the focused report shown only while it is focused expect(goldenMaster.passes).toMatchSnapshot(); }); + + it('follows every Onyx update as a cold build of the updated account does', async () => { + // Given search, warmed by searching the fixture account once, so the caches hold results that each update must invalidate + // Two caches survive between runs. createFilteredOptionList keeps only the idle list, which the SearchRouter reads for a blank query, because it skips the cache while searching. + // The searching list that other queries read is rebuilt every run, but chat previews are cached per report in alternateTextCache for both lists until one of its inputs changes identity. + // A stale entry in either cache would make the warm results differ from the cold ones below + let account = fixture; + account.derived = await resetOnyxTo(account); + clearSearchCaches(); + let previousResults = runCallSites(account, UPDATE_QUERIES); + + // The golden master already records the other queries for the fixture account, and every update records only what it + // changed, so the snapshot still pins every SearchRouter result after every update without repeating the unchanged ones. + // The autocomplete call sites are not recorded, to keep the snapshot small, but every assertion below still compares all call sites + const record: UpdatesRecord = { + beforeUpdates: getSearchRouterResults(getResultsOutsideGoldenMaster(previousResults)), + updates: [], + }; + + try { + for (const update of SEARCH_FIXTURE_UPDATES) { + // When an update lands in Onyx and the call sites search again, keeping their caches + const previousAccount = account; + account = update.apply(previousAccount); + account.derived = await writeSearchFixtureUpdateToOnyx(previousAccount, account); + const warmResults = runCallSites(account, UPDATE_QUERIES); + clearSearchCaches(); + const results = runCallSites(account, UPDATE_QUERIES); + + // Then they find what a search built from scratch over the updated account finds + expect({update: update.description, results: warmResults}).toEqual({ + update: update.description, + results, + }); + + // And the update changes something the queries reach, so the step does not compare an unchanged search with itself + const changedResults = getChangedResults(previousResults, results); + expect({update: update.description, hasChangedResults: Object.keys(changedResults).length > 0}).toEqual({ + update: update.description, + hasChangedResults: true, + }); + record.updates.push({afterUpdate: update.description, changedResults: getSearchRouterResults(changedResults)}); + previousResults = results; + } + + // And after all updates, a completely cold reset of Onyx and caches reproduces the accumulated warm state + account.derived = await resetOnyxTo(account); + clearSearchCaches(); + expect(runCallSites(account, UPDATE_QUERIES)).toEqual(previousResults); + } finally { + fixture.derived = await resetOnyxTo(fixture); + } + + // And what each update changed is recorded in the golden master + expect(record).toMatchSnapshot(); + }); }); diff --git a/tests/unit/__snapshots__/OptionsListUtilsSearchParityTest.ts.snap b/tests/unit/__snapshots__/OptionsListUtilsSearchParityTest.ts.snap index a5f14bfa6fda..1b0fbb0a540d 100644 --- a/tests/unit/__snapshots__/OptionsListUtilsSearchParityTest.ts.snap +++ b/tests/unit/__snapshots__/OptionsListUtilsSearchParityTest.ts.snap @@ -346,6 +346,899 @@ exports[`OptionsListUtils search parity (golden master) builds searching and Sea } `; +exports[`OptionsListUtils search parity (golden master) call site autocompleteIn matches the golden master for every query 1`] = ` +{ + "": { + "recentReports": [ + "2004 Current User (you) [alt: This is your personal space. Use it for notes, tasks, drafts, and reminders.] [accID: 1]", + "2013 #orphan-room [alt: Gone Workspace • This chat room is for anything #orphan-room related.] [sub: Gone Workspace]", + "1124 Ada Cole [alt: This chat is with Ada Cole.] [accID: 124]", + "1103 Dan Ames [alt: This chat is with Dan Ames.] [accID: 103]", + "1019 No Login [alt: This chat is with No Login.] [accID: 19]", + "1123 Lou Byrd [alt: This chat is with Lou Byrd.] [accID: 123]", + "1102 Cyd Ames [alt: This chat is with Cyd Ames.] [accID: 102]", + "1018 Domain Admin [alt: This chat is with Domain Admin.] [accID: 18]", + "1121 Jon Byrd [alt: This chat is with Jon Byrd.] [accID: 121]", + "1100 Ada Ames [alt: This chat is with Ada Ames.] [accID: 100]", + ], + }, + " ": { + "recentReports": [ + "2004 Current User (you) [alt: This is your personal space. Use it for notes, tasks, drafts, and reminders.] [accID: 1]", + "2013 #orphan-room [alt: Gone Workspace • This chat room is for anything #orphan-room related.] [sub: Gone Workspace]", + "1124 Ada Cole [alt: This chat is with Ada Cole.] [accID: 124]", + "1103 Dan Ames [alt: This chat is with Dan Ames.] [accID: 103]", + "1019 No Login [alt: This chat is with No Login.] [accID: 19]", + "1123 Lou Byrd [alt: This chat is with Lou Byrd.] [accID: 123]", + "1102 Cyd Ames [alt: This chat is with Cyd Ames.] [accID: 102]", + "1018 Domain Admin [alt: This chat is with Domain Admin.] [accID: 18]", + "1121 Jon Byrd [alt: This chat is with Jon Byrd.] [accID: 121]", + "1100 Ada Ames [alt: This chat is with Ada Ames.] [accID: 100]", + ], + }, + " al ": { + "recentReports": [ + "1015 Alex Smith Jr. [alt: This chat is with Alex Smith Jr..] [accID: 15]", + ], + }, + " alex smith ": { + "recentReports": [ + "1015 Alex Smith Jr. [alt: This chat is with Alex Smith Jr..] [accID: 15]", + ], + }, + " alex.smith@example.com ": { + "recentReports": [], + }, + "(500) 555": { + "recentReports": [ + "1013 (500) 555-0006 [alt: This chat is with (500) 555-0006.] [accID: 13]", + ], + }, + "*": { + "recentReports": [], + }, + "+1 650 555 0100": { + "recentReports": [], + }, + "+15005550006": { + "recentReports": [ + "1013 (500) 555-0006 [alt: This chat is with (500) 555-0006.] [accID: 13]", + ], + }, + ".*": { + "recentReports": [], + }, + "555-0006": { + "recentReports": [ + "1013 (500) 555-0006 [alt: This chat is with (500) 555-0006.] [accID: 13]", + ], + }, + "5550006": { + "recentReports": [ + "1013 (500) 555-0006 [alt: This chat is with (500) 555-0006.] [accID: 13]", + ], + }, + "@example": { + "recentReports": [ + "2004 Current User (you) [alt: This is your personal space. Use it for notes, tasks, drafts, and reminders.] [accID: 1]", + "1124 Ada Cole [alt: This chat is with Ada Cole.] [accID: 124]", + "1103 Dan Ames [alt: This chat is with Dan Ames.] [accID: 103]", + "1123 Lou Byrd [alt: This chat is with Lou Byrd.] [accID: 123]", + "1102 Cyd Ames [alt: This chat is with Cyd Ames.] [accID: 102]", + "1018 Domain Admin [alt: This chat is with Domain Admin.] [accID: 18]", + "1121 Jon Byrd [alt: This chat is with Jon Byrd.] [accID: 121]", + "1100 Ada Ames [alt: This chat is with Ada Ames.] [accID: 100]", + "1120 Ivy Byrd [alt: This chat is with Ivy Byrd.] [accID: 120]", + "1015 Alex Smith Jr. [alt: This chat is with Alex Smith Jr..] [accID: 15]", + ], + }, + "CURRENT.USER@EXAMPLE.COM": { + "recentReports": [ + "2004 Current User (you) [alt: This is your personal space. Use it for notes, tasks, drafts, and reminders.] [accID: 1]", + "2031 Offsite expenses [alt: No activity yet] [accID: 1]", + "2003 Weekend Hiking [alt: This chat is with José Ñúñez, Mary-Jane O'Brien, and Vít Novák.]", + ], + }, + "Groß": { + "recentReports": [ + "2007 Groß Straße [alt: Vít Workspace • This chat is for invoices between Groß Straße and Vít Workspace. Use the + button to send an invoice.] [sub: Invoices]", + "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace]", + ], + }, + "JOSÉ": { + "recentReports": [ + "2003 Weekend Hiking [alt: This chat is with José Ñúñez, Mary-Jane O'Brien, and Vít Novák.]", + "2020 José Ñúñez [alt: Packing list] [accID: 2]", + ], + }, + "Ñúñez": { + "recentReports": [ + "2003 Weekend Hiking [alt: This chat is with José Ñúñez, Mary-Jane O'Brien, and Vít Novák.]", + "2020 José Ñúñez [alt: Packing list] [accID: 2]", + ], + }, + "René": { + "recentReports": [], + }, + "René": { + "recentReports": [], + }, + "Vít": { + "recentReports": [ + "2012 #vít-room [rbr] [alt: Acme Holdings • This chat room is for anything #vít-room related.] [sub: Acme Holdings]", + "2011 #announce [alt: Vít Workspace • This chat is with everyone in Vít Workspace. Use it for the most important announcements.] [sub: Vít Workspace]", + "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace]", + "2005 Current User's expenses [gbr] [alt: Vít Workspace • This is where Current User will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace • Submits to Current User]", + "2003 Weekend Hiking [alt: This chat is with José Ñúñez, Mary-Jane O'Brien, and Vít Novák.]", + "2010 #admins [alt: Vít Workspace • This chat is with Vít Workspace admin. Use it to chat about workspace setup and more.] [sub: Vít Workspace]", + "1003 Vít Novák [alt: This chat is with Vít Novák.] [accID: 3]", + ], + }, + "Vít": { + "recentReports": [ + "2012 #vít-room [rbr] [alt: Acme Holdings • This chat room is for anything #vít-room related.] [sub: Acme Holdings]", + "2011 #announce [alt: Vít Workspace • This chat is with everyone in Vít Workspace. Use it for the most important announcements.] [sub: Vít Workspace]", + "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace]", + "2005 Current User's expenses [gbr] [alt: Vít Workspace • This is where Current User will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace • Submits to Current User]", + "2003 Weekend Hiking [alt: This chat is with José Ñúñez, Mary-Jane O'Brien, and Vít Novák.]", + "2010 #admins [alt: Vít Workspace • This chat is with Vít Workspace admin. Use it to chat about workspace setup and more.] [sub: Vít Workspace]", + "1003 Vít Novák [alt: This chat is with Vít Novák.] [accID: 3]", + ], + }, + "[": { + "recentReports": [], + }, + "\\": { + "recentReports": [], + }, + "a": { + "recentReports": [ + "2004 Current User (you) [alt: This is your personal space. Use it for notes, tasks, drafts, and reminders.] [accID: 1]", + "2013 #orphan-room [alt: Gone Workspace • This chat room is for anything #orphan-room related.] [sub: Gone Workspace]", + "1124 Ada Cole [alt: This chat is with Ada Cole.] [accID: 124]", + "1103 Dan Ames [alt: This chat is with Dan Ames.] [accID: 103]", + "1123 Lou Byrd [alt: This chat is with Lou Byrd.] [accID: 123]", + "1102 Cyd Ames [alt: This chat is with Cyd Ames.] [accID: 102]", + "1018 Domain Admin [alt: This chat is with Domain Admin.] [accID: 18]", + "1121 Jon Byrd [alt: This chat is with Jon Byrd.] [accID: 121]", + "1100 Ada Ames [alt: This chat is with Ada Ames.] [accID: 100]", + "1120 Ivy Byrd [alt: This chat is with Ivy Byrd.] [accID: 120]", + ], + }, + "acme": { + "recentReports": [ + "2012 #vít-room [rbr] [alt: Acme Holdings • This chat room is for anything #vít-room related.] [sub: Acme Holdings]", + ], + }, + "ada byrd": { + "recentReports": [ + "1112 Ada Byrd [alt: This chat is with Ada Byrd.] [accID: 112]", + ], + }, + "admins": { + "recentReports": [ + "2010 #admins [alt: Vít Workspace • This chat is with Vít Workspace admin. Use it to chat about workspace setup and more.] [sub: Vít Workspace]", + ], + }, + "al": { + "recentReports": [ + "1015 Alex Smith Jr. [alt: This chat is with Alex Smith Jr..] [accID: 15]", + ], + }, + "alex smith": { + "recentReports": [ + "1015 Alex Smith Jr. [alt: This chat is with Alex Smith Jr..] [accID: 15]", + ], + }, + "anamaria": { + "recentReports": [ + "1009 Ana​Maria [alt: This chat is with Ana​Maria.] [accID: 9]", + ], + }, + "ana​maria": { + "recentReports": [ + "1009 Ana​Maria [alt: This chat is with Ana​Maria.] [accID: 9]", + ], + }, + "bob builder": { + "recentReports": [ + "1010 Bob Builder [alt: See you at the trailhead] [accID: 10]", + ], + }, + "bob builder": { + "recentReports": [ + "1010 Bob Builder [alt: See you at the trailhead] [accID: 10]", + ], + }, + "bob builder": { + "recentReports": [ + "1010 Bob Builder [alt: See you at the trailhead] [accID: 10]", + ], + }, + "cole lou": { + "recentReports": [ + "1135 Lou Cole [alt: This chat is with Lou Cole.] [accID: 135]", + ], + }, + "concierge": { + "recentReports": [ + "1021 Concierge [alt: Concierge can answer questions, update expenses, and more.] [accID: -1]", + ], + }, + "ex sm": { + "recentReports": [ + "1015 Alex Smith Jr. [alt: This chat is with Alex Smith Jr..] [accID: 15]", + "1013 (500) 555-0006 [alt: This chat is with (500) 555-0006.] [accID: 13]", + "1004 İsmail Yılmaz [alt: Thanks!] [accID: 4]", + ], + }, + "example.com": { + "recentReports": [ + "2004 Current User (you) [alt: This is your personal space. Use it for notes, tasks, drafts, and reminders.] [accID: 1]", + "1124 Ada Cole [alt: This chat is with Ada Cole.] [accID: 124]", + "1103 Dan Ames [alt: This chat is with Dan Ames.] [accID: 103]", + "1123 Lou Byrd [alt: This chat is with Lou Byrd.] [accID: 123]", + "1102 Cyd Ames [alt: This chat is with Cyd Ames.] [accID: 102]", + "1018 Domain Admin [alt: This chat is with Domain Admin.] [accID: 18]", + "1121 Jon Byrd [alt: This chat is with Jon Byrd.] [accID: 121]", + "1100 Ada Ames [alt: This chat is with Ada Ames.] [accID: 100]", + "1120 Ivy Byrd [alt: This chat is with Ivy Byrd.] [accID: 120]", + "1015 Alex Smith Jr. [alt: This chat is with Alex Smith Jr..] [accID: 15]", + ], + }, + "first.last": { + "recentReports": [ + "1012 first.last+tag@x.com [alt: This chat is with first.last+tag@x.com.] [accID: 12]", + ], + }, + "firstlast": { + "recentReports": [ + "1012 first.last+tag@x.com [alt: This chat is with first.last+tag@x.com.] [accID: 12]", + ], + }, + "hiking": { + "recentReports": [ + "2003 Weekend Hiking [alt: This chat is with José Ñúñez, Mary-Jane O'Brien, and Vít Novák.]", + ], + }, + "ikin": { + "recentReports": [ + "2003 Weekend Hiking [alt: This chat is with José Ñúñez, Mary-Jane O'Brien, and Vít Novák.]", + ], + }, + "ismail": { + "recentReports": [ + "1004 İsmail Yılmaz [alt: Thanks!] [accID: 4]", + ], + }, + "i̇smail": { + "recentReports": [ + "1004 İsmail Yılmaz [alt: Thanks!] [accID: 4]", + ], + }, + "jr alex": { + "recentReports": [ + "1015 Alex Smith Jr. [alt: This chat is with Alex Smith Jr..] [accID: 15]", + ], + }, + "last+tag": { + "recentReports": [ + "1012 first.last+tag@x.com [alt: This chat is with first.last+tag@x.com.] [accID: 12]", + ], + }, + "lukasz": { + "recentReports": [ + "1006 Łukasz Wójcik [alt: This chat is with Łukasz Wójcik.] [accID: 6]", + ], + }, + "mary jane": { + "recentReports": [ + "2003 Weekend Hiking [alt: This chat is with José Ñúñez, Mary-Jane O'Brien, and Vít Novák.]", + "2000 Mary-Jane O'Brien (archived) [archived] [alt: This chat room has been archived.] [accID: 11]", + ], + }, + "mary-jane": { + "recentReports": [ + "2003 Weekend Hiking [alt: This chat is with José Ñúñez, Mary-Jane O'Brien, and Vít Novák.]", + "2000 Mary-Jane O'Brien (archived) [archived] [alt: This chat room has been archived.] [accID: 11]", + ], + }, + "me": { + "recentReports": [ + "2004 Current User (you) [alt: This is your personal space. Use it for notes, tasks, drafts, and reminders.] [accID: 1]", + "1103 Dan Ames [alt: This chat is with Dan Ames.] [accID: 103]", + "1102 Cyd Ames [alt: This chat is with Cyd Ames.] [accID: 102]", + "1100 Ada Ames [alt: This chat is with Ada Ames.] [accID: 100]", + "2012 #vít-room [rbr] [alt: Acme Holdings • This chat room is for anything #vít-room related.] [sub: Acme Holdings]", + "1111 Lou Ames [alt: This chat is with Lou Ames.] [accID: 111]", + "1109 Jon Ames [alt: This chat is with Jon Ames.] [accID: 109]", + "1108 Ivy Ames [alt: This chat is with Ivy Ames.] [accID: 108]", + "1106 Gus Ames [alt: This chat is with Gus Ames.] [accID: 106]", + "1105 Fay Ames [alt: This chat is with Fay Ames.] [accID: 105]", + ], + }, + "mith": { + "recentReports": [ + "1015 Alex Smith Jr. [alt: This chat is with Alex Smith Jr..] [accID: 15]", + ], + }, + "new.person@example.com": { + "recentReports": [], + }, + "nounce": { + "recentReports": [ + "2011 #announce [alt: Vít Workspace • This chat is with everyone in Vít Workspace. Use it for the most important announcements.] [sub: Vít Workspace]", + ], + }, + "nunez": { + "recentReports": [ + "2003 Weekend Hiking [alt: This chat is with José Ñúñez, Mary-Jane O'Brien, and Vít Novák.]", + "2020 José Ñúñez [alt: Packing list] [accID: 2]", + ], + }, + "o'brien": { + "recentReports": [ + "2003 Weekend Hiking [alt: This chat is with José Ñúñez, Mary-Jane O'Brien, and Vít Novák.]", + "2000 Mary-Jane O'Brien (archived) [archived] [alt: This chat room has been archived.] [accID: 11]", + ], + }, + "obrien": { + "recentReports": [ + "2003 Weekend Hiking [alt: This chat is with José Ñúñez, Mary-Jane O'Brien, and Vít Novák.]", + "2000 Mary-Jane O'Brien (archived) [archived] [alt: This chat room has been archived.] [accID: 11]", + ], + }, + "oldings": { + "recentReports": [ + "2012 #vít-room [rbr] [alt: Acme Holdings • This chat room is for anything #vít-room related.] [sub: Acme Holdings]", + ], + }, + "orkspace": { + "recentReports": [ + "2013 #orphan-room [alt: Gone Workspace • This chat room is for anything #orphan-room related.] [sub: Gone Workspace]", + "2011 #announce [alt: Vít Workspace • This chat is with everyone in Vít Workspace. Use it for the most important announcements.] [sub: Vít Workspace]", + "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace]", + "2005 Current User's expenses [gbr] [alt: Vít Workspace • This is where Current User will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace • Submits to Current User]", + "2010 #admins [alt: Vít Workspace • This chat is with Vít Workspace admin. Use it to chat about workspace setup and more.] [sub: Vít Workspace]", + ], + }, + "ovak": { + "recentReports": [ + "2003 Weekend Hiking [alt: This chat is with José Ñúñez, Mary-Jane O'Brien, and Vít Novák.]", + "1003 Vít Novák [alt: This chat is with Vít Novák.] [accID: 3]", + ], + }, + "packing thread": { + "recentReports": [ + "2026 Packing list [alt: José Ñúñez: Tent and stove]", + ], + }, + "rene": { + "recentReports": [], + }, + "smith alex": { + "recentReports": [ + "1015 Alex Smith Jr. [alt: This chat is with Alex Smith Jr..] [accID: 15]", + ], + }, + "smith jr": { + "recentReports": [ + "1015 Alex Smith Jr. [alt: This chat is with Alex Smith Jr..] [accID: 15]", + ], + }, + "strasse": { + "recentReports": [ + "2007 Groß Straße [alt: Vít Workspace • This chat is for invoices between Groß Straße and Vít Workspace. Use the + button to send an invoice.] [sub: Invoices]", + "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace]", + ], + }, + "straße": { + "recentReports": [ + "2007 Groß Straße [alt: Vít Workspace • This chat is for invoices between Groß Straße and Vít Workspace. Use the + button to send an invoice.] [sub: Invoices]", + "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace]", + ], + }, + "thread": { + "recentReports": [ + "2026 Packing list [alt: José Ñúñez: Tent and stove]", + "2025 Empty pinned thread [alt: No activity yet]", + "2024 Empty thread with a draft [alt: No activity yet]", + "2021 Thread about the offsite [alt: José Ñúñez: Count me in]", + ], + }, + "to:al": { + "recentReports": [], + }, + "vit": { + "recentReports": [ + "2012 #vít-room [rbr] [alt: Acme Holdings • This chat room is for anything #vít-room related.] [sub: Acme Holdings]", + "2011 #announce [alt: Vít Workspace • This chat is with everyone in Vít Workspace. Use it for the most important announcements.] [sub: Vít Workspace]", + "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace]", + "2005 Current User's expenses [gbr] [alt: Vít Workspace • This is where Current User will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace • Submits to Current User]", + "2003 Weekend Hiking [alt: This chat is with José Ñúñez, Mary-Jane O'Brien, and Vít Novák.]", + "2010 #admins [alt: Vít Workspace • This chat is with Vít Workspace admin. Use it to chat about workspace setup and more.] [sub: Vít Workspace]", + "1003 Vít Novák [alt: This chat is with Vít Novák.] [accID: 3]", + ], + }, + "vit workspace": { + "recentReports": [ + "2011 #announce [alt: Vít Workspace • This chat is with everyone in Vít Workspace. Use it for the most important announcements.] [sub: Vít Workspace]", + "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace]", + "2005 Current User's expenses [gbr] [alt: Vít Workspace • This is where Current User will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace • Submits to Current User]", + "2010 #admins [alt: Vít Workspace • This chat is with Vít Workspace admin. Use it to chat about workspace setup and more.] [sub: Vít Workspace]", + ], + }, + "workspace": { + "recentReports": [ + "2013 #orphan-room [alt: Gone Workspace • This chat room is for anything #orphan-room related.] [sub: Gone Workspace]", + "2011 #announce [alt: Vít Workspace • This chat is with everyone in Vít Workspace. Use it for the most important announcements.] [sub: Vít Workspace]", + "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace]", + "2005 Current User's expenses [gbr] [alt: Vít Workspace • This is where Current User will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace • Submits to Current User]", + "2010 #admins [alt: Vít Workspace • This chat is with Vít Workspace admin. Use it to chat about workspace setup and more.] [sub: Vít Workspace]", + ], + }, + "x.com": { + "recentReports": [ + "1012 first.last+tag@x.com [alt: This chat is with first.last+tag@x.com.] [accID: 12]", + ], + }, + "you": { + "recentReports": [ + "2004 Current User (you) [alt: This is your personal space. Use it for notes, tasks, drafts, and reminders.] [accID: 1]", + ], + }, + "zzzqqq": { + "recentReports": [], + }, + "İSMAIL": { + "recentReports": [ + "1004 İsmail Yılmaz [alt: Thanks!] [accID: 4]", + ], + }, + "łukasz": { + "recentReports": [ + "1006 Łukasz Wójcik [alt: This chat is with Łukasz Wójcik.] [accID: 6]", + ], + }, + "ΔΥΣΣΕΥΣ": { + "recentReports": [ + "1007 Οδυσσεύς [alt: This chat is with Οδυσσεύς.] [accID: 7]", + ], + }, + "δυσσευς": { + "recentReports": [ + "1007 Οδυσσεύς [alt: This chat is with Οδυσσεύς.] [accID: 7]", + ], + }, + "δυσσευσ": { + "recentReports": [], + }, + "δυσσεύς": { + "recentReports": [ + "1007 Οδυσσεύς [alt: This chat is with Οδυσσεύς.] [accID: 7]", + ], + }, + "👩‍💻": { + "recentReports": [], + }, +} +`; + +exports[`OptionsListUtils search parity (golden master) call site autocompleteParticipants matches the golden master for every query 1`] = ` +{ + "": { + "personalDetails": [ + "1013 (500) 555-0006 [alt: +15005550006@expensify.sms] [accID: 13]", + "1100 Ada Ames [alt: ada.ames.0@example.com] [accID: 100]", + "1112 Ada Byrd [alt: ada.byrd.12@example.com] [accID: 112]", + "1124 Ada Cole [alt: ada.cole.24@example.com] [accID: 124]", + "1136 Ada Dunn [alt: ada.dunn.36@example.com] [accID: 136]", + "2001 Alex Smith [alt: alex.smith@example.com] [accID: 14]", + "1009 Ana​Maria [alt: ana.maria@example.com] [accID: 9]", + "101 Bea Ames [alt: bea.ames.1@example.com] [accID: 101] [nav: bea.ames.1@example.com]", + "113 Bea Byrd [alt: bea.byrd.13@example.com] [accID: 113] [nav: bea.byrd.13@example.com]", + ], + }, + " ": { + "personalDetails": [ + "1013 (500) 555-0006 [alt: +15005550006@expensify.sms] [accID: 13]", + "1100 Ada Ames [alt: ada.ames.0@example.com] [accID: 100]", + "1112 Ada Byrd [alt: ada.byrd.12@example.com] [accID: 112]", + "1124 Ada Cole [alt: ada.cole.24@example.com] [accID: 124]", + "1136 Ada Dunn [alt: ada.dunn.36@example.com] [accID: 136]", + "2001 Alex Smith [alt: alex.smith@example.com] [accID: 14]", + "1009 Ana​Maria [alt: ana.maria@example.com] [accID: 9]", + "101 Bea Ames [alt: bea.ames.1@example.com] [accID: 101] [nav: bea.ames.1@example.com]", + "113 Bea Byrd [alt: bea.byrd.13@example.com] [accID: 113] [nav: bea.byrd.13@example.com]", + ], + }, + " al ": { + "personalDetails": [ + "2001 Alex Smith [alt: alex.smith@example.com] [accID: 14]", + "107 Hal Ames [alt: hal.ames.7@example.com] [accID: 107] [nav: hal.ames.7@example.com]", + "119 Hal Byrd [alt: hal.byrd.19@example.com] [accID: 119] [nav: hal.byrd.19@example.com]", + "131 Hal Cole [alt: hal.cole.31@example.com] [accID: 131] [nav: hal.cole.31@example.com]", + ], + }, + " alex smith ": { + "personalDetails": [ + "2001 Alex Smith [alt: alex.smith@example.com] [accID: 14]", + ], + }, + " alex.smith@example.com ": { + "personalDetails": [ + "2001 Alex Smith [alt: alex.smith@example.com] [accID: 14]", + ], + }, + "(500) 555": { + "personalDetails": [ + "1013 (500) 555-0006 [alt: +15005550006@expensify.sms] [accID: 13]", + ], + }, + "*": { + "personalDetails": [], + }, + "+1 650 555 0100": { + "personalDetails": [], + }, + "+15005550006": { + "personalDetails": [ + "1013 (500) 555-0006 [alt: +15005550006@expensify.sms] [accID: 13]", + ], + }, + ".*": { + "personalDetails": [], + }, + "555-0006": { + "personalDetails": [ + "1013 (500) 555-0006 [alt: +15005550006@expensify.sms] [accID: 13]", + ], + }, + "5550006": { + "personalDetails": [ + "1013 (500) 555-0006 [alt: +15005550006@expensify.sms] [accID: 13]", + ], + }, + "@example": { + "personalDetails": [ + "1100 Ada Ames [alt: ada.ames.0@example.com] [accID: 100]", + "1112 Ada Byrd [alt: ada.byrd.12@example.com] [accID: 112]", + "1124 Ada Cole [alt: ada.cole.24@example.com] [accID: 124]", + "1136 Ada Dunn [alt: ada.dunn.36@example.com] [accID: 136]", + "2001 Alex Smith [alt: alex.smith@example.com] [accID: 14]", + "1009 Ana​Maria [alt: ana.maria@example.com] [accID: 9]", + "101 Bea Ames [alt: bea.ames.1@example.com] [accID: 101] [nav: bea.ames.1@example.com]", + "113 Bea Byrd [alt: bea.byrd.13@example.com] [accID: 113] [nav: bea.byrd.13@example.com]", + "125 Bea Cole [alt: bea.cole.25@example.com] [accID: 125] [nav: bea.cole.25@example.com]", + ], + }, + "CURRENT.USER@EXAMPLE.COM": { + "personalDetails": [ + "1 Current User [alt: current.user@example.com] [accID: 1] [nav: current.user@example.com]", + ], + }, + "Groß": { + "personalDetails": [ + "5 Groß Straße [alt: strasse@example.com] [accID: 5] [nav: strasse@example.com]", + ], + }, + "JOSÉ": { + "personalDetails": [ + "2020 José Ñúñez [alt: jose.nunez@example.com] [accID: 2]", + ], + }, + "Ñúñez": { + "personalDetails": [ + "2020 José Ñúñez [alt: jose.nunez@example.com] [accID: 2]", + ], + }, + "René": { + "personalDetails": [ + "20 René Dupont [alt: rene@example.com] [accID: 20] [nav: rene@example.com]", + ], + }, + "René": { + "personalDetails": [ + "20 René Dupont [alt: rene@example.com] [accID: 20] [nav: rene@example.com]", + ], + }, + "Vít": { + "personalDetails": [ + "1003 Vít Novák [alt: vit.novak@example.com] [accID: 3]", + ], + }, + "Vít": { + "personalDetails": [ + "1003 Vít Novák [alt: vit.novak@example.com] [accID: 3]", + ], + }, + "[": { + "personalDetails": [], + }, + "\\": { + "personalDetails": [], + }, + "a": { + "personalDetails": [ + "1100 Ada Ames [alt: ada.ames.0@example.com] [accID: 100]", + "1112 Ada Byrd [alt: ada.byrd.12@example.com] [accID: 112]", + "1124 Ada Cole [alt: ada.cole.24@example.com] [accID: 124]", + "1136 Ada Dunn [alt: ada.dunn.36@example.com] [accID: 136]", + "2001 Alex Smith [alt: alex.smith@example.com] [accID: 14]", + "1009 Ana​Maria [alt: ana.maria@example.com] [accID: 9]", + "101 Bea Ames [alt: bea.ames.1@example.com] [accID: 101] [nav: bea.ames.1@example.com]", + "113 Bea Byrd [alt: bea.byrd.13@example.com] [accID: 113] [nav: bea.byrd.13@example.com]", + "125 Bea Cole [alt: bea.cole.25@example.com] [accID: 125] [nav: bea.cole.25@example.com]", + ], + }, + "acme": { + "personalDetails": [], + }, + "ada byrd": { + "personalDetails": [ + "1112 Ada Byrd [alt: ada.byrd.12@example.com] [accID: 112]", + ], + }, + "admins": { + "personalDetails": [], + }, + "al": { + "personalDetails": [ + "2001 Alex Smith [alt: alex.smith@example.com] [accID: 14]", + "107 Hal Ames [alt: hal.ames.7@example.com] [accID: 107] [nav: hal.ames.7@example.com]", + "119 Hal Byrd [alt: hal.byrd.19@example.com] [accID: 119] [nav: hal.byrd.19@example.com]", + "131 Hal Cole [alt: hal.cole.31@example.com] [accID: 131] [nav: hal.cole.31@example.com]", + ], + }, + "alex smith": { + "personalDetails": [ + "2001 Alex Smith [alt: alex.smith@example.com] [accID: 14]", + ], + }, + "anamaria": { + "personalDetails": [ + "1009 Ana​Maria [alt: ana.maria@example.com] [accID: 9]", + ], + }, + "ana​maria": { + "personalDetails": [ + "1009 Ana​Maria [alt: ana.maria@example.com] [accID: 9]", + ], + }, + "bob builder": { + "personalDetails": [ + "1010 Bob Builder [alt: bob.builder@example.com] [accID: 10]", + ], + }, + "bob builder": { + "personalDetails": [ + "1010 Bob Builder [alt: bob.builder@example.com] [accID: 10]", + ], + }, + "bob builder": { + "personalDetails": [ + "1010 Bob Builder [alt: bob.builder@example.com] [accID: 10]", + ], + }, + "cole lou": { + "personalDetails": [ + "1135 Lou Cole [alt: lou.cole.35@example.com] [accID: 135]", + ], + }, + "concierge": { + "personalDetails": [], + }, + "ex sm": { + "personalDetails": [ + "1013 (500) 555-0006 [alt: +15005550006@expensify.sms] [accID: 13]", + "2001 Alex Smith [alt: alex.smith@example.com] [accID: 14]", + "1004 İsmail Yılmaz [alt: ismail@example.com] [accID: 4]", + ], + }, + "example.com": { + "personalDetails": [ + "1100 Ada Ames [alt: ada.ames.0@example.com] [accID: 100]", + "1112 Ada Byrd [alt: ada.byrd.12@example.com] [accID: 112]", + "1124 Ada Cole [alt: ada.cole.24@example.com] [accID: 124]", + "1136 Ada Dunn [alt: ada.dunn.36@example.com] [accID: 136]", + "2001 Alex Smith [alt: alex.smith@example.com] [accID: 14]", + "1009 Ana​Maria [alt: ana.maria@example.com] [accID: 9]", + "101 Bea Ames [alt: bea.ames.1@example.com] [accID: 101] [nav: bea.ames.1@example.com]", + "113 Bea Byrd [alt: bea.byrd.13@example.com] [accID: 113] [nav: bea.byrd.13@example.com]", + "125 Bea Cole [alt: bea.cole.25@example.com] [accID: 125] [nav: bea.cole.25@example.com]", + ], + }, + "first.last": { + "personalDetails": [ + "1012 first.last+tag@x.com [alt: first.last+tag@x.com] [accID: 12]", + ], + }, + "firstlast": { + "personalDetails": [ + "1012 first.last+tag@x.com [alt: first.last+tag@x.com] [accID: 12]", + ], + }, + "hiking": { + "personalDetails": [], + }, + "ikin": { + "personalDetails": [], + }, + "ismail": { + "personalDetails": [ + "1004 İsmail Yılmaz [alt: ismail@example.com] [accID: 4]", + ], + }, + "i̇smail": { + "personalDetails": [ + "1004 İsmail Yılmaz [alt: ismail@example.com] [accID: 4]", + ], + }, + "jr alex": { + "personalDetails": [], + }, + "last+tag": { + "personalDetails": [ + "1012 first.last+tag@x.com [alt: first.last+tag@x.com] [accID: 12]", + ], + }, + "lukasz": { + "personalDetails": [ + "1006 Łukasz Wójcik [alt: lukasz@example.com] [accID: 6]", + ], + }, + "mary jane": { + "personalDetails": [ + "2000 Mary-Jane O'Brien [archived] [alt: obrien@example.com] [accID: 11]", + ], + }, + "mary-jane": { + "personalDetails": [ + "2000 Mary-Jane O'Brien [archived] [alt: obrien@example.com] [accID: 11]", + ], + }, + "me": { + "personalDetails": [ + "1100 Ada Ames [alt: ada.ames.0@example.com] [accID: 100]", + "101 Bea Ames [alt: bea.ames.1@example.com] [accID: 101] [nav: bea.ames.1@example.com]", + "1 Current User [alt: current.user@example.com] [accID: 1] [nav: current.user@example.com]", + "1102 Cyd Ames [alt: cyd.ames.2@example.com] [accID: 102]", + "1103 Dan Ames [alt: dan.ames.3@example.com] [accID: 103]", + "104 Eve Ames [alt: eve.ames.4@example.com] [accID: 104] [nav: eve.ames.4@example.com]", + "1105 Fay Ames [alt: fay.ames.5@example.com] [accID: 105]", + "1106 Gus Ames [alt: gus.ames.6@example.com] [accID: 106]", + "107 Hal Ames [alt: hal.ames.7@example.com] [accID: 107] [nav: hal.ames.7@example.com]", + ], + }, + "mith": { + "personalDetails": [ + "2001 Alex Smith [alt: alex.smith@example.com] [accID: 14]", + ], + }, + "new.person@example.com": { + "personalDetails": [], + }, + "nounce": { + "personalDetails": [], + }, + "nunez": { + "personalDetails": [ + "2020 José Ñúñez [alt: jose.nunez@example.com] [accID: 2]", + ], + }, + "o'brien": { + "personalDetails": [ + "2000 Mary-Jane O'Brien [archived] [alt: obrien@example.com] [accID: 11]", + ], + }, + "obrien": { + "personalDetails": [ + "2000 Mary-Jane O'Brien [archived] [alt: obrien@example.com] [accID: 11]", + ], + }, + "oldings": { + "personalDetails": [], + }, + "orkspace": { + "personalDetails": [], + }, + "ovak": { + "personalDetails": [ + "1003 Vít Novák [alt: vit.novak@example.com] [accID: 3]", + ], + }, + "packing thread": { + "personalDetails": [], + }, + "rene": { + "personalDetails": [ + "20 René Dupont [alt: rene@example.com] [accID: 20] [nav: rene@example.com]", + ], + }, + "smith alex": { + "personalDetails": [ + "2001 Alex Smith [alt: alex.smith@example.com] [accID: 14]", + ], + }, + "smith jr": { + "personalDetails": [], + }, + "strasse": { + "personalDetails": [ + "5 Groß Straße [alt: strasse@example.com] [accID: 5] [nav: strasse@example.com]", + ], + }, + "straße": { + "personalDetails": [ + "5 Groß Straße [alt: strasse@example.com] [accID: 5] [nav: strasse@example.com]", + ], + }, + "thread": { + "personalDetails": [], + }, + "to:al": { + "personalDetails": [], + }, + "vit": { + "personalDetails": [ + "1003 Vít Novák [alt: vit.novak@example.com] [accID: 3]", + ], + }, + "vit workspace": { + "personalDetails": [], + }, + "workspace": { + "personalDetails": [], + }, + "x.com": { + "personalDetails": [ + "1012 first.last+tag@x.com [alt: first.last+tag@x.com] [accID: 12]", + ], + }, + "you": { + "personalDetails": [ + "1 Current User [alt: current.user@example.com] [accID: 1] [nav: current.user@example.com]", + ], + }, + "zzzqqq": { + "personalDetails": [], + }, + "İSMAIL": { + "personalDetails": [ + "1004 İsmail Yılmaz [alt: ismail@example.com] [accID: 4]", + ], + }, + "łukasz": { + "personalDetails": [ + "1006 Łukasz Wójcik [alt: lukasz@example.com] [accID: 6]", + ], + }, + "ΔΥΣΣΕΥΣ": { + "personalDetails": [ + "1007 Οδυσσεύς [alt: odysseus@example.com] [accID: 7]", + ], + }, + "δυσσευς": { + "personalDetails": [ + "1007 Οδυσσεύς [alt: odysseus@example.com] [accID: 7]", + ], + }, + "δυσσευσ": { + "personalDetails": [], + }, + "δυσσεύς": { + "personalDetails": [ + "1007 Οδυσσεύς [alt: odysseus@example.com] [accID: 7]", + ], + }, + "👩‍💻": { + "personalDetails": [ + "8 Zoë 👩‍💻 [alt: zoe@example.com] [accID: 8] [nav: zoe@example.com]", + ], + }, +} +`; + exports[`OptionsListUtils search parity (golden master) call site searchRouterDisplayed matches the golden master for every query 1`] = ` { "": { @@ -398,6 +1291,23 @@ exports[`OptionsListUtils search parity (golden master) call site searchRouterDi ], "hasMore": true, }, + " al ": { + "displayedRows": [ + "2001 Alex Smith [alt: alex.smith@example.com] [accID: 14]", + "1015 Alex Smith Jr. [alt: This chat is with Alex Smith Jr..] [accID: 15]", + "107 Hal Ames [alt: hal.ames.7@example.com] [accID: 107] [nav: hal.ames.7@example.com]", + "119 Hal Byrd [alt: hal.byrd.19@example.com] [accID: 119] [nav: hal.byrd.19@example.com]", + "131 Hal Cole [alt: hal.cole.31@example.com] [accID: 131] [nav: hal.cole.31@example.com]", + ], + "hasMore": false, + }, + " alex smith ": { + "displayedRows": [ + "2001 Alex Smith [alt: alex.smith@example.com] [accID: 14]", + "1015 Alex Smith Jr. [alt: This chat is with Alex Smith Jr..] [accID: 15]", + ], + "hasMore": false, + }, " alex.smith@example.com ": { "displayedRows": [ "2001 Alex Smith [alt: alex.smith@example.com] [accID: 14]", @@ -430,6 +1340,12 @@ exports[`OptionsListUtils search parity (golden master) call site searchRouterDi "displayedRows": [], "hasMore": false, }, + "555-0006": { + "displayedRows": [ + "1013 (500) 555-0006 [alt: This chat is with (500) 555-0006.] [accID: 13]", + ], + "hasMore": false, + }, "5550006": { "displayedRows": [ "1013 (500) 555-0006 [alt: This chat is with (500) 555-0006.] [accID: 13]", @@ -484,12 +1400,37 @@ exports[`OptionsListUtils search parity (golden master) call site searchRouterDi ], "hasMore": false, }, + "Ñúñez": { + "displayedRows": [ + "2020 José Ñúñez [bold] [alt: Packing list] [accID: 2]", + "2003 Weekend Hiking [alt: This chat is with José Ñúñez, Mary-Jane O'Brien, and Vít Novák.]", + ], + "hasMore": false, + }, + "René": { + "displayedRows": [ + "20 René Dupont [alt: rene@example.com] [accID: 20] [nav: rene@example.com]", + ], + "hasMore": false, + }, "René": { "displayedRows": [ "20 René Dupont [alt: rene@example.com] [accID: 20] [nav: rene@example.com]", ], "hasMore": false, }, + "Vít": { + "displayedRows": [ + "1003 Vít Novák [alt: This chat is with Vít Novák.] [accID: 3]", + "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace]", + "2005 Current User's expenses [alt: Vít Workspace • This is where Current User will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace • Submits to Current User]", + "2003 Weekend Hiking [alt: This chat is with José Ñúñez, Mary-Jane O'Brien, and Vít Novák.]", + "2012 #vít-room [rbr] [alt: Acme Holdings • This chat room is for anything #vít-room related.] [sub: Acme Holdings]", + "2011 #announce [alt: Vít Workspace • This chat is with everyone in Vít Workspace. Use it for the most important announcements.] [sub: Vít Workspace]", + "2010 #admins [alt: Vít Workspace • This chat is with Vít Workspace admin. Use it to chat about workspace setup and more.] [sub: Vít Workspace]", + ], + "hasMore": false, + }, "Vít": { "displayedRows": [ "1003 Vít Novák [alt: This chat is with Vít Novák.] [accID: 3]", @@ -576,12 +1517,30 @@ exports[`OptionsListUtils search parity (golden master) call site searchRouterDi ], "hasMore": false, }, + "ana​maria": { + "displayedRows": [ + "1009 Ana​Maria [alt: This chat is with Ana​Maria.] [accID: 9]", + ], + "hasMore": false, + }, + "bob builder": { + "displayedRows": [ + "1010 Bob Builder [bold] [alt: See you at the trailhead] [accID: 10]", + ], + "hasMore": false, + }, "bob builder": { "displayedRows": [ "1010 Bob Builder [bold] [alt: See you at the trailhead] [accID: 10]", ], "hasMore": false, }, + "bob builder": { + "displayedRows": [ + "1010 Bob Builder [bold] [alt: See you at the trailhead] [accID: 10]", + ], + "hasMore": false, + }, "cole lou": { "displayedRows": [ "1135 Lou Cole [alt: This chat is with Lou Cole.] [accID: 135]", @@ -628,6 +1587,12 @@ exports[`OptionsListUtils search parity (golden master) call site searchRouterDi ], "hasMore": true, }, + "first.last": { + "displayedRows": [ + "1012 first.last+tag@x.com [alt: This chat is with first.last+tag@x.com.] [accID: 12]", + ], + "hasMore": false, + }, "firstlast": { "displayedRows": [ "1012 first.last+tag@x.com [alt: This chat is with first.last+tag@x.com.] [accID: 12]", @@ -652,6 +1617,12 @@ exports[`OptionsListUtils search parity (golden master) call site searchRouterDi ], "hasMore": false, }, + "i̇smail": { + "displayedRows": [ + "1004 İsmail Yılmaz [alt: Thanks!] [accID: 4]", + ], + "hasMore": false, + }, "jr alex": { "displayedRows": [ "1015 Alex Smith Jr. [alt: This chat is with Alex Smith Jr..] [accID: 15]", @@ -670,6 +1641,13 @@ exports[`OptionsListUtils search parity (golden master) call site searchRouterDi ], "hasMore": false, }, + "mary jane": { + "displayedRows": [ + "2003 Weekend Hiking [alt: This chat is with José Ñúñez, Mary-Jane O'Brien, and Vít Novák.]", + "2000 Mary-Jane O'Brien (archived) [archived] [alt: This chat room has been archived.] [accID: 11]", + ], + "hasMore": false, + }, "mary-jane": { "displayedRows": [ "2003 Weekend Hiking [alt: This chat is with José Ñúñez, Mary-Jane O'Brien, and Vít Novák.]", @@ -721,6 +1699,13 @@ exports[`OptionsListUtils search parity (golden master) call site searchRouterDi ], "hasMore": false, }, + "o'brien": { + "displayedRows": [ + "2003 Weekend Hiking [alt: This chat is with José Ñúñez, Mary-Jane O'Brien, and Vít Novák.]", + "2000 Mary-Jane O'Brien (archived) [archived] [alt: This chat room has been archived.] [accID: 11]", + ], + "hasMore": false, + }, "obrien": { "displayedRows": [ "2003 Weekend Hiking [alt: This chat is with José Ñúñez, Mary-Jane O'Brien, and Vít Novák.]", @@ -763,6 +1748,13 @@ exports[`OptionsListUtils search parity (golden master) call site searchRouterDi ], "hasMore": false, }, + "smith alex": { + "displayedRows": [ + "2001 Alex Smith [alt: alex.smith@example.com] [accID: 14]", + "1015 Alex Smith Jr. [alt: This chat is with Alex Smith Jr..] [accID: 15]", + ], + "hasMore": false, + }, "smith jr": { "displayedRows": [ "1015 Alex Smith Jr. [alt: This chat is with Alex Smith Jr..] [accID: 15]", @@ -777,6 +1769,14 @@ exports[`OptionsListUtils search parity (golden master) call site searchRouterDi ], "hasMore": false, }, + "straße": { + "displayedRows": [ + "5 Groß Straße [alt: strasse@example.com] [accID: 5] [nav: strasse@example.com]", + "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace]", + "2007 Groß Straße [alt: Vít Workspace • This chat is for invoices between Groß Straße and Vít Workspace. Use the + button to send an invoice.] [sub: Invoices]", + ], + "hasMore": false, + }, "thread": { "displayedRows": [ "2026 Packing list [bold] [alt: José Ñúñez: Tent and stove]", @@ -843,6 +1843,18 @@ exports[`OptionsListUtils search parity (golden master) call site searchRouterDi ], "hasMore": false, }, + "łukasz": { + "displayedRows": [ + "1006 Łukasz Wójcik [alt: This chat is with Łukasz Wójcik.] [accID: 6]", + ], + "hasMore": false, + }, + "ΔΥΣΣΕΥΣ": { + "displayedRows": [ + "1007 Οδυσσεύς [alt: This chat is with Οδυσσεύς.] [accID: 7]", + ], + "hasMore": false, + }, "δυσσευς": { "displayedRows": [ "1007 Οδυσσεύς [alt: This chat is with Οδυσσεύς.] [accID: 7]", @@ -853,6 +1865,12 @@ exports[`OptionsListUtils search parity (golden master) call site searchRouterDi "displayedRows": [], "hasMore": false, }, + "δυσσεύς": { + "displayedRows": [ + "1007 Οδυσσεύς [alt: This chat is with Οδυσσεύς.] [accID: 7]", + ], + "hasMore": false, + }, "👩‍💻": { "displayedRows": [ "8 Zoë 👩‍💻 [alt: zoe@example.com] [accID: 8] [nav: zoe@example.com]", @@ -924,6 +1942,37 @@ exports[`OptionsListUtils search parity (golden master) call site searchRouterLo "userToInvite": null, "workspaceChats": [], }, + " al ": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [ + "2001 Alex Smith [alt: alex.smith@example.com] [accID: 14]", + "1015 Alex Smith Jr. [alt: alex.smith2@example.com] [accID: 15]", + "107 Hal Ames [alt: hal.ames.7@example.com] [accID: 107] [nav: hal.ames.7@example.com]", + "119 Hal Byrd [alt: hal.byrd.19@example.com] [accID: 119] [nav: hal.byrd.19@example.com]", + "131 Hal Cole [alt: hal.cole.31@example.com] [accID: 131] [nav: hal.cole.31@example.com]", + ], + "recentReports": [ + "1015 Alex Smith Jr. [alt: This chat is with Alex Smith Jr..] [accID: 15]", + ], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, + " alex smith ": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [ + "2001 Alex Smith [alt: alex.smith@example.com] [accID: 14]", + "1015 Alex Smith Jr. [alt: alex.smith2@example.com] [accID: 15]", + ], + "recentReports": [ + "1015 Alex Smith Jr. [alt: This chat is with Alex Smith Jr..] [accID: 15]", + ], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, " alex.smith@example.com ": { "currentUserOption": null, "hasMore": false, @@ -988,6 +2037,19 @@ exports[`OptionsListUtils search parity (golden master) call site searchRouterLo "userToInvite": null, "workspaceChats": [], }, + "555-0006": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [ + "1013 (500) 555-0006 [alt: +15005550006@expensify.sms] [accID: 13]", + ], + "recentReports": [ + "1013 (500) 555-0006 [alt: This chat is with (500) 555-0006.] [accID: 13]", + ], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, "5550006": { "currentUserOption": null, "hasMore": false, @@ -1080,13 +2142,57 @@ exports[`OptionsListUtils search parity (golden master) call site searchRouterLo "userToInvite": null, "workspaceChats": [], }, - "René": { + "Ñúñez": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [ + "2020 José Ñúñez [alt: jose.nunez@example.com] [accID: 2]", + ], + "recentReports": [ + "2003 Weekend Hiking [alt: This chat is with José Ñúñez, Mary-Jane O'Brien, and Vít Novák.]", + "2020 José Ñúñez [bold] [alt: Packing list] [accID: 2]", + ], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, + "René": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [ + "20 René Dupont [alt: rene@example.com] [accID: 20] [nav: rene@example.com]", + ], + "recentReports": [], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, + "René": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [ + "20 René Dupont [alt: rene@example.com] [accID: 20] [nav: rene@example.com]", + ], + "recentReports": [], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, + "Vít": { "currentUserOption": null, "hasMore": false, "personalDetails": [ - "20 René Dupont [alt: rene@example.com] [accID: 20] [nav: rene@example.com]", + "1003 Vít Novák [alt: vit.novak@example.com] [accID: 3]", + ], + "recentReports": [ + "2012 #vít-room [rbr] [alt: Acme Holdings • This chat room is for anything #vít-room related.] [sub: Acme Holdings]", + "2011 #announce [alt: Vít Workspace • This chat is with everyone in Vít Workspace. Use it for the most important announcements.] [sub: Vít Workspace]", + "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace]", + "2005 Current User's expenses [alt: Vít Workspace • This is where Current User will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace • Submits to Current User]", + "2003 Weekend Hiking [alt: This chat is with José Ñúñez, Mary-Jane O'Brien, and Vít Novák.]", + "2010 #admins [alt: Vít Workspace • This chat is with Vít Workspace admin. Use it to chat about workspace setup and more.] [sub: Vít Workspace]", + "1003 Vít Novák [alt: This chat is with Vít Novák.] [accID: 3]", ], - "recentReports": [], "selfDMChat": null, "userToInvite": null, "workspaceChats": [], @@ -1243,6 +2349,32 @@ exports[`OptionsListUtils search parity (golden master) call site searchRouterLo "userToInvite": null, "workspaceChats": [], }, + "ana​maria": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [ + "1009 Ana​Maria [alt: ana.maria@example.com] [accID: 9]", + ], + "recentReports": [ + "1009 Ana​Maria [alt: This chat is with Ana​Maria.] [accID: 9]", + ], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, + "bob builder": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [ + "1010 Bob Builder [alt: bob.builder@example.com] [accID: 10]", + ], + "recentReports": [ + "1010 Bob Builder [bold] [alt: See you at the trailhead] [accID: 10]", + ], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, "bob builder": { "currentUserOption": null, "hasMore": false, @@ -1256,6 +2388,19 @@ exports[`OptionsListUtils search parity (golden master) call site searchRouterLo "userToInvite": null, "workspaceChats": [], }, + "bob builder": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [ + "1010 Bob Builder [alt: bob.builder@example.com] [accID: 10]", + ], + "recentReports": [ + "1010 Bob Builder [bold] [alt: See you at the trailhead] [accID: 10]", + ], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, "cole lou": { "currentUserOption": null, "hasMore": false, @@ -1336,6 +2481,19 @@ exports[`OptionsListUtils search parity (golden master) call site searchRouterLo "userToInvite": null, "workspaceChats": [], }, + "first.last": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [ + "1012 first.last+tag@x.com [alt: first.last+tag@x.com] [accID: 12]", + ], + "recentReports": [ + "1012 first.last+tag@x.com [alt: This chat is with first.last+tag@x.com.] [accID: 12]", + ], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, "firstlast": { "currentUserOption": null, "hasMore": false, @@ -1384,6 +2542,19 @@ exports[`OptionsListUtils search parity (golden master) call site searchRouterLo "userToInvite": null, "workspaceChats": [], }, + "i̇smail": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [ + "1004 İsmail Yılmaz [alt: ismail@example.com] [accID: 4]", + ], + "recentReports": [ + "1004 İsmail Yılmaz [alt: Thanks!] [accID: 4]", + ], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, "jr alex": { "currentUserOption": null, "hasMore": false, @@ -1423,6 +2594,20 @@ exports[`OptionsListUtils search parity (golden master) call site searchRouterLo "userToInvite": null, "workspaceChats": [], }, + "mary jane": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [ + "2000 Mary-Jane O'Brien [archived] [alt: obrien@example.com] [accID: 11]", + ], + "recentReports": [ + "2003 Weekend Hiking [alt: This chat is with José Ñúñez, Mary-Jane O'Brien, and Vít Novák.]", + "2000 Mary-Jane O'Brien (archived) [archived] [alt: This chat room has been archived.] [accID: 11]", + ], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, "mary-jane": { "currentUserOption": null, "hasMore": false, @@ -1515,6 +2700,20 @@ exports[`OptionsListUtils search parity (golden master) call site searchRouterLo "userToInvite": null, "workspaceChats": [], }, + "o'brien": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [ + "2000 Mary-Jane O'Brien [archived] [alt: obrien@example.com] [accID: 11]", + ], + "recentReports": [ + "2003 Weekend Hiking [alt: This chat is with José Ñúñez, Mary-Jane O'Brien, and Vít Novák.]", + "2000 Mary-Jane O'Brien (archived) [archived] [alt: This chat room has been archived.] [accID: 11]", + ], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, "obrien": { "currentUserOption": null, "hasMore": false, @@ -1591,6 +2790,20 @@ exports[`OptionsListUtils search parity (golden master) call site searchRouterLo "userToInvite": null, "workspaceChats": [], }, + "smith alex": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [ + "2001 Alex Smith [alt: alex.smith@example.com] [accID: 14]", + "1015 Alex Smith Jr. [alt: alex.smith2@example.com] [accID: 15]", + ], + "recentReports": [ + "1015 Alex Smith Jr. [alt: This chat is with Alex Smith Jr..] [accID: 15]", + ], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, "smith jr": { "currentUserOption": null, "hasMore": false, @@ -1618,6 +2831,20 @@ exports[`OptionsListUtils search parity (golden master) call site searchRouterLo "userToInvite": null, "workspaceChats": [], }, + "straße": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [ + "5 Groß Straße [alt: strasse@example.com] [accID: 5] [nav: strasse@example.com]", + ], + "recentReports": [ + "2007 Groß Straße [alt: Vít Workspace • This chat is for invoices between Groß Straße and Vít Workspace. Use the + button to send an invoice.] [sub: Invoices]", + "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace]", + ], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, "thread": { "currentUserOption": null, "hasMore": false, @@ -1737,6 +2964,32 @@ exports[`OptionsListUtils search parity (golden master) call site searchRouterLo "userToInvite": null, "workspaceChats": [], }, + "łukasz": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [ + "1006 Łukasz Wójcik [alt: lukasz@example.com] [accID: 6]", + ], + "recentReports": [ + "1006 Łukasz Wójcik [alt: This chat is with Łukasz Wójcik.] [accID: 6]", + ], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, + "ΔΥΣΣΕΥΣ": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [ + "1007 Οδυσσεύς [alt: odysseus@example.com] [accID: 7]", + ], + "recentReports": [ + "1007 Οδυσσεύς [alt: This chat is with Οδυσσεύς.] [accID: 7]", + ], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, "δυσσευς": { "currentUserOption": null, "hasMore": false, @@ -1759,6 +3012,19 @@ exports[`OptionsListUtils search parity (golden master) call site searchRouterLo "userToInvite": null, "workspaceChats": [], }, + "δυσσεύς": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [ + "1007 Οδυσσεύς [alt: odysseus@example.com] [accID: 7]", + ], + "recentReports": [ + "1007 Οδυσσεύς [alt: This chat is with Οδυσσεύς.] [accID: 7]", + ], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, "👩‍💻": { "currentUserOption": null, "hasMore": false, @@ -1772,3 +3038,984 @@ exports[`OptionsListUtils search parity (golden master) call site searchRouterLo }, } `; + +exports[`OptionsListUtils search parity (golden master) follows every Onyx update as a cold build of the updated account does 1`] = ` +{ + "beforeUpdates": { + "searchRouterDisplayed": { + "announce": { + "displayedRows": [ + "2011 #announce [alt: Vít Workspace • This chat is with everyone in Vít Workspace. Use it for the most important announcements.] [sub: Vít Workspace]", + ], + "hasMore": false, + }, + "atlas": { + "displayedRows": [], + "hasMore": false, + }, + "bob": { + "displayedRows": [ + "1010 Bob Builder [bold] [alt: See you at the trailhead] [accID: 10]", + ], + "hasMore": false, + }, + "cyd": { + "displayedRows": [ + "1102 Cyd Ames [alt: This chat is with Cyd Ames.] [accID: 102]", + "1138 Cyd Dunn [alt: This chat is with Cyd Dunn.] [accID: 138]", + "1114 Cyd Byrd [alt: This chat is with Cyd Byrd.] [accID: 114]", + "1126 Cyd Cole [alt: This chat is with Cyd Cole.] [accID: 126]", + ], + "hasMore": false, + }, + "empty": { + "displayedRows": [ + "2025 Empty pinned thread [alt: No activity yet]", + "2024 Empty thread with a draft [alt: No activity yet]", + ], + "hasMore": false, + }, + "nora": { + "displayedRows": [], + "hasMore": false, + }, + "robert": { + "displayedRows": [], + "hasMore": false, + }, + "sleeping": { + "displayedRows": [], + "hasMore": false, + }, + "town": { + "displayedRows": [], + "hasMore": false, + }, + }, + "searchRouterLocal": { + "announce": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [], + "recentReports": [ + "2011 #announce [alt: Vít Workspace • This chat is with everyone in Vít Workspace. Use it for the most important announcements.] [sub: Vít Workspace]", + ], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, + "atlas": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [], + "recentReports": [], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, + "bob": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [ + "1010 Bob Builder [alt: bob.builder@example.com] [accID: 10]", + ], + "recentReports": [ + "1010 Bob Builder [bold] [alt: See you at the trailhead] [accID: 10]", + ], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, + "cyd": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [ + "1102 Cyd Ames [alt: cyd.ames.2@example.com] [accID: 102]", + "1114 Cyd Byrd [alt: cyd.byrd.14@example.com] [accID: 114]", + "1126 Cyd Cole [alt: cyd.cole.26@example.com] [accID: 126]", + "1138 Cyd Dunn [alt: cyd.dunn.38@example.com] [accID: 138]", + ], + "recentReports": [ + "1102 Cyd Ames [alt: This chat is with Cyd Ames.] [accID: 102]", + "1138 Cyd Dunn [alt: This chat is with Cyd Dunn.] [accID: 138]", + "1114 Cyd Byrd [alt: This chat is with Cyd Byrd.] [accID: 114]", + "1126 Cyd Cole [alt: This chat is with Cyd Cole.] [accID: 126]", + ], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, + "empty": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [], + "recentReports": [ + "2025 Empty pinned thread [alt: No activity yet]", + "2024 Empty thread with a draft [alt: No activity yet]", + ], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, + "nora": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [], + "recentReports": [], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, + "robert": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [], + "recentReports": [], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, + "sleeping": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [], + "recentReports": [], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, + "town": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [], + "recentReports": [], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, + }, + }, + "updates": [ + { + "afterUpdate": "renames a room", + "changedResults": { + "searchRouterDisplayed": { + "announce": { + "displayedRows": [], + "hasMore": false, + }, + "town": { + "displayedRows": [ + "2011 #town-hall [alt: Vít Workspace • This chat is with everyone in Vít Workspace. Use it for the most important announcements.] [sub: Vít Workspace]", + ], + "hasMore": false, + }, + "vit": { + "displayedRows": [ + "1003 Vít Novák [alt: This chat is with Vít Novák.] [accID: 3]", + "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace]", + "2005 Current User's expenses [alt: Vít Workspace • This is where Current User will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace • Submits to Current User]", + "2003 Weekend Hiking [alt: This chat is with José Ñúñez, Mary-Jane O'Brien, and Vít Novák.]", + "2012 #vít-room [rbr] [alt: Acme Holdings • This chat room is for anything #vít-room related.] [sub: Acme Holdings]", + "2011 #town-hall [alt: Vít Workspace • This chat is with everyone in Vít Workspace. Use it for the most important announcements.] [sub: Vít Workspace]", + "2010 #admins [alt: Vít Workspace • This chat is with Vít Workspace admin. Use it to chat about workspace setup and more.] [sub: Vít Workspace]", + ], + "hasMore": false, + }, + "workspace": { + "displayedRows": [ + "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace]", + "2005 Current User's expenses [alt: Vít Workspace • This is where Current User will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace • Submits to Current User]", + "2013 #orphan-room [alt: Gone Workspace • This chat room is for anything #orphan-room related.] [sub: Gone Workspace]", + "2011 #town-hall [alt: Vít Workspace • This chat is with everyone in Vít Workspace. Use it for the most important announcements.] [sub: Vít Workspace]", + "2010 #admins [alt: Vít Workspace • This chat is with Vít Workspace admin. Use it to chat about workspace setup and more.] [sub: Vít Workspace]", + ], + "hasMore": false, + }, + }, + "searchRouterLocal": { + "announce": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [], + "recentReports": [], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, + "town": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [], + "recentReports": [ + "2011 #town-hall [alt: Vít Workspace • This chat is with everyone in Vít Workspace. Use it for the most important announcements.] [sub: Vít Workspace]", + ], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, + "vit": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [ + "1003 Vít Novák [alt: vit.novak@example.com] [accID: 3]", + ], + "recentReports": [ + "2012 #vít-room [rbr] [alt: Acme Holdings • This chat room is for anything #vít-room related.] [sub: Acme Holdings]", + "2011 #town-hall [alt: Vít Workspace • This chat is with everyone in Vít Workspace. Use it for the most important announcements.] [sub: Vít Workspace]", + "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace]", + "2005 Current User's expenses [alt: Vít Workspace • This is where Current User will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace • Submits to Current User]", + "2003 Weekend Hiking [alt: This chat is with José Ñúñez, Mary-Jane O'Brien, and Vít Novák.]", + "2010 #admins [alt: Vít Workspace • This chat is with Vít Workspace admin. Use it to chat about workspace setup and more.] [sub: Vít Workspace]", + "1003 Vít Novák [alt: This chat is with Vít Novák.] [accID: 3]", + ], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, + "workspace": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [], + "recentReports": [ + "2013 #orphan-room [alt: Gone Workspace • This chat room is for anything #orphan-room related.] [sub: Gone Workspace]", + "2011 #town-hall [alt: Vít Workspace • This chat is with everyone in Vít Workspace. Use it for the most important announcements.] [sub: Vít Workspace]", + "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace]", + "2005 Current User's expenses [alt: Vít Workspace • This is where Current User will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace • Submits to Current User]", + "2010 #admins [alt: Vít Workspace • This chat is with Vít Workspace admin. Use it to chat about workspace setup and more.] [sub: Vít Workspace]", + ], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, + }, + }, + }, + { + "afterUpdate": "archives a DM", + "changedResults": { + "searchRouterDisplayed": { + "vit": { + "displayedRows": [ + "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace]", + "2005 Current User's expenses [alt: Vít Workspace • This is where Current User will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace • Submits to Current User]", + "2003 Weekend Hiking [alt: This chat is with José Ñúñez, Mary-Jane O'Brien, and Vít Novák.]", + "2012 #vít-room [rbr] [alt: Acme Holdings • This chat room is for anything #vít-room related.] [sub: Acme Holdings]", + "2011 #town-hall [alt: Vít Workspace • This chat is with everyone in Vít Workspace. Use it for the most important announcements.] [sub: Vít Workspace]", + "2010 #admins [alt: Vít Workspace • This chat is with Vít Workspace admin. Use it to chat about workspace setup and more.] [sub: Vít Workspace]", + "1003 Vít Novák (archived) [archived] [alt: This chat room has been archived.] [accID: 3]", + ], + "hasMore": false, + }, + }, + "searchRouterLocal": { + "vit": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [ + "1003 Vít Novák [archived] [alt: vit.novak@example.com] [accID: 3]", + ], + "recentReports": [ + "2012 #vít-room [rbr] [alt: Acme Holdings • This chat room is for anything #vít-room related.] [sub: Acme Holdings]", + "2011 #town-hall [alt: Vít Workspace • This chat is with everyone in Vít Workspace. Use it for the most important announcements.] [sub: Vít Workspace]", + "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace]", + "2005 Current User's expenses [alt: Vít Workspace • This is where Current User will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace • Submits to Current User]", + "2003 Weekend Hiking [alt: This chat is with José Ñúñez, Mary-Jane O'Brien, and Vít Novák.]", + "2010 #admins [alt: Vít Workspace • This chat is with Vít Workspace admin. Use it to chat about workspace setup and more.] [sub: Vít Workspace]", + "1003 Vít Novák (archived) [archived] [alt: This chat room has been archived.] [accID: 3]", + ], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, + }, + }, + }, + { + "afterUpdate": "unarchives a DM", + "changedResults": { + "searchRouterDisplayed": { + "vit": { + "displayedRows": [ + "1003 Vít Novák [alt: This chat is with Vít Novák.] [accID: 3]", + "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace]", + "2005 Current User's expenses [alt: Vít Workspace • This is where Current User will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace • Submits to Current User]", + "2003 Weekend Hiking [alt: This chat is with José Ñúñez, Mary-Jane O'Brien, and Vít Novák.]", + "2012 #vít-room [rbr] [alt: Acme Holdings • This chat room is for anything #vít-room related.] [sub: Acme Holdings]", + "2011 #town-hall [alt: Vít Workspace • This chat is with everyone in Vít Workspace. Use it for the most important announcements.] [sub: Vít Workspace]", + "2010 #admins [alt: Vít Workspace • This chat is with Vít Workspace admin. Use it to chat about workspace setup and more.] [sub: Vít Workspace]", + ], + "hasMore": false, + }, + }, + "searchRouterLocal": { + "vit": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [ + "1003 Vít Novák [alt: vit.novak@example.com] [accID: 3]", + ], + "recentReports": [ + "2012 #vít-room [rbr] [alt: Acme Holdings • This chat room is for anything #vít-room related.] [sub: Acme Holdings]", + "2011 #town-hall [alt: Vít Workspace • This chat is with everyone in Vít Workspace. Use it for the most important announcements.] [sub: Vít Workspace]", + "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace]", + "2005 Current User's expenses [alt: Vít Workspace • This is where Current User will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace • Submits to Current User]", + "2003 Weekend Hiking [alt: This chat is with José Ñúñez, Mary-Jane O'Brien, and Vít Novák.]", + "2010 #admins [alt: Vít Workspace • This chat is with Vít Workspace admin. Use it to chat about workspace setup and more.] [sub: Vít Workspace]", + "1003 Vít Novák [alt: This chat is with Vít Novák.] [accID: 3]", + ], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, + }, + }, + }, + { + "afterUpdate": "deletes a room", + "changedResults": { + "searchRouterDisplayed": { + "admins": { + "displayedRows": [], + "hasMore": false, + }, + "vit": { + "displayedRows": [ + "1003 Vít Novák [alt: This chat is with Vít Novák.] [accID: 3]", + "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace]", + "2005 Current User's expenses [alt: Vít Workspace • This is where Current User will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace • Submits to Current User]", + "2003 Weekend Hiking [alt: This chat is with José Ñúñez, Mary-Jane O'Brien, and Vít Novák.]", + "2012 #vít-room [rbr] [alt: Acme Holdings • This chat room is for anything #vít-room related.] [sub: Acme Holdings]", + "2011 #town-hall [alt: Vít Workspace • This chat is with everyone in Vít Workspace. Use it for the most important announcements.] [sub: Vít Workspace]", + ], + "hasMore": false, + }, + "workspace": { + "displayedRows": [ + "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace]", + "2005 Current User's expenses [alt: Vít Workspace • This is where Current User will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace • Submits to Current User]", + "2013 #orphan-room [alt: Gone Workspace • This chat room is for anything #orphan-room related.] [sub: Gone Workspace]", + "2011 #town-hall [alt: Vít Workspace • This chat is with everyone in Vít Workspace. Use it for the most important announcements.] [sub: Vít Workspace]", + ], + "hasMore": false, + }, + }, + "searchRouterLocal": { + "admins": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [], + "recentReports": [], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, + "vit": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [ + "1003 Vít Novák [alt: vit.novak@example.com] [accID: 3]", + ], + "recentReports": [ + "2012 #vít-room [rbr] [alt: Acme Holdings • This chat room is for anything #vít-room related.] [sub: Acme Holdings]", + "2011 #town-hall [alt: Vít Workspace • This chat is with everyone in Vít Workspace. Use it for the most important announcements.] [sub: Vít Workspace]", + "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace]", + "2005 Current User's expenses [alt: Vít Workspace • This is where Current User will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace • Submits to Current User]", + "2003 Weekend Hiking [alt: This chat is with José Ñúñez, Mary-Jane O'Brien, and Vít Novák.]", + "1003 Vít Novák [alt: This chat is with Vít Novák.] [accID: 3]", + ], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, + "workspace": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [], + "recentReports": [ + "2013 #orphan-room [alt: Gone Workspace • This chat room is for anything #orphan-room related.] [sub: Gone Workspace]", + "2011 #town-hall [alt: Vít Workspace • This chat is with everyone in Vít Workspace. Use it for the most important announcements.] [sub: Vít Workspace]", + "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace]", + "2005 Current User's expenses [alt: Vít Workspace • This is where Current User will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace • Submits to Current User]", + ], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, + }, + }, + }, + { + "afterUpdate": "adds a contact and a DM with them", + "changedResults": { + "searchRouterDisplayed": { + "": { + "displayedRows": [ + "2004 Current User (you) [alt: This is your personal space. Use it for notes, tasks, drafts, and reminders.] [accID: 1]", + "1300 Nora Quill [alt: This chat is with Nora Quill.] [accID: 300]", + "2013 #orphan-room [alt: Gone Workspace • This chat room is for anything #orphan-room related.] [sub: Gone Workspace]", + "1124 Ada Cole [alt: This chat is with Ada Cole.] [accID: 124]", + "1103 Dan Ames [alt: This chat is with Dan Ames.] [accID: 103]", + "1019 No Login [alt: This chat is with No Login.] [accID: 19]", + "1123 Lou Byrd [alt: This chat is with Lou Byrd.] [accID: 123]", + "1102 Cyd Ames [alt: This chat is with Cyd Ames.] [accID: 102]", + "1018 Domain Admin [alt: This chat is with Domain Admin.] [accID: 18]", + "1121 Jon Byrd [alt: This chat is with Jon Byrd.] [accID: 121]", + "1100 Ada Ames [alt: This chat is with Ada Ames.] [accID: 100]", + "1120 Ivy Byrd [alt: This chat is with Ivy Byrd.] [accID: 120]", + "1015 Alex Smith Jr. [alt: This chat is with Alex Smith Jr..] [accID: 15]", + "2012 #vít-room [rbr] [alt: Acme Holdings • This chat room is for anything #vít-room related.] [sub: Acme Holdings]", + "1139 Dan Dunn [alt: This chat is with Dan Dunn.] [accID: 139]", + "1118 Gus Byrd [alt: This chat is with Gus Byrd.] [accID: 118]", + "1013 (500) 555-0006 [alt: This chat is with (500) 555-0006.] [accID: 13]", + "2007 Groß Straße [alt: Vít Workspace • This chat is for invoices between Groß Straße and Vít Workspace. Use the + button to send an invoice.] [sub: Invoices]", + "1138 Cyd Dunn [alt: This chat is with Cyd Dunn.] [accID: 138]", + "1117 Fay Byrd [alt: This chat is with Fay Byrd.] [accID: 117]", + ], + "hasMore": true, + }, + "nora": { + "displayedRows": [ + "1300 Nora Quill [alt: This chat is with Nora Quill.] [accID: 300]", + ], + "hasMore": false, + }, + }, + "searchRouterLocal": { + "": { + "currentUserOption": null, + "hasMore": true, + "personalDetails": [], + "recentReports": [ + "2004 Current User (you) [alt: This is your personal space. Use it for notes, tasks, drafts, and reminders.] [accID: 1]", + "1300 Nora Quill [alt: This chat is with Nora Quill.] [accID: 300]", + "2013 #orphan-room [alt: Gone Workspace • This chat room is for anything #orphan-room related.] [sub: Gone Workspace]", + "1124 Ada Cole [alt: This chat is with Ada Cole.] [accID: 124]", + "1103 Dan Ames [alt: This chat is with Dan Ames.] [accID: 103]", + "1019 No Login [alt: This chat is with No Login.] [accID: 19]", + "1123 Lou Byrd [alt: This chat is with Lou Byrd.] [accID: 123]", + "1102 Cyd Ames [alt: This chat is with Cyd Ames.] [accID: 102]", + "1018 Domain Admin [alt: This chat is with Domain Admin.] [accID: 18]", + "1121 Jon Byrd [alt: This chat is with Jon Byrd.] [accID: 121]", + "1100 Ada Ames [alt: This chat is with Ada Ames.] [accID: 100]", + "1120 Ivy Byrd [alt: This chat is with Ivy Byrd.] [accID: 120]", + "1015 Alex Smith Jr. [alt: This chat is with Alex Smith Jr..] [accID: 15]", + "2012 #vít-room [rbr] [alt: Acme Holdings • This chat room is for anything #vít-room related.] [sub: Acme Holdings]", + "1139 Dan Dunn [alt: This chat is with Dan Dunn.] [accID: 139]", + "1118 Gus Byrd [alt: This chat is with Gus Byrd.] [accID: 118]", + "1013 (500) 555-0006 [alt: This chat is with (500) 555-0006.] [accID: 13]", + "2007 Groß Straße [alt: Vít Workspace • This chat is for invoices between Groß Straße and Vít Workspace. Use the + button to send an invoice.] [sub: Invoices]", + "1138 Cyd Dunn [alt: This chat is with Cyd Dunn.] [accID: 138]", + "1117 Fay Byrd [alt: This chat is with Fay Byrd.] [accID: 117]", + ], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, + "nora": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [ + "1300 Nora Quill [alt: nora.quill@example.com] [accID: 300]", + ], + "recentReports": [ + "1300 Nora Quill [alt: This chat is with Nora Quill.] [accID: 300]", + ], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, + }, + }, + }, + { + "afterUpdate": "renames a contact", + "changedResults": { + "searchRouterDisplayed": { + "bob": { + "displayedRows": [ + "1010 Robert Builder [bold] [alt: See you at the trailhead] [accID: 10]", + ], + "hasMore": false, + }, + "robert": { + "displayedRows": [ + "1010 Robert Builder [bold] [alt: See you at the trailhead] [accID: 10]", + ], + "hasMore": false, + }, + }, + "searchRouterLocal": { + "bob": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [ + "1010 Robert Builder [alt: bob.builder@example.com] [accID: 10]", + ], + "recentReports": [ + "1010 Robert Builder [bold] [alt: See you at the trailhead] [accID: 10]", + ], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, + "robert": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [ + "1010 Robert Builder [alt: bob.builder@example.com] [accID: 10]", + ], + "recentReports": [ + "1010 Robert Builder [bold] [alt: See you at the trailhead] [accID: 10]", + ], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, + }, + }, + }, + { + "afterUpdate": "renames a contact without a DM", + "changedResults": { + "searchRouterDisplayed": { + "rene": { + "displayedRows": [ + "20 Renata Dupont [alt: rene@example.com] [accID: 20] [nav: rene@example.com]", + ], + "hasMore": false, + }, + }, + "searchRouterLocal": { + "rene": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [ + "20 Renata Dupont [alt: rene@example.com] [accID: 20] [nav: rene@example.com]", + ], + "recentReports": [], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, + }, + }, + }, + { + "afterUpdate": "removes a contact without a DM", + "changedResults": { + "searchRouterDisplayed": { + "rene": { + "displayedRows": [], + "hasMore": false, + }, + }, + "searchRouterLocal": { + "rene": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [], + "recentReports": [], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, + }, + }, + }, + { + "afterUpdate": "renames a workspace", + "changedResults": { + "searchRouterDisplayed": { + "": { + "displayedRows": [ + "2004 Current User (you) [alt: This is your personal space. Use it for notes, tasks, drafts, and reminders.] [accID: 1]", + "1300 Nora Quill [alt: This chat is with Nora Quill.] [accID: 300]", + "2013 #orphan-room [alt: Gone Workspace • This chat room is for anything #orphan-room related.] [sub: Gone Workspace]", + "1124 Ada Cole [alt: This chat is with Ada Cole.] [accID: 124]", + "1103 Dan Ames [alt: This chat is with Dan Ames.] [accID: 103]", + "1019 No Login [alt: This chat is with No Login.] [accID: 19]", + "1123 Lou Byrd [alt: This chat is with Lou Byrd.] [accID: 123]", + "1102 Cyd Ames [alt: This chat is with Cyd Ames.] [accID: 102]", + "1018 Domain Admin [alt: This chat is with Domain Admin.] [accID: 18]", + "1121 Jon Byrd [alt: This chat is with Jon Byrd.] [accID: 121]", + "1100 Ada Ames [alt: This chat is with Ada Ames.] [accID: 100]", + "1120 Ivy Byrd [alt: This chat is with Ivy Byrd.] [accID: 120]", + "1015 Alex Smith Jr. [alt: This chat is with Alex Smith Jr..] [accID: 15]", + "2012 #vít-room [rbr] [alt: Acme Holdings • This chat room is for anything #vít-room related.] [sub: Acme Holdings]", + "1139 Dan Dunn [alt: This chat is with Dan Dunn.] [accID: 139]", + "1118 Gus Byrd [alt: This chat is with Gus Byrd.] [accID: 118]", + "1013 (500) 555-0006 [alt: This chat is with (500) 555-0006.] [accID: 13]", + "2007 Groß Straße [alt: Atlas Workspace • This chat is for invoices between Groß Straße and Atlas Workspace. Use the + button to send an invoice.] [sub: Invoices]", + "1138 Cyd Dunn [alt: This chat is with Cyd Dunn.] [accID: 138]", + "1117 Fay Byrd [alt: This chat is with Fay Byrd.] [accID: 117]", + ], + "hasMore": true, + }, + "atlas": { + "displayedRows": [ + "2006 Groß Straße's expenses [alt: Atlas Workspace • This is where Groß Straße will submit expenses to Atlas Workspace. Just use the + button.] [sub: Atlas Workspace]", + "2005 Current User's expenses [alt: Atlas Workspace • This is where Current User will submit expenses to Atlas Workspace. Just use the + button.] [sub: Atlas Workspace • Submits to Current User]", + "2011 #town-hall [alt: Atlas Workspace • This chat is with everyone in Atlas Workspace. Use it for the most important announcements.] [sub: Atlas Workspace]", + ], + "hasMore": false, + }, + "town": { + "displayedRows": [ + "2011 #town-hall [alt: Atlas Workspace • This chat is with everyone in Atlas Workspace. Use it for the most important announcements.] [sub: Atlas Workspace]", + ], + "hasMore": false, + }, + "vit": { + "displayedRows": [ + "1003 Vít Novák [alt: This chat is with Vít Novák.] [accID: 3]", + "2006 Groß Straße's expenses [alt: Atlas Workspace • This is where Groß Straße will submit expenses to Atlas Workspace. Just use the + button.] [sub: Atlas Workspace]", + "2005 Current User's expenses [alt: Atlas Workspace • This is where Current User will submit expenses to Atlas Workspace. Just use the + button.] [sub: Atlas Workspace • Submits to Current User]", + "2003 Weekend Hiking [alt: This chat is with José Ñúñez, Mary-Jane O'Brien, and Vít Novák.]", + "2012 #vít-room [rbr] [alt: Acme Holdings • This chat room is for anything #vít-room related.] [sub: Acme Holdings]", + ], + "hasMore": false, + }, + "workspace": { + "displayedRows": [ + "2006 Groß Straße's expenses [alt: Atlas Workspace • This is where Groß Straße will submit expenses to Atlas Workspace. Just use the + button.] [sub: Atlas Workspace]", + "2005 Current User's expenses [alt: Atlas Workspace • This is where Current User will submit expenses to Atlas Workspace. Just use the + button.] [sub: Atlas Workspace • Submits to Current User]", + "2013 #orphan-room [alt: Gone Workspace • This chat room is for anything #orphan-room related.] [sub: Gone Workspace]", + "2011 #town-hall [alt: Atlas Workspace • This chat is with everyone in Atlas Workspace. Use it for the most important announcements.] [sub: Atlas Workspace]", + ], + "hasMore": false, + }, + }, + "searchRouterLocal": { + "": { + "currentUserOption": null, + "hasMore": true, + "personalDetails": [], + "recentReports": [ + "2004 Current User (you) [alt: This is your personal space. Use it for notes, tasks, drafts, and reminders.] [accID: 1]", + "1300 Nora Quill [alt: This chat is with Nora Quill.] [accID: 300]", + "2013 #orphan-room [alt: Gone Workspace • This chat room is for anything #orphan-room related.] [sub: Gone Workspace]", + "1124 Ada Cole [alt: This chat is with Ada Cole.] [accID: 124]", + "1103 Dan Ames [alt: This chat is with Dan Ames.] [accID: 103]", + "1019 No Login [alt: This chat is with No Login.] [accID: 19]", + "1123 Lou Byrd [alt: This chat is with Lou Byrd.] [accID: 123]", + "1102 Cyd Ames [alt: This chat is with Cyd Ames.] [accID: 102]", + "1018 Domain Admin [alt: This chat is with Domain Admin.] [accID: 18]", + "1121 Jon Byrd [alt: This chat is with Jon Byrd.] [accID: 121]", + "1100 Ada Ames [alt: This chat is with Ada Ames.] [accID: 100]", + "1120 Ivy Byrd [alt: This chat is with Ivy Byrd.] [accID: 120]", + "1015 Alex Smith Jr. [alt: This chat is with Alex Smith Jr..] [accID: 15]", + "2012 #vít-room [rbr] [alt: Acme Holdings • This chat room is for anything #vít-room related.] [sub: Acme Holdings]", + "1139 Dan Dunn [alt: This chat is with Dan Dunn.] [accID: 139]", + "1118 Gus Byrd [alt: This chat is with Gus Byrd.] [accID: 118]", + "1013 (500) 555-0006 [alt: This chat is with (500) 555-0006.] [accID: 13]", + "2007 Groß Straße [alt: Atlas Workspace • This chat is for invoices between Groß Straße and Atlas Workspace. Use the + button to send an invoice.] [sub: Invoices]", + "1138 Cyd Dunn [alt: This chat is with Cyd Dunn.] [accID: 138]", + "1117 Fay Byrd [alt: This chat is with Fay Byrd.] [accID: 117]", + ], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, + "atlas": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [], + "recentReports": [ + "2011 #town-hall [alt: Atlas Workspace • This chat is with everyone in Atlas Workspace. Use it for the most important announcements.] [sub: Atlas Workspace]", + "2006 Groß Straße's expenses [alt: Atlas Workspace • This is where Groß Straße will submit expenses to Atlas Workspace. Just use the + button.] [sub: Atlas Workspace]", + "2005 Current User's expenses [alt: Atlas Workspace • This is where Current User will submit expenses to Atlas Workspace. Just use the + button.] [sub: Atlas Workspace • Submits to Current User]", + ], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, + "town": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [], + "recentReports": [ + "2011 #town-hall [alt: Atlas Workspace • This chat is with everyone in Atlas Workspace. Use it for the most important announcements.] [sub: Atlas Workspace]", + ], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, + "vit": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [ + "1003 Vít Novák [alt: vit.novak@example.com] [accID: 3]", + ], + "recentReports": [ + "2012 #vít-room [rbr] [alt: Acme Holdings • This chat room is for anything #vít-room related.] [sub: Acme Holdings]", + "2006 Groß Straße's expenses [alt: Atlas Workspace • This is where Groß Straße will submit expenses to Atlas Workspace. Just use the + button.] [sub: Atlas Workspace]", + "2005 Current User's expenses [alt: Atlas Workspace • This is where Current User will submit expenses to Atlas Workspace. Just use the + button.] [sub: Atlas Workspace • Submits to Current User]", + "2003 Weekend Hiking [alt: This chat is with José Ñúñez, Mary-Jane O'Brien, and Vít Novák.]", + "1003 Vít Novák [alt: This chat is with Vít Novák.] [accID: 3]", + ], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, + "workspace": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [], + "recentReports": [ + "2013 #orphan-room [alt: Gone Workspace • This chat room is for anything #orphan-room related.] [sub: Gone Workspace]", + "2011 #town-hall [alt: Atlas Workspace • This chat is with everyone in Atlas Workspace. Use it for the most important announcements.] [sub: Atlas Workspace]", + "2006 Groß Straße's expenses [alt: Atlas Workspace • This is where Groß Straße will submit expenses to Atlas Workspace. Just use the + button.] [sub: Atlas Workspace]", + "2005 Current User's expenses [alt: Atlas Workspace • This is where Current User will submit expenses to Atlas Workspace. Just use the + button.] [sub: Atlas Workspace • Submits to Current User]", + ], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, + }, + }, + }, + { + "afterUpdate": "brings an old DM to the top", + "changedResults": { + "searchRouterDisplayed": { + "": { + "displayedRows": [ + "2004 Current User (you) [alt: This is your personal space. Use it for notes, tasks, drafts, and reminders.] [accID: 1]", + "1300 Nora Quill [alt: This chat is with Nora Quill.] [accID: 300]", + "1102 Cyd Ames [alt: This chat is with Cyd Ames.] [accID: 102]", + "2013 #orphan-room [alt: Gone Workspace • This chat room is for anything #orphan-room related.] [sub: Gone Workspace]", + "1124 Ada Cole [alt: This chat is with Ada Cole.] [accID: 124]", + "1103 Dan Ames [alt: This chat is with Dan Ames.] [accID: 103]", + "1019 No Login [alt: This chat is with No Login.] [accID: 19]", + "1123 Lou Byrd [alt: This chat is with Lou Byrd.] [accID: 123]", + "1018 Domain Admin [alt: This chat is with Domain Admin.] [accID: 18]", + "1121 Jon Byrd [alt: This chat is with Jon Byrd.] [accID: 121]", + "1100 Ada Ames [alt: This chat is with Ada Ames.] [accID: 100]", + "1120 Ivy Byrd [alt: This chat is with Ivy Byrd.] [accID: 120]", + "1015 Alex Smith Jr. [alt: This chat is with Alex Smith Jr..] [accID: 15]", + "2012 #vít-room [rbr] [alt: Acme Holdings • This chat room is for anything #vít-room related.] [sub: Acme Holdings]", + "1139 Dan Dunn [alt: This chat is with Dan Dunn.] [accID: 139]", + "1118 Gus Byrd [alt: This chat is with Gus Byrd.] [accID: 118]", + "1013 (500) 555-0006 [alt: This chat is with (500) 555-0006.] [accID: 13]", + "2007 Groß Straße [alt: Atlas Workspace • This chat is for invoices between Groß Straße and Atlas Workspace. Use the + button to send an invoice.] [sub: Invoices]", + "1138 Cyd Dunn [alt: This chat is with Cyd Dunn.] [accID: 138]", + "1117 Fay Byrd [alt: This chat is with Fay Byrd.] [accID: 117]", + ], + "hasMore": true, + }, + }, + "searchRouterLocal": { + "": { + "currentUserOption": null, + "hasMore": true, + "personalDetails": [], + "recentReports": [ + "2004 Current User (you) [alt: This is your personal space. Use it for notes, tasks, drafts, and reminders.] [accID: 1]", + "1300 Nora Quill [alt: This chat is with Nora Quill.] [accID: 300]", + "1102 Cyd Ames [alt: This chat is with Cyd Ames.] [accID: 102]", + "2013 #orphan-room [alt: Gone Workspace • This chat room is for anything #orphan-room related.] [sub: Gone Workspace]", + "1124 Ada Cole [alt: This chat is with Ada Cole.] [accID: 124]", + "1103 Dan Ames [alt: This chat is with Dan Ames.] [accID: 103]", + "1019 No Login [alt: This chat is with No Login.] [accID: 19]", + "1123 Lou Byrd [alt: This chat is with Lou Byrd.] [accID: 123]", + "1018 Domain Admin [alt: This chat is with Domain Admin.] [accID: 18]", + "1121 Jon Byrd [alt: This chat is with Jon Byrd.] [accID: 121]", + "1100 Ada Ames [alt: This chat is with Ada Ames.] [accID: 100]", + "1120 Ivy Byrd [alt: This chat is with Ivy Byrd.] [accID: 120]", + "1015 Alex Smith Jr. [alt: This chat is with Alex Smith Jr..] [accID: 15]", + "2012 #vít-room [rbr] [alt: Acme Holdings • This chat room is for anything #vít-room related.] [sub: Acme Holdings]", + "1139 Dan Dunn [alt: This chat is with Dan Dunn.] [accID: 139]", + "1118 Gus Byrd [alt: This chat is with Gus Byrd.] [accID: 118]", + "1013 (500) 555-0006 [alt: This chat is with (500) 555-0006.] [accID: 13]", + "2007 Groß Straße [alt: Atlas Workspace • This chat is for invoices between Groß Straße and Atlas Workspace. Use the + button to send an invoice.] [sub: Invoices]", + "1138 Cyd Dunn [alt: This chat is with Cyd Dunn.] [accID: 138]", + "1117 Fay Byrd [alt: This chat is with Fay Byrd.] [accID: 117]", + ], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, + }, + }, + }, + { + "afterUpdate": "marks a read DM unread", + "changedResults": { + "searchRouterDisplayed": { + "": { + "displayedRows": [ + "2004 Current User (you) [alt: This is your personal space. Use it for notes, tasks, drafts, and reminders.] [accID: 1]", + "1102 Cyd Ames [alt: This chat is with Cyd Ames.] [accID: 102]", + "1004 İsmail Yılmaz [bold] [alt: Thanks!] [accID: 4]", + "1300 Nora Quill [alt: This chat is with Nora Quill.] [accID: 300]", + "2013 #orphan-room [alt: Gone Workspace • This chat room is for anything #orphan-room related.] [sub: Gone Workspace]", + "1124 Ada Cole [alt: This chat is with Ada Cole.] [accID: 124]", + "1103 Dan Ames [alt: This chat is with Dan Ames.] [accID: 103]", + "1019 No Login [alt: This chat is with No Login.] [accID: 19]", + "1123 Lou Byrd [alt: This chat is with Lou Byrd.] [accID: 123]", + "1018 Domain Admin [alt: This chat is with Domain Admin.] [accID: 18]", + "1121 Jon Byrd [alt: This chat is with Jon Byrd.] [accID: 121]", + "1100 Ada Ames [alt: This chat is with Ada Ames.] [accID: 100]", + "1120 Ivy Byrd [alt: This chat is with Ivy Byrd.] [accID: 120]", + "1015 Alex Smith Jr. [alt: This chat is with Alex Smith Jr..] [accID: 15]", + "2012 #vít-room [rbr] [alt: Acme Holdings • This chat room is for anything #vít-room related.] [sub: Acme Holdings]", + "1139 Dan Dunn [alt: This chat is with Dan Dunn.] [accID: 139]", + "1118 Gus Byrd [alt: This chat is with Gus Byrd.] [accID: 118]", + "1013 (500) 555-0006 [alt: This chat is with (500) 555-0006.] [accID: 13]", + "2007 Groß Straße [alt: Atlas Workspace • This chat is for invoices between Groß Straße and Atlas Workspace. Use the + button to send an invoice.] [sub: Invoices]", + "1138 Cyd Dunn [alt: This chat is with Cyd Dunn.] [accID: 138]", + ], + "hasMore": true, + }, + "ismail": { + "displayedRows": [ + "1004 İsmail Yılmaz [bold] [alt: Thanks!] [accID: 4]", + ], + "hasMore": false, + }, + }, + "searchRouterLocal": { + "": { + "currentUserOption": null, + "hasMore": true, + "personalDetails": [], + "recentReports": [ + "2004 Current User (you) [alt: This is your personal space. Use it for notes, tasks, drafts, and reminders.] [accID: 1]", + "1102 Cyd Ames [alt: This chat is with Cyd Ames.] [accID: 102]", + "1004 İsmail Yılmaz [bold] [alt: Thanks!] [accID: 4]", + "1300 Nora Quill [alt: This chat is with Nora Quill.] [accID: 300]", + "2013 #orphan-room [alt: Gone Workspace • This chat room is for anything #orphan-room related.] [sub: Gone Workspace]", + "1124 Ada Cole [alt: This chat is with Ada Cole.] [accID: 124]", + "1103 Dan Ames [alt: This chat is with Dan Ames.] [accID: 103]", + "1019 No Login [alt: This chat is with No Login.] [accID: 19]", + "1123 Lou Byrd [alt: This chat is with Lou Byrd.] [accID: 123]", + "1018 Domain Admin [alt: This chat is with Domain Admin.] [accID: 18]", + "1121 Jon Byrd [alt: This chat is with Jon Byrd.] [accID: 121]", + "1100 Ada Ames [alt: This chat is with Ada Ames.] [accID: 100]", + "1120 Ivy Byrd [alt: This chat is with Ivy Byrd.] [accID: 120]", + "1015 Alex Smith Jr. [alt: This chat is with Alex Smith Jr..] [accID: 15]", + "2012 #vít-room [rbr] [alt: Acme Holdings • This chat room is for anything #vít-room related.] [sub: Acme Holdings]", + "1139 Dan Dunn [alt: This chat is with Dan Dunn.] [accID: 139]", + "1118 Gus Byrd [alt: This chat is with Gus Byrd.] [accID: 118]", + "1013 (500) 555-0006 [alt: This chat is with (500) 555-0006.] [accID: 13]", + "2007 Groß Straße [alt: Atlas Workspace • This chat is for invoices between Groß Straße and Atlas Workspace. Use the + button to send an invoice.] [sub: Invoices]", + "1138 Cyd Dunn [alt: This chat is with Cyd Dunn.] [accID: 138]", + ], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, + "ismail": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [ + "1004 İsmail Yılmaz [alt: ismail@example.com] [accID: 4]", + ], + "recentReports": [ + "1004 İsmail Yılmaz [bold] [alt: Thanks!] [accID: 4]", + ], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, + }, + }, + }, + { + "afterUpdate": "replies in a thread", + "changedResults": { + "searchRouterDisplayed": { + "": { + "displayedRows": [ + "2004 Current User (you) [alt: This is your personal space. Use it for notes, tasks, drafts, and reminders.] [accID: 1]", + "2026 Packing list [bold] [alt: José Ñúñez: Bring a sleeping bag]", + "1300 Nora Quill [alt: This chat is with Nora Quill.] [accID: 300]", + "1004 İsmail Yılmaz [bold] [alt: Thanks!] [accID: 4]", + "1102 Cyd Ames [alt: This chat is with Cyd Ames.] [accID: 102]", + "2013 #orphan-room [alt: Gone Workspace • This chat room is for anything #orphan-room related.] [sub: Gone Workspace]", + "1124 Ada Cole [alt: This chat is with Ada Cole.] [accID: 124]", + "1103 Dan Ames [alt: This chat is with Dan Ames.] [accID: 103]", + "1019 No Login [alt: This chat is with No Login.] [accID: 19]", + "1123 Lou Byrd [alt: This chat is with Lou Byrd.] [accID: 123]", + "1018 Domain Admin [alt: This chat is with Domain Admin.] [accID: 18]", + "1121 Jon Byrd [alt: This chat is with Jon Byrd.] [accID: 121]", + "1100 Ada Ames [alt: This chat is with Ada Ames.] [accID: 100]", + "1120 Ivy Byrd [alt: This chat is with Ivy Byrd.] [accID: 120]", + "1015 Alex Smith Jr. [alt: This chat is with Alex Smith Jr..] [accID: 15]", + "2012 #vít-room [rbr] [alt: Acme Holdings • This chat room is for anything #vít-room related.] [sub: Acme Holdings]", + "1139 Dan Dunn [alt: This chat is with Dan Dunn.] [accID: 139]", + "1118 Gus Byrd [alt: This chat is with Gus Byrd.] [accID: 118]", + "1013 (500) 555-0006 [alt: This chat is with (500) 555-0006.] [accID: 13]", + "2007 Groß Straße [alt: Atlas Workspace • This chat is for invoices between Groß Straße and Atlas Workspace. Use the + button to send an invoice.] [sub: Invoices]", + ], + "hasMore": true, + }, + }, + "searchRouterLocal": { + "": { + "currentUserOption": null, + "hasMore": true, + "personalDetails": [], + "recentReports": [ + "2004 Current User (you) [alt: This is your personal space. Use it for notes, tasks, drafts, and reminders.] [accID: 1]", + "2026 Packing list [bold] [alt: José Ñúñez: Bring a sleeping bag]", + "1300 Nora Quill [alt: This chat is with Nora Quill.] [accID: 300]", + "1004 İsmail Yılmaz [bold] [alt: Thanks!] [accID: 4]", + "1102 Cyd Ames [alt: This chat is with Cyd Ames.] [accID: 102]", + "2013 #orphan-room [alt: Gone Workspace • This chat room is for anything #orphan-room related.] [sub: Gone Workspace]", + "1124 Ada Cole [alt: This chat is with Ada Cole.] [accID: 124]", + "1103 Dan Ames [alt: This chat is with Dan Ames.] [accID: 103]", + "1019 No Login [alt: This chat is with No Login.] [accID: 19]", + "1123 Lou Byrd [alt: This chat is with Lou Byrd.] [accID: 123]", + "1018 Domain Admin [alt: This chat is with Domain Admin.] [accID: 18]", + "1121 Jon Byrd [alt: This chat is with Jon Byrd.] [accID: 121]", + "1100 Ada Ames [alt: This chat is with Ada Ames.] [accID: 100]", + "1120 Ivy Byrd [alt: This chat is with Ivy Byrd.] [accID: 120]", + "1015 Alex Smith Jr. [alt: This chat is with Alex Smith Jr..] [accID: 15]", + "2012 #vít-room [rbr] [alt: Acme Holdings • This chat room is for anything #vít-room related.] [sub: Acme Holdings]", + "1139 Dan Dunn [alt: This chat is with Dan Dunn.] [accID: 139]", + "1118 Gus Byrd [alt: This chat is with Gus Byrd.] [accID: 118]", + "1013 (500) 555-0006 [alt: This chat is with (500) 555-0006.] [accID: 13]", + "2007 Groß Straße [alt: Atlas Workspace • This chat is for invoices between Groß Straße and Atlas Workspace. Use the + button to send an invoice.] [sub: Invoices]", + ], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, + }, + }, + }, + { + "afterUpdate": "saves a draft in an empty thread", + "changedResults": { + "searchRouterDisplayed": { + "empty": { + "displayedRows": [ + "2025 Empty pinned thread [alt: No activity yet]", + "2024 Empty thread with a draft [alt: No activity yet]", + "2023 Empty thread [alt: No activity yet]", + ], + "hasMore": false, + }, + }, + "searchRouterLocal": { + "empty": { + "currentUserOption": null, + "hasMore": false, + "personalDetails": [], + "recentReports": [ + "2025 Empty pinned thread [alt: No activity yet]", + "2024 Empty thread with a draft [alt: No activity yet]", + "2023 Empty thread [alt: No activity yet]", + ], + "selfDMChat": null, + "userToInvite": null, + "workspaceChats": [], + }, + }, + }, + }, + ], +} +`; diff --git a/tests/utils/searchParity/generateSearchFixture.ts b/tests/utils/searchParity/generateSearchFixture.ts index 93ccb12f262c..b3c870ab3572 100644 --- a/tests/utils/searchParity/generateSearchFixture.ts +++ b/tests/utils/searchParity/generateSearchFixture.ts @@ -34,6 +34,7 @@ const ACCOUNT_IDS = { BOB_BUILDER: 10, MARY_JANE_OBRIEN: 11, ALEX_SMITH: 14, + RENE_DUPONT: 20, } as const; const SESSION = { @@ -161,7 +162,7 @@ const NAMED_CONTACTS: Array { + return Object.fromEntries(Object.keys(privateIsArchivedMap).map((key) => [key, ARCHIVED_REPORT_NAME_VALUE_PAIRS])); +} + /** The account's Onyx keys and values, for every key the search reads back. */ function getOnyxEntries(fixture: SearchFixture): OnyxMultiSetInput { return { @@ -705,8 +732,7 @@ function getOnyxEntries(fixture: SearchFixture): OnyxMultiSetInput { ...fixture.policies, ...fixture.draftComments, - // Mirrors privateIsArchivedMap so module-level archived reads agree with the map passed to createFilteredOptionList - ...Object.fromEntries(Object.keys(fixture.privateIsArchivedMap).map((key) => [key, ARCHIVED_REPORT_NAME_VALUE_PAIRS])), + ...getArchivedEntries(fixture.privateIsArchivedMap), }; } @@ -735,5 +761,264 @@ function writeSearchFixtureToOnyx(fixture: SearchFixture): Promise(previous: Readonly>, next: Readonly>): Record { + const changes: Record = {}; + for (const [key, value] of Object.entries(next)) { + if (previous[key] !== value) { + changes[key] = value; + } + } + for (const key of Object.keys(previous)) { + if (!(key in next)) { + // Onyx removes a key that is set to null + changes[key] = null; + } + } + return changes; +} + +/** + * Writes only the keys an update changed or removed, as the server's Onyx updates do, so Onyx re-derives only what depends on them + * and every other derived value keeps its reference. + */ +function writeSearchFixtureUpdateToOnyx(previous: SearchFixture, next: SearchFixture): Promise { + return writeOnyxEntries({ + ...(previous.personalDetails === next.personalDetails ? {} : {[ONYXKEYS.PERSONAL_DETAILS_LIST]: next.personalDetails}), + ...(previous.loginList === next.loginList ? {} : {[ONYXKEYS.LOGINS]: next.loginList}), + ...getChangedEntries(previous.reports, next.reports), + ...getChangedEntries(previous.reportActions, next.reportActions), + ...getChangedEntries(previous.policies, next.policies), + ...getChangedEntries(previous.draftComments, next.draftComments), + ...getChangedEntries(getArchivedEntries(previous.privateIsArchivedMap), getArchivedEntries(next.privateIsArchivedMap)), + }); +} + +/** Finds a fixture report by its name, so an update never depends on the reportIDs the fixture assigns to rooms and threads. */ +function getReportIDByName(fixture: SearchFixture, reportName: string): string { + const reportID = Object.values(fixture.reports).find((report) => report?.reportName === reportName)?.reportID; + if (!reportID) { + throw new Error(`No fixture report is named ${reportName}`); + } + return reportID; +} + +/** The reportID of the generated 1:1 DM with a contact, which is DM_REPORT_ID_OFFSET + the contact's accountID. */ +function getDMReportID(accountID: number): string { + return String(DM_REPORT_ID_OFFSET + accountID); +} + +/** Applies `changes` to the report with the given reportID. */ +function updateReport(fixture: SearchFixture, reportID: string, changes: Partial): SearchFixture { + const reportKey = `${ONYXKEYS.COLLECTION.REPORT}${reportID}` as const; + const report = fixture.reports[reportKey]; + if (!report) { + throw new Error(`No fixture report has the reportID ${reportID}`); + } + return { + ...fixture, + reports: {...fixture.reports, [reportKey]: {...report, ...changes}}, + }; +} + +type SearchFixtureUpdate = { + description: string; + /** Returns the updated account, replacing only the collections that change, as Onyx hands new references only for those. */ + apply: (fixture: SearchFixture) => SearchFixture; +}; + +/** Later than every generated timestamp, so an updated report becomes the most recent one. */ +const UPDATED_LAST_VISIBLE_ACTION_CREATED = '2024-01-29 10:00:00.000'; +const NEW_CONTACT_ACCOUNT_ID = 300; + +/** The contact whose DM the "archives a DM" and "unarchives a DM" updates toggle. */ +const ARCHIVED_DM_ACCOUNT_ID = ACCOUNT_IDS.VIT_NOVAK; +const ARCHIVED_DM_KEY = `${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${getDMReportID(ARCHIVED_DM_ACCOUNT_ID)}` as const; + +/** The third filler contact, "Cyd Ames", whose DM already ranks among the rows the blank SearchRouter query displays. */ +const CYD_AMES_ACCOUNT_ID = FIRST_FILLER_ACCOUNT_ID + 2; + +/** A sequence of everyday Onyx updates, applied one after another, that an incrementally kept search must follow. */ +const SEARCH_FIXTURE_UPDATES: SearchFixtureUpdate[] = [ + { + description: 'renames a room', + apply: (fixture) => updateReport(fixture, getReportIDByName(fixture, '#announce'), {reportName: '#town-hall'}), + }, + { + description: 'archives a DM', + apply: (fixture) => ({ + ...fixture, + privateIsArchivedMap: { + ...fixture.privateIsArchivedMap, + [ARCHIVED_DM_KEY]: true, + }, + }), + }, + { + description: 'unarchives a DM', + apply: (fixture) => ({ + ...fixture, + privateIsArchivedMap: Object.fromEntries(Object.entries(fixture.privateIsArchivedMap).filter(([key]) => key !== ARCHIVED_DM_KEY)), + }), + }, + { + description: 'deletes a room', + apply: (fixture) => { + const deletedReportKey = `${ONYXKEYS.COLLECTION.REPORT}${getReportIDByName(fixture, '#admins')}`; + return { + ...fixture, + reports: Object.fromEntries(Object.entries(fixture.reports).filter(([reportKey]) => reportKey !== deletedReportKey)), + }; + }, + }, + { + description: 'adds a contact and a DM with them', + apply: (fixture) => ({ + ...fixture, + personalDetails: { + ...fixture.personalDetails, + [NEW_CONTACT_ACCOUNT_ID]: { + accountID: NEW_CONTACT_ACCOUNT_ID, + login: 'nora.quill@example.com', + displayName: 'Nora Quill', + firstName: 'Nora', + lastName: 'Quill', + }, + }, + reports: { + ...fixture.reports, + [`${ONYXKEYS.COLLECTION.REPORT}${getDMReportID(NEW_CONTACT_ACCOUNT_ID)}`]: { + reportID: getDMReportID(NEW_CONTACT_ACCOUNT_ID), + reportName: 'Nora Quill', + type: CONST.REPORT.TYPE.CHAT, + participants: participantsOf([ACCOUNT_IDS.CURRENT_USER, NEW_CONTACT_ACCOUNT_ID]), + lastVisibleActionCreated: UPDATED_LAST_VISIBLE_ACTION_CREATED, + }, + }, + }), + }, + { + description: 'renames a contact', + apply: (fixture) => ({ + ...fixture, + personalDetails: { + ...fixture.personalDetails, + [ACCOUNT_IDS.BOB_BUILDER]: { + ...fixture.personalDetails[ACCOUNT_IDS.BOB_BUILDER], + accountID: ACCOUNT_IDS.BOB_BUILDER, + displayName: 'Robert Builder', + }, + }, + }), + }, + { + description: 'renames a contact without a DM', + apply: (fixture) => ({ + ...fixture, + personalDetails: { + ...fixture.personalDetails, + [ACCOUNT_IDS.RENE_DUPONT]: { + ...fixture.personalDetails[ACCOUNT_IDS.RENE_DUPONT], + accountID: ACCOUNT_IDS.RENE_DUPONT, + displayName: 'Renata Dupont', + }, + }, + }), + }, + { + description: 'removes a contact without a DM', + apply: (fixture) => ({ + ...fixture, + personalDetails: Object.fromEntries(Object.entries(fixture.personalDetails).filter(([accountID]) => accountID !== String(ACCOUNT_IDS.RENE_DUPONT))), + }), + }, + { + description: 'renames a workspace', + apply: (fixture) => { + const policyKey = `${ONYXKEYS.COLLECTION.POLICY}${POLICY_IDS.OWN}` as const; + const policy = fixture.policies[policyKey]; + if (!policy) { + throw new Error('The fixture has no own workspace'); + } + return { + ...fixture, + policies: { + ...fixture.policies, + [policyKey]: {...policy, name: 'Atlas Workspace'}, + }, + }; + }, + }, + + // A filler contact's DM that already sits among the 20 rows the blank SearchRouter query displays (the idle list keeps every fixture report, + // so nothing is evicted), and which this update moves from the 7th row to the 3rd + { + description: 'brings an old DM to the top', + apply: (fixture) => + updateReport(fixture, getDMReportID(CYD_AMES_ACCOUNT_ID), { + lastVisibleActionCreated: UPDATED_LAST_VISIBLE_ACTION_CREATED, + }), + }, + { + description: 'marks a read DM unread', + apply: (fixture) => + updateReport(fixture, getDMReportID(ACCOUNT_IDS.ISMAIL_YILMAZ), { + lastActorAccountID: ACCOUNT_IDS.ISMAIL_YILMAZ, + lastReadTime: '2024-01-01 00:00:00.000', + lastVisibleActionCreated: UPDATED_LAST_VISIBLE_ACTION_CREATED, + }), + }, + + // Moves the thread up and changes the task share destination's preview, which no search matches, so "sleeping" must keep finding nothing + { + description: 'replies in a thread', + apply: (fixture) => { + const reply = 'Bring a sleeping bag'; + const threadReportName = 'Packing list'; + const threadReportID = getReportIDByName(fixture, threadReportName); + const reportActionsKey = `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${threadReportID}` as const; + const updated = updateReport(fixture, threadReportID, { + lastMessageText: reply, + lastActorAccountID: ACCOUNT_IDS.JOSE_NUNEZ, + lastVisibleActionCreated: UPDATED_LAST_VISIBLE_ACTION_CREATED, + }); + return { + ...updated, + reportActions: { + ...fixture.reportActions, + [reportActionsKey]: { + ...fixture.reportActions[reportActionsKey], + + // The generated thread holds a first reply with reportActionID '1' + '2': { + reportActionID: '2', + actionName: CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT, + created: UPDATED_LAST_VISIBLE_ACTION_CREATED, + actorAccountID: ACCOUNT_IDS.JOSE_NUNEZ, + message: [ + { + type: CONST.REPORT.MESSAGE.TYPE.COMMENT, + html: reply, + text: reply, + }, + ], + }, + }, + }, + }; + }, + }, + { + description: 'saves a draft in an empty thread', + apply: (fixture) => ({ + ...fixture, + draftComments: { + ...fixture.draftComments, + [`${ONYXKEYS.COLLECTION.REPORT_DRAFT_COMMENT}${getReportIDByName(fixture, 'Empty thread')}`]: 'new draft', + }, + }), + }, +]; + +export {generateSearchFixture, writeSearchFixtureToOnyx, writeSearchFixtureUpdateToOnyx, ACCOUNT_IDS, CURRENT_USER_EMAIL, POLICY_IDS, SEARCH_FIXTURE_UPDATES, SEARCH_QUERIES}; export type {SearchFixture}; From a64cadb9700b64da55ece7f22c1b9abfa4a69e96 Mon Sep 17 00:00:00 2001 From: Jakub Magiera Date: Thu, 5 Nov 2026 14:13:14 +0100 Subject: [PATCH 2/2] Capture workspace icons in autocompleteIn search parity snapshots --- .../unit/OptionsListUtilsSearchParityTest.ts | 21 ++++- .../OptionsListUtilsSearchParityTest.ts.snap | 94 +++++++++---------- 2 files changed, 65 insertions(+), 50 deletions(-) diff --git a/tests/unit/OptionsListUtilsSearchParityTest.ts b/tests/unit/OptionsListUtilsSearchParityTest.ts index 6cc9d189601e..da16d94f1e86 100644 --- a/tests/unit/OptionsListUtilsSearchParityTest.ts +++ b/tests/unit/OptionsListUtilsSearchParityTest.ts @@ -69,8 +69,12 @@ function clearSearchCaches() { * [nav: ...] is the row's navigation target (reportID, else login, else none), emitted only when it differs from keyForList: report rows navigate by reportID, which equals keyForList today, so only a divergence shows. * The userToInvite login target is not emitted, because it is already visible as the text or the trailing invited login. * participantsList, icons and ownerAccountID are left out because the SearchRouter only renders them or never reads them. policyID and item are read for contextual search and FullStory masking, but only the canonical builders set them, so they are left out too. + * When includeWorkspaceIcon is true (used by autocompleteIn), [wsIcon] is emitted if the option carries a workspace avatar (first icon type is CONST.ICON_TYPE_WORKSPACE), matching what useAutocompleteSuggestions surfaces. */ -function serializeOption(option: SearchOptionData | null | undefined, {isUserToInvite = false}: {isUserToInvite?: boolean} = {}): string | null { +function serializeOption( + option: SearchOptionData | null | undefined, + {isUserToInvite = false, includeWorkspaceIcon = false}: {isUserToInvite?: boolean; includeWorkspaceIcon?: boolean} = {}, +): string | null { if (!option) { return null; } @@ -85,11 +89,12 @@ function serializeOption(option: SearchOptionData | null | undefined, {isUserToI const invitedLogin = isUserToInvite && option.login !== option.text ? ` ${option.login ?? ''}` : ''; const altText = option.alternateText ? ` [alt: ${option.alternateText}]` : ''; const subtitle = (option.isChatRoom || option.isPolicyExpenseChat) && option.subtitle ? ` [sub: ${option.subtitle}]` : ''; + const workspaceIcon = includeWorkspaceIcon && option.icons?.at(0)?.type === CONST.ICON_TYPE_WORKSPACE ? ' [wsIcon]' : ''; const accountID = option.accountID ? ` [accID: ${option.accountID}]` : ''; const navigationTarget = option.reportID || option.login; const isLoginShownAlready = isUserToInvite && !option.reportID; const navigation = !isLoginShownAlready && String(navigationTarget ?? '') !== (option.keyForList ?? '') ? ` [nav: ${navigationTarget || 'none'}]` : ''; - return `${option.keyForList ?? ''} ${option.text ?? ''}${flags}${altText}${subtitle}${accountID}${navigation}${invitedLogin}`; + return `${option.keyForList ?? ''} ${option.text ?? ''}${flags}${altText}${subtitle}${workspaceIcon}${accountID}${navigation}${invitedLogin}`; } /** What the screen shows: one flat list of rows, in order. */ @@ -106,7 +111,16 @@ function serializeResult(result: OptionsResult | DisplayedResult | SectionResult }; } if (!('options' in result)) { - return Object.fromEntries(Object.entries(result).map(([section, options]) => [section, options.map((option) => serializeOption(option))])); + return Object.fromEntries( + Object.entries(result).map(([section, options]) => [ + section, + options.map((option) => + serializeOption(option, { + includeWorkspaceIcon: section === 'recentReports', + }), + ), + ]), + ); } const {options, hasMore} = result; return { @@ -342,6 +356,7 @@ function createCallSites(sourceFixture: SearchFixture) { // The in: room filter of useAutocompleteSuggestions (src/hooks/useAutocompleteSuggestions.ts), which only reads recentReports. // The config is copied from that hook, so keep the two in sync. As above, isDefaultRoomsBetaEnabled is fixed to true, maxResults is the hook's literal 10, and the hook's filter of rows without text or already typed is not replicated. + // serializeResult captures [wsIcon] for this call site because the hook reads chat.icons.at(0) to disambiguate identically named rooms across workspaces. autocompleteIn: (options, query) => ({ recentReports: getSearchOptions({ ...commonSearchConfig, diff --git a/tests/unit/__snapshots__/OptionsListUtilsSearchParityTest.ts.snap b/tests/unit/__snapshots__/OptionsListUtilsSearchParityTest.ts.snap index 1b0fbb0a540d..cff5dd6e3828 100644 --- a/tests/unit/__snapshots__/OptionsListUtilsSearchParityTest.ts.snap +++ b/tests/unit/__snapshots__/OptionsListUtilsSearchParityTest.ts.snap @@ -351,7 +351,7 @@ exports[`OptionsListUtils search parity (golden master) call site autocompleteIn "": { "recentReports": [ "2004 Current User (you) [alt: This is your personal space. Use it for notes, tasks, drafts, and reminders.] [accID: 1]", - "2013 #orphan-room [alt: Gone Workspace • This chat room is for anything #orphan-room related.] [sub: Gone Workspace]", + "2013 #orphan-room [alt: Gone Workspace • This chat room is for anything #orphan-room related.] [sub: Gone Workspace] [wsIcon]", "1124 Ada Cole [alt: This chat is with Ada Cole.] [accID: 124]", "1103 Dan Ames [alt: This chat is with Dan Ames.] [accID: 103]", "1019 No Login [alt: This chat is with No Login.] [accID: 19]", @@ -365,7 +365,7 @@ exports[`OptionsListUtils search parity (golden master) call site autocompleteIn " ": { "recentReports": [ "2004 Current User (you) [alt: This is your personal space. Use it for notes, tasks, drafts, and reminders.] [accID: 1]", - "2013 #orphan-room [alt: Gone Workspace • This chat room is for anything #orphan-room related.] [sub: Gone Workspace]", + "2013 #orphan-room [alt: Gone Workspace • This chat room is for anything #orphan-room related.] [sub: Gone Workspace] [wsIcon]", "1124 Ada Cole [alt: This chat is with Ada Cole.] [accID: 124]", "1103 Dan Ames [alt: This chat is with Dan Ames.] [accID: 103]", "1019 No Login [alt: This chat is with No Login.] [accID: 19]", @@ -441,8 +441,8 @@ exports[`OptionsListUtils search parity (golden master) call site autocompleteIn }, "Groß": { "recentReports": [ - "2007 Groß Straße [alt: Vít Workspace • This chat is for invoices between Groß Straße and Vít Workspace. Use the + button to send an invoice.] [sub: Invoices]", - "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace]", + "2007 Groß Straße [alt: Vít Workspace • This chat is for invoices between Groß Straße and Vít Workspace. Use the + button to send an invoice.] [sub: Invoices] [wsIcon]", + "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace] [wsIcon]", ], }, "JOSÉ": { @@ -465,23 +465,23 @@ exports[`OptionsListUtils search parity (golden master) call site autocompleteIn }, "Vít": { "recentReports": [ - "2012 #vít-room [rbr] [alt: Acme Holdings • This chat room is for anything #vít-room related.] [sub: Acme Holdings]", - "2011 #announce [alt: Vít Workspace • This chat is with everyone in Vít Workspace. Use it for the most important announcements.] [sub: Vít Workspace]", - "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace]", - "2005 Current User's expenses [gbr] [alt: Vít Workspace • This is where Current User will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace • Submits to Current User]", + "2012 #vít-room [rbr] [alt: Acme Holdings • This chat room is for anything #vít-room related.] [sub: Acme Holdings] [wsIcon]", + "2011 #announce [alt: Vít Workspace • This chat is with everyone in Vít Workspace. Use it for the most important announcements.] [sub: Vít Workspace] [wsIcon]", + "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace] [wsIcon]", + "2005 Current User's expenses [gbr] [alt: Vít Workspace • This is where Current User will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace • Submits to Current User] [wsIcon]", "2003 Weekend Hiking [alt: This chat is with José Ñúñez, Mary-Jane O'Brien, and Vít Novák.]", - "2010 #admins [alt: Vít Workspace • This chat is with Vít Workspace admin. Use it to chat about workspace setup and more.] [sub: Vít Workspace]", + "2010 #admins [alt: Vít Workspace • This chat is with Vít Workspace admin. Use it to chat about workspace setup and more.] [sub: Vít Workspace] [wsIcon]", "1003 Vít Novák [alt: This chat is with Vít Novák.] [accID: 3]", ], }, "Vít": { "recentReports": [ - "2012 #vít-room [rbr] [alt: Acme Holdings • This chat room is for anything #vít-room related.] [sub: Acme Holdings]", - "2011 #announce [alt: Vít Workspace • This chat is with everyone in Vít Workspace. Use it for the most important announcements.] [sub: Vít Workspace]", - "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace]", - "2005 Current User's expenses [gbr] [alt: Vít Workspace • This is where Current User will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace • Submits to Current User]", + "2012 #vít-room [rbr] [alt: Acme Holdings • This chat room is for anything #vít-room related.] [sub: Acme Holdings] [wsIcon]", + "2011 #announce [alt: Vít Workspace • This chat is with everyone in Vít Workspace. Use it for the most important announcements.] [sub: Vít Workspace] [wsIcon]", + "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace] [wsIcon]", + "2005 Current User's expenses [gbr] [alt: Vít Workspace • This is where Current User will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace • Submits to Current User] [wsIcon]", "2003 Weekend Hiking [alt: This chat is with José Ñúñez, Mary-Jane O'Brien, and Vít Novák.]", - "2010 #admins [alt: Vít Workspace • This chat is with Vít Workspace admin. Use it to chat about workspace setup and more.] [sub: Vít Workspace]", + "2010 #admins [alt: Vít Workspace • This chat is with Vít Workspace admin. Use it to chat about workspace setup and more.] [sub: Vít Workspace] [wsIcon]", "1003 Vít Novák [alt: This chat is with Vít Novák.] [accID: 3]", ], }, @@ -494,7 +494,7 @@ exports[`OptionsListUtils search parity (golden master) call site autocompleteIn "a": { "recentReports": [ "2004 Current User (you) [alt: This is your personal space. Use it for notes, tasks, drafts, and reminders.] [accID: 1]", - "2013 #orphan-room [alt: Gone Workspace • This chat room is for anything #orphan-room related.] [sub: Gone Workspace]", + "2013 #orphan-room [alt: Gone Workspace • This chat room is for anything #orphan-room related.] [sub: Gone Workspace] [wsIcon]", "1124 Ada Cole [alt: This chat is with Ada Cole.] [accID: 124]", "1103 Dan Ames [alt: This chat is with Dan Ames.] [accID: 103]", "1123 Lou Byrd [alt: This chat is with Lou Byrd.] [accID: 123]", @@ -507,7 +507,7 @@ exports[`OptionsListUtils search parity (golden master) call site autocompleteIn }, "acme": { "recentReports": [ - "2012 #vít-room [rbr] [alt: Acme Holdings • This chat room is for anything #vít-room related.] [sub: Acme Holdings]", + "2012 #vít-room [rbr] [alt: Acme Holdings • This chat room is for anything #vít-room related.] [sub: Acme Holdings] [wsIcon]", ], }, "ada byrd": { @@ -517,7 +517,7 @@ exports[`OptionsListUtils search parity (golden master) call site autocompleteIn }, "admins": { "recentReports": [ - "2010 #admins [alt: Vít Workspace • This chat is with Vít Workspace admin. Use it to chat about workspace setup and more.] [sub: Vít Workspace]", + "2010 #admins [alt: Vít Workspace • This chat is with Vít Workspace admin. Use it to chat about workspace setup and more.] [sub: Vít Workspace] [wsIcon]", ], }, "al": { @@ -634,13 +634,13 @@ exports[`OptionsListUtils search parity (golden master) call site autocompleteIn "mary jane": { "recentReports": [ "2003 Weekend Hiking [alt: This chat is with José Ñúñez, Mary-Jane O'Brien, and Vít Novák.]", - "2000 Mary-Jane O'Brien (archived) [archived] [alt: This chat room has been archived.] [accID: 11]", + "2000 Mary-Jane O'Brien (archived) [archived] [alt: This chat room has been archived.] [wsIcon] [accID: 11]", ], }, "mary-jane": { "recentReports": [ "2003 Weekend Hiking [alt: This chat is with José Ñúñez, Mary-Jane O'Brien, and Vít Novák.]", - "2000 Mary-Jane O'Brien (archived) [archived] [alt: This chat room has been archived.] [accID: 11]", + "2000 Mary-Jane O'Brien (archived) [archived] [alt: This chat room has been archived.] [wsIcon] [accID: 11]", ], }, "me": { @@ -649,7 +649,7 @@ exports[`OptionsListUtils search parity (golden master) call site autocompleteIn "1103 Dan Ames [alt: This chat is with Dan Ames.] [accID: 103]", "1102 Cyd Ames [alt: This chat is with Cyd Ames.] [accID: 102]", "1100 Ada Ames [alt: This chat is with Ada Ames.] [accID: 100]", - "2012 #vít-room [rbr] [alt: Acme Holdings • This chat room is for anything #vít-room related.] [sub: Acme Holdings]", + "2012 #vít-room [rbr] [alt: Acme Holdings • This chat room is for anything #vít-room related.] [sub: Acme Holdings] [wsIcon]", "1111 Lou Ames [alt: This chat is with Lou Ames.] [accID: 111]", "1109 Jon Ames [alt: This chat is with Jon Ames.] [accID: 109]", "1108 Ivy Ames [alt: This chat is with Ivy Ames.] [accID: 108]", @@ -667,7 +667,7 @@ exports[`OptionsListUtils search parity (golden master) call site autocompleteIn }, "nounce": { "recentReports": [ - "2011 #announce [alt: Vít Workspace • This chat is with everyone in Vít Workspace. Use it for the most important announcements.] [sub: Vít Workspace]", + "2011 #announce [alt: Vít Workspace • This chat is with everyone in Vít Workspace. Use it for the most important announcements.] [sub: Vít Workspace] [wsIcon]", ], }, "nunez": { @@ -679,27 +679,27 @@ exports[`OptionsListUtils search parity (golden master) call site autocompleteIn "o'brien": { "recentReports": [ "2003 Weekend Hiking [alt: This chat is with José Ñúñez, Mary-Jane O'Brien, and Vít Novák.]", - "2000 Mary-Jane O'Brien (archived) [archived] [alt: This chat room has been archived.] [accID: 11]", + "2000 Mary-Jane O'Brien (archived) [archived] [alt: This chat room has been archived.] [wsIcon] [accID: 11]", ], }, "obrien": { "recentReports": [ "2003 Weekend Hiking [alt: This chat is with José Ñúñez, Mary-Jane O'Brien, and Vít Novák.]", - "2000 Mary-Jane O'Brien (archived) [archived] [alt: This chat room has been archived.] [accID: 11]", + "2000 Mary-Jane O'Brien (archived) [archived] [alt: This chat room has been archived.] [wsIcon] [accID: 11]", ], }, "oldings": { "recentReports": [ - "2012 #vít-room [rbr] [alt: Acme Holdings • This chat room is for anything #vít-room related.] [sub: Acme Holdings]", + "2012 #vít-room [rbr] [alt: Acme Holdings • This chat room is for anything #vít-room related.] [sub: Acme Holdings] [wsIcon]", ], }, "orkspace": { "recentReports": [ - "2013 #orphan-room [alt: Gone Workspace • This chat room is for anything #orphan-room related.] [sub: Gone Workspace]", - "2011 #announce [alt: Vít Workspace • This chat is with everyone in Vít Workspace. Use it for the most important announcements.] [sub: Vít Workspace]", - "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace]", - "2005 Current User's expenses [gbr] [alt: Vít Workspace • This is where Current User will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace • Submits to Current User]", - "2010 #admins [alt: Vít Workspace • This chat is with Vít Workspace admin. Use it to chat about workspace setup and more.] [sub: Vít Workspace]", + "2013 #orphan-room [alt: Gone Workspace • This chat room is for anything #orphan-room related.] [sub: Gone Workspace] [wsIcon]", + "2011 #announce [alt: Vít Workspace • This chat is with everyone in Vít Workspace. Use it for the most important announcements.] [sub: Vít Workspace] [wsIcon]", + "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace] [wsIcon]", + "2005 Current User's expenses [gbr] [alt: Vít Workspace • This is where Current User will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace • Submits to Current User] [wsIcon]", + "2010 #admins [alt: Vít Workspace • This chat is with Vít Workspace admin. Use it to chat about workspace setup and more.] [sub: Vít Workspace] [wsIcon]", ], }, "ovak": { @@ -728,14 +728,14 @@ exports[`OptionsListUtils search parity (golden master) call site autocompleteIn }, "strasse": { "recentReports": [ - "2007 Groß Straße [alt: Vít Workspace • This chat is for invoices between Groß Straße and Vít Workspace. Use the + button to send an invoice.] [sub: Invoices]", - "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace]", + "2007 Groß Straße [alt: Vít Workspace • This chat is for invoices between Groß Straße and Vít Workspace. Use the + button to send an invoice.] [sub: Invoices] [wsIcon]", + "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace] [wsIcon]", ], }, "straße": { "recentReports": [ - "2007 Groß Straße [alt: Vít Workspace • This chat is for invoices between Groß Straße and Vít Workspace. Use the + button to send an invoice.] [sub: Invoices]", - "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace]", + "2007 Groß Straße [alt: Vít Workspace • This chat is for invoices between Groß Straße and Vít Workspace. Use the + button to send an invoice.] [sub: Invoices] [wsIcon]", + "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace] [wsIcon]", ], }, "thread": { @@ -751,30 +751,30 @@ exports[`OptionsListUtils search parity (golden master) call site autocompleteIn }, "vit": { "recentReports": [ - "2012 #vít-room [rbr] [alt: Acme Holdings • This chat room is for anything #vít-room related.] [sub: Acme Holdings]", - "2011 #announce [alt: Vít Workspace • This chat is with everyone in Vít Workspace. Use it for the most important announcements.] [sub: Vít Workspace]", - "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace]", - "2005 Current User's expenses [gbr] [alt: Vít Workspace • This is where Current User will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace • Submits to Current User]", + "2012 #vít-room [rbr] [alt: Acme Holdings • This chat room is for anything #vít-room related.] [sub: Acme Holdings] [wsIcon]", + "2011 #announce [alt: Vít Workspace • This chat is with everyone in Vít Workspace. Use it for the most important announcements.] [sub: Vít Workspace] [wsIcon]", + "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace] [wsIcon]", + "2005 Current User's expenses [gbr] [alt: Vít Workspace • This is where Current User will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace • Submits to Current User] [wsIcon]", "2003 Weekend Hiking [alt: This chat is with José Ñúñez, Mary-Jane O'Brien, and Vít Novák.]", - "2010 #admins [alt: Vít Workspace • This chat is with Vít Workspace admin. Use it to chat about workspace setup and more.] [sub: Vít Workspace]", + "2010 #admins [alt: Vít Workspace • This chat is with Vít Workspace admin. Use it to chat about workspace setup and more.] [sub: Vít Workspace] [wsIcon]", "1003 Vít Novák [alt: This chat is with Vít Novák.] [accID: 3]", ], }, "vit workspace": { "recentReports": [ - "2011 #announce [alt: Vít Workspace • This chat is with everyone in Vít Workspace. Use it for the most important announcements.] [sub: Vít Workspace]", - "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace]", - "2005 Current User's expenses [gbr] [alt: Vít Workspace • This is where Current User will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace • Submits to Current User]", - "2010 #admins [alt: Vít Workspace • This chat is with Vít Workspace admin. Use it to chat about workspace setup and more.] [sub: Vít Workspace]", + "2011 #announce [alt: Vít Workspace • This chat is with everyone in Vít Workspace. Use it for the most important announcements.] [sub: Vít Workspace] [wsIcon]", + "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace] [wsIcon]", + "2005 Current User's expenses [gbr] [alt: Vít Workspace • This is where Current User will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace • Submits to Current User] [wsIcon]", + "2010 #admins [alt: Vít Workspace • This chat is with Vít Workspace admin. Use it to chat about workspace setup and more.] [sub: Vít Workspace] [wsIcon]", ], }, "workspace": { "recentReports": [ - "2013 #orphan-room [alt: Gone Workspace • This chat room is for anything #orphan-room related.] [sub: Gone Workspace]", - "2011 #announce [alt: Vít Workspace • This chat is with everyone in Vít Workspace. Use it for the most important announcements.] [sub: Vít Workspace]", - "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace]", - "2005 Current User's expenses [gbr] [alt: Vít Workspace • This is where Current User will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace • Submits to Current User]", - "2010 #admins [alt: Vít Workspace • This chat is with Vít Workspace admin. Use it to chat about workspace setup and more.] [sub: Vít Workspace]", + "2013 #orphan-room [alt: Gone Workspace • This chat room is for anything #orphan-room related.] [sub: Gone Workspace] [wsIcon]", + "2011 #announce [alt: Vít Workspace • This chat is with everyone in Vít Workspace. Use it for the most important announcements.] [sub: Vít Workspace] [wsIcon]", + "2006 Groß Straße's expenses [alt: Vít Workspace • This is where Groß Straße will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace] [wsIcon]", + "2005 Current User's expenses [gbr] [alt: Vít Workspace • This is where Current User will submit expenses to Vít Workspace. Just use the + button.] [sub: Vít Workspace • Submits to Current User] [wsIcon]", + "2010 #admins [alt: Vít Workspace • This chat is with Vít Workspace admin. Use it to chat about workspace setup and more.] [sub: Vít Workspace] [wsIcon]", ], }, "x.com": {