discourse/plugins/chat/test/javascripts/components/chat-message-test.js
Joffrey JAFFEUX 92797109ba
DEV: uses container resize event instead of mutation (#20757)
This commit takes advantage of the `ResizeObserver` to know when dates should be re-computed, it works like this:

```
scrollable-div
--  child-enclosing-div with resize observer
---- message 1
---- message 2
---- message x
```

It also switches to bottom/height for date separators sizing, instead of bottom/top, it prevents a bug where setting the top of the first item (at the top) would cause scrollbar to move to top.

<!-- NOTE: All pull requests should have tests (rspec in Ruby, qunit in JavaScript). If your code does not include test coverage, please include an explanation of why it was omitted. -->
2023-03-21 11:30:32 +01:00

109 lines
3.5 KiB
JavaScript

import User from "discourse/models/user";
import { render } from "@ember/test-helpers";
import ChatMessage from "discourse/plugins/chat/discourse/models/chat-message";
import { exists } from "discourse/tests/helpers/qunit-helpers";
import { setupRenderingTest } from "discourse/tests/helpers/component-test";
import hbs from "htmlbars-inline-precompile";
import ChatChannel from "discourse/plugins/chat/discourse/models/chat-channel";
import { module, test } from "qunit";
module("Discourse Chat | Component | chat-message", function (hooks) {
setupRenderingTest(hooks);
function generateMessageProps(messageData = {}) {
const chatChannel = ChatChannel.create({
chatable: { id: 1 },
chatable_type: "Category",
id: 9,
title: "Site",
last_message_sent_at: "2021-11-08T21:26:05.710Z",
current_user_membership: {
unread_count: 0,
muted: false,
},
canInteractWithChat: true,
canDeleteSelf: true,
canDeleteOthers: true,
canFlag: true,
userSilenced: false,
canModerate: true,
});
return {
message: ChatMessage.create(
chatChannel,
Object.assign(
{
id: 178,
message: "from deleted user",
cooked: "<p>from deleted user</p>",
excerpt: "<p>from deleted user</p>",
created_at: "2021-07-22T08:14:16.950Z",
flag_count: 0,
user: User.create({ username: "someguy", id: 1424 }),
edited: false,
},
messageData
)
),
chatChannel,
setReplyTo: () => {},
replyMessageClicked: () => {},
editButtonClicked: () => {},
afterExpand: () => {},
selectingMessages: false,
onStartSelectingMessages: () => {},
onSelectMessage: () => {},
bulkSelectMessages: () => {},
onHoverMessage: () => {},
messageDidEnterViewport: () => {},
messageDidLeaveViewport: () => {},
};
}
const template = hbs`
<ChatMessage
@message={{this.message}}
@canInteractWithChat={{this.canInteractWithChat}}
@channel={{this.chatChannel}}
@setReplyTo={{this.setReplyTo}}
@replyMessageClicked={{this.replyMessageClicked}}
@editButtonClicked={{this.editButtonClicked}}
@selectingMessages={{this.selectingMessages}}
@onStartSelectingMessages={{this.onStartSelectingMessages}}
@onSelectMessage={{this.onSelectMessage}}
@bulkSelectMessages={{this.bulkSelectMessages}}
@onHoverMessage={{this.onHoverMessage}}
@messageDidEnterViewport={{this.messageDidEnterViewport}}
@messageDidLeaveViewport={{this.messageDidLeaveViewport}}
/>
`;
test("Message with edits", async function (assert) {
this.setProperties(generateMessageProps({ edited: true }));
await render(template);
assert.true(
exists(".chat-message-edited"),
"has the correct edited css class"
);
});
test("Deleted message", async function (assert) {
this.setProperties(generateMessageProps({ deleted_at: moment() }));
await render(template);
assert.true(
exists(".chat-message-deleted .chat-message-expand"),
"has the correct deleted css class and expand button within"
);
});
test("Hidden message", async function (assert) {
this.setProperties(generateMessageProps({ hidden: true }));
await render(template);
assert.true(
exists(".chat-message-hidden .chat-message-expand"),
"has the correct hidden css class and expand button within"
);
});
});