discourse/plugins/chat/test/javascripts/components/chat-channel-row-test.js
Joffrey JAFFEUX 67c0498f64
DEV: rework the chat-live-pane
This PR is introducing glimmer usage in the chat-live-pane, for components but also for models. RestModel usage has been dropped in favor of native classes.

Other changes/additions in this PR:

- sticky dates, scrolling will now keep the date separator of the current section at the top of the screen
- better unread management, marking a channel as unread will correctly mark the correct message and not mark the whole channel as read. Tracking state will also now correctly return unread count and unread mentions.
- adds an animation on bottom arrow
- better scrolling behavior, we should now always correctly keep the scroll position while loading more
- reactions are now more reactive, and will update their tooltip without needed to close/reopen it
- skeleton has been improved with placeholder images and reactions
- when making a reaction on the desktop message actions, the menu won't move anymore
- simplify logic and stop maintaining a list of unloaded messages
2023-03-02 16:34:25 +01:00

176 lines
5.8 KiB
JavaScript

import { module, test } from "qunit";
import { setupRenderingTest } from "discourse/tests/helpers/component-test";
import { render } from "@ember/test-helpers";
import { hbs } from "ember-cli-htmlbars";
import fabricators from "../helpers/fabricators";
module("Discourse Chat | Component | chat-channel-row", function (hooks) {
setupRenderingTest(hooks);
hooks.beforeEach(function () {
this.categoryChatChannel = fabricators.chatChannel();
this.directMessageChatChannel = fabricators.directMessageChatChannel();
});
test("links to correct channel", async function (assert) {
await render(hbs`<ChatChannelRow @channel={{this.categoryChatChannel}} />`);
assert
.dom(".chat-channel-row")
.hasAttribute(
"href",
`/chat/c/${this.categoryChatChannel.slugifiedTitle}/${this.categoryChatChannel.id}`
);
});
test("allows tabbing", async function (assert) {
await render(hbs`<ChatChannelRow @channel={{this.categoryChatChannel}} />`);
assert.dom(".chat-channel-row").hasAttribute("tabindex", "0");
});
test("channel data attrite tabbing", async function (assert) {
await render(hbs`<ChatChannelRow @channel={{this.categoryChatChannel}} />`);
assert
.dom(".chat-channel-row")
.hasAttribute(
"data-chat-channel-id",
this.categoryChatChannel.id.toString()
);
});
test("renders correct channel title", async function (assert) {
await render(hbs`<ChatChannelRow @channel={{this.categoryChatChannel}} />`);
assert.dom(".chat-channel-title").hasText(this.categoryChatChannel.title);
});
test("renders correct channel metadata", async function (assert) {
await render(hbs`<ChatChannelRow @channel={{this.categoryChatChannel}} />`);
assert
.dom(".chat-channel-metadata")
.hasText(moment(this.categoryChatChannel.lastMessageSentAt).format("l"));
});
test("renders membership toggling button when necessary", async function (assert) {
this.site.desktopView = false;
await render(hbs`<ChatChannelRow @channel={{this.categoryChatChannel}}/>`);
assert.dom(".toggle-channel-membership-button").doesNotExist();
this.categoryChatChannel.currentUserMembership.following = true;
await render(hbs`<ChatChannelRow @channel={{this.categoryChatChannel}} />`);
assert.dom(".toggle-channel-membership-button").doesNotExist();
this.site.desktopView = true;
await render(
hbs`<ChatChannelRow @channel={{this.categoryChatChannel}} @options={{hash leaveButton=true}}/>`
);
assert.dom(".toggle-channel-membership-button").exists();
});
test("focused channel has correct class", async function (assert) {
await render(hbs`<ChatChannelRow @channel={{this.categoryChatChannel}} />`);
assert.dom(".chat-channel-row").doesNotHaveClass("focused");
this.categoryChatChannel.focused = true;
await render(hbs`<ChatChannelRow @channel={{this.categoryChatChannel}} />`);
assert.dom(".chat-channel-row").hasClass("focused");
});
test("muted channel has correct class", async function (assert) {
await render(hbs`<ChatChannelRow @channel={{this.categoryChatChannel}} />`);
assert.dom(".chat-channel-row").doesNotHaveClass("muted");
this.categoryChatChannel.currentUserMembership.muted = true;
await render(hbs`<ChatChannelRow @channel={{this.categoryChatChannel}} />`);
assert.dom(".chat-channel-row").hasClass("muted");
});
test("leaveButton options adds correct class", async function (assert) {
await render(hbs`<ChatChannelRow @channel={{this.categoryChatChannel}} />`);
assert.dom(".chat-channel-row").doesNotHaveClass("can-leave");
await render(
hbs`<ChatChannelRow @channel={{this.categoryChatChannel}} @options={{hash leaveButton=true}} />`
);
assert.dom(".chat-channel-row").hasClass("can-leave");
});
test("active channel adds correct class", async function (assert) {
await render(hbs`<ChatChannelRow @channel={{this.categoryChatChannel}} />`);
assert.dom(".chat-channel-row").doesNotHaveClass("active");
this.owner
.lookup("service:chat")
.set("activeChannel", { id: this.categoryChatChannel.id });
await render(hbs`<ChatChannelRow @channel={{this.categoryChatChannel}} />`);
assert.dom(".chat-channel-row").hasClass("active");
});
test("unreads adds correct class", async function (assert) {
await render(hbs`<ChatChannelRow @channel={{this.categoryChatChannel}} />`);
assert.dom(".chat-channel-row").doesNotHaveClass("has-unread");
this.categoryChatChannel.currentUserMembership.unread_count = 1;
await render(hbs`<ChatChannelRow @channel={{this.categoryChatChannel}} />`);
assert.dom(".chat-channel-row").hasClass("has-unread");
});
test("user status with category channel", async function (assert) {
await render(hbs`<ChatChannelRow @channel={{this.categoryChatChannel}} />`);
assert.dom(".user-status-message").doesNotExist();
});
test("user status with direct message channel", async function (assert) {
const status = { description: "Off to dentist", emoji: "tooth" };
this.directMessageChatChannel.chatable.users[0].status = status;
await render(
hbs`<ChatChannelRow @channel={{this.directMessageChatChannel}} />`
);
assert.dom(".user-status-message").exists();
});
test("user status with direct message channel and multiple users", async function (assert) {
const status = { description: "Off to dentist", emoji: "tooth" };
this.directMessageChatChannel.chatable.users[0].status = status;
this.directMessageChatChannel.chatable.users.push({
id: 2,
username: "bill",
name: null,
avatar_template: "/letter_avatar_proxy/v3/letter/t/31188e/{size}.png",
});
await render(
hbs`<ChatChannelRow @channel={{this.directMessageChatChannel}} />`
);
assert.dom(".user-status-message").doesNotExist();
});
});