|
|
|
|
| const { start } = require("../utils");
|
| const lg = require("../utils/litegraph");
|
|
|
| describe("users", () => {
|
| beforeEach(() => {
|
| lg.setup(global);
|
| });
|
|
|
| afterEach(() => {
|
| lg.teardown(global);
|
| });
|
|
|
| function expectNoUserScreen() {
|
|
|
| const selection = document.querySelectorAll("#comfy-user-selection")?.[0];
|
| expect(selection["style"].display).toBe("none");
|
| const menu = document.querySelectorAll(".comfy-menu")?.[0];
|
| expect(window.getComputedStyle(menu)?.display).not.toBe("none");
|
| }
|
|
|
| describe("multi-user", () => {
|
| function mockAddStylesheet() {
|
| const utils = require("../../web/scripts/utils");
|
| utils.addStylesheet = jest.fn().mockReturnValue(Promise.resolve());
|
| }
|
|
|
| async function waitForUserScreenShow() {
|
| mockAddStylesheet();
|
|
|
|
|
| const { UserSelectionScreen } = require("../../web/scripts/ui/userSelection");
|
| let resolve, reject;
|
| const fn = UserSelectionScreen.prototype.show;
|
| const p = new Promise((res, rej) => {
|
| resolve = res;
|
| reject = rej;
|
| });
|
| jest.spyOn(UserSelectionScreen.prototype, "show").mockImplementation(async (...args) => {
|
| const res = fn(...args);
|
| await new Promise(process.nextTick);
|
| resolve();
|
| return res;
|
| });
|
|
|
| setTimeout(() => reject("timeout waiting for UserSelectionScreen to be shown."), 500);
|
| await p;
|
| await new Promise(process.nextTick);
|
| }
|
|
|
| async function testUserScreen(onShown, users) {
|
| if (!users) {
|
| users = {};
|
| }
|
| const starting = start({
|
| resetEnv: true,
|
| userConfig: { storage: "server", users },
|
| });
|
|
|
|
|
| expect(localStorage["Comfy.userId"]).toBeFalsy();
|
| expect(localStorage["Comfy.userName"]).toBeFalsy();
|
|
|
| await waitForUserScreenShow();
|
|
|
| const selection = document.querySelectorAll("#comfy-user-selection")?.[0];
|
| expect(selection).toBeTruthy();
|
|
|
|
|
| expect(window.getComputedStyle(selection)?.display).not.toBe("none");
|
|
|
| const menu = document.querySelectorAll(".comfy-menu")?.[0];
|
| expect(window.getComputedStyle(menu)?.display).toBe("none");
|
|
|
| const isCreate = await onShown(selection);
|
|
|
|
|
| selection.querySelectorAll("form")[0].submit();
|
| await new Promise(process.nextTick);
|
|
|
|
|
| const s = await starting;
|
|
|
|
|
| expect(document.querySelectorAll("#comfy-user-selection")).toHaveLength(0);
|
| expect(window.getComputedStyle(menu)?.display).not.toBe("none");
|
|
|
|
|
| const { api } = require("../../web/scripts/api");
|
| expect(api.createUser).toHaveBeenCalledTimes(+isCreate);
|
| expect(api.storeSettings).toHaveBeenCalledTimes(+isCreate);
|
| expect(api.storeUserData).toHaveBeenCalledTimes(+isCreate);
|
| if (isCreate) {
|
| expect(api.storeUserData).toHaveBeenCalledWith("comfy.templates.json", null, { stringify: false });
|
| expect(s.app.isNewUserSession).toBeTruthy();
|
| } else {
|
| expect(s.app.isNewUserSession).toBeFalsy();
|
| }
|
|
|
| return { users, selection, ...s };
|
| }
|
|
|
| it("allows user creation if no users", async () => {
|
| const { users } = await testUserScreen((selection) => {
|
|
|
| expect(selection.classList.contains("no-users")).toBeTruthy();
|
|
|
|
|
| const input = selection.getElementsByTagName("input")[0];
|
| input.focus();
|
| input.value = "Test User";
|
|
|
| return true;
|
| });
|
|
|
| expect(users).toStrictEqual({
|
| "Test User!": "Test User",
|
| });
|
|
|
| expect(localStorage["Comfy.userId"]).toBe("Test User!");
|
| expect(localStorage["Comfy.userName"]).toBe("Test User");
|
| });
|
| it("allows user creation if no current user but other users", async () => {
|
| const users = {
|
| "Test User 2!": "Test User 2",
|
| };
|
|
|
| await testUserScreen((selection) => {
|
| expect(selection.classList.contains("no-users")).toBeFalsy();
|
|
|
|
|
| const input = selection.getElementsByTagName("input")[0];
|
| input.focus();
|
| input.value = "Test User 3";
|
| return true;
|
| }, users);
|
|
|
| expect(users).toStrictEqual({
|
| "Test User 2!": "Test User 2",
|
| "Test User 3!": "Test User 3",
|
| });
|
|
|
| expect(localStorage["Comfy.userId"]).toBe("Test User 3!");
|
| expect(localStorage["Comfy.userName"]).toBe("Test User 3");
|
| });
|
| it("allows user selection if no current user but other users", async () => {
|
| const users = {
|
| "A!": "A",
|
| "B!": "B",
|
| "C!": "C",
|
| };
|
|
|
| await testUserScreen((selection) => {
|
| expect(selection.classList.contains("no-users")).toBeFalsy();
|
|
|
|
|
| const select = selection.getElementsByTagName("select")[0];
|
| const options = select.getElementsByTagName("option");
|
| expect(
|
| [...options]
|
| .filter((o) => !o.disabled)
|
| .reduce((p, n) => {
|
| p[n.getAttribute("value")] = n.textContent;
|
| return p;
|
| }, {})
|
| ).toStrictEqual(users);
|
|
|
|
|
| select.focus();
|
| select.value = options[2].value;
|
|
|
| return false;
|
| }, users);
|
|
|
| expect(users).toStrictEqual(users);
|
|
|
| expect(localStorage["Comfy.userId"]).toBe("B!");
|
| expect(localStorage["Comfy.userName"]).toBe("B");
|
| });
|
| it("doesnt show user screen if current user", async () => {
|
| const starting = start({
|
| resetEnv: true,
|
| userConfig: {
|
| storage: "server",
|
| users: {
|
| "User!": "User",
|
| },
|
| },
|
| localStorage: {
|
| "Comfy.userId": "User!",
|
| "Comfy.userName": "User",
|
| },
|
| });
|
| await new Promise(process.nextTick);
|
|
|
| expectNoUserScreen();
|
|
|
| await starting;
|
| });
|
| it("allows user switching", async () => {
|
| const { app } = await start({
|
| resetEnv: true,
|
| userConfig: {
|
| storage: "server",
|
| users: {
|
| "User!": "User",
|
| },
|
| },
|
| localStorage: {
|
| "Comfy.userId": "User!",
|
| "Comfy.userName": "User",
|
| },
|
| });
|
|
|
|
|
| expect(app.ui.settings.settingsLookup["Comfy.SwitchUser"]).toBeTruthy();
|
| });
|
| });
|
| describe("single-user", () => {
|
| it("doesnt show user creation if no default user", async () => {
|
| const { app } = await start({
|
| resetEnv: true,
|
| userConfig: { migrated: false, storage: "server" },
|
| });
|
| expectNoUserScreen();
|
|
|
|
|
| const { api } = require("../../web/scripts/api");
|
| expect(api.storeSettings).toHaveBeenCalledTimes(1);
|
| expect(api.storeUserData).toHaveBeenCalledTimes(1);
|
| expect(api.storeUserData).toHaveBeenCalledWith("comfy.templates.json", null, { stringify: false });
|
| expect(app.isNewUserSession).toBeTruthy();
|
| });
|
| it("doesnt show user creation if default user", async () => {
|
| const { app } = await start({
|
| resetEnv: true,
|
| userConfig: { migrated: true, storage: "server" },
|
| });
|
| expectNoUserScreen();
|
|
|
|
|
| const { api } = require("../../web/scripts/api");
|
| expect(api.storeSettings).toHaveBeenCalledTimes(0);
|
| expect(api.storeUserData).toHaveBeenCalledTimes(0);
|
| expect(app.isNewUserSession).toBeFalsy();
|
| });
|
| it("doesnt allow user switching", async () => {
|
| const { app } = await start({
|
| resetEnv: true,
|
| userConfig: { migrated: true, storage: "server" },
|
| });
|
| expectNoUserScreen();
|
|
|
| expect(app.ui.settings.settingsLookup["Comfy.SwitchUser"]).toBeFalsy();
|
| });
|
| });
|
| describe("browser-user", () => {
|
| it("doesnt show user creation if no default user", async () => {
|
| const { app } = await start({
|
| resetEnv: true,
|
| userConfig: { migrated: false, storage: "browser" },
|
| });
|
| expectNoUserScreen();
|
|
|
|
|
| const { api } = require("../../web/scripts/api");
|
| expect(api.storeSettings).toHaveBeenCalledTimes(0);
|
| expect(api.storeUserData).toHaveBeenCalledTimes(0);
|
| expect(app.isNewUserSession).toBeFalsy();
|
| });
|
| it("doesnt show user creation if default user", async () => {
|
| const { app } = await start({
|
| resetEnv: true,
|
| userConfig: { migrated: true, storage: "server" },
|
| });
|
| expectNoUserScreen();
|
|
|
|
|
| const { api } = require("../../web/scripts/api");
|
| expect(api.storeSettings).toHaveBeenCalledTimes(0);
|
| expect(api.storeUserData).toHaveBeenCalledTimes(0);
|
| expect(app.isNewUserSession).toBeFalsy();
|
| });
|
| it("doesnt allow user switching", async () => {
|
| const { app } = await start({
|
| resetEnv: true,
|
| userConfig: { migrated: true, storage: "browser" },
|
| });
|
| expectNoUserScreen();
|
|
|
| expect(app.ui.settings.settingsLookup["Comfy.SwitchUser"]).toBeFalsy();
|
| });
|
| });
|
| });
|
|
|