import userSearch from "discourse/lib/user-search"; import { CANCELLED_STATUS } from "discourse/lib/autocomplete"; import pretender from "helpers/create-pretender"; QUnit.module("lib:user-search", { beforeEach() { const response = (object) => { return [200, { "Content-Type": "application/json" }, object]; }; pretender.get("/u/search/users", (request) => { // special responder for per category search const categoryMatch = request.url.match(/category_id=([0-9]+)/); if (categoryMatch) { if (categoryMatch[1] === "3") { return response({}); } return response({ users: [ { username: `category_${categoryMatch[1]}`, name: "category user", avatar_template: "https://avatars.discourse.org/v3/letter/t/41988e/{size}.png", }, ], }); } if (request.url.match(/no-results/)) { return response({ users: [] }); } return response({ users: [ { username: "TeaMoe", name: "TeaMoe", avatar_template: "https://avatars.discourse.org/v3/letter/t/41988e/{size}.png", }, { username: "TeamOneJ", name: "J Cobb", avatar_template: "https://avatars.discourse.org/v3/letter/t/3d9bf3/{size}.png", }, { username: "kudos", name: "Team Blogeto.com", avatar_template: "/user_avatar/meta.discourse.org/kudos/{size}/62185_1.png", }, { username: "RosieLinda", name: "Linda Teaman", avatar_template: "https://avatars.discourse.org/v3/letter/r/bc8723/{size}.png", }, { username: "legalatom", name: "Team LegalAtom", avatar_template: "https://avatars.discourse.org/v3/letter/l/a9a28c/{size}.png", }, { username: "dzsat_team", name: "Dz Sat Dz Sat", avatar_template: "https://avatars.discourse.org/v3/letter/d/eb9ed0/{size}.png", }, ], groups: [ { name: "bob", usernames: [], }, { name: "team", usernames: [], }, ], }); }); }, }); QUnit.test("it flushes cache when switching categories", async (assert) => { let results = await userSearch({ term: "hello", categoryId: 1 }); assert.equal(results[0].username, "category_1"); assert.equal(results.length, 1); // this is cached ... so let's check the cache is good results = await userSearch({ term: "hello", categoryId: 1 }); assert.equal(results[0].username, "category_1"); assert.equal(results.length, 1); results = await userSearch({ term: "hello", categoryId: 2 }); assert.equal(results[0].username, "category_2"); assert.equal(results.length, 1); }); QUnit.test( "it returns cancel when eager completing with no results", async (assert) => { // Do everything twice, to check the cache works correctly for (let i = 0; i < 2; i++) { // No topic or category, will always cancel let result = await userSearch({ term: "" }); assert.equal(result, CANCELLED_STATUS); } for (let i = 0; i < 2; i++) { // Unsecured category, so has no recommendations let result = await userSearch({ term: "", categoryId: 3 }); assert.equal(result, CANCELLED_STATUS); } for (let i = 0; i < 2; i++) { // Secured category, will have 1 recommendation let results = await userSearch({ term: "", categoryId: 1 }); assert.equal(results[0].username, "category_1"); assert.equal(results.length, 1); } } ); QUnit.test( "it places groups unconditionally for exact match", async (assert) => { let results = await userSearch({ term: "Team" }); assert.equal(results[results.length - 1]["name"], "team"); } ); QUnit.test("it strips @ from the beginning", async (assert) => { let results = await userSearch({ term: "@Team" }); assert.equal(results[results.length - 1]["name"], "team"); }); QUnit.test("it skips a search depending on punctuations", async (assert) => { let results; let skippedTerms = [ "@sam s", // double space is not allowed "@sam;", "@sam,", "@sam:", ]; for (let term of skippedTerms) { results = await userSearch({ term }); assert.equal(results.length, 0); } let allowedTerms = [ "@sam sam", // double space is not allowed "@sam.sam", "@sam_sam", "@sam-sam", "@", ]; let topicId = 100; for (let term of allowedTerms) { results = await userSearch({ term, topicId }); assert.equal(results.length, 6); } results = await userSearch({ term: "sam@sam.com", allowEmails: true }); // 6 + email assert.equal(results.length, 7); results = await userSearch({ term: "sam+test@sam.com", allowEmails: true }); assert.equal(results.length, 7); results = await userSearch({ term: "sam@sam.com" }); assert.equal(results.length, 0); results = await userSearch({ term: "no-results@example.com", allowEmails: true, }); assert.equal(results.length, 1); });