mirror of
https://github.com/discourse/discourse-ai.git
synced 2025-07-24 23:13:27 +00:00
Overview This PR introduces a Bot Homepage that was first introduced at https://ask.discourse.org/. Key Features: Add a bot homepage: /discourse-ai/ai-bot/conversations Display a sidebar with previous bot conversations Infinite scroll for large counts Sidebar still visible when navigation mode is header_dropdown Sidebar visible on homepage and bot PM show view Add New Question button to the bottom of sidebar on bot PM show view Add persona picker to homepage
119 lines
3.8 KiB
JavaScript
119 lines
3.8 KiB
JavaScript
import { click, settled, visit } from "@ember/test-helpers";
|
|
import { test } from "qunit";
|
|
import { AUTO_GROUPS } from "discourse/lib/constants";
|
|
import { cloneJSON } from "discourse/lib/object";
|
|
import topicFixtures from "discourse/tests/fixtures/topic";
|
|
import {
|
|
acceptance,
|
|
publishToMessageBus,
|
|
query,
|
|
selectText,
|
|
} from "discourse/tests/helpers/qunit-helpers";
|
|
import aiHelperPrompts from "../fixtures/ai-helper-prompts";
|
|
|
|
acceptance("AI Helper - Post Helper Menu", function (needs) {
|
|
needs.settings({
|
|
discourse_ai_enabled: true,
|
|
ai_helper_enabled: true,
|
|
post_ai_helper_allowed_groups: "1|2",
|
|
ai_helper_enabled_features: "suggestions|context_menu",
|
|
share_quote_visibility: "anonymous",
|
|
enable_markdown_footnotes: true,
|
|
display_footnotes_inline: true,
|
|
});
|
|
needs.user({
|
|
admin: true,
|
|
moderator: true,
|
|
groups: [AUTO_GROUPS.admins],
|
|
can_use_assistant_in_post: true,
|
|
ai_helper_prompts: aiHelperPrompts,
|
|
trust_level: 4,
|
|
});
|
|
needs.pretender((server, helper) => {
|
|
server.get("/t/1.json", () => {
|
|
const json = cloneJSON(topicFixtures["/t/28830/1.json"]);
|
|
json.post_stream.posts[0].can_edit_post = true;
|
|
json.post_stream.posts[0].can_edit = true;
|
|
return helper.response(json);
|
|
});
|
|
|
|
server.get("/t/2.json", () => {
|
|
const json = cloneJSON(topicFixtures["/t/28830/1.json"]);
|
|
json.post_stream.posts[0].cooked =
|
|
"<p>La lluvia en España se queda principalmente en el avión.</p>";
|
|
return helper.response(json);
|
|
});
|
|
|
|
server.post(`/discourse-ai/ai-helper/stream_suggestion/`, () => {
|
|
return helper.response({
|
|
result: "This is a suggestio",
|
|
done: false,
|
|
});
|
|
});
|
|
|
|
server.get("/discourse-ai/ai-bot/conversations.json", () => {});
|
|
});
|
|
|
|
test("displays streamed explanation", async function (assert) {
|
|
await visit("/t/-/1");
|
|
const suggestion = "This is a suggestion that is completed";
|
|
const textNode = query("#post_1 .cooked p").childNodes[0];
|
|
await selectText(textNode, 9);
|
|
await click(".ai-post-helper__trigger");
|
|
await click(".ai-helper-options__button[data-name='explain']");
|
|
await publishToMessageBus(
|
|
`/discourse-ai/ai-helper/stream_suggestion/118591`,
|
|
{
|
|
done: true,
|
|
result: suggestion,
|
|
}
|
|
);
|
|
assert.dom(".ai-post-helper__suggestion__text").hasText(suggestion);
|
|
});
|
|
|
|
async function selectSpecificText(textNode, start, end) {
|
|
const range = document.createRange();
|
|
range.setStart(textNode, start);
|
|
range.setEnd(textNode, end);
|
|
const selection = window.getSelection();
|
|
selection.removeAllRanges();
|
|
selection.addRange(range);
|
|
await settled();
|
|
}
|
|
|
|
test("adds explained text as footnote to post", async function (assert) {
|
|
await visit("/t/-/1");
|
|
const suggestion = "This is a suggestion that is completed";
|
|
|
|
const textNode = query("#post_1 .cooked p").childNodes[0];
|
|
await selectSpecificText(textNode, 72, 77);
|
|
await click(".ai-post-helper__trigger");
|
|
await click(".ai-helper-options__button[data-name='explain']");
|
|
await publishToMessageBus(
|
|
`/discourse-ai/ai-helper/stream_suggestion/118591`,
|
|
{
|
|
done: true,
|
|
result: suggestion,
|
|
}
|
|
);
|
|
|
|
assert.dom(".ai-post-helper__suggestion__insert-footnote").isDisabled();
|
|
});
|
|
|
|
test("shows translated post", async function (assert) {
|
|
await visit("/t/-/2");
|
|
const translated = "The rain in Spain, stays mainly in the Plane.";
|
|
await selectText(query("#post_1 .cooked p"));
|
|
await click(".ai-post-helper__trigger");
|
|
await click(".ai-helper-options__button[data-name='translate']");
|
|
await publishToMessageBus(
|
|
`/discourse-ai/ai-helper/stream_suggestion/118591`,
|
|
{
|
|
done: true,
|
|
result: translated,
|
|
}
|
|
);
|
|
assert.dom(".ai-post-helper__suggestion__text").hasText(translated);
|
|
});
|
|
});
|