discourse/plugins/chat/test/javascripts/unit/utility/plugin-api-test.js
Joffrey JAFFEUX 1060e4573a
DEV: allows fabricators to use faker (#26555)
The complexity of the situation is that we don't want to load faker into production by default but fabricators and styleguide are available on production.

This is made possible through app/assets/javascripts/discourse/app/lib/load-faker.js which contains a function to ensure faker is loaded asynchronously (loadFaker) and another function to access the loaded faker (getLoadedFaker).

Note 1: this commit also refactors fabricators to have access to context and use faker where possible
Note 2: this commit moves automation to admin bundle

---------

Co-authored-by: David Taylor <david@taylorhq.com>
2024-04-08 21:00:09 +02:00

81 lines
2.8 KiB
JavaScript

import { getOwner } from "@ember/application";
import { setupTest } from "ember-qunit";
import { module, test } from "qunit";
import { withPluginApi } from "discourse/lib/plugin-api";
import User from "discourse/models/user";
import pretender from "discourse/tests/helpers/create-pretender";
import { logIn } from "discourse/tests/helpers/qunit-helpers";
import ChatMessageInteractor, {
resetRemovedChatComposerSecondaryActions,
} from "discourse/plugins/chat/discourse/lib/chat-message-interactor";
import ChatFabricators from "discourse/plugins/chat/discourse/lib/fabricators";
module("Chat | Unit | Utility | plugin-api", function (hooks) {
setupTest(hooks);
test("#sendChatMessage", async function (assert) {
const done = assert.async();
pretender.post("/chat/1", (request) => {
assert.strictEqual(request.url, "/chat/1");
assert.strictEqual(request.requestBody, "thread_id=2&message=hello");
done();
return [200, {}, {}];
});
withPluginApi("1.1.0", async (api) => {
await api.sendChatMessage(1, { message: "hello", threadId: 2 });
});
});
test("#removeChatComposerSecondaryActions", async function (assert) {
withPluginApi("1.1.0", async (api) => {
// assert that the api method is defined
assert.equal(typeof api.removeChatComposerSecondaryActions, "function");
logIn();
const currentUser = User.current();
getOwner(this).unregister("service:current-user");
getOwner(this).register("service:current-user", currentUser, {
instantiate: false,
});
const message = new ChatFabricators(getOwner(this)).message({
user: currentUser,
});
const context = "channel";
const interactor = new ChatMessageInteractor(
getOwner(this),
message,
context
);
// assert that the initial secondary actions are present
const secondaryActions = interactor.secondaryActions;
assert.ok(secondaryActions.length > 0);
try {
// remove the first secondary action listed
api.removeChatComposerSecondaryActions(secondaryActions[0].id);
const updatedSecondaryActions = interactor.secondaryActions;
// assert that the secondary action was removed
assert.ok(
updatedSecondaryActions.length < secondaryActions.length,
"the updated secondary actions must contain less items than the original"
);
assert.notOk(
updatedSecondaryActions
.map((v) => v.id)
.includes(secondaryActions[0]),
"the updated secondary actions must not include the removed action"
);
} finally {
// reset the secondary actions removed to prevent leakage to other tests
resetRemovedChatComposerSecondaryActions();
}
});
});
});