diff --git a/app/assets/javascripts/discourse/app/models/category.js b/app/assets/javascripts/discourse/app/models/category.js index f15bd040237..bc4f1f91272 100644 --- a/app/assets/javascripts/discourse/app/models/category.js +++ b/app/assets/javascripts/discourse/app/models/category.js @@ -123,7 +123,7 @@ export default class Category extends RestModel { static async asyncFindByIds(ids = []) { ids = ids.map((x) => parseInt(x, 10)); - if (!Site.current().lazy_load_categories) { + if (!Site.current().lazy_load_categories || this.hasAsyncFoundAll(ids)) { return this.findByIds(ids); } diff --git a/app/assets/javascripts/discourse/tests/unit/models/category-test.js b/app/assets/javascripts/discourse/tests/unit/models/category-test.js index 193155941a5..c5e3154888b 100644 --- a/app/assets/javascripts/discourse/tests/unit/models/category-test.js +++ b/app/assets/javascripts/discourse/tests/unit/models/category-test.js @@ -3,6 +3,7 @@ import { setupTest } from "ember-qunit"; import { module, test } from "qunit"; import sinon from "sinon"; import Category from "discourse/models/category"; +import pretender, { response } from "discourse/tests/helpers/create-pretender"; module("Unit | Model | category", function (hooks) { setupTest(hooks); @@ -447,4 +448,27 @@ module("Unit | Model | category", function (hooks) { "Test2 Sub Sub", ]); }); + + test("asyncFindByIds - do not request categories that have been loaded already", async function (assert) { + const requestedIds = []; + pretender.get("/categories/find", (request) => { + const ids = request.queryParams.ids.map((id) => parseInt(id, 10)); + requestedIds.push(ids); + return response({ + categories: ids.map((id) => ({ id, slug: `category-${id}` })), + }); + }); + + const site = this.owner.lookup("service:site"); + site.set("lazy_load_categories", true); + + await Category.asyncFindByIds([12345, 12346]); + assert.deepEqual(requestedIds, [[12345, 12346]]); + + await Category.asyncFindByIds([12345, 12346, 12347]); + assert.deepEqual(requestedIds, [[12345, 12346], [12347]]); + + await Category.asyncFindByIds([12345]); + assert.deepEqual(requestedIds, [[12345, 12346], [12347]]); + }); });