Spaces:
Running
Running
import { assert, it, describe, afterEach, vi, expect } from "vitest"; | |
import type { Cookies } from "@sveltejs/kit"; | |
import { collections } from "$lib/server/database"; | |
import { updateUser } from "./updateUser"; | |
import { ObjectId } from "mongodb"; | |
import { DEFAULT_SETTINGS } from "$lib/types/Settings"; | |
import { defaultModel } from "$lib/server/models"; | |
const userData = { | |
preferred_username: "new-username", | |
name: "name", | |
picture: "https://example.com/avatar.png", | |
sub: "1234567890", | |
}; | |
const locals = { | |
userId: "1234567890", | |
sessionId: "1234567890", | |
}; | |
// @ts-expect-error SvelteKit cookies dumb mock | |
const cookiesMock: Cookies = { | |
set: vi.fn(), | |
}; | |
const insertRandomUser = async () => { | |
const res = await collections.users.insertOne({ | |
_id: new ObjectId(), | |
createdAt: new Date(), | |
updatedAt: new Date(), | |
username: "base-username", | |
name: userData.name, | |
avatarUrl: userData.picture, | |
hfUserId: userData.sub, | |
sessionId: locals.sessionId, | |
}); | |
return res.insertedId; | |
}; | |
const insertRandomConversations = async (count: number) => { | |
const res = await collections.conversations.insertMany( | |
new Array(count).fill(0).map(() => ({ | |
_id: new ObjectId(), | |
title: "random title", | |
messages: [], | |
model: defaultModel.id, | |
createdAt: new Date(), | |
updatedAt: new Date(), | |
sessionId: locals.sessionId, | |
})) | |
); | |
return res.insertedIds; | |
}; | |
describe("login", () => { | |
it("should update user if existing", async () => { | |
await insertRandomUser(); | |
await updateUser({ userData, locals, cookies: cookiesMock }); | |
const existingUser = await collections.users.findOne({ hfUserId: userData.sub }); | |
assert.equal(existingUser?.name, userData.name); | |
expect(cookiesMock.set).toBeCalledTimes(1); | |
}); | |
it("should migrate pre-existing conversations for new user", async () => { | |
const insertedId = await insertRandomUser(); | |
await insertRandomConversations(2); | |
await updateUser({ userData, locals, cookies: cookiesMock }); | |
const conversationCount = await collections.conversations.countDocuments({ | |
userId: insertedId, | |
sessionId: { $exists: false }, | |
}); | |
assert.equal(conversationCount, 2); | |
await collections.conversations.deleteMany({ userId: insertedId }); | |
}); | |
it("should create default settings for new user", async () => { | |
await updateUser({ userData, locals, cookies: cookiesMock }); | |
const user = await collections.users.findOne({ sessionId: locals.sessionId }); | |
assert.exists(user); | |
const settings = await collections.settings.findOne({ userId: user?._id }); | |
expect(settings).toMatchObject({ | |
userId: user?._id, | |
updatedAt: expect.any(Date), | |
createdAt: expect.any(Date), | |
ethicsModalAcceptedAt: expect.any(Date), | |
...DEFAULT_SETTINGS, | |
}); | |
await collections.settings.deleteOne({ userId: user?._id }); | |
}); | |
it("should migrate pre-existing settings for pre-existing user", async () => { | |
const { insertedId } = await collections.settings.insertOne({ | |
sessionId: locals.sessionId, | |
ethicsModalAcceptedAt: new Date(), | |
updatedAt: new Date(), | |
createdAt: new Date(), | |
...DEFAULT_SETTINGS, | |
shareConversationsWithModelAuthors: false, | |
}); | |
await updateUser({ userData, locals, cookies: cookiesMock }); | |
const settings = await collections.settings.findOne({ | |
_id: insertedId, | |
sessionId: { $exists: false }, | |
}); | |
assert.exists(settings); | |
const user = await collections.users.findOne({ hfUserId: userData.sub }); | |
expect(settings).toMatchObject({ | |
userId: user?._id, | |
updatedAt: expect.any(Date), | |
createdAt: expect.any(Date), | |
ethicsModalAcceptedAt: expect.any(Date), | |
...DEFAULT_SETTINGS, | |
shareConversationsWithModelAuthors: false, | |
}); | |
await collections.settings.deleteOne({ userId: user?._id }); | |
}); | |
}); | |
afterEach(async () => { | |
await collections.users.deleteMany({ hfUserId: userData.sub }); | |
vi.clearAllMocks(); | |
}); | |