discourse/plugins/chat/test/javascripts/unit/services/chat-state-manager-test.js
Martin Brennan c00c522530
DEV: Adds hasNoPreferredMode to chat state manager (#33213)
This commit introduces a new property `hasNoPreferredMode` to the
chat state manager, which represents a user who has not purposely
set chat mode to drawer or full page, meaning they have no LocalStorage
value set.

This can be useful for themes to change the chat mode but only
if the user has no preference already.

c.f.
https://meta.discourse.org/t/full-screen-chat-as-default-for-collaboration-setup/369849
2025-06-17 13:22:42 +10:00

164 lines
4.3 KiB
JavaScript

import { getOwner } from "@ember/owner";
import { setupTest } from "ember-qunit";
import { module, test } from "qunit";
import sinon from "sinon";
import { forceMobile } from "discourse/lib/mobile";
import {
addChatDrawerStateCallback,
resetChatDrawerStateCallbacks,
} from "discourse/plugins/chat/discourse/services/chat-state-manager";
module(
"Discourse Chat | Unit | Service | chat-state-manager",
function (hooks) {
setupTest(hooks);
hooks.beforeEach(function () {
this.subject = getOwner(this).lookup("service:chat-state-manager");
});
hooks.afterEach(function () {
this.subject.reset();
});
test("isFullPagePreferred", function (assert) {
assert.false(this.subject.isFullPagePreferred);
this.subject.prefersFullPage();
assert.true(this.subject.isFullPagePreferred);
this.subject.prefersDrawer();
assert.false(this.subject.isFullPagePreferred);
this.subject.prefersDrawer();
forceMobile();
assert.true(this.subject.isFullPagePreferred);
});
test("isDrawerPreferred", function (assert) {
assert.true(this.subject.isDrawerPreferred);
this.subject.prefersFullPage();
assert.false(this.subject.isDrawerPreferred);
this.subject.prefersDrawer();
assert.true(this.subject.isDrawerPreferred);
});
test("hasNoPreferredMode", async function (assert) {
assert.true(this.subject.hasNoPreferredMode);
this.subject.prefersFullPage();
assert.false(this.subject.hasNoPreferredMode);
this.subject.prefersDrawer();
assert.false(this.subject.hasNoPreferredMode);
});
test("lastKnownChatURL", function (assert) {
assert.strictEqual(this.subject.lastKnownChatURL, "/chat");
this.subject.storeChatURL("/bar");
assert.strictEqual(this.subject.lastKnownChatURL, "/bar");
});
test("lastKnownAppURL", function (assert) {
assert.strictEqual(this.subject.lastKnownAppURL, "/latest");
sinon.stub(this.subject.router, "currentURL").value("/foo");
this.subject.storeAppURL();
assert.strictEqual(this.subject.lastKnownAppURL, "/foo");
this.subject.storeAppURL("/bar");
assert.strictEqual(this.subject.lastKnownAppURL, "/bar");
});
test("isFullPageActive", function (assert) {
sinon.stub(this.subject.router, "currentRouteName").value("foo");
assert.false(this.subject.isFullPageActive);
sinon.stub(this.subject.router, "currentRouteName").value("chat");
assert.true(this.subject.isFullPageActive);
});
test("didCollapseDrawer", function (assert) {
this.subject.didCollapseDrawer();
assert.false(this.subject.isDrawerExpanded);
assert.true(this.subject.isDrawerActive);
});
test("didExpandDrawer", function (assert) {
const stub = sinon.stub(
this.owner.lookup("service:chat"),
"updatePresence"
);
this.subject.didExpandDrawer();
assert.true(this.subject.isDrawerExpanded);
assert.true(this.subject.isDrawerActive);
sinon.assert.calledOnce(stub);
});
test("didCloseDrawer", function (assert) {
const stub = sinon.stub(
this.owner.lookup("service:chat"),
"updatePresence"
);
this.subject.didCloseDrawer();
assert.false(this.subject.isDrawerExpanded);
assert.false(this.subject.isDrawerActive);
sinon.assert.calledOnce(stub);
});
test("didOpenDrawer", function (assert) {
const stub = sinon.stub(
this.owner.lookup("service:chat"),
"updatePresence"
);
this.subject.didOpenDrawer();
assert.true(this.subject.isDrawerExpanded);
assert.true(this.subject.isDrawerActive);
assert.strictEqual(this.subject.lastKnownChatURL, "/chat");
this.subject.didOpenDrawer("/foo");
assert.strictEqual(this.subject.lastKnownChatURL, "/foo");
sinon.assert.calledTwice(stub);
});
test("callbacks", function (assert) {
this.state = null;
addChatDrawerStateCallback((state) => {
this.state = state;
});
this.subject.didOpenDrawer();
assert.true(this.state.isDrawerActive);
assert.true(this.state.isDrawerExpanded);
this.subject.didCloseDrawer();
assert.false(this.state.isDrawerActive);
assert.false(this.state.isDrawerExpanded);
resetChatDrawerStateCallbacks();
});
}
);