Skip to content

g1t/apps/web/app/lib/mention.test.ts

56 lines2,625 bytesCodeBlame
1import assert from "node:assert/strict";
2import { test } from "node:test";
3
4import { mentionSuggestions, partialMention } from "./mention.ts";
5
6test("an @ that could become @g1t is offered", () => {
7 assert.equal(partialMention("@", 1), 0);
8 assert.equal(partialMention("thanks @g1", 10), 7);
9 assert.equal(partialMention("(@G1", 4), 1);
10 assert.equal(partialMention("line\n@g", 7), 5);
11});
12
13test("anything else is not", () => {
14 // Already complete.
15 assert.equal(partialMention("@g1t", 4), null);
16 assert.equal(partialMention("@G1T", 4), null);
17 // Longer names that start with it are other names.
18 assert.equal(partialMention("@g1t-agent", 10), null);
19 assert.equal(partialMention("@g1t-a", 6), null);
20 assert.equal(partialMention("@g1t/g1t", 8), null);
21 assert.equal(partialMention("@g1tx", 5), null);
22 // Another name.
23 assert.equal(partialMention("@ana", 4), null);
24 // An email address.
25 assert.equal(partialMention("me@g1", 5), null);
26 // The caret is not at the end of it.
27 assert.equal(partialMention("@g1 later", 9), null);
28});
29
30const TEAMS = ["@acme/backend", "@acme/backend-oncall", "@acme/web", "@acme/design", "@acme/docs", "@acme/data"];
31
32test("@g1t is offered with no teams, as before", () => {
33 assert.deepEqual(mentionSuggestions("thanks @g1", 10), { start: 7, options: ["@g1t"] });
34 assert.deepEqual(mentionSuggestions("@", 1), { start: 0, options: ["@g1t"] });
35 assert.equal(mentionSuggestions("@g1t", 4), null);
36 assert.equal(mentionSuggestions("me@g1", 5), null);
37 assert.equal(mentionSuggestions("@ana", 4), null);
38 assert.equal(mentionSuggestions("@g1 later", 9), null);
39});
40
41test("teams complete from the workspace or from their own name", () => {
42 assert.deepEqual(mentionSuggestions("cc @acme/b", 10, TEAMS), { start: 3, options: ["@acme/backend", "@acme/backend-oncall"] });
43 assert.deepEqual(mentionSuggestions("@back", 5, TEAMS), { start: 0, options: ["@acme/backend", "@acme/backend-oncall"] });
44 assert.deepEqual(mentionSuggestions("(@ACME/W", 8, TEAMS), { start: 1, options: ["@acme/web"] });
45 // Handles given without their @ work the same.
46 assert.deepEqual(mentionSuggestions("@we", 3, ["acme/web"]), { start: 0, options: ["@acme/web"] });
47});
48
49test("at most five, @g1t first, and nothing once one is typed in full", () => {
50 const all = mentionSuggestions("@", 1, TEAMS);
51 assert.equal(all?.options.length, 5);
52 assert.equal(all?.options[0], "@g1t");
53 assert.equal(mentionSuggestions("@acme/web", 9, TEAMS), null);
54 assert.equal(mentionSuggestions("@acme/x", 7, TEAMS), null);
55 assert.equal(mentionSuggestions("@acme/web later", 15, TEAMS), null);
56});