Files
buzz/mobile/test/shared/mentions/mention-rules.fixtures.json
Logan Johnson 9322289364 feat(mobile): follow the portable mention rules, including DMs (#8102)
🤖
## Summary
The mobile app's @mention chooser now follows the same rules as the
desktop app (buzz-app). The same typed text finds the same people in the
same order on both apps, and sending works the same way.

- **Same matching and order.** Mobile uses the shared mention rules and
runs their shared test cases. A multi-word search such as `@Mary J`
still searches the community directory, so it can find "Mary Jane" even
when she is not in the channel.
- **DMs can mention people outside the DM.** The chooser marks them "not
in DM". Nobody can be added to a DM, so the message sends without a
prompt. Outside people go out as references, so they are not notified.
This matches buzz-app #510.
- **Channels still ask.** In a stream or forum, mentioning someone
outside the channel asks "Invite" or "Do nothing" before the message
sends. A channel with no type tag counts as a stream.
- **Sessions do not search the directory.** Only session members appear.
- **A failed directory search stays visible.** The chooser shows the
error and a Retry button. Before, it closed.
- **Search results stay in their community.** If you switch communities
while a search runs, its people and its error do not show in the new
community. The search starts again there.
- **A failed send check keeps the draft.** Before a message with a
mention sends, the app checks who is in the channel. If that check
fails, the message stays in the compose bar and a notice offers Retry.
Before, nothing was sent and nothing was shown.
- **Invite stays in its community.** If you switch communities while the
"Invite" question is open, Invite adds nobody.

### Screenshots
The real compose bar widget, rendered by Flutter's test renderer with
the app's fonts and theme. The data is sample data. These are not device
captures.

| DM: outside person is "not in DM" | Stream: outside person is "not in
channel" |
|---|---|
| <img width="320" alt="DM chooser"
src="https://github.com/user-attachments/assets/0e884518-2386-4cd1-9f19-16661aaa194e"
/> | <img width="320" alt="Stream chooser"
src="https://github.com/user-attachments/assets/5395e4e1-032e-459b-98c6-0126c060c4d9"
/> |

| Stream: send asks first | Session: members only | Search failed: Retry
|
|---|---|---|
| <img width="260" alt="Stream ask on send"
src="https://github.com/user-attachments/assets/2b988257-3c6a-445d-acfa-fca47b9752fe"
/> | <img width="260" alt="Session chooser"
src="https://github.com/user-attachments/assets/e193551f-f5bf-41d9-aa29-bc8665c643f9"
/> | <img width="260" alt="Search failed with Retry"
src="https://github.com/user-attachments/assets/e8c4b9bb-067e-4fe9-9fdd-4e5691bc66be"
/> |

### Details
- `mobile/lib/shared/mentions/mention_rules.dart` holds the rules: query
syntax, match tiers, sort order, Space selection of an exact unique
name, stable rows while results arrive, and `p` and `mention` tags. A
`p` tag notifies the person. A `mention` tag is a reference and does not
notify.
- `mobile/test/shared/mentions/mention-rules.fixtures.json` is an exact
copy of the buzz-app fixture file. `mention_rules_test.dart` runs every
case.
- Known difference: desktop gives the directory to a channel with an
unknown explicit type (not stream, forum, DM or session). Mobile does
not. No such type exists today.

### Related issue
None found. Desktop counterpart: block/buzz-app#510. #7513 also edits
`send_message_provider.dart` and may conflict.

### Testing
`just mobile-install mobile-check mobile-test` passes: analyze clean,
2998 tests pass on `49c44653` (before rebase). The pre-push hook ran
`just mobile-check && just mobile-test` again on the rebased head
`de1ca080` and passed.

Each review fix was mutation-checked: removing the fix makes its new
test fail.

---------

Signed-off-by: Larry <627498bd4bd1f281a16431e3c6cce3b5c25b6692798c78672298aefbf2f8f8b5@buzz.block.builderlab.xyz>
Co-authored-by: Larry <627498bd4bd1f281a16431e3c6cce3b5c25b6692798c78672298aefbf2f8f8b5@buzz.block.builderlab.xyz>
2026-10-05 18:54:49 -04:00

1259 lines
38 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"$comment": "Mention rules v1: semantic inputs, no signed events. Spec: README.md. Keys are lowercase 64-hex. Choice defaults: label = name, aliases = [name], agent/owned/managed = false. history maps key to recency (higher is more recent); presence maps key to online/away (missing is unknown). ranking.expected is the full ordered key list; space.expected is a key or null. Expected outputs are literal, not generated by the code under test.",
"version": 1,
"ranking": [
{
"name": "match_tiers_within_members",
"query": "honey",
"choices": [
{
"pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"name": "A Honey",
"member": true
},
{
"pubkey": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"name": "Honey Bee",
"member": true
},
{
"pubkey": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
"name": "Honey",
"member": true
},
{
"pubkey": "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
"name": "Honey",
"member": false,
"agent": true
},
{
"pubkey": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
"name": "A Honeybee",
"member": true
}
],
"expected": [
"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
"dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"
]
},
{
"name": "no_substring_inside_a_word",
"query": "oney",
"choices": [
{
"pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"name": "A Honey",
"member": true
}
],
"expected": []
},
{
"name": "members_before_better_matching_outsiders",
"query": "honey",
"choices": [
{
"pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"name": "Honey",
"member": false
},
{
"pubkey": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"name": "Honey Bee",
"member": true
}
],
"expected": [
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
]
},
{
"name": "empty_query_lists_all_by_group_then_label",
"query": "",
"choices": [
{
"pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"name": "Zoe",
"member": true
},
{
"pubkey": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"name": "adam",
"member": true
},
{
"pubkey": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
"name": "Bob",
"member": false
}
],
"expected": [
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
]
},
{
"name": "query_is_trimmed_and_case_insensitive",
"query": " HONEY ",
"choices": [
{
"pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"name": "Honey Bee",
"member": true
},
{
"pubkey": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"name": "honey",
"member": true
}
],
"expected": [
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
]
},
{
"name": "public_keys_are_not_searchable",
"query": "abcdef12",
"choices": [
{
"pubkey": "abcdef12abcdef12abcdef12abcdef12abcdef12abcdef12abcdef12abcdef12",
"name": "One",
"member": true
}
],
"expected": []
},
{
"name": "unnamed_identity_matches_only_the_empty_query",
"query": "aaaa",
"choices": [
{
"pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"name": "aaaaaaaaaaaa",
"aliases": [],
"member": true
}
],
"expected": []
},
{
"name": "unnamed_identity_is_listed_for_the_empty_query",
"query": "",
"choices": [
{
"pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"name": "aaaaaaaaaaaa",
"aliases": [],
"member": true
}
],
"expected": [
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
]
},
{
"name": "visible_label_before_alias_match",
"query": "Legacy",
"choices": [
{
"pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"name": "Honey",
"label": "Wes’s Honey",
"aliases": ["Honey", "Legacy Bee"],
"member": true,
"agent": true
},
{
"pubkey": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
"name": "Another name",
"label": "Visible Legacy Bee",
"member": true
}
],
"expected": [
"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
]
},
{
"name": "alias_matches_when_visible_label_does_not",
"query": "Legacy Bee",
"choices": [
{
"pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"name": "Honey",
"label": "Wes’s Honey",
"aliases": ["Honey", "Legacy Bee"],
"member": true,
"agent": true
},
{
"pubkey": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
"name": "Another name",
"label": "Visible Legacy Bee",
"member": true
}
],
"expected": [
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
]
},
{
"name": "owner_qualified_label_is_searchable",
"query": "Wes’s",
"choices": [
{
"pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"name": "Honey",
"label": "Wes’s Honey",
"aliases": ["Honey"],
"member": true,
"agent": true
},
{
"pubkey": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"name": "Honey",
"member": true,
"agent": true
}
],
"expected": [
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
]
},
{
"name": "owned_agent_first_on_equal_match_before_history_managed_presence",
"query": "riz",
"choices": [
{
"pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"name": "Rizz",
"member": true,
"agent": true,
"managed": true
},
{
"pubkey": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"name": "Rizz",
"member": true,
"agent": true,
"owned": true
}
],
"history": {
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 10
},
"presence": {
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": "online"
},
"expected": [
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
]
},
{
"name": "owned_agent_before_people_and_other_agents",
"query": "",
"choices": [
{
"pubkey": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
"name": "Mary",
"member": true
},
{
"pubkey": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"name": "Alpha",
"member": true,
"agent": true
},
{
"pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"name": "Zed",
"member": true,
"agent": true,
"owned": true
}
],
"expected": [
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
]
},
{
"name": "same_name_agents_stay_one_block_at_its_first_label",
"query": "",
"choices": [
{
"pubkey": "1111111111111111111111111111111111111111111111111111111111111111",
"name": "Honey · b",
"member": true
},
{
"pubkey": "2222222222222222222222222222222222222222222222222222222222222222",
"name": "Honey Bee",
"label": "Honey · c",
"member": true,
"agent": true
},
{
"pubkey": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
"name": "Honey",
"label": "Honey · aa",
"member": true,
"agent": true
},
{
"pubkey": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
"name": "Honey",
"label": "Wes’s Honey",
"member": true,
"agent": true,
"managed": true
},
{
"pubkey": "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
"name": "Honey",
"label": "Honey · zz",
"member": true,
"agent": true
}
],
"history": {
"dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd": 2
},
"presence": {
"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff": "online"
},
"expected": [
"dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
"1111111111111111111111111111111111111111111111111111111111111111",
"2222222222222222222222222222222222222222222222222222222222222222"
]
},
{
"name": "person_before_agent_block_on_equal_label",
"query": "",
"choices": [
{
"pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"name": "Sam",
"member": true,
"agent": true
},
{
"pubkey": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"name": "Sam",
"member": true
}
],
"expected": [
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
]
},
{
"name": "ownership_does_not_override_membership",
"query": "riz",
"choices": [
{
"pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"name": "Rizz",
"member": true,
"agent": true,
"managed": true
},
{
"pubkey": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"name": "Rizz",
"member": false,
"agent": true,
"owned": true
}
],
"expected": [
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
]
},
{
"name": "ownership_does_not_override_match_quality",
"query": "Rizz",
"choices": [
{
"pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"name": "Rizz",
"member": true,
"agent": true
},
{
"pubkey": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"name": "Rizz Helper",
"member": true,
"agent": true,
"owned": true
}
],
"expected": [
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
]
},
{
"name": "visible_prefix_beats_owned_word_prefix",
"query": "riz",
"choices": [
{
"pubkey": "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
"name": "Rizz",
"label": "tho’s Rizz",
"member": true,
"agent": true,
"owned": true
},
{
"pubkey": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
"name": "Rizz",
"member": true,
"agent": true
}
],
"expected": [
"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
"dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"
]
},
{
"name": "history_breaks_same_name_agent_ties",
"query": "honey",
"choices": [
{
"pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"name": "Honey",
"label": "Honey · aaaa",
"member": true,
"agent": true
},
{
"pubkey": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"name": "Honey",
"label": "Honey · bbbb",
"member": true,
"agent": true
}
],
"history": {
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb": 5
},
"expected": [
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
]
},
{
"name": "managed_then_presence_for_same_name_agents",
"query": "honey",
"choices": [
{
"pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"name": "Honey",
"label": "Honey · aaaa",
"member": true,
"agent": true
},
{
"pubkey": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"name": "Honey",
"label": "Honey · bbbb",
"member": true,
"agent": true,
"managed": true
},
{
"pubkey": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
"name": "Honey",
"label": "Honey · cccc",
"member": true,
"agent": true
}
],
"presence": {
"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc": "online",
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": "away"
},
"expected": [
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
]
},
{
"name": "away_before_unknown_presence",
"query": "honey",
"choices": [
{
"pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"name": "Honey",
"label": "Honey · aaaa",
"member": true,
"agent": true
},
{
"pubkey": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"name": "Honey",
"label": "Honey · bbbb",
"member": true,
"agent": true
}
],
"presence": {
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb": "away"
},
"expected": [
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
]
},
{
"name": "history_ignored_for_different_names",
"query": "honey",
"choices": [
{
"pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"name": "Honey Ant",
"member": true,
"agent": true
},
{
"pubkey": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"name": "Honey Bee",
"member": true,
"agent": true
}
],
"history": {
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb": 9
},
"expected": [
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
]
},
{
"name": "history_ignored_for_humans",
"query": "honey",
"choices": [
{
"pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"name": "Honey",
"label": "Honey · aaaa",
"member": true
},
{
"pubkey": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"name": "Honey",
"label": "Honey · bbbb",
"member": true
}
],
"history": {
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb": 9
},
"expected": [
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
]
},
{
"name": "base_name_quality_then_full_displayed_label",
"query": "fizz",
"choices": [
{
"pubkey": "3333333333333333333333333333333333333333333333333333333333333333",
"name": "Fast Fizz",
"member": true,
"agent": true
},
{
"pubkey": "0000000000000000000000000000000000000000000000000000000000000000",
"name": "Fizz",
"label": "baxen’s Fizz · oncp",
"member": true,
"agent": true
},
{
"pubkey": "4444444444444444444444444444444444444444444444444444444444444444",
"name": "Fizz",
"label": "baxen’s Fizz · s03j",
"member": true,
"agent": true
},
{
"pubkey": "5555555555555555555555555555555555555555555555555555555555555555",
"name": "Fizz",
"label": "Kenny Lopez’s Fizz",
"member": true,
"agent": true
},
{
"pubkey": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"name": "Fizz",
"label": "baxen’s Fizz · 4prr",
"member": true,
"agent": true
},
{
"pubkey": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
"name": "Fizz",
"label": "baxen’s Fizz · 06pl",
"member": true,
"agent": true
}
],
"expected": [
"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"0000000000000000000000000000000000000000000000000000000000000000",
"4444444444444444444444444444444444444444444444444444444444444444",
"5555555555555555555555555555555555555555555555555555555555555555",
"3333333333333333333333333333333333333333333333333333333333333333"
]
},
{
"name": "alias_base_quality_breaks_visible_tie",
"query": "fizz",
"choices": [
{
"pubkey": "3333333333333333333333333333333333333333333333333333333333333333",
"name": "Fast Fizz",
"member": true
},
{
"pubkey": "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
"name": "Another name",
"label": "Other Fizz",
"aliases": ["Another name", "Fizz"],
"member": true
}
],
"expected": [
"dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
"3333333333333333333333333333333333333333333333333333333333333333"
]
},
{
"name": "key_is_the_final_tie_break",
"query": "sam",
"choices": [
{
"pubkey": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"name": "Sam",
"member": true
},
{
"pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"name": "Sam",
"member": true
}
],
"expected": [
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
]
}
],
"space": [
{
"name": "unique_exact_name",
"query": "Honey",
"choices": [
{
"pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"name": "Honey",
"member": true
},
{
"pubkey": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"name": "Honeybee",
"member": true
}
],
"expected": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
},
{
"name": "case_insensitive_and_trimmed",
"query": " honey ",
"choices": [
{
"pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"name": "Honey",
"member": true
}
],
"expected": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
},
{
"name": "namesakes_do_not_select",
"query": "Honey",
"choices": [
{
"pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"name": "Honey",
"member": true
},
{
"pubkey": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"name": "Honey",
"member": true,
"agent": true
}
],
"expected": null
},
{
"name": "longer_name_with_space_blocks",
"query": "Honey",
"choices": [
{
"pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"name": "Honey",
"member": true
},
{
"pubkey": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"name": "Honey Bee",
"member": true
}
],
"expected": null
},
{
"name": "longer_label_with_space_blocks",
"query": "Honey",
"choices": [
{
"pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"name": "Honey",
"member": true
},
{
"pubkey": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"name": "Other",
"label": "Honey Bee",
"member": true
}
],
"expected": null
},
{
"name": "partial_name_does_not_select",
"query": "Hon",
"choices": [
{
"pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"name": "Honey",
"member": true
}
],
"expected": null
},
{
"name": "empty_query_does_not_select",
"query": "",
"choices": [
{
"pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"name": "Honey",
"member": true
}
],
"expected": null
},
{
"name": "qualified_label_selects_its_identity",
"query": "Wes’s Honey",
"choices": [
{
"pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"name": "Honey",
"member": true,
"agent": true
},
{
"pubkey": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"name": "Honey",
"label": "Wes’s Honey",
"member": true,
"agent": true
}
],
"expected": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
},
{
"name": "shared_base_name_is_ambiguous_even_with_distinct_labels",
"query": "Honey",
"choices": [
{
"pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"name": "Honey",
"member": true,
"agent": true
},
{
"pubkey": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"name": "Honey",
"label": "Wes’s Honey",
"member": true,
"agent": true
}
],
"expected": null
},
{
"name": "known_alias_selects",
"query": "legacy bee",
"choices": [
{
"pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"name": "Honey",
"label": "Wes’s Honey",
"aliases": ["Honey", "Legacy Bee"],
"member": true,
"agent": true
}
],
"expected": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
},
{
"name": "unnamed_fallback_label_does_not_select",
"query": "aaaaaaaaaaaa",
"choices": [
{
"pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"name": "aaaaaaaaaaaa",
"aliases": [],
"member": true
}
],
"expected": null
},
{
"name": "membership_does_not_break_ambiguity",
"query": "Honey",
"choices": [
{
"pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"name": "Honey",
"member": true
},
{
"pubkey": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"name": "Honey",
"member": false
}
],
"expected": null
}
],
"query": [
{
"name": "at_start",
"text": "@Hon",
"caret": 4,
"expected": {
"start": 0,
"end": 4,
"query": "Hon"
}
},
{
"name": "after_space",
"text": "hi @Ho",
"caret": 6,
"expected": {
"start": 3,
"end": 6,
"query": "Ho"
}
},
{
"name": "after_open_paren",
"text": "(@Ho",
"caret": 4,
"expected": {
"start": 1,
"end": 4,
"query": "Ho"
}
},
{
"name": "after_newline",
"text": "@x\n@y",
"caret": 5,
"expected": {
"start": 3,
"end": 5,
"query": "y"
}
},
{
"name": "empty_query",
"text": "hi @",
"caret": 4,
"expected": {
"start": 3,
"end": 4,
"query": ""
}
},
{
"name": "spaces_allowed_in_query",
"text": "@Honey Bee",
"caret": 10,
"expected": {
"start": 0,
"end": 10,
"query": "Honey Bee"
}
},
{
"name": "inside_a_word_is_not_a_mention",
"text": "email@x",
"caret": 7,
"expected": null
},
{
"name": "second_at_without_boundary",
"text": "@a@b",
"caret": 4,
"expected": null
},
{
"name": "tab_ends_the_query",
"text": "@a\tb",
"caret": 4,
"expected": null
},
{
"name": "caret_before_text_start",
"text": "@a",
"caret": -1,
"expected": null
},
{
"name": "caret_after_text_end",
"text": "@a",
"caret": 3,
"expected": null
},
{
"name": "caret_before_the_at",
"text": "hi @Ho",
"caret": 2,
"expected": null
}
],
"admission": [
{
"name": "single_word_always_admitted",
"query": "Hon",
"names": [],
"expected": true
},
{
"name": "multi_word_prefix_of_a_name",
"query": "Honey B",
"names": ["Honey Bee"],
"expected": true
},
{
"name": "multi_word_case_insensitive",
"query": "honey b",
"names": ["Honey Bee"],
"expected": true
},
{
"name": "multi_word_without_a_name",
"query": "Foo bar",
"names": ["Honey"],
"expected": false
},
{
"name": "trailing_space_after_complete_name_ends",
"query": "Honey ",
"names": ["Honey"],
"expected": false
},
{
"name": "trailing_space_before_longer_name_continues",
"query": "Honey ",
"names": ["Honey Bee"],
"expected": true
}
],
"tags": {
"write": [
{
"name": "recipients_notify_references_do_not",
"members": [
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
],
"recipients": [
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
],
"references": [
"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
],
"expected": {
"tags": [
[
"p",
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
],
[
"mention",
"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
]
]
}
},
{
"name": "duplicates_are_removed",
"members": [
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
],
"recipients": [
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
],
"references": [
"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
],
"expected": {
"tags": [
[
"p",
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
],
[
"mention",
"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
]
]
}
},
{
"name": "no_mentions",
"members": [
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
],
"recipients": [],
"references": [],
"expected": {
"tags": []
}
},
{
"name": "recipient_must_be_a_member",
"members": [
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
],
"recipients": [
"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
],
"references": [],
"expected": {
"error": "not_member"
}
},
{
"name": "reference_must_be_a_valid_key",
"members": [
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
],
"recipients": [],
"references": ["invalid"],
"expected": {
"error": "invalid"
}
},
{
"name": "uppercase_reference_key_is_invalid",
"members": [
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
],
"recipients": [],
"references": [
"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
],
"expected": {
"error": "invalid"
}
},
{
"name": "at_most_32_references",
"members": [
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
],
"recipients": [],
"references": [
"0000000000000000000000000000000000000000000000000000000000000001",
"0000000000000000000000000000000000000000000000000000000000000002",
"0000000000000000000000000000000000000000000000000000000000000003",
"0000000000000000000000000000000000000000000000000000000000000004",
"0000000000000000000000000000000000000000000000000000000000000005",
"0000000000000000000000000000000000000000000000000000000000000006",
"0000000000000000000000000000000000000000000000000000000000000007",
"0000000000000000000000000000000000000000000000000000000000000008",
"0000000000000000000000000000000000000000000000000000000000000009",
"000000000000000000000000000000000000000000000000000000000000000a",
"000000000000000000000000000000000000000000000000000000000000000b",
"000000000000000000000000000000000000000000000000000000000000000c",
"000000000000000000000000000000000000000000000000000000000000000d",
"000000000000000000000000000000000000000000000000000000000000000e",
"000000000000000000000000000000000000000000000000000000000000000f",
"0000000000000000000000000000000000000000000000000000000000000010",
"0000000000000000000000000000000000000000000000000000000000000011",
"0000000000000000000000000000000000000000000000000000000000000012",
"0000000000000000000000000000000000000000000000000000000000000013",
"0000000000000000000000000000000000000000000000000000000000000014",
"0000000000000000000000000000000000000000000000000000000000000015",
"0000000000000000000000000000000000000000000000000000000000000016",
"0000000000000000000000000000000000000000000000000000000000000017",
"0000000000000000000000000000000000000000000000000000000000000018",
"0000000000000000000000000000000000000000000000000000000000000019",
"000000000000000000000000000000000000000000000000000000000000001a",
"000000000000000000000000000000000000000000000000000000000000001b",
"000000000000000000000000000000000000000000000000000000000000001c",
"000000000000000000000000000000000000000000000000000000000000001d",
"000000000000000000000000000000000000000000000000000000000000001e",
"000000000000000000000000000000000000000000000000000000000000001f",
"0000000000000000000000000000000000000000000000000000000000000020",
"0000000000000000000000000000000000000000000000000000000000000021"
],
"expected": {
"error": "too_many"
}
}
],
"read": [
{
"name": "two_field_mention_is_a_reference",
"tags": [
[
"mention",
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
]
],
"expected": {
"mentions": [],
"references": [
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
]
}
},
{
"name": "p_is_an_addressed_mention",
"tags": [
[
"p",
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
]
],
"expected": {
"mentions": [
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
],
"references": []
}
},
{
"name": "references_are_deduplicated_in_order",
"tags": [
[
"mention",
"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
],
[
"mention",
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
],
[
"mention",
"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
]
],
"expected": {
"mentions": [],
"references": [
"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
]
}
},
{
"name": "three_field_mention_is_not_a_reference",
"tags": [
[
"mention",
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"agent-address"
]
],
"expected": {
"mentions": [],
"references": []
}
},
{
"name": "invalid_keys_are_ignored",
"tags": [
["mention", "invalid"],
[
"mention",
"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
],
["p", "invalid"]
],
"expected": {
"mentions": [],
"references": []
}
},
{
"name": "same_key_in_both_lists",
"tags": [
[
"p",
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
],
[
"mention",
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
]
],
"expected": {
"mentions": [
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
],
"references": [
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
]
}
}
]
}
}