@better-auth/test-utils 1.5.5 → 1.5.7-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"basic.mjs","names":[],"sources":["../../src/adapter/suites/basic.ts"],"sourcesContent":["import type { BetterAuthPlugin } from \"@better-auth/core\";\nimport type {\n\tAccount,\n\tSession,\n\tUser,\n\tVerification,\n} from \"@better-auth/core/db\";\nimport type {\n\tInvitation,\n\tMember,\n\tOrganization,\n\tTeam,\n} from \"better-auth/plugins/organization\";\nimport { organization } from \"better-auth/plugins/organization\";\nimport { expect } from \"vitest\";\nimport { createTestSuite } from \"../create-test-suite\";\n\n/**\n * This test suite tests the basic CRUD operations of the adapter.\n */\nexport const normalTestSuite = createTestSuite(\n\t\"normal\",\n\t{},\n\t(helpers, debugTools?: { showDB?: () => Promise<void> }) => {\n\t\tconst tests = getNormalTestSuiteTests(helpers, debugTools);\n\t\treturn {\n\t\t\t\"init - tests\": async () => {\n\t\t\t\tconst opts = helpers.getBetterAuthOptions();\n\t\t\t\texpect(opts.advanced?.database?.generateId !== \"serial\").toBeTruthy();\n\t\t\t},\n\t\t\t...tests,\n\t\t};\n\t},\n);\n\nexport const getNormalTestSuiteTests = (\n\t{\n\t\tadapter,\n\t\tgenerate,\n\t\tinsertRandom,\n\t\tmodifyBetterAuthOptions,\n\t\tsortModels,\n\t\tcustomIdGenerator,\n\t\tgetBetterAuthOptions,\n\t\ttransformGeneratedModel,\n\t\ttransformIdOutput,\n\t}: Parameters<Parameters<typeof createTestSuite>[2]>[0],\n\tdebugTools?: { showDB?: () => Promise<void> },\n) => {\n\treturn {\n\t\t\"create - should create a model\": async () => {\n\t\t\tconst user = await generate(\"user\");\n\t\t\t// console.log(`pre-transformed:`, user);\n\t\t\tconst result = await adapter.create<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: user,\n\t\t\t\tforceAllowId: true,\n\t\t\t});\n\t\t\tconst options = getBetterAuthOptions();\n\t\t\tif (\n\t\t\t\toptions.advanced?.database?.generateId === \"serial\" ||\n\t\t\t\toptions.advanced?.database?.generateId === \"uuid\"\n\t\t\t) {\n\t\t\t\tuser.id = result.id;\n\t\t\t}\n\n\t\t\texpect(typeof result.id).toEqual(\"string\");\n\t\t\tconst transformed = transformGeneratedModel(user);\n\t\t\t// console.log(`transformed:`, transformed);\n\t\t\t// console.log(`result:`, result);\n\t\t\texpect(result).toEqual(transformed);\n\t\t},\n\t\t\"create - should always return an id\": async () => {\n\t\t\tconst { id: _, ...user } = await generate(\"user\");\n\t\t\tconst res = await adapter.create<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: user,\n\t\t\t});\n\t\t\texpect(res).toHaveProperty(\"id\");\n\t\t\texpect(typeof res.id).toEqual(\"string\");\n\t\t},\n\t\t\"create - should use generateId if provided\": async () => {\n\t\t\tconst ID = (await customIdGenerator?.()) || \"MOCK-ID\";\n\t\t\tawait modifyBetterAuthOptions(\n\t\t\t\t{\n\t\t\t\t\tadvanced: {\n\t\t\t\t\t\tdatabase: {\n\t\t\t\t\t\t\tgenerateId: () => ID,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tfalse,\n\t\t\t);\n\t\t\tconst { id: _, ...user } = await generate(\"user\");\n\t\t\tconst res = await adapter.create<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: user,\n\t\t\t});\n\t\t\texpect(res.id).toEqual(transformIdOutput ? transformIdOutput(ID) : ID);\n\t\t\tconst findResult = await adapter.findOne<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [{ field: \"id\", value: res.id }],\n\t\t\t});\n\t\t\texpect(findResult).toEqual(res);\n\t\t},\n\t\t\"create - should return null for nullable foreign keys\": {\n\t\t\tmigrateBetterAuth: {\n\t\t\t\tplugins: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"nullable-test\",\n\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\ttestModel: {\n\t\t\t\t\t\t\t\tfields: {\n\t\t\t\t\t\t\t\t\tnullableReference: {\n\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\treferences: { field: \"id\", model: \"user\" },\n\t\t\t\t\t\t\t\t\t\trequired: false,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t} satisfies BetterAuthPlugin,\n\t\t\t\t],\n\t\t\t},\n\t\t\ttest: async () => {\n\t\t\t\tconst { nullableReference } = await adapter.create<{\n\t\t\t\t\tnullableReference: string | null;\n\t\t\t\t}>({\n\t\t\t\t\tmodel: \"testModel\",\n\t\t\t\t\tdata: { nullableReference: null },\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\t\t\t\texpect(nullableReference).toBeNull();\n\t\t\t},\n\t\t},\n\n\t\t\"create - should apply default values to fields\": async () => {\n\t\t\tawait modifyBetterAuthOptions(\n\t\t\t\t{\n\t\t\t\t\tuser: {\n\t\t\t\t\t\tadditionalFields: {\n\t\t\t\t\t\t\ttestField: {\n\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\tdefaultValue: \"test-value\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tcbDefaultValueField: {\n\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\tdefaultValue: () => {\n\t\t\t\t\t\t\t\t\treturn \"advanced-test-value\";\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tplugins: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"default-fields-test\",\n\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\ttestModel: {\n\t\t\t\t\t\t\t\t\tfields: {\n\t\t\t\t\t\t\t\t\t\ttestField: {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\tdefaultValue: \"test-value\",\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tcbDefaultValueField: {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\tdefaultValue: () => {\n\t\t\t\t\t\t\t\t\t\t\t\treturn \"advanced-test-value\";\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\ttrue,\n\t\t\t);\n\t\t\tconst result = await adapter.create<{\n\t\t\t\ttestField?: string;\n\t\t\t\tid: string;\n\t\t\t\tcbDefaultValueField?: string;\n\t\t\t}>({\n\t\t\t\tmodel: \"testModel\",\n\t\t\t\tdata: {},\n\t\t\t});\n\t\t\texpect(result.id).toBeDefined();\n\t\t\texpect(result.id).toBeTypeOf(\"string\");\n\t\t\texpect(result.testField).toBe(\"test-value\");\n\t\t\texpect(result.cbDefaultValueField).toBe(\"advanced-test-value\");\n\n\t\t\tconst userResult = await adapter.create<\n\t\t\t\tUser & { testField?: string; cbDefaultValueField?: string }\n\t\t\t>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\t...(await generate(\"user\")),\n\t\t\t\t},\n\t\t\t\tforceAllowId: true,\n\t\t\t});\n\t\t\texpect(userResult).toBeDefined();\n\t\t\texpect(userResult?.testField).toBe(\"test-value\");\n\t\t\texpect(userResult?.cbDefaultValueField).toBe(\"advanced-test-value\");\n\t\t},\n\t\t\"findOne - should find a model\": async () => {\n\t\t\tconst [user] = await insertRandom(\"user\");\n\t\t\tconst result = await adapter.findOne<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [{ field: \"id\", value: user.id }],\n\t\t\t});\n\t\t\texpect(result).toEqual(user);\n\t\t},\n\t\t\"findOne - should not apply defaultValue if value not found\": async () => {\n\t\t\tawait modifyBetterAuthOptions(\n\t\t\t\t{\n\t\t\t\t\tuser: {\n\t\t\t\t\t\tadditionalFields: {\n\t\t\t\t\t\t\ttestField: {\n\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\trequired: false,\n\t\t\t\t\t\t\t\tdefaultValue: \"test-value\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tcbDefaultValueField: {\n\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\trequired: false,\n\t\t\t\t\t\t\t\tdefaultValue: () => {\n\t\t\t\t\t\t\t\t\treturn \"advanced-test-value\";\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tplugins: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"default-fields-test\",\n\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\ttestModel: {\n\t\t\t\t\t\t\t\t\tfields: {\n\t\t\t\t\t\t\t\t\t\ttestField: {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\trequired: false,\n\t\t\t\t\t\t\t\t\t\t\tdefaultValue: \"test-value\",\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tcbDefaultValueField: {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\trequired: false,\n\t\t\t\t\t\t\t\t\t\t\tdefaultValue: () => {\n\t\t\t\t\t\t\t\t\t\t\t\treturn \"advanced-test-value\";\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\ttrue,\n\t\t\t);\n\t\t\tconst first = await adapter.create<{\n\t\t\t\ttestField?: string | null;\n\t\t\t\tid: string;\n\t\t\t\tcbDefaultValueField?: string | null;\n\t\t\t}>({\n\t\t\t\tmodel: \"testModel\",\n\t\t\t\tdata: {\n\t\t\t\t\ttestField: null,\n\t\t\t\t\tcbDefaultValueField: null,\n\t\t\t\t},\n\t\t\t});\n\t\t\tconst second = await adapter.create<\n\t\t\t\tUser & {\n\t\t\t\t\ttestField?: string | null;\n\t\t\t\t\tcbDefaultValueField?: string | null;\n\t\t\t\t}\n\t\t\t>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\t...(await generate(\"user\")),\n\t\t\t\t\ttestField: null,\n\t\t\t\t\tcbDefaultValueField: null,\n\t\t\t\t},\n\t\t\t\tforceAllowId: true,\n\t\t\t});\n\n\t\t\tconst result = await adapter.findOne<{\n\t\t\t\ttestField?: string;\n\t\t\t\tid: string;\n\t\t\t\tcbDefaultValueField?: string;\n\t\t\t}>({\n\t\t\t\tmodel: \"testModel\",\n\t\t\t\twhere: [{ field: \"id\", value: first.id }],\n\t\t\t});\n\t\t\texpect(result).not.toBeNull();\n\t\t\texpect(result?.testField).toBeNull();\n\t\t\texpect(result?.cbDefaultValueField).toBeNull();\n\n\t\t\tconst resultTwo = await adapter.findMany<\n\t\t\t\tUser & {\n\t\t\t\t\ttestField?: string | null;\n\t\t\t\t\tcbDefaultValueField?: string | null;\n\t\t\t\t}\n\t\t\t>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [{ field: \"id\", value: second.id }],\n\t\t\t});\n\t\t\texpect(resultTwo).not.toBeNull();\n\t\t\texpect(resultTwo.length).toBe(1);\n\t\t\texpect(resultTwo[0]?.testField).toBeNull();\n\t\t\texpect(resultTwo[0]?.cbDefaultValueField).toBeNull();\n\t\t},\n\t\t\"findOne - should find a model using a reference field\": async () => {\n\t\t\tconst [user, session] = await insertRandom(\"session\");\n\t\t\tconst result = await adapter.findOne<User>({\n\t\t\t\tmodel: \"session\",\n\t\t\t\twhere: [{ field: \"userId\", value: user.id }],\n\t\t\t});\n\t\t\texpect(result).toEqual(session);\n\t\t},\n\t\t\"findOne - should not throw on record not found\": async () => {\n\t\t\tconst options = getBetterAuthOptions();\n\t\t\tconst useUUIDs = options.advanced?.database?.generateId === \"uuid\";\n\t\t\tconst result = await adapter.findOne<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{ field: \"id\", value: useUUIDs ? crypto.randomUUID() : \"100000\" },\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(result).toBeNull();\n\t\t},\n\t\t\"findOne - should find a model without id\": async () => {\n\t\t\tconst [user] = await insertRandom(\"user\");\n\t\t\tconst result = await adapter.findOne<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [{ field: \"email\", value: user.email }],\n\t\t\t});\n\t\t\texpect(result).toEqual(user);\n\t\t},\n\t\t\"findOne - should find a model with join\": async () => {\n\t\t\tconst users: User[] = [];\n\t\t\tconst sessions: Session[] = [];\n\t\t\tconst accounts: Account[] = [];\n\t\t\tfor (const _ of Array.from({ length: 3 })) {\n\t\t\t\tconst user = await adapter.create<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\t...(await generate(\"user\")),\n\t\t\t\t\t},\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\t\t\t\tusers.push(user);\n\t\t\t\tconst userId = users[0]!.id;\n\t\t\t\tconst session = await adapter.create<Session>({\n\t\t\t\t\tmodel: \"session\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\t...(await generate(\"session\")),\n\t\t\t\t\t\tuserId,\n\t\t\t\t\t},\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\t\t\t\tsessions.push(session);\n\t\t\t\tconst account = await adapter.create<Account>({\n\t\t\t\t\tmodel: \"account\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\t...(await generate(\"account\")),\n\t\t\t\t\t\tuserId,\n\t\t\t\t\t},\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\t\t\t\taccounts.push(account);\n\t\t\t}\n\n\t\t\ttype ExpectedResult = User & { session: Session[]; account: Account[] };\n\n\t\t\tconst result = await adapter.findOne<ExpectedResult>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [{ field: \"id\", value: users[0]!.id }],\n\t\t\t\tjoin: {\n\t\t\t\t\tsession: true,\n\t\t\t\t\taccount: true,\n\t\t\t\t},\n\t\t\t});\n\t\t\texpect({\n\t\t\t\t...result,\n\t\t\t\tsession: result?.session.sort((a, b) => a.id.localeCompare(b.id)),\n\t\t\t\taccount: result?.account.sort((a, b) => a.id.localeCompare(b.id)),\n\t\t\t}).toEqual({\n\t\t\t\t...users[0]!,\n\t\t\t\tsession: sessions.sort((a, b) => a.id.localeCompare(b.id)),\n\t\t\t\taccount: accounts.sort((a, b) => a.id.localeCompare(b.id)),\n\t\t\t});\n\t\t},\n\t\t\"findOne - should find a model with modified field name\": async () => {\n\t\t\tawait modifyBetterAuthOptions(\n\t\t\t\t{\n\t\t\t\t\tuser: {\n\t\t\t\t\t\tfields: {\n\t\t\t\t\t\t\temail: \"email_address\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\ttrue,\n\t\t\t);\n\t\t\tconst [user] = await insertRandom(\"user\");\n\t\t\tconst result = await adapter.findOne<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [{ field: \"email\", value: user.email }],\n\t\t\t});\n\t\t\texpect(result).toEqual(user);\n\t\t\texpect(result?.email).toEqual(user.email);\n\t\t\texpect(true).toEqual(true);\n\t\t},\n\t\t\"findOne - should find a model with modified model name\": async () => {\n\t\t\tawait modifyBetterAuthOptions(\n\t\t\t\t{\n\t\t\t\t\tuser: {\n\t\t\t\t\t\tmodelName: \"user_custom\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\ttrue,\n\t\t\t);\n\t\t\tconst [user] = await insertRandom(\"user\");\n\t\t\texpect(user).toBeDefined();\n\t\t\texpect(user).toHaveProperty(\"id\");\n\t\t\texpect(user).toHaveProperty(\"name\");\n\t\t\tconst result = await adapter.findOne<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [{ field: \"email\", value: user.email }],\n\t\t\t});\n\t\t\texpect(result).toEqual(user);\n\t\t\texpect(result?.email).toEqual(user.email);\n\t\t\texpect(true).toEqual(true);\n\t\t},\n\t\t\"findOne - should find a model with additional fields\": async () => {\n\t\t\tawait modifyBetterAuthOptions(\n\t\t\t\t{\n\t\t\t\t\tuser: {\n\t\t\t\t\t\tadditionalFields: {\n\t\t\t\t\t\t\tcustomField: {\n\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\tinput: false,\n\t\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\t\tdefaultValue: \"default-value\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\ttrue,\n\t\t\t);\n\t\t\tconst [user_] = await insertRandom(\"user\");\n\t\t\tconst user = user_ as User & { customField: string };\n\t\t\texpect(user).toHaveProperty(\"customField\");\n\t\t\texpect(user.customField).toBe(\"default-value\");\n\t\t\tconst result = await adapter.findOne<User & { customField: string }>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [{ field: \"customField\", value: user.customField }],\n\t\t\t});\n\t\t\texpect(result).toEqual(user);\n\t\t\texpect(result?.customField).toEqual(\"default-value\");\n\t\t},\n\t\t\"findOne - should select fields\": async () => {\n\t\t\tconst [user] = await insertRandom(\"user\");\n\t\t\tconst result = await adapter.findOne<Pick<User, \"email\" | \"name\">>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [{ field: \"id\", value: user.id }],\n\t\t\t\tselect: [\"email\", \"name\"],\n\t\t\t});\n\t\t\texpect(result).toEqual({ email: user.email, name: user.name });\n\t\t},\n\t\t\"findOne - should select fields with one-to-many join\": async () => {\n\t\t\tconst user = await adapter.create<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: { ...(await generate(\"user\")) },\n\t\t\t\tforceAllowId: true,\n\t\t\t});\n\t\t\tconst session = await adapter.create<Session>({\n\t\t\t\tmodel: \"session\",\n\t\t\t\tdata: { ...(await generate(\"session\")), userId: user.id },\n\t\t\t\tforceAllowId: true,\n\t\t\t});\n\n\t\t\ttype ResultType = Pick<User, \"email\" | \"name\"> & {\n\t\t\t\tsession: Session[];\n\t\t\t};\n\n\t\t\tconst result = await adapter.findOne<ResultType>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [{ field: \"id\", value: user.id }],\n\t\t\t\tselect: [\"email\", \"name\"],\n\t\t\t\tjoin: { session: true },\n\t\t\t});\n\n\t\t\texpect(result).toBeDefined();\n\t\t\texpect(result?.email).toEqual(user.email);\n\t\t\texpect(result?.name).toEqual(user.name);\n\t\t\texpect(result?.session).toBeDefined();\n\t\t\texpect(Array.isArray(result?.session)).toBe(true);\n\t\t\texpect(result?.session).toHaveLength(1);\n\t\t\texpect(result?.session[0]).toEqual(session);\n\t\t},\n\t\t\"findOne - should select fields with one-to-one join\": async () => {\n\t\t\tawait modifyBetterAuthOptions(\n\t\t\t\t{\n\t\t\t\t\tplugins: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"one-to-one-test\",\n\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\toneToOneTable: {\n\t\t\t\t\t\t\t\t\tfields: {\n\t\t\t\t\t\t\t\t\t\toneToOne: {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\t\t\t\t\treferences: { field: \"id\", model: \"user\" },\n\t\t\t\t\t\t\t\t\t\t\tunique: true,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t} satisfies BetterAuthPlugin,\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\ttrue,\n\t\t\t);\n\t\t\ttype OneToOneTable = { oneToOne: string };\n\t\t\tconst user = await adapter.create<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\t...(await generate(\"user\")),\n\t\t\t\t},\n\t\t\t\tforceAllowId: true,\n\t\t\t});\n\n\t\t\tconst oneToOne = await adapter.create<OneToOneTable>({\n\t\t\t\tmodel: \"oneToOneTable\",\n\t\t\t\tdata: {\n\t\t\t\t\toneToOne: user.id,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\ttype ResultType = Pick<User, \"email\" | \"name\"> & {\n\t\t\t\toneToOneTable: OneToOneTable;\n\t\t\t};\n\n\t\t\tconst result = await adapter.findOne<ResultType>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [{ field: \"id\", value: user.id }],\n\t\t\t\tselect: [\"email\", \"name\"],\n\t\t\t\tjoin: { oneToOneTable: true },\n\t\t\t});\n\n\t\t\texpect(result).toBeDefined();\n\t\t\texpect(result?.email).toEqual(user.email);\n\t\t\texpect(result?.name).toEqual(user.name);\n\t\t\texpect(result?.oneToOneTable).toBeDefined();\n\t\t\texpect(result?.oneToOneTable).toEqual(oneToOne);\n\t\t},\n\t\t\"findOne - should select fields with multiple joins\": async () => {\n\t\t\tconst user = await adapter.create<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: { ...(await generate(\"user\")) },\n\t\t\t\tforceAllowId: true,\n\t\t\t});\n\t\t\tconst session = await adapter.create<Session>({\n\t\t\t\tmodel: \"session\",\n\t\t\t\tdata: { ...(await generate(\"session\")), userId: user.id },\n\t\t\t\tforceAllowId: true,\n\t\t\t});\n\t\t\tconst account = await adapter.create<Account>({\n\t\t\t\tmodel: \"account\",\n\t\t\t\tdata: { ...(await generate(\"account\")), userId: user.id },\n\t\t\t\tforceAllowId: true,\n\t\t\t});\n\n\t\t\ttype ResultType = Pick<User, \"email\" | \"name\"> & {\n\t\t\t\tsession: Session[];\n\t\t\t\taccount: Account[];\n\t\t\t};\n\n\t\t\tconst result = await adapter.findOne<ResultType>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [{ field: \"id\", value: user.id }],\n\t\t\t\tselect: [\"email\", \"name\"],\n\t\t\t\tjoin: { session: true, account: true },\n\t\t\t});\n\n\t\t\texpect(result).toBeDefined();\n\t\t\texpect(result?.email).toEqual(user.email);\n\t\t\texpect(result?.name).toEqual(user.name);\n\t\t\texpect(result?.session).toBeDefined();\n\t\t\texpect(Array.isArray(result?.session)).toBe(true);\n\t\t\texpect(result?.session).toHaveLength(1);\n\t\t\texpect(result?.session[0]).toEqual(session);\n\t\t\texpect(result?.account).toBeDefined();\n\t\t\texpect(Array.isArray(result?.account)).toBe(true);\n\t\t\texpect(result?.account).toHaveLength(1);\n\t\t\texpect(result?.account[0]).toEqual(account);\n\t\t},\n\t\t\"findOne - should find model with date field\": async () => {\n\t\t\tconst [user] = await insertRandom(\"user\");\n\t\t\tconst result = await adapter.findOne<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [{ field: \"createdAt\", value: user.createdAt, operator: \"eq\" }],\n\t\t\t});\n\t\t\texpect(result).toEqual(user);\n\t\t\texpect(result?.createdAt).toBeInstanceOf(Date);\n\t\t\texpect(result?.createdAt).toEqual(user.createdAt);\n\t\t},\n\t\t\"findOne - should perform backwards joins\": async () => {\n\t\t\tconst user = await adapter.create<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: { ...(await generate(\"user\")) },\n\t\t\t\tforceAllowId: true,\n\t\t\t});\n\t\t\tconst session = await adapter.create<Session>({\n\t\t\t\tmodel: \"session\",\n\t\t\t\tdata: { ...(await generate(\"session\")), userId: user.id },\n\t\t\t\tforceAllowId: true,\n\t\t\t});\n\t\t\tconst result = await adapter.findOne<Session & { user: User }>({\n\t\t\t\tmodel: \"session\",\n\t\t\t\twhere: [{ field: \"token\", value: session.token }],\n\t\t\t\tjoin: { user: true },\n\t\t\t});\n\t\t\texpect(result).toEqual({\n\t\t\t\t...session,\n\t\t\t\tuser: user,\n\t\t\t});\n\t\t},\n\t\t\"findOne - should return an object for one-to-one joins\": async () => {\n\t\t\tawait modifyBetterAuthOptions(\n\t\t\t\t{\n\t\t\t\t\tplugins: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"one-to-one-test\",\n\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\toneToOneTable: {\n\t\t\t\t\t\t\t\t\tfields: {\n\t\t\t\t\t\t\t\t\t\toneToOne: {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\t\t\t\t\treferences: { field: \"id\", model: \"user\" },\n\t\t\t\t\t\t\t\t\t\t\tunique: true,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t} satisfies BetterAuthPlugin,\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\ttrue,\n\t\t\t);\n\t\t\ttype OneToOneTable = { oneToOne: string };\n\t\t\tconst users = (await insertRandom(\"user\", 2)).map((x) => x[0]);\n\t\t\tconst oneToOne = await adapter.create<OneToOneTable>({\n\t\t\t\tmodel: \"oneToOneTable\",\n\t\t\t\tdata: {\n\t\t\t\t\toneToOne: users[0]!.id,\n\t\t\t\t},\n\t\t\t});\n\t\t\t// decoy second table that shouldn't be included in the result\n\t\t\tawait adapter.create<OneToOneTable>({\n\t\t\t\tmodel: \"oneToOneTable\",\n\t\t\t\tdata: {\n\t\t\t\t\toneToOne: users[1]!.id,\n\t\t\t\t},\n\t\t\t});\n\t\t\tconst result = await adapter.findOne<\n\t\t\t\tUser & { oneToOneTable: OneToOneTable }\n\t\t\t>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [{ field: \"id\", value: users[0]!.id }],\n\t\t\t\tjoin: { oneToOneTable: true },\n\t\t\t});\n\t\t\texpect(result).toEqual({\n\t\t\t\t...users[0]!,\n\t\t\t\toneToOneTable: oneToOne,\n\t\t\t});\n\t\t},\n\t\t\"findOne - should return an array for one-to-many joins\": async () => {\n\t\t\tconst user = await adapter.create<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: { ...(await generate(\"user\")) },\n\t\t\t\tforceAllowId: true,\n\t\t\t});\n\t\t\tconst session = await adapter.create<Session>({\n\t\t\t\tmodel: \"session\",\n\t\t\t\tdata: { ...(await generate(\"session\")), userId: user.id },\n\t\t\t\tforceAllowId: true,\n\t\t\t});\n\t\t\tconst result = await adapter.findOne<User & { session: Session }>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [{ field: \"id\", value: user.id }],\n\t\t\t\tjoin: { session: true },\n\t\t\t});\n\t\t\texpect(result).toEqual({\n\t\t\t\t...user,\n\t\t\t\tsession: [session],\n\t\t\t});\n\t\t},\n\t\t\"findOne - should work with both one-to-one and one-to-many joins\":\n\t\t\tasync () => {\n\t\t\t\tawait modifyBetterAuthOptions(\n\t\t\t\t\t{\n\t\t\t\t\t\tplugins: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: \"one-to-one-test\",\n\t\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\t\toneToOneTable: {\n\t\t\t\t\t\t\t\t\t\tfields: {\n\t\t\t\t\t\t\t\t\t\t\toneToOne: {\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\t\t\t\t\t\treferences: { field: \"id\", model: \"user\" },\n\t\t\t\t\t\t\t\t\t\t\t\tunique: true,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t} satisfies BetterAuthPlugin,\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t\ttype OneToOneTable = { oneToOne: string };\n\t\t\t\tconst users = (await insertRandom(\"user\", 2)).map((x) => x[0]);\n\t\t\t\tconst oneToOne = await adapter.create<OneToOneTable>({\n\t\t\t\t\tmodel: \"oneToOneTable\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\toneToOne: users[0]!.id,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tconst session1 = await adapter.create<Session>({\n\t\t\t\t\tmodel: \"session\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\t...(await generate(\"session\")),\n\t\t\t\t\t\tuserId: users[0]!.id,\n\t\t\t\t\t\tcreatedAt: new Date(Date.now() - 3000),\n\t\t\t\t\t},\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\t\t\t\tconst session2 = await adapter.create<Session>({\n\t\t\t\t\tmodel: \"session\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\t...(await generate(\"session\")),\n\t\t\t\t\t\tuserId: users[0]!.id,\n\t\t\t\t\t\tcreatedAt: new Date(Date.now() - 1000),\n\t\t\t\t\t},\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\t\t\t\tconst result = await adapter.findOne<\n\t\t\t\t\tUser & { oneToOneTable: OneToOneTable; session: Session[] }\n\t\t\t\t>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\twhere: [{ field: \"id\", value: users[0]!.id }],\n\t\t\t\t\tjoin: { oneToOneTable: true, session: true },\n\t\t\t\t});\n\t\t\t\tif (result?.session?.length) {\n\t\t\t\t\tresult.session = result.session.sort(\n\t\t\t\t\t\t(a, b) => a.createdAt.getTime() - b.createdAt.getTime(),\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\texpect(result).toEqual({\n\t\t\t\t\t...users[0]!,\n\t\t\t\t\toneToOneTable: oneToOne,\n\t\t\t\t\tsession: [session1, session2],\n\t\t\t\t});\n\t\t\t},\n\t\t\"findOne - should return null for failed base model lookup that has joins\":\n\t\t\tasync () => {\n\t\t\t\tawait modifyBetterAuthOptions(\n\t\t\t\t\t{\n\t\t\t\t\t\tplugins: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: \"one-to-one-test\",\n\t\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\t\toneToOneTable: {\n\t\t\t\t\t\t\t\t\t\tmodelName: \"one_to_one_table\",\n\t\t\t\t\t\t\t\t\t\tfields: {\n\t\t\t\t\t\t\t\t\t\t\toneToOne: {\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\t\t\t\t\t\treferences: { field: \"id\", model: \"user\" },\n\t\t\t\t\t\t\t\t\t\t\t\tunique: true,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t} satisfies BetterAuthPlugin,\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\n\t\t\t\tconst options = getBetterAuthOptions();\n\t\t\t\tconst useUUIDs = options.advanced?.database?.generateId === \"uuid\";\n\t\t\t\tconst result = await adapter.findOne<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t{ field: \"id\", value: useUUIDs ? crypto.randomUUID() : \"100000\" },\n\t\t\t\t\t],\n\t\t\t\t\tjoin: { session: true, account: true, oneToOneTable: true },\n\t\t\t\t});\n\t\t\t\texpect(result).toBeNull();\n\t\t\t},\n\t\t\"findOne - should join a model with modified field name\": async () => {\n\t\t\tawait modifyBetterAuthOptions(\n\t\t\t\t{\n\t\t\t\t\tuser: {\n\t\t\t\t\t\tfields: {\n\t\t\t\t\t\t\temail: \"email_address\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tplugins: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"one-to-one-test\",\n\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\toneToOneTable: {\n\t\t\t\t\t\t\t\t\tmodelName: \"one_to_one_table\",\n\t\t\t\t\t\t\t\t\tfields: {\n\t\t\t\t\t\t\t\t\t\toneToOne: {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\t\t\t\t\treferences: { field: \"email\", model: \"user\" },\n\t\t\t\t\t\t\t\t\t\t\tunique: true,\n\t\t\t\t\t\t\t\t\t\t\tfieldName: \"one_to_one\",\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t} satisfies BetterAuthPlugin,\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\ttrue,\n\t\t\t);\n\n\t\t\ttype OneToOneTable = { oneToOne: string; id: string };\n\t\t\tconst user = await adapter.create<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\t...(await generate(\"user\")),\n\t\t\t\t},\n\t\t\t\tforceAllowId: true,\n\t\t\t});\n\n\t\t\tconst oneToOne = await adapter.create<OneToOneTable>({\n\t\t\t\tmodel: \"oneToOneTable\",\n\t\t\t\tdata: {\n\t\t\t\t\toneToOne: user.email,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tconst result = await adapter.findOne<\n\t\t\t\tUser & { oneToOneTable: OneToOneTable }\n\t\t\t>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [{ field: \"email\", value: user.email }],\n\t\t\t\tjoin: { oneToOneTable: true },\n\t\t\t});\n\t\t\texpect(result).toEqual({\n\t\t\t\t...user,\n\t\t\t\toneToOneTable: oneToOne,\n\t\t\t});\n\t\t},\n\t\t\"findMany - should find many models\": async () => {\n\t\t\tconst users = (await insertRandom(\"user\", 3)).map((x) => x[0]);\n\t\t\tconst result = await adapter.findMany<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t});\n\t\t\texpect(sortModels(result)).toEqual(sortModels(users));\n\t\t},\n\t\t\"findMany - should find many models with date fields\": async () => {\n\t\t\tconst users = (await insertRandom(\"user\", 3)).map((x) => x[0]);\n\t\t\tconst youngestUser = users.sort(\n\t\t\t\t(a, b) => b.createdAt.getTime() - a.createdAt.getTime(),\n\t\t\t)[0]!;\n\t\t\tconst result = await adapter.findMany<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{ field: \"createdAt\", value: youngestUser.createdAt, operator: \"lt\" },\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(sortModels(result)).toEqual(\n\t\t\t\tsortModels(\n\t\t\t\t\tusers.filter((user) => user.createdAt < youngestUser.createdAt),\n\t\t\t\t),\n\t\t\t);\n\t\t},\n\t\t\"findMany - should find many models with join\": async () => {\n\t\t\ttype ExpectedResult = User & { session: Session[]; account: Account[] };\n\t\t\tlet expectedResult: ExpectedResult[] = [];\n\n\t\t\tfor (let i = 0; i < 10; i++) {\n\t\t\t\tconst user = await adapter.create<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\t...(await generate(\"user\")),\n\t\t\t\t\t\t...(i < 3 ? { name: `join-user-${i}` } : {}),\n\t\t\t\t\t},\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\t\t\t\tconst sessions: Session[] = [];\n\t\t\t\tfor (let index = 0; index < 3; index++) {\n\t\t\t\t\tconst session = await adapter.create<Session>({\n\t\t\t\t\t\tmodel: \"session\",\n\t\t\t\t\t\tdata: { ...(await generate(\"session\")), userId: user.id },\n\t\t\t\t\t\tforceAllowId: true,\n\t\t\t\t\t});\n\t\t\t\t\tsessions.push(session);\n\t\t\t\t}\n\t\t\t\tconst accounts: Account[] = [];\n\t\t\t\tfor (let index = 0; index < 3; index++) {\n\t\t\t\t\tconst account = await adapter.create<Account>({\n\t\t\t\t\t\tmodel: \"account\",\n\t\t\t\t\t\tdata: { ...(await generate(\"account\")), userId: user.id },\n\t\t\t\t\t\tforceAllowId: true,\n\t\t\t\t\t});\n\t\t\t\t\taccounts.push(account);\n\t\t\t\t}\n\n\t\t\t\tif (i < 3) {\n\t\t\t\t\texpectedResult.push({\n\t\t\t\t\t\t...user,\n\t\t\t\t\t\tsession: sessions,\n\t\t\t\t\t\taccount: accounts,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet result = await adapter.findMany<ExpectedResult>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [{ field: \"name\", value: \"join-user\", operator: \"starts_with\" }],\n\t\t\t\tjoin: {\n\t\t\t\t\tsession: true,\n\t\t\t\t\taccount: true,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\t// sort both results since order in this case doesn't matter\n\t\t\t// but the test requires the order to be consistent\n\t\t\tconst sort = (a: ExpectedResult, b: ExpectedResult) =>\n\t\t\t\ta.id.localeCompare(b.id);\n\t\t\tresult = result.sort(sort);\n\t\t\tresult = result.map((x) => ({\n\t\t\t\t...x,\n\t\t\t\tsession: x.session.sort((a, b) => a.id.localeCompare(b.id)),\n\t\t\t\taccount: x.account.sort((a, b) => a.id.localeCompare(b.id)),\n\t\t\t}));\n\n\t\t\texpectedResult = expectedResult.sort(sort);\n\t\t\texpectedResult = expectedResult.map((x) => ({\n\t\t\t\t...x,\n\t\t\t\tsession: x.session.sort((a, b) => a.id.localeCompare(b.id)),\n\t\t\t\taccount: x.account.sort((a, b) => a.id.localeCompare(b.id)),\n\t\t\t}));\n\t\t\texpect(result).toEqual(expectedResult);\n\t\t},\n\t\t\"findMany - should find many with join and limit\": async () => {\n\t\t\tconst users: User[] = [];\n\t\t\tconst sessionsByUser: Map<string, Session[]> = new Map();\n\n\t\t\tfor (let i = 0; i < 5; i++) {\n\t\t\t\tconst user = await adapter.create<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: { ...(await generate(\"user\")) },\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\t\t\t\tusers.push(user);\n\t\t\t\tsessionsByUser.set(user.id, []);\n\n\t\t\t\tfor (let j = 0; j < 3; j++) {\n\t\t\t\t\tconst session = await adapter.create<Session>({\n\t\t\t\t\t\tmodel: \"session\",\n\t\t\t\t\t\tdata: { ...(await generate(\"session\")), userId: user.id },\n\t\t\t\t\t\tforceAllowId: true,\n\t\t\t\t\t});\n\t\t\t\t\tsessionsByUser.get(user.id)!.push(session);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst result = await adapter.findMany<User & { session: Session[] }>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tjoin: { session: true },\n\t\t\t\tlimit: 2,\n\t\t\t});\n\n\t\t\texpect(result).toHaveLength(2);\n\t\t\tresult.forEach((user) => {\n\t\t\t\texpect(user.session).toHaveLength(3);\n\t\t\t});\n\t\t},\n\t\t\"findMany - should select fields\": async () => {\n\t\t\tconst expectedResults = (await insertRandom(\"user\", 3)).map(\n\t\t\t\t([{ id, email }]) => ({ id, email }),\n\t\t\t);\n\t\t\tconst select = [\"id\", \"email\"];\n\t\t\tconst result = await adapter.findMany<Pick<User, \"id\" | \"email\">>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tvalue: expectedResults.map((r) => r.id),\n\t\t\t\t\t\toperator: \"in\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tselect,\n\t\t\t});\n\n\t\t\texpect(result.length).toEqual(expectedResults.length);\n\t\t\texpect(result[0]).toSatisfy(\n\t\t\t\t(obj) =>\n\t\t\t\t\texpectedResults.some(\n\t\t\t\t\t\t(r) => r.id === obj.id && r.email === obj.email,\n\t\t\t\t\t) &&\n\t\t\t\t\tObject.entries(obj).every(\n\t\t\t\t\t\t([k, v]) => select.includes(k) || v === undefined,\n\t\t\t\t\t),\n\t\t\t);\n\t\t},\n\t\t\"findMany - should select fields with one-to-many join\": async () => {\n\t\t\tconst user = await adapter.create<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: { ...(await generate(\"user\")) },\n\t\t\t\tforceAllowId: true,\n\t\t\t});\n\t\t\tconst session = await adapter.create<Session>({\n\t\t\t\tmodel: \"session\",\n\t\t\t\tdata: { ...(await generate(\"session\")), userId: user.id },\n\t\t\t\tforceAllowId: true,\n\t\t\t});\n\n\t\t\ttype ResultType = Pick<User, \"email\" | \"name\"> & {\n\t\t\t\tsession: Session[];\n\t\t\t};\n\n\t\t\tconst [result] = await adapter.findMany<ResultType>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [{ field: \"id\", value: user.id }],\n\t\t\t\tselect: [\"email\", \"name\"],\n\t\t\t\tjoin: { session: true },\n\t\t\t});\n\n\t\t\texpect(result).toBeDefined();\n\t\t\texpect(result?.email).toEqual(user.email);\n\t\t\texpect(result?.name).toEqual(user.name);\n\t\t\texpect(result?.session).toBeDefined();\n\t\t\texpect(Array.isArray(result?.session)).toBe(true);\n\t\t\texpect(result?.session).toHaveLength(1);\n\t\t\texpect(result?.session[0]).toEqual(session);\n\t\t},\n\t\t\"findMany - should select fields with one-to-one join\": async () => {\n\t\t\tawait modifyBetterAuthOptions(\n\t\t\t\t{\n\t\t\t\t\tplugins: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"one-to-one-test\",\n\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\toneToOneTable: {\n\t\t\t\t\t\t\t\t\tfields: {\n\t\t\t\t\t\t\t\t\t\toneToOne: {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\t\t\t\t\treferences: { field: \"id\", model: \"user\" },\n\t\t\t\t\t\t\t\t\t\t\tunique: true,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t} satisfies BetterAuthPlugin,\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\ttrue,\n\t\t\t);\n\t\t\ttype OneToOneTable = { oneToOne: string };\n\t\t\tconst user = await adapter.create<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\t...(await generate(\"user\")),\n\t\t\t\t},\n\t\t\t\tforceAllowId: true,\n\t\t\t});\n\n\t\t\tconst oneToOne = await adapter.create<OneToOneTable>({\n\t\t\t\tmodel: \"oneToOneTable\",\n\t\t\t\tdata: {\n\t\t\t\t\toneToOne: user.id,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\ttype ResultType = Pick<User, \"email\" | \"name\"> & {\n\t\t\t\toneToOneTable: OneToOneTable;\n\t\t\t};\n\n\t\t\tconst [result] = await adapter.findMany<ResultType>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [{ field: \"id\", value: user.id }],\n\t\t\t\tselect: [\"email\", \"name\"],\n\t\t\t\tjoin: { oneToOneTable: true },\n\t\t\t});\n\n\t\t\texpect(result).toBeDefined();\n\t\t\texpect(result?.email).toEqual(user.email);\n\t\t\texpect(result?.name).toEqual(user.name);\n\t\t\texpect(result?.oneToOneTable).toBeDefined();\n\t\t\texpect(result?.oneToOneTable).toEqual(oneToOne);\n\t\t},\n\t\t\"findMany - should select fields with multiple joins\": async () => {\n\t\t\tconst user = await adapter.create<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: { ...(await generate(\"user\")) },\n\t\t\t\tforceAllowId: true,\n\t\t\t});\n\t\t\tconst session = await adapter.create<Session>({\n\t\t\t\tmodel: \"session\",\n\t\t\t\tdata: { ...(await generate(\"session\")), userId: user.id },\n\t\t\t\tforceAllowId: true,\n\t\t\t});\n\t\t\tconst account = await adapter.create<Account>({\n\t\t\t\tmodel: \"account\",\n\t\t\t\tdata: { ...(await generate(\"account\")), userId: user.id },\n\t\t\t\tforceAllowId: true,\n\t\t\t});\n\n\t\t\ttype ResultType = Pick<User, \"email\" | \"name\"> & {\n\t\t\t\tsession: Session[];\n\t\t\t\taccount: Account[];\n\t\t\t};\n\n\t\t\tconst [result] = await adapter.findMany<ResultType>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [{ field: \"id\", value: user.id }],\n\t\t\t\tselect: [\"email\", \"name\"],\n\t\t\t\tjoin: { session: true, account: true },\n\t\t\t});\n\n\t\t\texpect(result).toBeDefined();\n\t\t\texpect(result?.email).toEqual(user.email);\n\t\t\texpect(result?.name).toEqual(user.name);\n\t\t\texpect(result?.session).toBeDefined();\n\t\t\texpect(Array.isArray(result?.session)).toBe(true);\n\t\t\texpect(result?.session).toHaveLength(1);\n\t\t\texpect(result?.session[0]).toEqual(session);\n\t\t\texpect(result?.account).toBeDefined();\n\t\t\texpect(Array.isArray(result?.account)).toBe(true);\n\t\t\texpect(result?.account).toHaveLength(1);\n\t\t\texpect(result?.account[0]).toEqual(account);\n\t\t},\n\t\t\"findMany - should find many with join and offset\": async () => {\n\t\t\tconst users: User[] = [];\n\n\t\t\tfor (let i = 0; i < 5; i++) {\n\t\t\t\tconst user = await adapter.create<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\t...(await generate(\"user\")),\n\t\t\t\t\t\tname: `user-${i.toString().padStart(2, \"0\")}`,\n\t\t\t\t\t},\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\t\t\t\tusers.push(user);\n\n\t\t\t\tfor (let j = 0; j < 2; j++) {\n\t\t\t\t\tawait adapter.create<Session>({\n\t\t\t\t\t\tmodel: \"session\",\n\t\t\t\t\t\tdata: { ...(await generate(\"session\")), userId: user.id },\n\t\t\t\t\t\tforceAllowId: true,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst result = await adapter.findMany<User & { session: Session[] }>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tjoin: { session: true },\n\t\t\t\toffset: 2,\n\t\t\t});\n\n\t\t\texpect(result.length).toBe(3);\n\t\t},\n\t\t\"findMany - should find many with join and sortBy\": async () => {\n\t\t\tlet n = -1;\n\t\t\tawait modifyBetterAuthOptions(\n\t\t\t\t{\n\t\t\t\t\tuser: {\n\t\t\t\t\t\tadditionalFields: {\n\t\t\t\t\t\t\tnumericField: {\n\t\t\t\t\t\t\t\ttype: \"number\",\n\t\t\t\t\t\t\t\tdefaultValue() {\n\t\t\t\t\t\t\t\t\treturn ++n;\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\ttrue,\n\t\t\t);\n\n\t\t\tconst users: (User & { numericField: number })[] = [];\n\t\t\tfor (let i = 0; i < 5; i++) {\n\t\t\t\tconst user = (await adapter.create({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: { ...(await generate(\"user\")) },\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t} as any)) as User & { numericField: number };\n\t\t\t\tusers.push(user);\n\n\t\t\t\tfor (let j = 0; j < 2; j++) {\n\t\t\t\t\tawait adapter.create<Session>({\n\t\t\t\t\t\tmodel: \"session\",\n\t\t\t\t\t\tdata: { ...(await generate(\"session\")), userId: user.id },\n\t\t\t\t\t\tforceAllowId: true,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst result = await adapter.findMany<\n\t\t\t\t(User & { session: Session[] }) & { numericField: number }\n\t\t\t>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tjoin: { session: true },\n\t\t\t\tsortBy: { field: \"numericField\", direction: \"desc\" },\n\t\t\t});\n\n\t\t\texpect(result[0]!.numericField).toBeGreaterThan(\n\t\t\t\tresult[result.length - 1]!.numericField,\n\t\t\t);\n\t\t\tresult.forEach((user) => {\n\t\t\t\texpect(user.session.length).toBeGreaterThan(0);\n\t\t\t});\n\t\t},\n\t\t\"findMany - should find many with join and where clause\": async () => {\n\t\t\tconst users: User[] = [];\n\n\t\t\tfor (let i = 0; i < 5; i++) {\n\t\t\t\tconst user = await adapter.create<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\t...(await generate(\"user\")),\n\t\t\t\t\t\tname: i < 2 ? `target-user-${i}` : `other-user-${i}`,\n\t\t\t\t\t},\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\t\t\t\tusers.push(user);\n\n\t\t\t\tfor (let j = 0; j < 2; j++) {\n\t\t\t\t\tawait adapter.create<Session>({\n\t\t\t\t\t\tmodel: \"session\",\n\t\t\t\t\t\tdata: { ...(await generate(\"session\")), userId: user.id },\n\t\t\t\t\t\tforceAllowId: true,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst result = await adapter.findMany<User & { session: Session[] }>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{ field: \"name\", value: \"target-user\", operator: \"starts_with\" },\n\t\t\t\t],\n\t\t\t\tjoin: { session: true },\n\t\t\t});\n\n\t\t\texpect(result).toHaveLength(2);\n\t\t\tresult.forEach((user) => {\n\t\t\t\texpect(user.name.startsWith(\"target-user\")).toBe(true);\n\t\t\t\texpect(user.session).toHaveLength(2);\n\t\t\t});\n\t\t},\n\t\t\"findMany - should find many with join, where, limit, and offset\":\n\t\t\tasync () => {\n\t\t\t\tconst users: User[] = [];\n\n\t\t\t\tfor (let i = 0; i < 10; i++) {\n\t\t\t\t\tconst user = await adapter.create<User>({\n\t\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t...(await generate(\"user\")),\n\t\t\t\t\t\t\tname: `target-${i.toString().padStart(2, \"0\")}`,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tforceAllowId: true,\n\t\t\t\t\t});\n\t\t\t\t\tusers.push(user);\n\n\t\t\t\t\tfor (let j = 0; j < 2; j++) {\n\t\t\t\t\t\tawait adapter.create<Session>({\n\t\t\t\t\t\t\tmodel: \"session\",\n\t\t\t\t\t\t\tdata: { ...(await generate(\"session\")), userId: user.id },\n\t\t\t\t\t\t\tforceAllowId: true,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst result = await adapter.findMany<User & { session: Session[] }>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\twhere: [{ field: \"name\", value: \"target\", operator: \"starts_with\" }],\n\t\t\t\t\tjoin: { session: true },\n\t\t\t\t\tlimit: 3,\n\t\t\t\t\toffset: 2,\n\t\t\t\t});\n\n\t\t\t\texpect(result).toHaveLength(3);\n\t\t\t\tresult.forEach((user) => {\n\t\t\t\t\texpect(user.session).toHaveLength(2);\n\t\t\t\t});\n\t\t\t},\n\t\t\"findMany - should find many with one-to-one join\": async () => {\n\t\t\tawait modifyBetterAuthOptions(\n\t\t\t\t{\n\t\t\t\t\tplugins: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"one-to-one-test\",\n\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\toneToOneTable: {\n\t\t\t\t\t\t\t\t\tfields: {\n\t\t\t\t\t\t\t\t\t\toneToOne: {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\t\t\t\t\treferences: { field: \"id\", model: \"user\" },\n\t\t\t\t\t\t\t\t\t\t\tunique: true,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t} satisfies BetterAuthPlugin,\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\ttrue,\n\t\t\t);\n\n\t\t\ttype OneToOneTable = { oneToOne: string; id: string };\n\t\t\tconst users = (await insertRandom(\"user\", 3)).map((x) => x[0]);\n\t\t\tconst oneToOneRecords: OneToOneTable[] = [];\n\n\t\t\tfor (const user of users) {\n\t\t\t\tconst record = await adapter.create<OneToOneTable>({\n\t\t\t\t\tmodel: \"oneToOneTable\",\n\t\t\t\t\tdata: { oneToOne: user.id },\n\t\t\t\t});\n\t\t\t\toneToOneRecords.push(record);\n\t\t\t}\n\n\t\t\tconst result = await adapter.findMany<\n\t\t\t\tUser & { oneToOneTable: OneToOneTable }\n\t\t\t>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tjoin: { oneToOneTable: true },\n\t\t\t});\n\n\t\t\tconst resultsWithJoin = result.filter((r) => r.oneToOneTable);\n\t\t\texpect(resultsWithJoin).toHaveLength(3);\n\t\t\tresultsWithJoin.forEach((user) => {\n\t\t\t\texpect(user.oneToOneTable).toBeDefined();\n\t\t\t\texpect(user.oneToOneTable.oneToOne).toBe(user.id);\n\t\t\t});\n\t\t},\n\t\t\"findMany - should find many with both one-to-one and one-to-many joins\":\n\t\t\tasync () => {\n\t\t\t\tawait modifyBetterAuthOptions(\n\t\t\t\t\t{\n\t\t\t\t\t\tplugins: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: \"one-to-one-test\",\n\t\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\t\toneToOneTable: {\n\t\t\t\t\t\t\t\t\t\tfields: {\n\t\t\t\t\t\t\t\t\t\t\toneToOne: {\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\t\t\t\t\t\treferences: { field: \"id\", model: \"user\" },\n\t\t\t\t\t\t\t\t\t\t\t\tunique: true,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t} satisfies BetterAuthPlugin,\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\n\t\t\t\ttype OneToOneTable = { oneToOne: string; id: string };\n\t\t\t\tconst users = (await insertRandom(\"user\", 2)).map((x) => x[0]);\n\n\t\t\t\tfor (const user of users) {\n\t\t\t\t\tawait adapter.create<OneToOneTable>({\n\t\t\t\t\t\tmodel: \"oneToOneTable\",\n\t\t\t\t\t\tdata: { oneToOne: user.id },\n\t\t\t\t\t});\n\n\t\t\t\t\tfor (let i = 0; i < 2; i++) {\n\t\t\t\t\t\tawait adapter.create<Session>({\n\t\t\t\t\t\t\tmodel: \"session\",\n\t\t\t\t\t\t\tdata: { ...(await generate(\"session\")), userId: user.id },\n\t\t\t\t\t\t\tforceAllowId: true,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst result = await adapter.findMany<\n\t\t\t\t\tUser & { oneToOneTable: OneToOneTable; session: Session[] }\n\t\t\t\t>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tjoin: { oneToOneTable: true, session: true },\n\t\t\t\t});\n\n\t\t\t\tconst resultsWithBothJoins = result.filter(\n\t\t\t\t\t(r) => r.oneToOneTable && r.session?.length > 0,\n\t\t\t\t);\n\t\t\t\texpect(resultsWithBothJoins.length).toBeGreaterThanOrEqual(2);\n\t\t\t\tresultsWithBothJoins.forEach((user) => {\n\t\t\t\t\texpect(user.oneToOneTable).toBeDefined();\n\t\t\t\t\texpect(Array.isArray(user.session)).toBe(true);\n\t\t\t\t\texpect(user.session.length).toBeGreaterThan(0);\n\t\t\t\t});\n\t\t\t},\n\t\t\"findMany - should return an empty array when no models are found\":\n\t\t\tasync () => {\n\t\t\t\tconst options = getBetterAuthOptions();\n\t\t\t\tconst useUUIDs = options.advanced?.database?.generateId === \"uuid\";\n\t\t\t\tconst result = await adapter.findMany<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t{ field: \"id\", value: useUUIDs ? crypto.randomUUID() : \"100000\" },\n\t\t\t\t\t],\n\t\t\t\t});\n\t\t\t\texpect(result).toEqual([]);\n\t\t\t},\n\t\t\"findMany - should return empty array when base records don't exist with joins\":\n\t\t\tasync () => {\n\t\t\t\tawait modifyBetterAuthOptions(\n\t\t\t\t\t{\n\t\t\t\t\t\tplugins: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: \"one-to-one-test\",\n\t\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\t\toneToOneTable: {\n\t\t\t\t\t\t\t\t\t\tfields: {\n\t\t\t\t\t\t\t\t\t\t\toneToOne: {\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\t\t\t\t\t\treferences: { field: \"id\", model: \"user\" },\n\t\t\t\t\t\t\t\t\t\t\t\tunique: true,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t} satisfies BetterAuthPlugin,\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t\tconst options = getBetterAuthOptions();\n\t\t\t\tconst useUUIDs = options.advanced?.database?.generateId === \"uuid\";\n\t\t\t\tconst result = await adapter.findMany<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t{ field: \"id\", value: useUUIDs ? crypto.randomUUID() : \"100000\" },\n\t\t\t\t\t],\n\t\t\t\t\tjoin: { session: true, account: true, oneToOneTable: true },\n\t\t\t\t});\n\t\t\t\texpect(result).toEqual([]);\n\t\t\t},\n\t\t\"findMany - should find many models with starts_with operator\":\n\t\t\tasync () => {\n\t\t\t\tconst users = (await insertRandom(\"user\", 3)).map((x) => x[0]);\n\t\t\t\tconst result = await adapter.findMany<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\twhere: [{ field: \"name\", value: \"user\", operator: \"starts_with\" }],\n\t\t\t\t});\n\t\t\t\texpect(sortModels(result)).toEqual(sortModels(users));\n\t\t\t},\n\t\t\"findMany - starts_with should not interpret regex patterns\": async () => {\n\t\t\t// Create a user whose name literally starts with the regex-like prefix\n\t\t\tconst userTemplate = await generate(\"user\");\n\t\t\tconst literalRegexUser = await adapter.create<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\t...userTemplate,\n\t\t\t\t\tname: \".*danger\",\n\t\t\t\t},\n\t\t\t\tforceAllowId: true,\n\t\t\t});\n\n\t\t\t// Also create some normal users that do NOT start with \".*\"\n\t\t\tawait insertRandom(\"user\", 3);\n\n\t\t\tconst result = await adapter.findMany<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [{ field: \"name\", value: \".*\", operator: \"starts_with\" }],\n\t\t\t});\n\n\t\t\t// Should only match the literal \".*\" prefix, not treat it as a regex matching everything\n\t\t\texpect(result.length).toBe(1);\n\t\t\texpect(result[0]!.id).toBe(literalRegexUser.id);\n\t\t\texpect(result[0]!.name.startsWith(\".*\")).toBe(true);\n\t\t},\n\t\t\"findMany - ends_with should not interpret regex patterns\": async () => {\n\t\t\t// Create a user whose name literally ends with the regex-like suffix\n\t\t\tconst userTemplate = await generate(\"user\");\n\t\t\tconst literalRegexUser = await adapter.create<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\t...userTemplate,\n\t\t\t\t\tname: \"danger.*\",\n\t\t\t\t},\n\t\t\t\tforceAllowId: true,\n\t\t\t});\n\n\t\t\t// Also create some normal users that do NOT end with \".*\"\n\t\t\tawait insertRandom(\"user\", 3);\n\n\t\t\tconst result = await adapter.findMany<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [{ field: \"name\", value: \".*\", operator: \"ends_with\" }],\n\t\t\t});\n\n\t\t\t// Should only match the literal \".*\" suffix, not treat it as a regex matching everything\n\t\t\texpect(result.length).toBe(1);\n\t\t\texpect(result[0]!.id).toBe(literalRegexUser.id);\n\t\t\texpect(result[0]!.name.endsWith(\".*\")).toBe(true);\n\t\t},\n\t\t\"findMany - contains should not interpret regex patterns\": async () => {\n\t\t\t// Create a user whose name literally contains the regex-like pattern\n\t\t\tconst userTemplate = await generate(\"user\");\n\t\t\tconst literalRegexUser = await adapter.create<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\t...userTemplate,\n\t\t\t\t\tname: \"prefix-.*-suffix\",\n\t\t\t\t},\n\t\t\t\tforceAllowId: true,\n\t\t\t});\n\n\t\t\t// Also create some normal users that do NOT contain \".*\"\n\t\t\tawait insertRandom(\"user\", 3);\n\n\t\t\tconst result = await adapter.findMany<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [{ field: \"name\", value: \".*\", operator: \"contains\" }],\n\t\t\t});\n\n\t\t\t// Should only match the literal substring \".*\", not treat it as a regex matching everything\n\t\t\texpect(result.length).toBe(1);\n\t\t\texpect(result[0]!.id).toBe(literalRegexUser.id);\n\t\t\texpect(result[0]!.name.includes(\".*\")).toBe(true);\n\t\t},\n\t\t\"findMany - should find many models with ends_with operator\": async () => {\n\t\t\tconst users = (await insertRandom(\"user\", 3)).map((x) => x[0]);\n\t\t\tfor (const user of users) {\n\t\t\t\tconst res = await adapter.update<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\twhere: [{ field: \"id\", value: user.id }],\n\t\t\t\t\tupdate: { name: user.name.toLowerCase() }, // make name lowercase\n\t\t\t\t});\n\t\t\t\tif (!res) throw new Error(\"No result\");\n\t\t\t\tconst u = users.find((u) => u.id === user.id)!;\n\t\t\t\tu.name = res.name;\n\t\t\t\tu.updatedAt = res.updatedAt;\n\t\t\t}\n\t\t\tconst ends_with = users[0]!.name.slice(-1);\n\t\t\tconst result = await adapter.findMany<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"name\",\n\t\t\t\t\t\tvalue: ends_with,\n\t\t\t\t\t\toperator: \"ends_with\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\tconst expectedResult = sortModels(\n\t\t\t\tusers.filter((user) => user.name.endsWith(ends_with)),\n\t\t\t);\n\t\t\tif (result.length !== expectedResult.length) {\n\t\t\t\tconsole.log(`Result length: ${result.length}`);\n\t\t\t\tconsole.log(sortModels(result));\n\t\t\t\tconsole.log(\"--------------------------------\");\n\t\t\t\tconsole.log(\n\t\t\t\t\t`Expected result length: ${expectedResult.length} - key: ${JSON.stringify(ends_with)}`,\n\t\t\t\t);\n\t\t\t\tconsole.log(expectedResult);\n\t\t\t}\n\t\t\texpect(sortModels(result)).toEqual(expectedResult);\n\t\t},\n\t\t\"findMany - should find many models with contains operator\": async () => {\n\t\t\tconst users = (await insertRandom(\"user\", 3)).map((x) => x[0]);\n\n\t\t\t// if this check fails, the test will fail.\n\t\t\t// insertRandom needs to generate emails that contain `@email.com`\n\t\t\texpect(users[0]!.email).toContain(\"@email.com\");\n\n\t\t\tconst result = await adapter.findMany<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"email\",\n\t\t\t\t\t\tvalue: \"mail\", // all emails contains `@email.com` from `insertRandom`\n\t\t\t\t\t\toperator: \"contains\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(sortModels(result)).toEqual(sortModels(users));\n\t\t},\n\t\t\"findMany - should handle multiple where conditions with different operators\":\n\t\t\tasync () => {\n\t\t\t\tconst testData = [\n\t\t\t\t\t{ name: \"john doe\", email: \"john@example.com\" },\n\t\t\t\t\t{ name: \"jane smith\", email: \"jane@gmail.com\" },\n\t\t\t\t];\n\n\t\t\t\tconst createdUsers: User[] = [];\n\t\t\t\tfor (const data of testData) {\n\t\t\t\t\tconst user = await adapter.create({\n\t\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t...generate(\"user\"),\n\t\t\t\t\t\t\t...data,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tforceAllowId: true,\n\t\t\t\t\t});\n\t\t\t\t\tcreatedUsers.push(user as User);\n\t\t\t\t}\n\n\t\t\t\tconst result = await adapter.findMany<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfield: \"email\",\n\t\t\t\t\t\t\tvalue: \"john@example.com\",\n\t\t\t\t\t\t\toperator: \"eq\",\n\t\t\t\t\t\t\tconnector: \"AND\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfield: \"name\",\n\t\t\t\t\t\t\tvalue: \"john\",\n\t\t\t\t\t\t\toperator: \"contains\",\n\t\t\t\t\t\t\tconnector: \"AND\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t});\n\t\t\t\texpect(result.length).toBe(1);\n\t\t\t\texpect(result[0]!.email).toBe(\"john@example.com\");\n\t\t\t\texpect(result[0]!.name).toBe(\"john doe\");\n\n\t\t\t\tconst result2 = await adapter.findMany<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfield: \"email\",\n\t\t\t\t\t\t\tvalue: \"gmail\",\n\t\t\t\t\t\t\toperator: \"contains\",\n\t\t\t\t\t\t\tconnector: \"AND\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfield: \"name\",\n\t\t\t\t\t\t\tvalue: \"jane\",\n\t\t\t\t\t\t\toperator: \"contains\",\n\t\t\t\t\t\t\tconnector: \"AND\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t});\n\n\t\t\t\texpect(result2.length).toBe(1);\n\t\t\t\texpect(result2[0]!.email).toBe(\"jane@gmail.com\");\n\t\t\t\texpect(result2[0]!.name).toBe(\"jane smith\");\n\n\t\t\t\tconst result3 = await adapter.findMany<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfield: \"email\",\n\t\t\t\t\t\t\tvalue: \"john\",\n\t\t\t\t\t\t\toperator: \"starts_with\",\n\t\t\t\t\t\t\tconnector: \"AND\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfield: \"name\",\n\t\t\t\t\t\t\tvalue: \"john\",\n\t\t\t\t\t\t\toperator: \"contains\",\n\t\t\t\t\t\t\tconnector: \"AND\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t});\n\n\t\t\t\texpect(result3.length).toBe(1);\n\t\t\t\texpect(result3[0]!.email).toBe(\"john@example.com\");\n\t\t\t\texpect(result3[0]!.name).toBe(\"john doe\");\n\t\t\t},\n\t\t\"findMany - should find many models with contains operator (using symbol)\":\n\t\t\tasync () => {\n\t\t\t\tconst users = (await insertRandom(\"user\", 3)).map((x) => x[0]);\n\t\t\t\tconst result = await adapter.findMany<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\twhere: [{ field: \"email\", value: \"@\", operator: \"contains\" }],\n\t\t\t\t});\n\t\t\t\texpect(sortModels(result)).toEqual(sortModels(users));\n\t\t\t},\n\t\t\"findMany - should find many models with eq operator\": async () => {\n\t\t\tconst users = (await insertRandom(\"user\", 3)).map((x) => x[0]);\n\t\t\tconst result = await adapter.findMany<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [{ field: \"email\", value: users[0]!.email, operator: \"eq\" }],\n\t\t\t});\n\t\t\texpect(sortModels(result)).toEqual(sortModels([users[0]!]));\n\t\t},\n\t\t\"findMany - should find many models with ne operator\": async () => {\n\t\t\tconst users = (await insertRandom(\"user\", 3)).map((x) => x[0]);\n\t\t\tconst result = await adapter.findMany<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [{ field: \"email\", value: users[0]!.email, operator: \"ne\" }],\n\t\t\t});\n\t\t\texpect(sortModels(result)).toEqual(sortModels(users.slice(1)));\n\t\t},\n\t\t\"findMany - should find many models with gt operator\": async () => {\n\t\t\tconst users = (await insertRandom(\"user\", 3)).map((x) => x[0]);\n\t\t\tconst oldestUser = users.sort(\n\t\t\t\t(a, b) => a.createdAt.getTime() - b.createdAt.getTime(),\n\t\t\t)[0]!;\n\t\t\tconst result = await adapter.findMany<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"createdAt\",\n\t\t\t\t\t\tvalue: oldestUser.createdAt,\n\t\t\t\t\t\toperator: \"gt\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\tconst expectedResult = sortModels(\n\t\t\t\tusers.filter((user) => user.createdAt > oldestUser.createdAt),\n\t\t\t);\n\t\t\texpect(result.length).not.toBe(0);\n\t\t\texpect(sortModels(result)).toEqual(expectedResult);\n\t\t},\n\t\t\"findMany - should find many models with gte operator\": async () => {\n\t\t\tconst users = (await insertRandom(\"user\", 3)).map((x) => x[0]);\n\t\t\tconst oldestUser = users.sort(\n\t\t\t\t(a, b) => b.createdAt.getTime() - a.createdAt.getTime(),\n\t\t\t)[0]!;\n\t\t\tconst result = await adapter.findMany<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"createdAt\",\n\t\t\t\t\t\tvalue: oldestUser.createdAt,\n\t\t\t\t\t\toperator: \"gte\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\tconst expectedResult = users.filter(\n\t\t\t\t(user) => user.createdAt >= oldestUser.createdAt,\n\t\t\t);\n\t\t\texpect(result.length).not.toBe(0);\n\t\t\texpect(sortModels(result)).toEqual(sortModels(expectedResult));\n\t\t},\n\t\t\"findMany - should find many models with lte operator\": async () => {\n\t\t\tconst users = (await insertRandom(\"user\", 3)).map((x) => x[0]);\n\t\t\tconst result = await adapter.findMany<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{ field: \"createdAt\", value: users[0]!.createdAt, operator: \"lte\" },\n\t\t\t\t],\n\t\t\t});\n\t\t\tconst expectedResult = users.filter(\n\t\t\t\t(user) => user.createdAt <= users[0]!.createdAt,\n\t\t\t);\n\t\t\texpect(sortModels(result)).toEqual(sortModels(expectedResult));\n\t\t},\n\t\t\"findMany - should find many models with lt operator\": async () => {\n\t\t\tconst users = (await insertRandom(\"user\", 3)).map((x) => x[0]);\n\t\t\tconst result = await adapter.findMany<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{ field: \"createdAt\", value: users[0]!.createdAt, operator: \"lt\" },\n\t\t\t\t],\n\t\t\t});\n\t\t\tconst expectedResult = users.filter(\n\t\t\t\t(user) => user.createdAt < users[0]!.createdAt,\n\t\t\t);\n\t\t\texpect(sortModels(result)).toEqual(sortModels(expectedResult));\n\t\t},\n\t\t\"findMany - should find many models with in operator\": async () => {\n\t\t\tconst users = (await insertRandom(\"user\", 3)).map((x) => x[0]);\n\t\t\tconst result = await adapter.findMany<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tvalue: [users[0]!.id, users[1]!.id],\n\t\t\t\t\t\toperator: \"in\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\tconst expectedResult = users.filter(\n\t\t\t\t(user) => user.id === users[0]!.id || user.id === users[1]!.id,\n\t\t\t);\n\t\t\texpect(sortModels(result)).toEqual(sortModels(expectedResult));\n\t\t},\n\t\t\"findMany - should find many models with not_in operator\": async () => {\n\t\t\tconst users = (await insertRandom(\"user\", 3)).map((x) => x[0]);\n\t\t\tconst result = await adapter.findMany<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tvalue: [users[0]!.id, users[1]!.id],\n\t\t\t\t\t\toperator: \"not_in\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(sortModels(result)).toEqual([users[2]]);\n\t\t},\n\t\t\"findMany - should find many models with sortBy\": async () => {\n\t\t\tlet n = -1;\n\t\t\tawait modifyBetterAuthOptions(\n\t\t\t\t{\n\t\t\t\t\tuser: {\n\t\t\t\t\t\tadditionalFields: {\n\t\t\t\t\t\t\tnumericField: {\n\t\t\t\t\t\t\t\ttype: \"number\",\n\t\t\t\t\t\t\t\tdefaultValue() {\n\t\t\t\t\t\t\t\t\treturn n++;\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\ttrue,\n\t\t\t);\n\t\t\tconst users = (await insertRandom(\"user\", 5)).map(\n\t\t\t\t(x) => x[0],\n\t\t\t) as (User & { numericField: number })[];\n\t\t\tconst result = await adapter.findMany<User & { numericField: number }>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tsortBy: { field: \"numericField\", direction: \"asc\" },\n\t\t\t});\n\t\t\tconst expectedResult = users\n\t\t\t\t.map((x) => x.numericField)\n\t\t\t\t.sort((a, b) => a - b);\n\t\t\ttry {\n\t\t\t\texpect(result.map((x) => x.numericField)).toEqual(expectedResult);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.log(`--------------------------------`);\n\t\t\t\tconsole.log(`result:`);\n\t\t\t\tconsole.log(result.map((x) => x.id));\n\t\t\t\tconsole.log(`expected result:`);\n\t\t\t\tconsole.log(expectedResult);\n\t\t\t\tconsole.log(`--------------------------------`);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tconst options = getBetterAuthOptions();\n\t\t\tif (options.advanced?.database?.generateId === \"serial\") {\n\t\t\t\texpect(Number(users[0]!.id)).not.toBeNaN();\n\t\t\t}\n\t\t},\n\t\t\"findMany - should find many models with limit\": async () => {\n\t\t\tconst users = (await insertRandom(\"user\", 3)).map((x) => x[0]);\n\t\t\tconst result = await adapter.findMany<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tlimit: 2,\n\t\t\t});\n\t\t\texpect(result.length).toEqual(2);\n\t\t\texpect(users.find((x) => x.id === result[0]!.id)).not.toBeNull();\n\t\t},\n\t\t\"findMany - should find many models with offset\": async () => {\n\t\t\t// Note: The returned rows are ordered in no particular order\n\t\t\t// This is because databases return rows in whatever order is fastest for the query.\n\t\t\tconst count = 10;\n\t\t\tawait insertRandom(\"user\", count);\n\t\t\tconst result = await adapter.findMany<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\toffset: 2,\n\t\t\t});\n\t\t\texpect(result.length).toEqual(count - 2);\n\t\t},\n\t\t\"findMany - should find many models with limit and offset\": async () => {\n\t\t\t// Note: The returned rows are ordered in no particular order\n\t\t\t// This is because databases return rows in whatever order is fastest for the query.\n\t\t\tconst count = 5;\n\t\t\tawait insertRandom(\"user\", count);\n\t\t\tconst result = await adapter.findMany<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tlimit: 2,\n\t\t\t\toffset: 2,\n\t\t\t});\n\t\t\texpect(result.length).toEqual(2);\n\t\t\texpect(result).toBeInstanceOf(Array);\n\t\t\tresult.forEach((user) => {\n\t\t\t\texpect(user).toHaveProperty(\"id\");\n\t\t\t\texpect(user).toHaveProperty(\"name\");\n\t\t\t\texpect(user).toHaveProperty(\"email\");\n\t\t\t});\n\t\t},\n\t\t\"findMany - should find many models with sortBy and offset\": async () => {\n\t\t\tlet n = -1;\n\t\t\tawait modifyBetterAuthOptions(\n\t\t\t\t{\n\t\t\t\t\tuser: {\n\t\t\t\t\t\tadditionalFields: {\n\t\t\t\t\t\t\tnumericField: {\n\t\t\t\t\t\t\t\ttype: \"number\",\n\t\t\t\t\t\t\t\tdefaultValue() {\n\t\t\t\t\t\t\t\t\treturn n++;\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\ttrue,\n\t\t\t);\n\t\t\tconst users = (await insertRandom(\"user\", 5)).map(\n\t\t\t\t(x) => x[0],\n\t\t\t) as (User & { numericField: number })[];\n\t\t\tconst result = await adapter.findMany<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tsortBy: { field: \"numericField\", direction: \"asc\" },\n\t\t\t\toffset: 2,\n\t\t\t});\n\t\t\texpect(result).toHaveLength(3);\n\t\t\texpect(result).toEqual(\n\t\t\t\tusers.sort((a, b) => a.numericField - b.numericField).slice(2),\n\t\t\t);\n\t\t},\n\t\t\"findMany - should find many models with sortBy and limit\": async () => {\n\t\t\tlet n = -1;\n\t\t\tawait modifyBetterAuthOptions(\n\t\t\t\t{\n\t\t\t\t\tuser: {\n\t\t\t\t\t\tadditionalFields: {\n\t\t\t\t\t\t\tnumericField: {\n\t\t\t\t\t\t\t\ttype: \"number\",\n\t\t\t\t\t\t\t\tdefaultValue() {\n\t\t\t\t\t\t\t\t\treturn n++;\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\ttrue,\n\t\t\t);\n\t\t\tconst users = (await insertRandom(\"user\", 5)).map(\n\t\t\t\t(x) => x[0],\n\t\t\t) as (User & { numericField: number })[];\n\t\t\tconst result = await adapter.findMany<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tsortBy: { field: \"numericField\", direction: \"asc\" },\n\t\t\t\tlimit: 2,\n\t\t\t});\n\t\t\texpect(result).toEqual(\n\t\t\t\tusers.sort((a, b) => a.numericField - b.numericField).slice(0, 2),\n\t\t\t);\n\t\t},\n\t\t\"findMany - should find many models with sortBy and limit and offset\":\n\t\t\tasync () => {\n\t\t\t\tlet n = -1;\n\t\t\t\tawait modifyBetterAuthOptions(\n\t\t\t\t\t{\n\t\t\t\t\t\tuser: {\n\t\t\t\t\t\t\tadditionalFields: {\n\t\t\t\t\t\t\t\tnumericField: {\n\t\t\t\t\t\t\t\t\ttype: \"number\",\n\t\t\t\t\t\t\t\t\tdefaultValue() {\n\t\t\t\t\t\t\t\t\t\treturn n++;\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t\tconst users = (await insertRandom(\"user\", 5)).map(\n\t\t\t\t\t(x) => x[0],\n\t\t\t\t) as (User & { numericField: number })[];\n\t\t\t\tconst result = await adapter.findMany<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tsortBy: { field: \"numericField\", direction: \"asc\" },\n\t\t\t\t\tlimit: 2,\n\t\t\t\t\toffset: 2,\n\t\t\t\t});\n\t\t\t\texpect(result.length).toBe(2);\n\t\t\t\texpect(result).toEqual(\n\t\t\t\t\tusers.sort((a, b) => a.numericField - b.numericField).slice(2, 4),\n\t\t\t\t);\n\t\t\t},\n\t\t\"findMany - should find many models with sortBy and limit and offset and where\":\n\t\t\tasync () => {\n\t\t\t\tlet n = -1;\n\t\t\t\tawait modifyBetterAuthOptions(\n\t\t\t\t\t{\n\t\t\t\t\t\tuser: {\n\t\t\t\t\t\t\tadditionalFields: {\n\t\t\t\t\t\t\t\tnumericField: {\n\t\t\t\t\t\t\t\t\ttype: \"number\",\n\t\t\t\t\t\t\t\t\tdefaultValue() {\n\t\t\t\t\t\t\t\t\t\treturn n++;\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t\tconst users = (await insertRandom(\"user\", 10)).map(\n\t\t\t\t\t(x) => x[0],\n\t\t\t\t) as (User & { numericField: number })[];\n\n\t\t\t\t// update the last three users to end with \"last\"\n\t\t\t\tlet i = -1;\n\t\t\t\tfor (const user of users) {\n\t\t\t\t\ti++;\n\t\t\t\t\tif (i < 5) continue;\n\t\t\t\t\tconst result = await adapter.update<User>({\n\t\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\t\twhere: [{ field: \"id\", value: user.id }],\n\t\t\t\t\t\tupdate: { name: user.name + \"-last\" },\n\t\t\t\t\t});\n\t\t\t\t\tif (!result) throw new Error(\"No result\");\n\t\t\t\t\tusers[i]!.name = result.name;\n\t\t\t\t\tusers[i]!.updatedAt = result.updatedAt;\n\t\t\t\t}\n\n\t\t\t\tconst result = await adapter.findMany<User & { numericField: number }>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tsortBy: { field: \"numericField\", direction: \"asc\" },\n\t\t\t\t\tlimit: 2,\n\t\t\t\t\toffset: 2,\n\t\t\t\t\twhere: [{ field: \"name\", value: \"last\", operator: \"ends_with\" }],\n\t\t\t\t});\n\n\t\t\t\t// Order of operation for most DBs:\n\t\t\t\t// FROM → WHERE → SORT BY → OFFSET → LIMIT\n\n\t\t\t\tlet expectedResult: any[] = [];\n\t\t\t\texpectedResult = users\n\t\t\t\t\t.filter((user) => user.name.endsWith(\"last\"))\n\t\t\t\t\t.sort((a, b) => a.numericField - b.numericField)\n\t\t\t\t\t.slice(2, 4);\n\n\t\t\t\ttry {\n\t\t\t\t\texpect(result.length).toBe(2);\n\t\t\t\t\texpect(result).toEqual(expectedResult);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.log(`--------------------------------`);\n\t\t\t\t\tconsole.log(`results:`);\n\t\t\t\t\tconsole.log(result.map((x) => x.id));\n\t\t\t\t\tconsole.log(`expected results, sorted:`);\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\tusers\n\t\t\t\t\t\t\t.filter((x) => x.name.toString().endsWith(\"last\"))\n\t\t\t\t\t\t\t.map((x) => x.numericField)\n\t\t\t\t\t\t\t.sort((a, b) => a - b),\n\t\t\t\t\t);\n\t\t\t\t\tconsole.log(`expected results, sorted + offset:`);\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\tusers\n\t\t\t\t\t\t\t.filter((x) => x.name.toString().endsWith(\"last\"))\n\t\t\t\t\t\t\t.map((x) => x.numericField)\n\t\t\t\t\t\t\t.sort((a, b) => a - b)\n\t\t\t\t\t\t\t.slice(2, 4),\n\t\t\t\t\t);\n\t\t\t\t\tconsole.log(`--------------------------------`);\n\t\t\t\t\tconsole.log(\"FAIL\", error);\n\t\t\t\t\tconsole.log(`--------------------------------`);\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t},\n\t\t\"update - should update a model\": async () => {\n\t\t\tconst [user] = await insertRandom(\"user\");\n\t\t\tconst result = await adapter.update<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [{ field: \"id\", value: user.id }],\n\t\t\t\tupdate: { name: \"test-name\" },\n\t\t\t});\n\t\t\tconst expectedResult = {\n\t\t\t\t...user,\n\t\t\t\tname: \"test-name\",\n\t\t\t};\n\t\t\t// because of `onUpdate` hook, the updatedAt field will be different\n\t\t\tresult!.updatedAt = user.updatedAt;\n\t\t\texpect(result).toEqual(expectedResult);\n\t\t\tconst findResult = await adapter.findOne<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [{ field: \"id\", value: user.id }],\n\t\t\t});\n\t\t\t// because of `onUpdate` hook, the updatedAt field will be different\n\t\t\tfindResult!.updatedAt = user.updatedAt;\n\t\t\texpect(findResult).toEqual(expectedResult);\n\t\t},\n\t\t\"updateMany - should update all models when where is empty\": async () => {\n\t\t\tconst users = (await insertRandom(\"user\", 3)).map((x) => x[0]);\n\t\t\tawait adapter.updateMany({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [],\n\t\t\t\tupdate: { name: \"test-name\" },\n\t\t\t});\n\t\t\tconst result = await adapter.findMany<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t});\n\t\t\texpect(sortModels(result)).toEqual(\n\t\t\t\tsortModels(users).map((user, i) => ({\n\t\t\t\t\t...user,\n\t\t\t\t\tname: \"test-name\",\n\t\t\t\t\tupdatedAt: sortModels(result)[i]!.updatedAt,\n\t\t\t\t})),\n\t\t\t);\n\t\t},\n\t\t\"updateMany - should update many models with a specific where\":\n\t\t\tasync () => {\n\t\t\t\tconst users = (await insertRandom(\"user\", 3)).map((x) => x[0]);\n\t\t\t\tawait adapter.updateMany({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\twhere: [{ field: \"id\", value: users[0]!.id }],\n\t\t\t\t\tupdate: { name: \"test-name\" },\n\t\t\t\t});\n\t\t\t\tconst result = await adapter.findOne<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\twhere: [{ field: \"id\", value: users[0]!.id }],\n\t\t\t\t});\n\t\t\t\texpect(result).toEqual({\n\t\t\t\t\t...users[0],\n\t\t\t\t\tname: \"test-name\",\n\t\t\t\t\tupdatedAt: result!.updatedAt,\n\t\t\t\t});\n\t\t\t},\n\t\t\"updateMany - should update many models with a multiple where\":\n\t\t\tasync () => {\n\t\t\t\tconst users = (await insertRandom(\"user\", 3)).map((x) => x[0]);\n\t\t\t\tawait adapter.updateMany({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t{ field: \"id\", value: users[0]!.id, connector: \"OR\" },\n\t\t\t\t\t\t{ field: \"id\", value: users[1]!.id, connector: \"OR\" },\n\t\t\t\t\t],\n\t\t\t\t\tupdate: { name: \"test-name\" },\n\t\t\t\t});\n\t\t\t\tconst result = await adapter.findOne<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\twhere: [{ field: \"id\", value: users[0]!.id }],\n\t\t\t\t});\n\t\t\t\texpect(result).toEqual({\n\t\t\t\t\t...users[0],\n\t\t\t\t\tname: \"test-name\",\n\t\t\t\t\tupdatedAt: result!.updatedAt,\n\t\t\t\t});\n\t\t\t},\n\t\t\"delete - should delete a model\": async () => {\n\t\t\tconst [user] = await insertRandom(\"user\");\n\t\t\tawait adapter.delete({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [{ field: \"id\", value: user.id }],\n\t\t\t});\n\t\t\tconst result = await adapter.findOne<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [{ field: \"id\", value: user.id }],\n\t\t\t});\n\t\t\texpect(result).toBeNull();\n\t\t},\n\t\t\"delete - should not throw on record not found\": async () => {\n\t\t\tconst options = getBetterAuthOptions();\n\t\t\tconst useUUIDs = options.advanced?.database?.generateId === \"uuid\";\n\t\t\tawait expect(\n\t\t\t\tadapter.delete({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t{ field: \"id\", value: useUUIDs ? crypto.randomUUID() : \"100000\" },\n\t\t\t\t\t],\n\t\t\t\t}),\n\t\t\t).resolves.not.toThrow();\n\t\t},\n\t\t/**\n\t\t * @see https://github.com/better-auth/better-auth/issues/8313\n\t\t */\n\t\t\"delete - should delete by non-unique field\": async () => {\n\t\t\tconst [verification] = await insertRandom(\"verification\");\n\t\t\tawait adapter.delete<Verification>({\n\t\t\t\tmodel: \"verification\",\n\t\t\t\twhere: [{ field: \"identifier\", value: verification.identifier }],\n\t\t\t});\n\t\t\tconst result = await adapter.findOne<Verification>({\n\t\t\t\tmodel: \"verification\",\n\t\t\t\twhere: [{ field: \"identifier\", value: verification.identifier }],\n\t\t\t});\n\t\t\texpect(result).toBeNull();\n\t\t},\n\t\t\"deleteMany - should delete many models\": async () => {\n\t\t\tconst users = (await insertRandom(\"user\", 3)).map((x) => x[0]);\n\t\t\tawait adapter.deleteMany({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{ field: \"id\", value: users[0]!.id, connector: \"OR\" },\n\t\t\t\t\t{ field: \"id\", value: users[1]!.id, connector: \"OR\" },\n\t\t\t\t],\n\t\t\t});\n\t\t\tconst result = await adapter.findMany<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t});\n\t\t\texpect(sortModels(result)).toEqual(sortModels(users.slice(2)));\n\t\t},\n\t\t\"deleteMany - starts_with should not interpret regex patterns\":\n\t\t\tasync () => {\n\t\t\t\t// Create a user whose name literally starts with the regex-like prefix\n\t\t\t\tconst userTemplate = await generate(\"user\");\n\t\t\t\tconst literalRegexUser = await adapter.create<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\t...userTemplate,\n\t\t\t\t\t\tname: \".*danger\",\n\t\t\t\t\t},\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\n\t\t\t\t// Also create some normal users that do NOT start with \".*\"\n\t\t\t\tconst normalUsers = (await insertRandom(\"user\", 3)).map((x) => x[0]);\n\n\t\t\t\tawait adapter.deleteMany({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\twhere: [{ field: \"name\", value: \".*\", operator: \"starts_with\" }],\n\t\t\t\t});\n\n\t\t\t\t// The literal \".*danger\" user should be deleted\n\t\t\t\tconst deleted = await adapter.findOne<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\twhere: [{ field: \"id\", value: literalRegexUser.id }],\n\t\t\t\t});\n\t\t\t\texpect(deleted).toBeNull();\n\n\t\t\t\t// Normal users should remain\n\t\t\t\tfor (const user of normalUsers) {\n\t\t\t\t\tconst stillThere = await adapter.findOne<User>({\n\t\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\t\twhere: [{ field: \"id\", value: user.id }],\n\t\t\t\t\t});\n\t\t\t\t\texpect(stillThere).not.toBeNull();\n\t\t\t\t}\n\t\t\t},\n\t\t\"deleteMany - ends_with should not interpret regex patterns\": async () => {\n\t\t\t// Create a user whose name literally ends with the regex-like suffix\n\t\t\tconst userTemplate = await generate(\"user\");\n\t\t\tconst literalRegexUser = await adapter.create<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\t...userTemplate,\n\t\t\t\t\tname: \"danger.*\",\n\t\t\t\t},\n\t\t\t\tforceAllowId: true,\n\t\t\t});\n\n\t\t\tconst normalUsers = (await insertRandom(\"user\", 3)).map((x) => x[0]);\n\n\t\t\tawait adapter.deleteMany({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [{ field: \"name\", value: \".*\", operator: \"ends_with\" }],\n\t\t\t});\n\n\t\t\tconst deleted = await adapter.findOne<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [{ field: \"id\", value: literalRegexUser.id }],\n\t\t\t});\n\t\t\texpect(deleted).toBeNull();\n\n\t\t\tfor (const user of normalUsers) {\n\t\t\t\tconst stillThere = await adapter.findOne<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\twhere: [{ field: \"id\", value: user.id }],\n\t\t\t\t});\n\t\t\t\texpect(stillThere).not.toBeNull();\n\t\t\t}\n\t\t},\n\t\t\"deleteMany - contains should not interpret regex patterns\": async () => {\n\t\t\t// Create a user whose name literally contains the regex-like pattern\n\t\t\tconst userTemplate = await generate(\"user\");\n\t\t\tconst literalRegexUser = await adapter.create<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\t...userTemplate,\n\t\t\t\t\tname: \"prefix-.*-suffix\",\n\t\t\t\t},\n\t\t\t\tforceAllowId: true,\n\t\t\t});\n\n\t\t\tconst normalUsers = (await insertRandom(\"user\", 3)).map((x) => x[0]);\n\n\t\t\tawait adapter.deleteMany({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [{ field: \"name\", value: \".*\", operator: \"contains\" }],\n\t\t\t});\n\n\t\t\tconst deleted = await adapter.findOne<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [{ field: \"id\", value: literalRegexUser.id }],\n\t\t\t});\n\t\t\texpect(deleted).toBeNull();\n\n\t\t\tfor (const user of normalUsers) {\n\t\t\t\tconst stillThere = await adapter.findOne<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\twhere: [{ field: \"id\", value: user.id }],\n\t\t\t\t});\n\t\t\t\texpect(stillThere).not.toBeNull();\n\t\t\t}\n\t\t},\n\t\t\"deleteMany - should delete many models with numeric values\": async () => {\n\t\t\tlet i = 0;\n\t\t\tawait modifyBetterAuthOptions(\n\t\t\t\t{\n\t\t\t\t\tuser: {\n\t\t\t\t\t\tadditionalFields: {\n\t\t\t\t\t\t\tnumericField: {\n\t\t\t\t\t\t\t\ttype: \"number\",\n\t\t\t\t\t\t\t\tdefaultValue() {\n\t\t\t\t\t\t\t\t\treturn i++;\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\ttrue,\n\t\t\t);\n\t\t\tconst users = (await insertRandom(\"user\", 3)).map(\n\t\t\t\t(x) => x[0],\n\t\t\t) as (User & { numericField: number })[];\n\t\t\tif (!users[0] || !users[1] || !users[2]) {\n\t\t\t\texpect(false).toBe(true);\n\t\t\t\tthrow new Error(\"Users not found\");\n\t\t\t}\n\t\t\texpect(users[0].numericField).toEqual(0);\n\t\t\texpect(users[1].numericField).toEqual(1);\n\t\t\texpect(users[2].numericField).toEqual(2);\n\n\t\t\tawait adapter.deleteMany({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"numericField\",\n\t\t\t\t\t\tvalue: users[0].numericField,\n\t\t\t\t\t\toperator: \"gt\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\n\t\t\tconst result = await adapter.findMany<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t});\n\t\t\texpect(result).toEqual([users[0]]);\n\t\t},\n\t\t\"deleteMany - should delete many models with boolean values\": async () => {\n\t\t\tconst users = (await insertRandom(\"user\", 3)).map((x) => x[0]);\n\t\t\t// in this test, we have 3 users, two of which have emailVerified set to true and one to false\n\t\t\t// delete all that has emailVerified set to true, and expect users[1] to be the only one left\n\t\t\tif (!users[0] || !users[1] || !users[2]) {\n\t\t\t\texpect(false).toBe(true);\n\t\t\t\tthrow new Error(\"Users not found\");\n\t\t\t}\n\t\t\tawait adapter.updateMany({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [],\n\t\t\t\tupdate: { emailVerified: true },\n\t\t\t});\n\t\t\tawait adapter.update({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [{ field: \"id\", value: users[1].id }],\n\t\t\t\tupdate: { emailVerified: false },\n\t\t\t});\n\t\t\tawait adapter.deleteMany({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [{ field: \"emailVerified\", value: true }],\n\t\t\t});\n\t\t\tconst result = await adapter.findMany<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t});\n\t\t\texpect(result).toHaveLength(1);\n\t\t\texpect(result.find((user) => user.id === users[0]?.id)).toBeUndefined();\n\t\t\texpect(result.find((user) => user.id === users[1]?.id)).toBeDefined();\n\t\t\texpect(result.find((user) => user.id === users[2]?.id)).toBeUndefined();\n\t\t},\n\t\t\"count - should count many models\": async () => {\n\t\t\tconst users = await insertRandom(\"user\", 15);\n\t\t\tconst result = await adapter.count({\n\t\t\t\tmodel: \"user\",\n\t\t\t});\n\t\t\texpect(result).toEqual(users.length);\n\t\t},\n\t\t\"count - should return 0 with no rows to count\": async () => {\n\t\t\tconst result = await adapter.count({\n\t\t\t\tmodel: \"user\",\n\t\t\t});\n\t\t\texpect(result).toEqual(0);\n\t\t},\n\t\t\"count - should count with where clause\": async () => {\n\t\t\tconst users = (await insertRandom(\"user\", 15)).map((x) => x[0]);\n\t\t\tconst result = await adapter.count({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{ field: \"id\", value: users[2]!.id, connector: \"OR\" },\n\t\t\t\t\t{ field: \"id\", value: users[3]!.id, connector: \"OR\" },\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(result).toEqual(2);\n\t\t},\n\t\t\"update - should correctly return record when updating a field used in where clause\":\n\t\t\tasync () => {\n\t\t\t\t// This tests the fix for MySQL where updating a field that's in the where clause\n\t\t\t\t// would previously fail to find the record using the old value\n\t\t\t\tconst [user] = await insertRandom(\"user\");\n\t\t\t\tconst originalEmail = user.email;\n\n\t\t\t\t// Update the email, using the old email in the where clause\n\t\t\t\tconst result = await adapter.update<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\twhere: [{ field: \"email\", value: originalEmail }],\n\t\t\t\t\tupdate: { email: \"newemail@example.com\" },\n\t\t\t\t});\n\n\t\t\t\t// Should return the updated record with the new email\n\t\t\t\texpect(result).toBeDefined();\n\t\t\t\texpect(result!.email).toBe(\"newemail@example.com\");\n\t\t\t\texpect(result!.id).toBe(user.id);\n\n\t\t\t\t// Verify the update persisted by finding with new email\n\t\t\t\tconst foundUser = await adapter.findOne<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\twhere: [{ field: \"email\", value: \"newemail@example.com\" }],\n\t\t\t\t});\n\t\t\t\texpect(foundUser).toBeDefined();\n\t\t\t\texpect(foundUser!.id).toBe(user.id);\n\n\t\t\t\t// Old email should not exist\n\t\t\t\tconst oldUser = await adapter.findOne<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\twhere: [{ field: \"email\", value: originalEmail }],\n\t\t\t\t});\n\t\t\t\texpect(oldUser).toBeNull();\n\t\t\t},\n\n\t\t\"update - should handle updating multiple fields including where clause field\":\n\t\t\tasync () => {\n\t\t\t\tconst [user] = await insertRandom(\"user\");\n\t\t\t\tconst originalEmail = user.email;\n\n\t\t\t\tconst result = await adapter.update<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\twhere: [{ field: \"email\", value: originalEmail }],\n\t\t\t\t\tupdate: {\n\t\t\t\t\t\temail: \"updated@example.com\",\n\t\t\t\t\t\tname: \"Updated Name\",\n\t\t\t\t\t\temailVerified: true,\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\texpect(result!.email).toBe(\"updated@example.com\");\n\t\t\t\texpect(result!.name).toBe(\"Updated Name\");\n\t\t\t\texpect(result!.emailVerified).toBe(true);\n\t\t\t\texpect(result!.id).toBe(user.id);\n\t\t\t},\n\n\t\t\"update - should work when updated field is not in where clause\":\n\t\t\tasync () => {\n\t\t\t\t// Regression test: ensure normal updates still work\n\t\t\t\tconst [user] = await insertRandom(\"user\");\n\n\t\t\t\tconst result = await adapter.update<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\twhere: [{ field: \"email\", value: user.email }],\n\t\t\t\t\tupdate: { name: \"Updated Name Only\" },\n\t\t\t\t});\n\n\t\t\t\texpect(result!.name).toBe(\"Updated Name Only\");\n\t\t\t\texpect(result!.email).toBe(user.email); // Should remain unchanged\n\t\t\t\texpect(result!.id).toBe(user.id);\n\t\t\t},\n\t\t\"findOne - backwards join should only return single record not array\":\n\t\t\tasync () => {\n\t\t\t\tconst user = await adapter.create<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: { ...(await generate(\"user\")) },\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\t\t\t\tconst session = await adapter.create<Session>({\n\t\t\t\t\tmodel: \"session\",\n\t\t\t\t\tdata: { ...(await generate(\"session\")), userId: user.id },\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\n\t\t\t\tconst result = await adapter.findOne<Session & { user: User }>({\n\t\t\t\t\tmodel: \"session\",\n\t\t\t\t\twhere: [{ field: \"id\", value: session.id }],\n\t\t\t\t\tjoin: { user: true },\n\t\t\t\t});\n\n\t\t\t\texpect(result?.user).toBeDefined();\n\t\t\t\texpect(Array.isArray(result?.user)).toBe(false);\n\t\t\t\texpect(result?.user?.id).toBe(user.id);\n\t\t\t},\n\t\t\"findMany - backwards join should only return single record not array\":\n\t\t\tasync () => {\n\t\t\t\tconst users = (await insertRandom(\"user\", 2)).map((x) => x[0]);\n\t\t\t\tconst sessions: Session[] = [];\n\n\t\t\t\tfor (const user of users) {\n\t\t\t\t\tconst session = await adapter.create<Session>({\n\t\t\t\t\t\tmodel: \"session\",\n\t\t\t\t\t\tdata: { ...(await generate(\"session\")), userId: user.id },\n\t\t\t\t\t\tforceAllowId: true,\n\t\t\t\t\t});\n\t\t\t\t\tsessions.push(session);\n\t\t\t\t}\n\n\t\t\t\tconst result = await adapter.findMany<Session & { user: User }>({\n\t\t\t\t\tmodel: \"session\",\n\t\t\t\t\tjoin: { user: true },\n\t\t\t\t});\n\n\t\t\t\tresult.forEach((session) => {\n\t\t\t\t\texpect(session.user).toBeDefined();\n\t\t\t\t\texpect(Array.isArray(session.user)).toBe(false);\n\t\t\t\t\texpect(session.user?.id).toBeDefined();\n\t\t\t\t});\n\t\t\t},\n\t\t\"findOne - backwards join with modified field name (session base, users-table join)\":\n\t\t\tasync () => {\n\t\t\t\tawait modifyBetterAuthOptions(\n\t\t\t\t\t{\n\t\t\t\t\t\tuser: {\n\t\t\t\t\t\t\tmodelName: \"user_table\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t\tconst user = await adapter.create<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: { ...(await generate(\"user\")) },\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\t\t\t\tconst session = await adapter.create<Session>({\n\t\t\t\t\tmodel: \"session\",\n\t\t\t\t\tdata: { ...(await generate(\"session\")), userId: user.id },\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\n\t\t\t\tconst result = await adapter.findOne<Session & { user: User }>({\n\t\t\t\t\tmodel: \"session\",\n\t\t\t\t\twhere: [{ field: \"id\", value: session.id }],\n\t\t\t\t\tjoin: { user: true },\n\t\t\t\t});\n\n\t\t\t\texpect(result).toEqual({\n\t\t\t\t\t...session,\n\t\t\t\t\tuser: user,\n\t\t\t\t});\n\t\t\t\texpect(result?.user).toBeDefined();\n\t\t\t\texpect(Array.isArray(result?.user)).toBe(false);\n\t\t\t\texpect(result?.user?.id).toBe(user.id);\n\t\t\t},\n\t\t\"findOne - multiple joins should return result even when some joined tables have no matching rows\":\n\t\t\tasync () => {\n\t\t\t\tawait modifyBetterAuthOptions(\n\t\t\t\t\t{\n\t\t\t\t\t\tplugins: [organization({ teams: { enabled: true } })],\n\t\t\t\t\t},\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\n\t\t\t\t// Create a user and organization\n\t\t\t\tconst user = await adapter.create<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: { ...(await generate(\"user\")) },\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\n\t\t\t\tconst organizationData = await adapter.create<Organization>({\n\t\t\t\t\tmodel: \"organization\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tname: \"Test Organization\",\n\t\t\t\t\t\tslug: \"test-org-\" + Math.random(),\n\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t},\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\n\t\t\t\t// Add a member to the organization\n\t\t\t\tawait adapter.create<Member>({\n\t\t\t\t\tmodel: \"member\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\torganizationId: organizationData.id,\n\t\t\t\t\t\tuserId: user.id,\n\t\t\t\t\t\trole: \"owner\",\n\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t},\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\n\t\t\t\t// Create a team for the organization\n\t\t\t\tawait adapter.create<Team>({\n\t\t\t\t\tmodel: \"team\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tname: \"Test Team\",\n\t\t\t\t\t\torganizationId: organizationData.id,\n\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t},\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\n\t\t\t\t// Do NOT create any invitations - leave it empty\n\n\t\t\t\t// Query the organization with joins to member, team, and invitation\n\t\t\t\ttype ResultType = Organization & {\n\t\t\t\t\tmember: Member[];\n\t\t\t\t\tteam: Team[];\n\t\t\t\t\tinvitation: Invitation[];\n\t\t\t\t};\n\n\t\t\t\tconst result = await adapter.findOne<ResultType>({\n\t\t\t\t\tmodel: \"organization\",\n\t\t\t\t\twhere: [{ field: \"id\", value: organizationData.id }],\n\t\t\t\t\tjoin: {\n\t\t\t\t\t\tmember: true,\n\t\t\t\t\t\tteam: true,\n\t\t\t\t\t\tinvitation: true,\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\texpect(result).toBeDefined();\n\t\t\t\texpect(result?.id).toBe(organizationData.id);\n\t\t\t\texpect(result?.name).toBe(\"Test Organization\");\n\n\t\t\t\t// Verify member join worked\n\t\t\t\texpect(Array.isArray(result?.member)).toBe(true);\n\t\t\t\texpect(result?.member).toHaveLength(1);\n\t\t\t\texpect(result?.member[0]?.userId).toBe(user.id);\n\t\t\t\texpect(result?.member[0]?.role).toBe(\"owner\");\n\n\t\t\t\t// Verify team join worked\n\t\t\t\texpect(Array.isArray(result?.team)).toBe(true);\n\t\t\t\texpect(result?.team).toHaveLength(1);\n\t\t\t\texpect(result?.team[0]?.name).toBe(\"Test Team\");\n\n\t\t\t\t// Verify invitation is empty array\n\t\t\t\texpect(Array.isArray(result?.invitation)).toBe(true);\n\t\t\t\texpect(result?.invitation).toHaveLength(0);\n\t\t\t},\n\t\t\"findOne - should be able to perform a limited join\": async () => {\n\t\t\tconst user = await adapter.create<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: { ...(await generate(\"user\")) },\n\t\t\t\tforceAllowId: true,\n\t\t\t});\n\n\t\t\tfor (let i = 0; i < 5; i++) {\n\t\t\t\tawait adapter.create<Session>({\n\t\t\t\t\tmodel: \"session\",\n\t\t\t\t\tdata: { ...(await generate(\"session\")), userId: user.id },\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst result = await adapter.findOne<User & { session: Session[] }>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [{ field: \"id\", value: user.id }],\n\t\t\t\tjoin: {\n\t\t\t\t\tsession: { limit: 2 },\n\t\t\t\t},\n\t\t\t});\n\n\t\t\texpect(result).toBeDefined();\n\t\t\texpect(result?.session).toBeDefined();\n\t\t\texpect(result?.session).toHaveLength(2);\n\t\t\texpect(result?.session[0]?.userId).toBe(user.id);\n\t\t},\n\t\t\"findOne - should be able to perform a complex limited join\": async () => {\n\t\t\tconst user = await adapter.create<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: { ...(await generate(\"user\")) },\n\t\t\t\tforceAllowId: true,\n\t\t\t});\n\n\t\t\tfor (let i = 0; i < 5; i++) {\n\t\t\t\tawait adapter.create<Session>({\n\t\t\t\t\tmodel: \"session\",\n\t\t\t\t\tdata: { ...(await generate(\"session\")), userId: user.id },\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\t\t\t\tawait adapter.create<Account>({\n\t\t\t\t\tmodel: \"account\",\n\t\t\t\t\tdata: { ...(await generate(\"account\")), userId: user.id },\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst result = await adapter.findOne<\n\t\t\t\tUser & { session: Session[]; account: Account[] }\n\t\t\t>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [{ field: \"id\", value: user.id }],\n\t\t\t\tjoin: {\n\t\t\t\t\tsession: { limit: 2 },\n\t\t\t\t\taccount: { limit: 3 },\n\t\t\t\t},\n\t\t\t});\n\t\t\texpect(result).toBeDefined();\n\t\t\texpect(result?.session).toBeDefined();\n\t\t\texpect(result?.session).toHaveLength(2);\n\t\t\texpect(result?.account).toBeDefined();\n\t\t\texpect(result?.account).toHaveLength(3);\n\t\t},\n\t\t\"findMany - should be able to perform a limited join\": async () => {\n\t\t\tconst users: User[] = [];\n\n\t\t\tfor (let i = 0; i < 5; i++) {\n\t\t\t\tconst user = await adapter.create<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: { ...(await generate(\"user\")) },\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\t\t\t\tusers.push(user);\n\t\t\t}\n\t\t\tconst sessionsByUser: Map<string, Session[]> = new Map();\n\t\t\tfor (const user of users) {\n\t\t\t\tsessionsByUser.set(user.id, []);\n\t\t\t\tfor (let i = 0; i < 5; i++) {\n\t\t\t\t\tconst session = await adapter.create<Session>({\n\t\t\t\t\t\tmodel: \"session\",\n\t\t\t\t\t\tdata: { ...(await generate(\"session\")), userId: user.id },\n\t\t\t\t\t\tforceAllowId: true,\n\t\t\t\t\t});\n\t\t\t\t\tsessionsByUser.get(user.id)!.push(session);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst result = await adapter.findMany<User & { session: Session[] }>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tjoin: { session: { limit: 2 } },\n\t\t\t});\n\t\t\texpect(result).toBeDefined();\n\t\t\texpect(result).toHaveLength(5);\n\t\t\tresult.forEach((user) => {\n\t\t\t\texpect(user.session).toBeDefined();\n\t\t\t\texpect(user.session).toHaveLength(2);\n\t\t\t\texpect(user.session[0]?.userId).toBe(user.id);\n\t\t\t});\n\t\t},\n\t\t\"findMany - should be able to perform a complex limited join\": async () => {\n\t\t\tconst users: User[] = [];\n\t\t\tconst sessionsByUser: Map<string, Session[]> = new Map();\n\t\t\tconst accountsByUser: Map<string, Account[]> = new Map();\n\t\t\tfor (let i = 0; i < 5; i++) {\n\t\t\t\tconst user = await adapter.create<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: { ...(await generate(\"user\")) },\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\t\t\t\tusers.push(user);\n\t\t\t\tsessionsByUser.set(user.id, []);\n\t\t\t\taccountsByUser.set(user.id, []);\n\t\t\t\tfor (let i = 0; i < 5; i++) {\n\t\t\t\t\tconst session = await adapter.create<Session>({\n\t\t\t\t\t\tmodel: \"session\",\n\t\t\t\t\t\tdata: { ...(await generate(\"session\")), userId: user.id },\n\t\t\t\t\t\tforceAllowId: true,\n\t\t\t\t\t});\n\t\t\t\t\tsessionsByUser.get(user.id)!.push(session);\n\t\t\t\t\tconst account = await adapter.create<Account>({\n\t\t\t\t\t\tmodel: \"account\",\n\t\t\t\t\t\tdata: { ...(await generate(\"account\")), userId: user.id },\n\t\t\t\t\t\tforceAllowId: true,\n\t\t\t\t\t});\n\t\t\t\t\taccountsByUser.get(user.id)!.push(account);\n\t\t\t\t}\n\t\t\t}\n\t\t\ttype ResultType = User & { session: Session[]; account: Account[] };\n\t\t\tconst result = await adapter.findMany<ResultType>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tjoin: {\n\t\t\t\t\tsession: { limit: 2 },\n\t\t\t\t\taccount: { limit: 3 },\n\t\t\t\t},\n\t\t\t\tlimit: 2,\n\t\t\t\toffset: 2,\n\t\t\t});\n\t\t\texpect(result).toBeDefined();\n\t\t\texpect(result).toHaveLength(2);\n\t\t\tresult.forEach((user) => {\n\t\t\t\texpect(user.session).toBeDefined();\n\t\t\t\texpect(user.session).toHaveLength(2);\n\t\t\t\texpect(user.session[0]?.userId).toBe(user.id);\n\t\t\t\texpect(user.account).toBeDefined();\n\t\t\t\texpect(user.account).toHaveLength(3);\n\t\t\t\texpect(user.account[0]?.userId).toBe(user.id);\n\t\t\t});\n\t\t},\n\t\t\"findOne - should return null for one-to-one join when joined record doesn't exist\":\n\t\t\tasync () => {\n\t\t\t\tawait modifyBetterAuthOptions(\n\t\t\t\t\t{\n\t\t\t\t\t\tplugins: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: \"one-to-one-test\",\n\t\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\t\toneToOneTable: {\n\t\t\t\t\t\t\t\t\t\tfields: {\n\t\t\t\t\t\t\t\t\t\t\toneToOne: {\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\t\t\t\t\t\treferences: { field: \"id\", model: \"user\" },\n\t\t\t\t\t\t\t\t\t\t\t\tunique: true,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t} satisfies BetterAuthPlugin,\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t\ttype OneToOneTable = { oneToOne: string; id: string };\n\t\t\t\t// Create a user without a corresponding one-to-one record\n\t\t\t\tconst user = await adapter.create<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: { ...(await generate(\"user\")) },\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\n\t\t\t\tconst result = await adapter.findOne<\n\t\t\t\t\tUser & { oneToOneTable: OneToOneTable | null }\n\t\t\t\t>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\twhere: [{ field: \"id\", value: user.id }],\n\t\t\t\t\tjoin: { oneToOneTable: true },\n\t\t\t\t});\n\n\t\t\t\texpect(result).toBeDefined();\n\t\t\t\texpect(result?.id).toBe(user.id);\n\t\t\t\texpect(result?.oneToOneTable).toBeNull();\n\t\t\t},\n\t\t\"findMany - should return null for one-to-one join when joined records don't exist\":\n\t\t\tasync () => {\n\t\t\t\tawait modifyBetterAuthOptions(\n\t\t\t\t\t{\n\t\t\t\t\t\tplugins: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: \"one-to-one-test\",\n\t\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\t\toneToOneTable: {\n\t\t\t\t\t\t\t\t\t\tfields: {\n\t\t\t\t\t\t\t\t\t\t\toneToOne: {\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\t\t\t\t\t\treferences: { field: \"id\", model: \"user\" },\n\t\t\t\t\t\t\t\t\t\t\t\tunique: true,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t} satisfies BetterAuthPlugin,\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t\ttype OneToOneTable = { oneToOne: string; id: string };\n\t\t\t\t// Create multiple users - some with one-to-one records, some without\n\t\t\t\tconst userWithJoin = await adapter.create<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: { ...(await generate(\"user\")) },\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\t\t\t\tconst oneToOne = await adapter.create<OneToOneTable>({\n\t\t\t\t\tmodel: \"oneToOneTable\",\n\t\t\t\t\tdata: { oneToOne: userWithJoin.id },\n\t\t\t\t});\n\n\t\t\t\tconst userWithoutJoin = await adapter.create<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: { ...(await generate(\"user\")) },\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\n\t\t\t\tconst result = await adapter.findMany<\n\t\t\t\t\tUser & { oneToOneTable: OneToOneTable | null }\n\t\t\t\t>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t{ field: \"id\", value: userWithJoin.id, connector: \"OR\" },\n\t\t\t\t\t\t{ field: \"id\", value: userWithoutJoin.id, connector: \"OR\" },\n\t\t\t\t\t],\n\t\t\t\t\tjoin: { oneToOneTable: true },\n\t\t\t\t});\n\n\t\t\t\texpect(result).toBeDefined();\n\t\t\t\texpect(result.length).toBe(2);\n\n\t\t\t\tconst resultWithJoin = result.find((u) => u.id === userWithJoin.id);\n\t\t\t\tconst resultWithoutJoin = result.find(\n\t\t\t\t\t(u) => u.id === userWithoutJoin.id,\n\t\t\t\t);\n\n\t\t\t\texpect(resultWithJoin).toBeDefined();\n\t\t\t\texpect(resultWithJoin?.oneToOneTable).toBeDefined();\n\t\t\t\texpect(resultWithJoin?.oneToOneTable?.id).toBe(oneToOne.id);\n\n\t\t\t\texpect(resultWithoutJoin).toBeDefined();\n\t\t\t\texpect(resultWithoutJoin?.oneToOneTable).toBeNull();\n\t\t\t},\n\t\t\"findMany - should return empty array for one-to-many join when joined records don't exist\":\n\t\t\tasync () => {\n\t\t\t\t// Create multiple users - some with sessions, some without\n\t\t\t\tconst userWithSessions = await adapter.create<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: { ...(await generate(\"user\")) },\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\t\t\t\tconst session1 = await adapter.create<Session>({\n\t\t\t\t\tmodel: \"session\",\n\t\t\t\t\tdata: { ...(await generate(\"session\")), userId: userWithSessions.id },\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\t\t\t\tconst session2 = await adapter.create<Session>({\n\t\t\t\t\tmodel: \"session\",\n\t\t\t\t\tdata: { ...(await generate(\"session\")), userId: userWithSessions.id },\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\n\t\t\t\tconst userWithoutSessions = await adapter.create<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: { ...(await generate(\"user\")) },\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\n\t\t\t\tconst result = await adapter.findMany<User & { session: Session[] }>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t{ field: \"id\", value: userWithSessions.id, connector: \"OR\" },\n\t\t\t\t\t\t{ field: \"id\", value: userWithoutSessions.id, connector: \"OR\" },\n\t\t\t\t\t],\n\t\t\t\t\tjoin: { session: true },\n\t\t\t\t});\n\n\t\t\t\texpect(result).toBeDefined();\n\t\t\t\texpect(result.length).toBe(2);\n\n\t\t\t\tconst resultWithSessions = result.find(\n\t\t\t\t\t(u) => u.id === userWithSessions.id,\n\t\t\t\t);\n\t\t\t\tconst resultWithoutSessions = result.find(\n\t\t\t\t\t(u) => u.id === userWithoutSessions.id,\n\t\t\t\t);\n\n\t\t\t\texpect(resultWithSessions).toBeDefined();\n\t\t\t\texpect(Array.isArray(resultWithSessions?.session)).toBe(true);\n\t\t\t\texpect(resultWithSessions?.session).toHaveLength(2);\n\t\t\t\texpect(\n\t\t\t\t\tresultWithSessions?.session.some((s) => s.id === session1.id),\n\t\t\t\t).toBe(true);\n\t\t\t\texpect(\n\t\t\t\t\tresultWithSessions?.session.some((s) => s.id === session2.id),\n\t\t\t\t).toBe(true);\n\n\t\t\t\texpect(resultWithoutSessions).toBeDefined();\n\t\t\t\texpect(Array.isArray(resultWithoutSessions?.session)).toBe(true);\n\t\t\t\texpect(resultWithoutSessions?.session).toHaveLength(0);\n\t\t\t},\n\t\t\"findMany - should handle mixed joins correctly when some are missing\":\n\t\t\tasync () => {\n\t\t\t\tawait modifyBetterAuthOptions(\n\t\t\t\t\t{\n\t\t\t\t\t\tplugins: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: \"one-to-one-test\",\n\t\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\t\toneToOneTable: {\n\t\t\t\t\t\t\t\t\t\tfields: {\n\t\t\t\t\t\t\t\t\t\t\toneToOne: {\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\t\t\t\t\t\treferences: { field: \"id\", model: \"user\" },\n\t\t\t\t\t\t\t\t\t\t\t\tunique: true,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t} satisfies BetterAuthPlugin,\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t\ttype OneToOneTable = { oneToOne: string; id: string };\n\n\t\t\t\t// User 1: Has both one-to-one and one-to-many joins\n\t\t\t\tconst user1 = await adapter.create<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: { ...(await generate(\"user\")) },\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\t\t\t\tconst oneToOne1 = await adapter.create<OneToOneTable>({\n\t\t\t\t\tmodel: \"oneToOneTable\",\n\t\t\t\t\tdata: { oneToOne: user1.id },\n\t\t\t\t});\n\t\t\t\tconst session1 = await adapter.create<Session>({\n\t\t\t\t\tmodel: \"session\",\n\t\t\t\t\tdata: { ...(await generate(\"session\")), userId: user1.id },\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\n\t\t\t\t// User 2: Has one-to-one but no one-to-many\n\t\t\t\tconst user2 = await adapter.create<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: { ...(await generate(\"user\")) },\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\t\t\t\tconst oneToOne2 = await adapter.create<OneToOneTable>({\n\t\t\t\t\tmodel: \"oneToOneTable\",\n\t\t\t\t\tdata: { oneToOne: user2.id },\n\t\t\t\t});\n\n\t\t\t\t// User 3: Has one-to-many but no one-to-one\n\t\t\t\tconst user3 = await adapter.create<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: { ...(await generate(\"user\")) },\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\t\t\t\tconst session3 = await adapter.create<Session>({\n\t\t\t\t\tmodel: \"session\",\n\t\t\t\t\tdata: { ...(await generate(\"session\")), userId: user3.id },\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\n\t\t\t\t// User 4: Has neither join\n\t\t\t\tconst user4 = await adapter.create<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: { ...(await generate(\"user\")) },\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\n\t\t\t\tconst result = await adapter.findMany<\n\t\t\t\t\tUser & { oneToOneTable: OneToOneTable | null; session: Session[] }\n\t\t\t\t>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t{ field: \"id\", value: user1.id, connector: \"OR\" },\n\t\t\t\t\t\t{ field: \"id\", value: user2.id, connector: \"OR\" },\n\t\t\t\t\t\t{ field: \"id\", value: user3.id, connector: \"OR\" },\n\t\t\t\t\t\t{ field: \"id\", value: user4.id, connector: \"OR\" },\n\t\t\t\t\t],\n\t\t\t\t\tjoin: { oneToOneTable: true, session: true },\n\t\t\t\t});\n\n\t\t\t\texpect(result).toBeDefined();\n\t\t\t\texpect(result.length).toBe(4);\n\n\t\t\t\t// User 1: Has both\n\t\t\t\tconst result1 = result.find((u) => u.id === user1.id);\n\t\t\t\texpect(result1).toBeDefined();\n\t\t\t\texpect(result1?.oneToOneTable).toBeDefined();\n\t\t\t\texpect(result1?.oneToOneTable?.id).toBe(oneToOne1.id);\n\t\t\t\texpect(Array.isArray(result1?.session)).toBe(true);\n\t\t\t\texpect(result1?.session).toHaveLength(1);\n\t\t\t\texpect(result1?.session[0]?.id).toBe(session1.id);\n\n\t\t\t\t// User 2: Has one-to-one, no one-to-many\n\t\t\t\tconst result2 = result.find((u) => u.id === user2.id);\n\t\t\t\texpect(result2).toBeDefined();\n\t\t\t\texpect(result2?.oneToOneTable).toBeDefined();\n\t\t\t\texpect(result2?.oneToOneTable?.id).toBe(oneToOne2.id);\n\t\t\t\texpect(Array.isArray(result2?.session)).toBe(true);\n\t\t\t\texpect(result2?.session).toHaveLength(0);\n\n\t\t\t\t// User 3: Has one-to-many, no one-to-one\n\t\t\t\tconst result3 = result.find((u) => u.id === user3.id);\n\t\t\t\texpect(result3).toBeDefined();\n\t\t\t\texpect(result3?.oneToOneTable).toBeNull();\n\t\t\t\texpect(Array.isArray(result3?.session)).toBe(true);\n\t\t\t\texpect(result3?.session).toHaveLength(1);\n\t\t\t\texpect(result3?.session[0]?.id).toBe(session3.id);\n\n\t\t\t\t// User 4: Has neither\n\t\t\t\tconst result4 = result.find((u) => u.id === user4.id);\n\t\t\t\texpect(result4).toBeDefined();\n\t\t\t\texpect(result4?.oneToOneTable).toBeNull();\n\t\t\t\texpect(Array.isArray(result4?.session)).toBe(true);\n\t\t\t\texpect(result4?.session).toHaveLength(0);\n\t\t\t},\n\t\t\"create - should support arrays\": {\n\t\t\tmigrateBetterAuth: {\n\t\t\t\tplugins: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"string-arrays-test\",\n\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\ttestModel: {\n\t\t\t\t\t\t\t\tfields: {\n\t\t\t\t\t\t\t\t\tstringArray: {\n\t\t\t\t\t\t\t\t\t\ttype: \"string[]\",\n\t\t\t\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tnumberArray: {\n\t\t\t\t\t\t\t\t\t\ttype: \"number[]\",\n\t\t\t\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t} satisfies BetterAuthPlugin,\n\t\t\t\t],\n\t\t\t},\n\t\t\ttest: async () => {\n\t\t\t\tconst result = await adapter.create<{\n\t\t\t\t\tid: string;\n\t\t\t\t\tstringArray: string[];\n\t\t\t\t\tnumberArray: number[];\n\t\t\t\t}>({\n\t\t\t\t\tmodel: \"testModel\",\n\t\t\t\t\tdata: { stringArray: [\"1\", \"2\", \"3\"], numberArray: [1, 2, 3] },\n\t\t\t\t});\n\t\t\t\texpect(result.stringArray).toEqual([\"1\", \"2\", \"3\"]);\n\t\t\t\texpect(result.numberArray).toEqual([1, 2, 3]);\n\n\t\t\t\tconst findResult = await adapter.findOne<{\n\t\t\t\t\tstringArray: string[];\n\t\t\t\t\tnumberArray: number[];\n\t\t\t\t}>({\n\t\t\t\t\tmodel: \"testModel\",\n\t\t\t\t\twhere: [{ field: \"id\", value: result.id }],\n\t\t\t\t});\n\t\t\t\texpect(findResult).toEqual(result);\n\t\t\t\texpect(findResult?.stringArray).toEqual([\"1\", \"2\", \"3\"]);\n\t\t\t\texpect(findResult?.numberArray).toEqual([1, 2, 3]);\n\t\t\t},\n\t\t},\n\t\t\"create - should support json\": {\n\t\t\tmigrateBetterAuth: {\n\t\t\t\tplugins: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"json-test\",\n\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\ttestModel: {\n\t\t\t\t\t\t\t\tfields: {\n\t\t\t\t\t\t\t\t\tjson: {\n\t\t\t\t\t\t\t\t\t\ttype: \"json\",\n\t\t\t\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t} satisfies BetterAuthPlugin,\n\t\t\t\t],\n\t\t\t},\n\t\t\ttest: async () => {\n\t\t\t\tconst result = await adapter.create<{\n\t\t\t\t\tid: string;\n\t\t\t\t\tjson: Record<string, any>;\n\t\t\t\t}>({\n\t\t\t\t\tmodel: \"testModel\",\n\t\t\t\t\tdata: { json: { foo: \"bar\" } },\n\t\t\t\t});\n\t\t\t\texpect(result.json).toEqual({ foo: \"bar\" });\n\n\t\t\t\tconst findResult = await adapter.findOne<{\n\t\t\t\t\tjson: Record<string, any>;\n\t\t\t\t}>({\n\t\t\t\t\tmodel: \"testModel\",\n\t\t\t\t\twhere: [{ field: \"id\", value: result.id }],\n\t\t\t\t});\n\t\t\t\texpect(findResult).toEqual(result);\n\t\t\t\texpect(findResult?.json).toEqual({ foo: \"bar\" });\n\t\t\t\tconsole.log(findResult);\n\t\t\t},\n\t\t},\n\t\t\"update - should support multiple where conditions under AND connector with unique field\":\n\t\t\tasync () => {\n\t\t\t\t// This test is specific to Prisma where unique fields must be at root level,\n\t\t\t\t// not nested in AND arrays (which is what we do by default)\n\t\t\t\tconst [user] = await insertRandom(\"user\");\n\t\t\t\tconst result = await adapter.update<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t{ field: \"email\", value: user.email },\n\t\t\t\t\t\t{ field: \"id\", value: user.id },\n\t\t\t\t\t],\n\t\t\t\t\tupdate: { name: \"Updated Name\" },\n\t\t\t\t});\n\t\t\t\texpect(result).toBeDefined();\n\t\t\t\texpect(result!.name).toBe(\"Updated Name\");\n\t\t\t\texpect(result!.email).toBe(user.email);\n\t\t\t\texpect(result!.id).toBe(user.id);\n\t\t\t},\n\n\t\t\"findMany - eq operator with null value (single condition) should use IS NULL\":\n\t\t\tasync () => {\n\t\t\t\tconst withNull = await adapter.create<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: { ...(await generate(\"user\")), image: null },\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\t\t\t\tconst withImage = await adapter.create<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\t...(await generate(\"user\")),\n\t\t\t\t\t\timage: \"https://example.com/avatar.png\",\n\t\t\t\t\t},\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\n\t\t\t\tconst nullResult = await adapter.findMany<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\twhere: [{ field: \"image\", operator: \"eq\", value: null }],\n\t\t\t\t});\n\t\t\t\tconst nullIds = nullResult.map((u) => u.id);\n\t\t\t\texpect(nullIds).toContain(withNull.id);\n\t\t\t\texpect(nullIds).not.toContain(withImage.id);\n\n\t\t\t\tconst notNullResult = await adapter.findMany<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\twhere: [{ field: \"image\", operator: \"ne\", value: null }],\n\t\t\t\t});\n\t\t\t\tconst notNullIds = notNullResult.map((u) => u.id);\n\t\t\t\texpect(notNullIds).not.toContain(withNull.id);\n\t\t\t\texpect(notNullIds).toContain(withImage.id);\n\t\t\t},\n\n\t\t\"findMany - eq and ne operators with null value in AND group should use IS NULL / IS NOT NULL\":\n\t\t\tasync () => {\n\t\t\t\tconst nullVerified = await adapter.create<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\t...(await generate(\"user\")),\n\t\t\t\t\t\timage: null,\n\t\t\t\t\t\temailVerified: true,\n\t\t\t\t\t},\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\t\t\t\tconst nullUnverified = await adapter.create<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\t...(await generate(\"user\")),\n\t\t\t\t\t\timage: null,\n\t\t\t\t\t\temailVerified: false,\n\t\t\t\t\t},\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\t\t\t\tconst imageVerified = await adapter.create<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\t...(await generate(\"user\")),\n\t\t\t\t\t\timage: \"https://example.com/avatar.png\",\n\t\t\t\t\t\temailVerified: true,\n\t\t\t\t\t},\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\n\t\t\t\t// image IS NULL AND emailVerified = true → only nullVerified\n\t\t\t\tconst eqResult = await adapter.findMany<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t{ field: \"image\", operator: \"eq\", value: null, connector: \"AND\" },\n\t\t\t\t\t\t{ field: \"emailVerified\", value: true, connector: \"AND\" },\n\t\t\t\t\t],\n\t\t\t\t});\n\t\t\t\tconst eqIds = eqResult.map((u) => u.id);\n\t\t\t\texpect(eqIds).toContain(nullVerified.id);\n\t\t\t\texpect(eqIds).not.toContain(nullUnverified.id);\n\t\t\t\texpect(eqIds).not.toContain(imageVerified.id);\n\n\t\t\t\t// image IS NOT NULL AND emailVerified = true → only imageVerified\n\t\t\t\tconst neResult = await adapter.findMany<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t{ field: \"image\", operator: \"ne\", value: null, connector: \"AND\" },\n\t\t\t\t\t\t{ field: \"emailVerified\", value: true, connector: \"AND\" },\n\t\t\t\t\t],\n\t\t\t\t});\n\t\t\t\tconst neIds = neResult.map((u) => u.id);\n\t\t\t\texpect(neIds).not.toContain(nullVerified.id);\n\t\t\t\texpect(neIds).not.toContain(nullUnverified.id);\n\t\t\t\texpect(neIds).toContain(imageVerified.id);\n\t\t\t},\n\n\t\t\"findMany - eq and ne operators with null value in OR group should use IS NULL / IS NOT NULL\":\n\t\t\tasync () => {\n\t\t\t\tconst withNull = await adapter.create<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: { ...(await generate(\"user\")), image: null },\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\t\t\t\tconst targetImage = await adapter.create<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\t...(await generate(\"user\")),\n\t\t\t\t\t\timage: \"https://example.com/target.png\",\n\t\t\t\t\t},\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\t\t\t\tconst otherImage = await adapter.create<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\t...(await generate(\"user\")),\n\t\t\t\t\t\timage: \"https://example.com/other.png\",\n\t\t\t\t\t},\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\n\t\t\t\t// image IS NULL OR email = targetImage.email → withNull + targetImage\n\t\t\t\tconst eqResult = await adapter.findMany<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t{ field: \"image\", operator: \"eq\", value: null, connector: \"OR\" },\n\t\t\t\t\t\t{ field: \"email\", value: targetImage.email, connector: \"OR\" },\n\t\t\t\t\t],\n\t\t\t\t});\n\t\t\t\tconst eqIds = eqResult.map((u) => u.id);\n\t\t\t\texpect(eqIds).toContain(withNull.id);\n\t\t\t\texpect(eqIds).toContain(targetImage.id);\n\t\t\t\texpect(eqIds).not.toContain(otherImage.id);\n\n\t\t\t\t// image IS NOT NULL OR email = withNull.email → targetImage + otherImage + withNull (by email)\n\t\t\t\tconst neResult = await adapter.findMany<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t{ field: \"image\", operator: \"ne\", value: null, connector: \"OR\" },\n\t\t\t\t\t\t{ field: \"email\", value: withNull.email, connector: \"OR\" },\n\t\t\t\t\t],\n\t\t\t\t});\n\t\t\t\tconst neIds = neResult.map((u) => u.id);\n\t\t\t\texpect(neIds).toContain(withNull.id); // matched by email OR clause\n\t\t\t\texpect(neIds).toContain(targetImage.id);\n\t\t\t\texpect(neIds).toContain(otherImage.id);\n\t\t\t},\n\n\t\t\"update - should return updated record when where condition uses null value\":\n\t\t\tasync () => {\n\t\t\t\tconst withNull = await adapter.create<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: { ...(await generate(\"user\")), image: null },\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\n\t\t\t\t// Update WHERE image IS NULL AND id = withNull.id\n\t\t\t\tconst result = await adapter.update<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t{ field: \"id\", value: withNull.id },\n\t\t\t\t\t\t{ field: \"image\", operator: \"eq\", value: null },\n\t\t\t\t\t],\n\t\t\t\t\tupdate: { name: \"null-where-updated\" },\n\t\t\t\t});\n\n\t\t\t\t// On MySQL the re-fetch after UPDATE must use IS NULL, not = NULL\n\t\t\t\texpect(result).toBeDefined();\n\t\t\t\texpect(result!.id).toBe(withNull.id);\n\t\t\t\texpect(result!.name).toBe(\"null-where-updated\");\n\t\t\t},\n\t};\n};\n\nconst getTestKeys = () => Object.keys(getNormalTestSuiteTests({} as any));\ntype TestKeys = Partial<\n\tRecord<keyof ReturnType<typeof getNormalTestSuiteTests>, boolean>\n>;\n\nexport const enableJoinTests = getTestKeys().reduce((acc, test) => {\n\tif (test.includes(\"join\")) {\n\t\tacc[test as keyof TestKeys] = false;\n\t}\n\treturn acc;\n}, {} as TestKeys);\n"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { authFlowTestSuite } from "./auth-flow.mjs";
2
+ import { enableJoinTests, getNormalTestSuiteTests, normalTestSuite } from "./basic.mjs";
3
+ import { joinsTestSuite } from "./joins.mjs";
4
+ import { numberIdTestSuite } from "./number-id.mjs";
5
+ import { transactionsTestSuite } from "./transactions.mjs";
6
+ import { uuidTestSuite } from "./uuid.mjs";
@@ -0,0 +1,7 @@
1
+ import "./auth-flow.mjs";
2
+ import "./basic.mjs";
3
+ import "./joins.mjs";
4
+ import "./number-id.mjs";
5
+ import "./transactions.mjs";
6
+ import "./uuid.mjs";
7
+ export {};
@@ -0,0 +1,25 @@
1
+ import { Logger } from "../test-adapter.mjs";
2
+ import { TestSuiteStats } from "../create-test-suite.mjs";
3
+ import * as better_auth0 from "better-auth";
4
+
5
+ //#region src/adapter/suites/joins.d.ts
6
+ declare const joinsTestSuite: (options?: {
7
+ disableTests?: Partial<Record<"init - tests" | "create - should create a model" | "create - should always return an id" | "create - should return null for nullable foreign keys" | "create - should apply default values to fields" | "findOne - should find a model" | "findOne - should not apply defaultValue if value not found" | "findOne - should find a model using a reference field" | "findOne - should not throw on record not found" | "findOne - should find a model without id" | "findOne - should find a model with join" | "findOne - should find a model with modified field name" | "findOne - should find a model with modified model name" | "findOne - should find a model with additional fields" | "findOne - should select fields" | "findOne - should select fields with one-to-many join" | "findOne - should select fields with one-to-one join" | "findOne - should select fields with multiple joins" | "findOne - should find model with date field" | "findOne - should perform backwards joins" | "findOne - should return an object for one-to-one joins" | "findOne - should return an array for one-to-many joins" | "findOne - should work with both one-to-one and one-to-many joins" | "findOne - should return null for failed base model lookup that has joins" | "findOne - should join a model with modified field name" | "findMany - should find many models" | "findMany - should find many models with date fields" | "findMany - should find many models with join" | "findMany - should find many with join and limit" | "findMany - should select fields" | "findMany - should select fields with one-to-many join" | "findMany - should select fields with one-to-one join" | "findMany - should select fields with multiple joins" | "findMany - should find many with join and offset" | "findMany - should find many with join and sortBy" | "findMany - should find many with join and where clause" | "findMany - should find many with join, where, limit, and offset" | "findMany - should find many with one-to-one join" | "findMany - should find many with both one-to-one and one-to-many joins" | "findMany - should return an empty array when no models are found" | "findMany - should return empty array when base records don't exist with joins" | "findMany - should find many models with starts_with operator" | "findMany - starts_with should not interpret regex patterns" | "findMany - ends_with should not interpret regex patterns" | "findMany - contains should not interpret regex patterns" | "findMany - should find many models with ends_with operator" | "findMany - should find many models with contains operator" | "findMany - should handle multiple where conditions with different operators" | "findMany - should find many models with contains operator (using symbol)" | "findMany - should find many models with eq operator" | "findMany - should find many models with ne operator" | "findMany - should find many models with gt operator" | "findMany - should find many models with gte operator" | "findMany - should find many models with lte operator" | "findMany - should find many models with lt operator" | "findMany - should find many models with in operator" | "findMany - should find many models with not_in operator" | "findMany - should find many models with sortBy" | "findMany - should find many models with limit" | "findMany - should find many models with offset" | "findMany - should find many models with limit and offset" | "findMany - should find many models with sortBy and offset" | "findMany - should find many models with sortBy and limit" | "findMany - should find many models with sortBy and limit and offset" | "findMany - should find many models with sortBy and limit and offset and where" | "update - should update a model" | "updateMany - should update all models when where is empty" | "updateMany - should update many models with a specific where" | "updateMany - should update many models with a multiple where" | "delete - should delete a model" | "delete - should not throw on record not found" | "delete - should delete by non-unique field" | "deleteMany - should delete many models" | "deleteMany - starts_with should not interpret regex patterns" | "deleteMany - ends_with should not interpret regex patterns" | "deleteMany - contains should not interpret regex patterns" | "deleteMany - should delete many models with numeric values" | "deleteMany - should delete many models with boolean values" | "count - should count many models" | "count - should return 0 with no rows to count" | "count - should count with where clause" | "update - should correctly return record when updating a field used in where clause" | "update - should handle updating multiple fields including where clause field" | "update - should work when updated field is not in where clause" | "findOne - backwards join should only return single record not array" | "findMany - backwards join should only return single record not array" | "findOne - backwards join with modified field name (session base, users-table join)" | "findOne - multiple joins should return result even when some joined tables have no matching rows" | "findOne - should be able to perform a limited join" | "findOne - should be able to perform a complex limited join" | "findMany - should be able to perform a limited join" | "findMany - should be able to perform a complex limited join" | "findOne - should return null for one-to-one join when joined record doesn't exist" | "findMany - should return null for one-to-one join when joined records don't exist" | "findMany - should return empty array for one-to-many join when joined records don't exist" | "findMany - should handle mixed joins correctly when some are missing" | "create - should support arrays" | "create - should support json" | "update - should support multiple where conditions under AND connector with unique field" | "findMany - eq operator with null value (single condition) should use IS NULL" | "findMany - eq and ne operators with null value in AND group should use IS NULL / IS NOT NULL" | "findMany - eq and ne operators with null value in OR group should use IS NULL / IS NOT NULL" | "update - should return updated record when where condition uses null value", boolean> & {
8
+ ALL?: boolean;
9
+ }> | undefined;
10
+ } | undefined) => (helpers: {
11
+ adapter: () => Promise<better_auth0.DBAdapter<better_auth0.BetterAuthOptions>>;
12
+ log: Logger;
13
+ adapterDisplayName: string;
14
+ getBetterAuthOptions: () => better_auth0.BetterAuthOptions;
15
+ modifyBetterAuthOptions: (options: better_auth0.BetterAuthOptions) => Promise<better_auth0.BetterAuthOptions>;
16
+ cleanup: () => Promise<void>;
17
+ runMigrations: () => Promise<void>;
18
+ prefixTests?: string | undefined;
19
+ onTestFinish: (stats: TestSuiteStats) => Promise<void>;
20
+ customIdGenerator?: (() => any | Promise<any> | undefined) | undefined;
21
+ transformIdOutput?: ((id: any) => string | undefined) | undefined;
22
+ }) => Promise<void>;
23
+ //#endregion
24
+ export { joinsTestSuite };
25
+ //# sourceMappingURL=joins.d.mts.map
@@ -0,0 +1,21 @@
1
+ import { createTestSuite } from "../create-test-suite.mjs";
2
+ import { getNormalTestSuiteTests } from "./basic.mjs";
3
+ import { expect } from "vitest";
4
+ //#region src/adapter/suites/joins.ts
5
+ const joinsTestSuite = createTestSuite("joins", {
6
+ defaultBetterAuthOptions: { experimental: { joins: true } },
7
+ alwaysMigrate: true,
8
+ prefixTests: "joins"
9
+ }, (helpers) => {
10
+ const { "create - should use generateId if provided": _, ...normalTests } = getNormalTestSuiteTests({ ...helpers });
11
+ return {
12
+ "init - tests": async () => {
13
+ expect(helpers.getBetterAuthOptions().experimental?.joins).toBe(true);
14
+ },
15
+ ...normalTests
16
+ };
17
+ });
18
+ //#endregion
19
+ export { joinsTestSuite };
20
+
21
+ //# sourceMappingURL=joins.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joins.mjs","names":[],"sources":["../../src/adapter/suites/joins.ts"],"sourcesContent":["import { expect } from \"vitest\";\nimport { createTestSuite } from \"../create-test-suite\";\nimport { getNormalTestSuiteTests } from \"./basic\";\n\nexport const joinsTestSuite = createTestSuite(\n\t\"joins\",\n\t{\n\t\tdefaultBetterAuthOptions: {\n\t\t\texperimental: {\n\t\t\t\tjoins: true,\n\t\t\t},\n\t\t},\n\t\talwaysMigrate: true,\n\t\tprefixTests: \"joins\",\n\t},\n\t(helpers) => {\n\t\tconst { \"create - should use generateId if provided\": _, ...normalTests } =\n\t\t\tgetNormalTestSuiteTests({ ...helpers });\n\n\t\treturn {\n\t\t\t\"init - tests\": async () => {\n\t\t\t\tconst opts = helpers.getBetterAuthOptions();\n\t\t\t\texpect(opts.experimental?.joins).toBe(true);\n\t\t\t},\n\t\t\t...normalTests,\n\t\t};\n\t},\n);\n"],"mappings":";;;;AAIA,MAAa,iBAAiB,gBAC7B,SACA;CACC,0BAA0B,EACzB,cAAc,EACb,OAAO,MACP,EACD;CACD,eAAe;CACf,aAAa;CACb,GACA,YAAY;CACZ,MAAM,EAAE,8CAA8C,GAAG,GAAG,gBAC3D,wBAAwB,EAAE,GAAG,SAAS,CAAC;AAExC,QAAO;EACN,gBAAgB,YAAY;AAE3B,UADa,QAAQ,sBAAsB,CAC/B,cAAc,MAAM,CAAC,KAAK,KAAK;;EAE5C,GAAG;EACH;EAEF"}
@@ -0,0 +1,25 @@
1
+ import { Logger } from "../test-adapter.mjs";
2
+ import { TestSuiteStats } from "../create-test-suite.mjs";
3
+ import * as better_auth0 from "better-auth";
4
+
5
+ //#region src/adapter/suites/number-id.d.ts
6
+ declare const numberIdTestSuite: (options?: {
7
+ disableTests?: Partial<Record<"init - tests" | "create - should create a model" | "create - should always return an id" | "create - should return null for nullable foreign keys" | "create - should apply default values to fields" | "findOne - should find a model" | "findOne - should not apply defaultValue if value not found" | "findOne - should find a model using a reference field" | "findOne - should not throw on record not found" | "findOne - should find a model without id" | "findOne - should find a model with join" | "findOne - should find a model with modified field name" | "findOne - should find a model with modified model name" | "findOne - should find a model with additional fields" | "findOne - should select fields" | "findOne - should select fields with one-to-many join" | "findOne - should select fields with one-to-one join" | "findOne - should select fields with multiple joins" | "findOne - should find model with date field" | "findOne - should perform backwards joins" | "findOne - should return an object for one-to-one joins" | "findOne - should return an array for one-to-many joins" | "findOne - should work with both one-to-one and one-to-many joins" | "findOne - should return null for failed base model lookup that has joins" | "findOne - should join a model with modified field name" | "findMany - should find many models" | "findMany - should find many models with date fields" | "findMany - should find many models with join" | "findMany - should find many with join and limit" | "findMany - should select fields" | "findMany - should select fields with one-to-many join" | "findMany - should select fields with one-to-one join" | "findMany - should select fields with multiple joins" | "findMany - should find many with join and offset" | "findMany - should find many with join and sortBy" | "findMany - should find many with join and where clause" | "findMany - should find many with join, where, limit, and offset" | "findMany - should find many with one-to-one join" | "findMany - should find many with both one-to-one and one-to-many joins" | "findMany - should return an empty array when no models are found" | "findMany - should return empty array when base records don't exist with joins" | "findMany - should find many models with starts_with operator" | "findMany - starts_with should not interpret regex patterns" | "findMany - ends_with should not interpret regex patterns" | "findMany - contains should not interpret regex patterns" | "findMany - should find many models with ends_with operator" | "findMany - should find many models with contains operator" | "findMany - should handle multiple where conditions with different operators" | "findMany - should find many models with contains operator (using symbol)" | "findMany - should find many models with eq operator" | "findMany - should find many models with ne operator" | "findMany - should find many models with gt operator" | "findMany - should find many models with gte operator" | "findMany - should find many models with lte operator" | "findMany - should find many models with lt operator" | "findMany - should find many models with in operator" | "findMany - should find many models with not_in operator" | "findMany - should find many models with sortBy" | "findMany - should find many models with limit" | "findMany - should find many models with offset" | "findMany - should find many models with limit and offset" | "findMany - should find many models with sortBy and offset" | "findMany - should find many models with sortBy and limit" | "findMany - should find many models with sortBy and limit and offset" | "findMany - should find many models with sortBy and limit and offset and where" | "update - should update a model" | "updateMany - should update all models when where is empty" | "updateMany - should update many models with a specific where" | "updateMany - should update many models with a multiple where" | "delete - should delete a model" | "delete - should not throw on record not found" | "delete - should delete by non-unique field" | "deleteMany - should delete many models" | "deleteMany - starts_with should not interpret regex patterns" | "deleteMany - ends_with should not interpret regex patterns" | "deleteMany - contains should not interpret regex patterns" | "deleteMany - should delete many models with numeric values" | "deleteMany - should delete many models with boolean values" | "count - should count many models" | "count - should return 0 with no rows to count" | "count - should count with where clause" | "update - should correctly return record when updating a field used in where clause" | "update - should handle updating multiple fields including where clause field" | "update - should work when updated field is not in where clause" | "findOne - backwards join should only return single record not array" | "findMany - backwards join should only return single record not array" | "findOne - backwards join with modified field name (session base, users-table join)" | "findOne - multiple joins should return result even when some joined tables have no matching rows" | "findOne - should be able to perform a limited join" | "findOne - should be able to perform a complex limited join" | "findMany - should be able to perform a limited join" | "findMany - should be able to perform a complex limited join" | "findOne - should return null for one-to-one join when joined record doesn't exist" | "findMany - should return null for one-to-one join when joined records don't exist" | "findMany - should return empty array for one-to-many join when joined records don't exist" | "findMany - should handle mixed joins correctly when some are missing" | "create - should support arrays" | "create - should support json" | "update - should support multiple where conditions under AND connector with unique field" | "findMany - eq operator with null value (single condition) should use IS NULL" | "findMany - eq and ne operators with null value in AND group should use IS NULL / IS NOT NULL" | "findMany - eq and ne operators with null value in OR group should use IS NULL / IS NOT NULL" | "update - should return updated record when where condition uses null value" | "create - should return a number id", boolean> & {
8
+ ALL?: boolean;
9
+ }> | undefined;
10
+ } | undefined) => (helpers: {
11
+ adapter: () => Promise<better_auth0.DBAdapter<better_auth0.BetterAuthOptions>>;
12
+ log: Logger;
13
+ adapterDisplayName: string;
14
+ getBetterAuthOptions: () => better_auth0.BetterAuthOptions;
15
+ modifyBetterAuthOptions: (options: better_auth0.BetterAuthOptions) => Promise<better_auth0.BetterAuthOptions>;
16
+ cleanup: () => Promise<void>;
17
+ runMigrations: () => Promise<void>;
18
+ prefixTests?: string | undefined;
19
+ onTestFinish: (stats: TestSuiteStats) => Promise<void>;
20
+ customIdGenerator?: (() => any | Promise<any> | undefined) | undefined;
21
+ transformIdOutput?: ((id: any) => string | undefined) | undefined;
22
+ }) => Promise<void>;
23
+ //#endregion
24
+ export { numberIdTestSuite };
25
+ //# sourceMappingURL=number-id.d.mts.map
@@ -0,0 +1,32 @@
1
+ import { createTestSuite } from "../create-test-suite.mjs";
2
+ import { getNormalTestSuiteTests } from "./basic.mjs";
3
+ import { expect } from "vitest";
4
+ //#region src/adapter/suites/number-id.ts
5
+ const numberIdTestSuite = createTestSuite("number-id", {
6
+ defaultBetterAuthOptions: { advanced: { database: { generateId: "serial" } } },
7
+ alwaysMigrate: true,
8
+ prefixTests: "number-id"
9
+ }, (helpers) => {
10
+ const { "create - should use generateId if provided": _, ...normalTests } = getNormalTestSuiteTests({ ...helpers });
11
+ return {
12
+ "init - tests": async () => {
13
+ expect(helpers.getBetterAuthOptions().advanced?.database?.generateId === "serial").toBe(true);
14
+ },
15
+ "create - should return a number id": async () => {
16
+ const user = await helpers.generate("user");
17
+ const res = await helpers.adapter.create({
18
+ model: "user",
19
+ data: user,
20
+ forceAllowId: true
21
+ });
22
+ expect(res).toHaveProperty("id");
23
+ expect(typeof res.id).toBe("string");
24
+ expect(Number(res.id)).toBeGreaterThan(0);
25
+ },
26
+ ...normalTests
27
+ };
28
+ });
29
+ //#endregion
30
+ export { numberIdTestSuite };
31
+
32
+ //# sourceMappingURL=number-id.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"number-id.mjs","names":[],"sources":["../../src/adapter/suites/number-id.ts"],"sourcesContent":["import type { User } from \"better-auth/types\";\nimport { expect } from \"vitest\";\nimport { createTestSuite } from \"../create-test-suite\";\nimport { getNormalTestSuiteTests } from \"./basic\";\n\nexport const numberIdTestSuite = createTestSuite(\n\t\"number-id\",\n\t{\n\t\tdefaultBetterAuthOptions: {\n\t\t\tadvanced: {\n\t\t\t\tdatabase: {\n\t\t\t\t\tgenerateId: \"serial\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\talwaysMigrate: true,\n\t\tprefixTests: \"number-id\",\n\t},\n\t(helpers) => {\n\t\tconst { \"create - should use generateId if provided\": _, ...normalTests } =\n\t\t\tgetNormalTestSuiteTests({ ...helpers });\n\n\t\treturn {\n\t\t\t\"init - tests\": async () => {\n\t\t\t\tconst opts = helpers.getBetterAuthOptions();\n\t\t\t\texpect(opts.advanced?.database?.generateId === \"serial\").toBe(true);\n\t\t\t},\n\t\t\t\"create - should return a number id\": async () => {\n\t\t\t\tconst user = await helpers.generate(\"user\");\n\t\t\t\tconst res = await helpers.adapter.create<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: user,\n\t\t\t\t\tforceAllowId: true,\n\t\t\t\t});\n\t\t\t\texpect(res).toHaveProperty(\"id\");\n\t\t\t\texpect(typeof res.id).toBe(\"string\");\n\t\t\t\texpect(Number(res.id)).toBeGreaterThan(0);\n\t\t\t},\n\t\t\t...normalTests,\n\t\t};\n\t},\n);\n"],"mappings":";;;;AAKA,MAAa,oBAAoB,gBAChC,aACA;CACC,0BAA0B,EACzB,UAAU,EACT,UAAU,EACT,YAAY,UACZ,EACD,EACD;CACD,eAAe;CACf,aAAa;CACb,GACA,YAAY;CACZ,MAAM,EAAE,8CAA8C,GAAG,GAAG,gBAC3D,wBAAwB,EAAE,GAAG,SAAS,CAAC;AAExC,QAAO;EACN,gBAAgB,YAAY;AAE3B,UADa,QAAQ,sBAAsB,CAC/B,UAAU,UAAU,eAAe,SAAS,CAAC,KAAK,KAAK;;EAEpE,sCAAsC,YAAY;GACjD,MAAM,OAAO,MAAM,QAAQ,SAAS,OAAO;GAC3C,MAAM,MAAM,MAAM,QAAQ,QAAQ,OAAa;IAC9C,OAAO;IACP,MAAM;IACN,cAAc;IACd,CAAC;AACF,UAAO,IAAI,CAAC,eAAe,KAAK;AAChC,UAAO,OAAO,IAAI,GAAG,CAAC,KAAK,SAAS;AACpC,UAAO,OAAO,IAAI,GAAG,CAAC,CAAC,gBAAgB,EAAE;;EAE1C,GAAG;EACH;EAEF"}