You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
295 lines
8.6 KiB
295 lines
8.6 KiB
// @ts-check |
|
/// <reference path="../node_modules/@types/jest/index.d.ts" /> |
|
const { start } = require("../utils"); |
|
const lg = require("../utils/litegraph"); |
|
|
|
describe("users", () => { |
|
beforeEach(() => { |
|
lg.setup(global); |
|
}); |
|
|
|
afterEach(() => { |
|
lg.teardown(global); |
|
}); |
|
|
|
function expectNoUserScreen() { |
|
// Ensure login isnt visible |
|
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(); |
|
|
|
// Wait for "show" to be called |
|
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); // wait for promises to resolve |
|
resolve(); |
|
return res; |
|
}); |
|
// @ts-ignore |
|
setTimeout(() => reject("timeout waiting for UserSelectionScreen to be shown."), 500); |
|
await p; |
|
await new Promise(process.nextTick); // wait for promises to resolve |
|
} |
|
|
|
async function testUserScreen(onShown, users) { |
|
if (!users) { |
|
users = {}; |
|
} |
|
const starting = start({ |
|
resetEnv: true, |
|
userConfig: { storage: "server", users }, |
|
}); |
|
|
|
// Ensure no current user |
|
expect(localStorage["Comfy.userId"]).toBeFalsy(); |
|
expect(localStorage["Comfy.userName"]).toBeFalsy(); |
|
|
|
await waitForUserScreenShow(); |
|
|
|
const selection = document.querySelectorAll("#comfy-user-selection")?.[0]; |
|
expect(selection).toBeTruthy(); |
|
|
|
// Ensure login is visible |
|
expect(window.getComputedStyle(selection)?.display).not.toBe("none"); |
|
// Ensure menu is hidden |
|
const menu = document.querySelectorAll(".comfy-menu")?.[0]; |
|
expect(window.getComputedStyle(menu)?.display).toBe("none"); |
|
|
|
const isCreate = await onShown(selection); |
|
|
|
// Submit form |
|
selection.querySelectorAll("form")[0].submit(); |
|
await new Promise(process.nextTick); // wait for promises to resolve |
|
|
|
// Wait for start |
|
const s = await starting; |
|
|
|
// Ensure login is removed |
|
expect(document.querySelectorAll("#comfy-user-selection")).toHaveLength(0); |
|
expect(window.getComputedStyle(menu)?.display).not.toBe("none"); |
|
|
|
// Ensure settings + templates are saved |
|
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) => { |
|
// Ensure we have no users flag added |
|
expect(selection.classList.contains("no-users")).toBeTruthy(); |
|
|
|
// Enter a username |
|
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(); |
|
|
|
// Enter a username |
|
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(); |
|
|
|
// Check user list |
|
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 an option |
|
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); // wait for promises to resolve |
|
|
|
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", |
|
}, |
|
}); |
|
|
|
// cant actually test switching user easily but can check the setting is present |
|
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(); |
|
|
|
// It should store the settings |
|
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(); |
|
|
|
// It should store the settings |
|
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(); |
|
|
|
// It should store the settings |
|
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(); |
|
|
|
// It should store the settings |
|
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(); |
|
}); |
|
}); |
|
});
|
|
|