UNPKG

better-auth

Version:

The most comprehensive authentication framework for TypeScript.

1 lines • 49.8 kB
{"version":3,"file":"test.mjs","names":["user: {\n\t\tname: string;\n\t\temail: string;\n\t\temailVerified: boolean;\n\t\tcreatedAt: Date;\n\t\tupdatedAt: Date;\n\t\tid: string;\n\t}","adapter","user","cleanup: { modelName: string; id: string }[]"],"sources":["../../src/adapters/test.ts"],"sourcesContent":["import type { Awaitable, BetterAuthOptions } from \"@better-auth/core\";\nimport type { DBAdapter } from \"@better-auth/core/db/adapter\";\nimport { beforeAll, describe, expect, test } from \"vitest\";\nimport type { User } from \"../types\";\nimport { generateId } from \"../utils\";\n\ninterface AdapterTestOptions {\n\tgetAdapter: (\n\t\tcustomOptions?: Omit<BetterAuthOptions, \"database\">,\n\t) => Awaitable<DBAdapter<BetterAuthOptions>>;\n\tdisableTests?: Partial<Record<keyof typeof adapterTests, boolean>>;\n\ttestPrefix?: string;\n}\n\ninterface NumberIdAdapterTestOptions {\n\tgetAdapter: (\n\t\tcustomOptions?: Omit<BetterAuthOptions, \"database\">,\n\t) => Promise<DBAdapter<BetterAuthOptions>>;\n\tdisableTests?: Partial<Record<keyof typeof numberIdAdapterTests, boolean>>;\n\ttestPrefix?: string;\n}\n\nconst adapterTests = {\n\tCREATE_MODEL: \"create model\",\n\tCREATE_MODEL_SHOULD_ALWAYS_RETURN_AN_ID:\n\t\t\"create model should always return an id\",\n\tFIND_MODEL: \"find model\",\n\tFIND_MODEL_WITHOUT_ID: \"find model without id\",\n\tFIND_MODEL_WITH_SELECT: \"find model with select\",\n\tFIND_MODEL_WITH_MODIFIED_FIELD_NAME: \"find model with modified field name\",\n\tUPDATE_MODEL: \"update model\",\n\tSHOULD_FIND_MANY: \"should find many\",\n\tSHOULD_FIND_MANY_WITH_WHERE: \"should find many with where\",\n\tSHOULD_FIND_MANY_WITH_OPERATORS: \"should find many with operators\",\n\tSHOULD_WORK_WITH_REFERENCE_FIELDS: \"should work with reference fields\",\n\tSHOULD_FIND_MANY_WITH_NOT_IN_OPERATOR:\n\t\t\"should find many with not in operator\",\n\tSHOULD_FIND_MANY_WITH_SORT_BY: \"should find many with sortBy\",\n\tSHOULD_FIND_MANY_WITH_LIMIT: \"should find many with limit\",\n\tSHOULD_FIND_MANY_WITH_OFFSET: \"should find many with offset\",\n\tSHOULD_UPDATE_WITH_MULTIPLE_WHERE: \"should update with multiple where\",\n\tDELETE_MODEL: \"delete model\",\n\tSHOULD_DELETE_MANY: \"should delete many\",\n\tSHOULD_NOT_THROW_ON_DELETE_RECORD_NOT_FOUND:\n\t\t\"shouldn't throw on delete record not found\",\n\tSHOULD_NOT_THROW_ON_RECORD_NOT_FOUND: \"shouldn't throw on record not found\",\n\tSHOULD_FIND_MANY_WITH_CONTAINS_OPERATOR:\n\t\t\"should find many with contains operator\",\n\tSHOULD_SEARCH_USERS_WITH_STARTS_WITH: \"should search users with startsWith\",\n\tSHOULD_SEARCH_USERS_WITH_ENDS_WITH: \"should search users with endsWith\",\n\tSHOULD_PREFER_GENERATE_ID_IF_PROVIDED: \"should prefer generateId if provided\",\n\tSHOULD_ROLLBACK_FAILING_TRANSACTION: \"should rollback failing transaction\",\n\tSHOULD_RETURN_TRANSACTION_RESULT: \"should return transaction result\",\n\tSHOULD_FIND_MANY_WITH_CONNECTORS: \"should find many with connectors\",\n} as const;\n\nconst { ...numberIdAdapterTestsCopy } = adapterTests;\n\nconst numberIdAdapterTests = {\n\t...numberIdAdapterTestsCopy,\n\tSHOULD_RETURN_A_NUMBER_ID_AS_A_RESULT:\n\t\t\"Should return a number id as a result\",\n\tSHOULD_INCREMENT_THE_ID_BY_1: \"Should increment the id by 1\",\n};\n\n// @ts-expect-error\n// biome-ignore lint/performance/noDelete: testing propose\ndelete numberIdAdapterTests.SHOULD_NOT_THROW_ON_DELETE_RECORD_NOT_FOUND;\n\n/**\n * @deprecated Use `testAdapter` instead.\n */\nfunction adapterTest(\n\t{ getAdapter, disableTests: disabledTests, testPrefix }: AdapterTestOptions,\n\tinternalOptions?: {\n\t\tpredefinedOptions: Omit<BetterAuthOptions, \"database\">;\n\t},\n) {\n\tconsole.warn(\n\t\t\"This test function is deprecated and will be removed in the future. Use `testAdapter` instead.\",\n\t);\n\tconst adapter = async () =>\n\t\tawait getAdapter(internalOptions?.predefinedOptions);\n\n\tasync function resetDebugLogs() {\n\t\t//@ts-expect-error\n\t\t(await adapter())?.adapterTestDebugLogs?.resetDebugLogs();\n\t}\n\n\tasync function printDebugLogs() {\n\t\t//@ts-expect-error\n\t\t(await adapter())?.adapterTestDebugLogs?.printDebugLogs();\n\t}\n\n\t// Generate unique test identifier for this test run to avoid conflicts\n\tconst testRunId =\n\t\tDate.now().toString(36) + Math.random().toString(36).substring(2, 5);\n\tconst getUniqueEmail = (base: string) => `${testRunId}_${base}`;\n\n\t//@ts-expect-error - intentionally omitting id\n\tlet user: {\n\t\tname: string;\n\t\temail: string;\n\t\temailVerified: boolean;\n\t\tcreatedAt: Date;\n\t\tupdatedAt: Date;\n\t\tid: string;\n\t} = {\n\t\tname: \"user\",\n\t\temail: getUniqueEmail(\"user@email.com\"),\n\t\temailVerified: true,\n\t\tcreatedAt: new Date(),\n\t\tupdatedAt: new Date(),\n\t};\n\n\ttest.skipIf(disabledTests?.CREATE_MODEL)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${adapterTests.CREATE_MODEL}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst res = await (await adapter()).create({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: user,\n\t\t\t});\n\t\t\tuser.id = res.id;\n\t\t\texpect({\n\t\t\t\tname: res.name,\n\t\t\t\temail: res.email,\n\t\t\t}).toEqual({\n\t\t\t\tname: user.name,\n\t\t\t\temail: user.email,\n\t\t\t});\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.CREATE_MODEL_SHOULD_ALWAYS_RETURN_AN_ID)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.CREATE_MODEL_SHOULD_ALWAYS_RETURN_AN_ID\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst res = await (await adapter()).create({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\tname: \"test-name-without-id\",\n\t\t\t\t\temail: getUniqueEmail(\"test-email-without-id@email.com\"),\n\t\t\t\t},\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);\n\n\ttest.skipIf(disabledTests?.FIND_MODEL)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${adapterTests.FIND_MODEL}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst res = await (await adapter()).findOne<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: user.id,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect({\n\t\t\t\tname: res?.name,\n\t\t\t\temail: res?.email,\n\t\t\t}).toEqual({\n\t\t\t\tname: user.name,\n\t\t\t\temail: user.email,\n\t\t\t});\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.FIND_MODEL_WITHOUT_ID)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.FIND_MODEL_WITHOUT_ID\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst res = await (await adapter()).findOne<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: user.email,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect({\n\t\t\t\tname: res?.name,\n\t\t\t\temail: res?.email,\n\t\t\t}).toEqual({\n\t\t\t\tname: user.name,\n\t\t\t\temail: user.email,\n\t\t\t});\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.FIND_MODEL_WITH_MODIFIED_FIELD_NAME)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.FIND_MODEL_WITH_MODIFIED_FIELD_NAME\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst email = getUniqueEmail(\"test-email-with-modified-field@email.com\");\n\t\t\tconst adapter = await getAdapter(\n\t\t\t\tObject.assign(\n\t\t\t\t\t{\n\t\t\t\t\t\tuser: {\n\t\t\t\t\t\t\tfields: {\n\t\t\t\t\t\t\t\temail: \"email_address\",\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\tinternalOptions?.predefinedOptions,\n\t\t\t\t),\n\t\t\t);\n\t\t\tconst user = await adapter.create({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\temail,\n\t\t\t\t\tname: \"test-name-with-modified-field\",\n\t\t\t\t\temailVerified: true,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\t\t\texpect(user.email).toEqual(email);\n\t\t\tconst res = await adapter.findOne<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: email,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(res).not.toBeNull();\n\t\t\texpect(res?.email).toEqual(email);\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.FIND_MODEL_WITH_SELECT)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.FIND_MODEL_WITH_SELECT\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst res = await (await adapter()).findOne({\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: user.id,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tselect: [\"email\"],\n\t\t\t});\n\t\t\texpect(res).toEqual({ email: user.email });\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.UPDATE_MODEL)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${adapterTests.UPDATE_MODEL}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst newEmail = getUniqueEmail(\"updated@email.com\");\n\n\t\t\tconst res = await (await adapter()).update<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: user.id,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tupdate: {\n\t\t\t\t\temail: newEmail,\n\t\t\t\t},\n\t\t\t});\n\t\t\texpect(res).toMatchObject({\n\t\t\t\temail: newEmail,\n\t\t\t\tname: user.name,\n\t\t\t});\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_FIND_MANY)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${adapterTests.SHOULD_FIND_MANY}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst res = await (await adapter()).findMany({\n\t\t\t\tmodel: \"user\",\n\t\t\t});\n\t\t\texpect(res.length).toBe(3);\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_FIND_MANY_WITH_WHERE)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_FIND_MANY_WITH_WHERE\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst user = await (await adapter()).create<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\tname: \"user2\",\n\t\t\t\t\temail: getUniqueEmail(\"test@email.com\"),\n\t\t\t\t\temailVerified: true,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\t\t\tconst res = await (await adapter()).findMany({\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: user.id,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(res.length).toBe(1);\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_FIND_MANY_WITH_OPERATORS)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_FIND_MANY_WITH_OPERATORS\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst newUser = await (await adapter()).create<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\tname: \"user\",\n\t\t\t\t\temail: getUniqueEmail(\"test-email2@email.com\"),\n\t\t\t\t\temailVerified: true,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\t\t\tconst res = await (await adapter()).findMany({\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\toperator: \"in\",\n\t\t\t\t\t\tvalue: [user.id, newUser.id],\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(res.length).toBe(2);\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_FIND_MANY_WITH_NOT_IN_OPERATOR)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_FIND_MANY_WITH_NOT_IN_OPERATOR\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\n\t\t\tconst newUser3 = await (await adapter()).create<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\tname: \"user\",\n\t\t\t\t\temail: getUniqueEmail(\"test-email3@email.com\"),\n\t\t\t\t\temailVerified: true,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\t\t\tconst allUsers = await (await adapter()).findMany<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t});\n\t\t\texpect(allUsers.length).toBe(6);\n\t\t\tconst usersWithoutNotIn = await (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\toperator: \"not_in\",\n\t\t\t\t\t\tvalue: [user.id, newUser3.id],\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(usersWithoutNotIn.length).toBe(4);\n\t\t\t//cleanup\n\t\t\tawait (await adapter()).delete({\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: newUser3.id,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_WORK_WITH_REFERENCE_FIELDS)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_WORK_WITH_REFERENCE_FIELDS\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tlet token = null;\n\t\t\tconst user = await (await adapter()).create<Record<string, any>>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\tname: \"user\",\n\t\t\t\t\temail: getUniqueEmail(\"my-email@email.com\"),\n\t\t\t\t\temailVerified: true,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\t\t\tconst session = await (await adapter()).create({\n\t\t\t\tmodel: \"session\",\n\t\t\t\tdata: {\n\t\t\t\t\ttoken: generateId(),\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t\tuserId: user.id,\n\t\t\t\t\texpiresAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\t\t\ttoken = session.token;\n\t\t\tconst res = await (await adapter()).findOne({\n\t\t\t\tmodel: \"session\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"userId\",\n\t\t\t\t\t\tvalue: user.id,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\tconst resToken = await (await adapter()).findOne({\n\t\t\t\tmodel: \"session\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"token\",\n\t\t\t\t\t\tvalue: token,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(res).toMatchObject({\n\t\t\t\tuserId: user.id,\n\t\t\t});\n\t\t\texpect(resToken).toMatchObject({\n\t\t\t\tuserId: user.id,\n\t\t\t});\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_FIND_MANY_WITH_SORT_BY)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_FIND_MANY_WITH_SORT_BY\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tawait (await adapter()).create({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\tname: \"a\",\n\t\t\t\t\temail: getUniqueEmail(\"a@email.com\"),\n\t\t\t\t\temailVerified: true,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\t\t\tconst res = await (await adapter()).findMany<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tsortBy: {\n\t\t\t\t\tfield: \"name\",\n\t\t\t\t\tdirection: \"asc\",\n\t\t\t\t},\n\t\t\t});\n\t\t\texpect(res[0]!.name).toBe(\"a\");\n\n\t\t\tconst res2 = await (await adapter()).findMany<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tsortBy: {\n\t\t\t\t\tfield: \"name\",\n\t\t\t\t\tdirection: \"desc\",\n\t\t\t\t},\n\t\t\t});\n\n\t\t\texpect(res2[res2.length - 1]!.name).toBe(\"a\");\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_FIND_MANY_WITH_LIMIT)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_FIND_MANY_WITH_LIMIT\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst res = await (await adapter()).findMany({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tlimit: 1,\n\t\t\t});\n\t\t\texpect(res.length).toBe(1);\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_FIND_MANY_WITH_OFFSET)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_FIND_MANY_WITH_OFFSET\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst res = await (await adapter()).findMany({\n\t\t\t\tmodel: \"user\",\n\t\t\t\toffset: 2,\n\t\t\t});\n\t\t\texpect(res.length).toBe(5);\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_UPDATE_WITH_MULTIPLE_WHERE)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_UPDATE_WITH_MULTIPLE_WHERE\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\t// Note: user's email was already updated in the previous test\n\t\t\tconst currentEmail = getUniqueEmail(\"updated@email.com\");\n\t\t\tawait (await adapter()).updateMany({\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: user.name,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"email\",\n\t\t\t\t\t\tvalue: currentEmail,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tupdate: {\n\t\t\t\t\temail: getUniqueEmail(\"updated2@email.com\"),\n\t\t\t\t},\n\t\t\t});\n\t\t\tconst updatedUser = await (await adapter()).findOne<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: getUniqueEmail(\"updated2@email.com\"),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(updatedUser).toMatchObject({\n\t\t\t\tname: user.name,\n\t\t\t\temail: getUniqueEmail(\"updated2@email.com\"),\n\t\t\t});\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.DELETE_MODEL)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${adapterTests.DELETE_MODEL}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tawait (await adapter()).delete({\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: user.id,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\tconst findRes = await (await adapter()).findOne({\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: user.id,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(findRes).toBeNull();\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_DELETE_MANY)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${adapterTests.SHOULD_DELETE_MANY}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tfor (const i of [\"to-be-delete-1\", \"to-be-delete-2\", \"to-be-delete-3\"]) {\n\t\t\t\tawait (await adapter()).create({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tname: \"to-be-deleted\",\n\t\t\t\t\t\temail: getUniqueEmail(`email@test-${i}.com`),\n\t\t\t\t\t\temailVerified: true,\n\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst findResFirst = await (await adapter()).findMany({\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: \"to-be-deleted\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(findResFirst.length).toBe(3);\n\t\t\tawait (await 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: \"name\",\n\t\t\t\t\t\tvalue: \"to-be-deleted\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\tconst findRes = await (await adapter()).findMany({\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: \"to-be-deleted\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(findRes.length).toBe(0);\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_NOT_THROW_ON_DELETE_RECORD_NOT_FOUND)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_NOT_THROW_ON_DELETE_RECORD_NOT_FOUND\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tawait (await adapter()).delete({\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: \"100000\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_NOT_THROW_ON_RECORD_NOT_FOUND)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_NOT_THROW_ON_RECORD_NOT_FOUND\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst res = await (await adapter()).findOne({\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: \"100000\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(res).toBeNull();\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_FIND_MANY_WITH_CONTAINS_OPERATOR)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_FIND_MANY_WITH_CONTAINS_OPERATOR\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst res = await (await adapter()).findMany({\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\toperator: \"contains\",\n\t\t\t\t\t\tvalue: \"user2\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(res.length).toBe(1);\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_SEARCH_USERS_WITH_STARTS_WITH)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_SEARCH_USERS_WITH_STARTS_WITH\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tawait (await adapter()).create({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\tname: \"user_starts\",\n\t\t\t\t\temail: getUniqueEmail(\"startswith1@test.com\"),\n\t\t\t\t\temailVerified: true,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\t\t\tawait (await adapter()).create({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\tname: \"user2_starts\",\n\t\t\t\t\temail: getUniqueEmail(\"startswith2@test.com\"),\n\t\t\t\t\temailVerified: true,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\t\t\tawait (await adapter()).create({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\tname: \"user3_starts\",\n\t\t\t\t\temail: getUniqueEmail(\"startswith3@test.com\"),\n\t\t\t\t\temailVerified: true,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\t\t\tconst res = await (await adapter()).findMany({\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\toperator: \"starts_with\",\n\t\t\t\t\t\tvalue: \"user\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(res.length).toBeGreaterThanOrEqual(3);\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_SEARCH_USERS_WITH_ENDS_WITH)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_SEARCH_USERS_WITH_ENDS_WITH\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\t// Create test user for this test with unique suffix\n\t\t\tawait (await adapter()).create({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\tname: \"tester2\",\n\t\t\t\t\temail: getUniqueEmail(\"endswith@test.com\"),\n\t\t\t\t\temailVerified: true,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\t\t\tconst res = await (await adapter()).findMany({\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\toperator: \"ends_with\",\n\t\t\t\t\t\tvalue: \"ter2\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(res.length).toBe(1);\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_PREFER_GENERATE_ID_IF_PROVIDED)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_PREFER_GENERATE_ID_IF_PROVIDED\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst customAdapter = await getAdapter(\n\t\t\t\tObject.assign(\n\t\t\t\t\t{\n\t\t\t\t\t\tadvanced: {\n\t\t\t\t\t\t\tdatabase: {\n\t\t\t\t\t\t\t\tgenerateId: () => \"mocked-id\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t} satisfies BetterAuthOptions,\n\t\t\t\t\tinternalOptions?.predefinedOptions,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tconst res = await customAdapter.create({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\tname: \"user4\",\n\t\t\t\t\temail: getUniqueEmail(\"user4@email.com\"),\n\t\t\t\t\temailVerified: true,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\n\t\t\texpect(res.id).toBe(\"mocked-id\");\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_ROLLBACK_FAILING_TRANSACTION)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${adapterTests.SHOULD_ROLLBACK_FAILING_TRANSACTION}`,\n\t\tasync ({ onTestFailed, skip }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst customAdapter = await adapter();\n\n\t\t\t// Check if adapter actually supports transactions\n\t\t\tconst enableTransaction =\n\t\t\t\tcustomAdapter?.options?.adapterConfig.transaction;\n\t\t\tif (!enableTransaction) {\n\t\t\t\tskip(\n\t\t\t\t\t`Skipping test: ${\n\t\t\t\t\t\tcustomAdapter?.options?.adapterConfig.adapterName || \"Adapter\"\n\t\t\t\t\t}\n\t\t\t\t\t does not support transactions`,\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst user5 = {\n\t\t\t\tname: \"user5\",\n\t\t\t\temail: getUniqueEmail(\"user5@email.com\"),\n\t\t\t\temailVerified: true,\n\t\t\t\tcreatedAt: new Date(),\n\t\t\t\tupdatedAt: new Date(),\n\t\t\t};\n\t\t\tconst user6 = {\n\t\t\t\tname: \"user6\",\n\t\t\t\temail: getUniqueEmail(\"user6@email.com\"),\n\t\t\t\temailVerified: true,\n\t\t\t\tcreatedAt: new Date(),\n\t\t\t\tupdatedAt: new Date(),\n\t\t\t};\n\t\t\tawait expect(\n\t\t\t\tcustomAdapter.transaction(async (tx) => {\n\t\t\t\t\tawait tx.create({ model: \"user\", data: user5 });\n\t\t\t\t\tthrow new Error(\"Simulated failure\");\n\t\t\t\t\tawait tx.create({ model: \"user\", data: user6 });\n\t\t\t\t}),\n\t\t\t).rejects.toThrow(\"Simulated failure\");\n\n\t\t\tawait expect(\n\t\t\t\tcustomAdapter.findMany({\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: user5.email,\n\t\t\t\t\t\t\tconnector: \"OR\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfield: \"email\",\n\t\t\t\t\t\t\tvalue: user6.email,\n\t\t\t\t\t\t\tconnector: \"OR\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t}),\n\t\t\t).resolves.toEqual([]);\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_RETURN_TRANSACTION_RESULT)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${adapterTests.SHOULD_RETURN_TRANSACTION_RESULT}`,\n\t\tasync ({ onTestFailed, skip }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst customAdapter = await adapter();\n\n\t\t\tconst enableTransaction =\n\t\t\t\tcustomAdapter?.options?.adapterConfig.transaction;\n\t\t\tif (!enableTransaction) {\n\t\t\t\tskip(\n\t\t\t\t\t`Skipping test: ${\n\t\t\t\t\t\tcustomAdapter?.options?.adapterConfig.adapterName || \"Adapter\"\n\t\t\t\t\t}\n\t\t\t\t\t does not support transactions`,\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst result = await customAdapter.transaction(async (tx) => {\n\t\t\t\tconst createdUser = await tx.create<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tname: \"user6\",\n\t\t\t\t\t\temail: getUniqueEmail(\"user6@email.com\"),\n\t\t\t\t\t\temailVerified: true,\n\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\treturn createdUser.email;\n\t\t\t});\n\n\t\t\texpect(result).toEqual(getUniqueEmail(\"user6@email.com\"));\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_FIND_MANY_WITH_CONNECTORS)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_FIND_MANY_WITH_CONNECTORS\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\n\t\t\tawait (await adapter()).create({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\tname: \"connector-user1\",\n\t\t\t\t\temail: getUniqueEmail(\"connector-user1@email.com\"),\n\t\t\t\t\temailVerified: true,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\t\t\tawait (await adapter()).create({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\tname: \"con-user2\",\n\t\t\t\t\temail: getUniqueEmail(\"connector-user2@email.com\"),\n\t\t\t\t\temailVerified: true,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tconst andRes = await (await adapter()).findMany({\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: \"con-user2\",\n\t\t\t\t\t\tconnector: \"AND\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"email\",\n\t\t\t\t\t\tvalue: getUniqueEmail(\"connector-user2@email.com\"),\n\t\t\t\t\t\tconnector: \"AND\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\n\t\t\texpect(andRes.length).toBe(1);\n\n\t\t\tconst orRes = await (await adapter()).findMany({\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: \"connector-user1\",\n\t\t\t\t\t\tconnector: \"OR\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"name\",\n\t\t\t\t\t\tvalue: \"con-user2\",\n\t\t\t\t\t\tconnector: \"OR\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(orRes.length).toBe(2);\n\t\t},\n\t);\n}\n\nexport function runAdapterTest(opts: AdapterTestOptions) {\n\treturn adapterTest(opts);\n}\n\nexport function runNumberIdAdapterTest(opts: NumberIdAdapterTestOptions) {\n\tconst cleanup: { modelName: string; id: string }[] = [];\n\n\t// Generate unique test identifier for this test run to avoid conflicts\n\tconst testRunId =\n\t\tDate.now().toString(36) + Math.random().toString(36).substr(2, 5);\n\tconst getUniqueEmail = (base: string) => `${testRunId}_${base}`;\n\n\tconst adapter = async () =>\n\t\tawait opts.getAdapter({\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\tdescribe(\"Should run number id specific tests\", async () => {\n\t\tlet idNumber = -1;\n\n\t\tasync function resetDebugLogs() {\n\t\t\t//@ts-expect-error\n\t\t\t(await adapter())?.adapterTestDebugLogs?.resetDebugLogs();\n\t\t}\n\n\t\tasync function printDebugLogs() {\n\t\t\t//@ts-expect-error\n\t\t\t(await adapter())?.adapterTestDebugLogs?.printDebugLogs();\n\t\t}\n\t\ttest.skipIf(opts.disableTests?.SHOULD_RETURN_A_NUMBER_ID_AS_A_RESULT)(\n\t\t\t`${opts.testPrefix ? `${opts.testPrefix} - ` : \"\"}${\n\t\t\t\tnumberIdAdapterTests.SHOULD_RETURN_A_NUMBER_ID_AS_A_RESULT\n\t\t\t}`,\n\t\t\tasync ({ onTestFailed }) => {\n\t\t\t\tawait resetDebugLogs();\n\t\t\t\tonTestFailed(async () => {\n\t\t\t\t\tawait printDebugLogs();\n\t\t\t\t});\n\t\t\t\tconst res = await (await adapter()).create({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tname: \"user\",\n\t\t\t\t\t\temail: getUniqueEmail(\"number-user@email.com\"),\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tcleanup.push({ modelName: \"user\", id: res.id });\n\t\t\t\texpect(typeof res.id).toBe(\"string\"); // we forcefully return all `id`s as strings. this is intentional.\n\t\t\t\texpect(parseInt(res.id)).toBeGreaterThan(0);\n\t\t\t\tidNumber = parseInt(res.id);\n\t\t\t},\n\t\t);\n\t\ttest.skipIf(opts.disableTests?.SHOULD_INCREMENT_THE_ID_BY_1)(\n\t\t\t`${opts.testPrefix ? `${opts.testPrefix} - ` : \"\"}${\n\t\t\t\tnumberIdAdapterTests.SHOULD_INCREMENT_THE_ID_BY_1\n\t\t\t}`,\n\t\t\tasync ({ onTestFailed }) => {\n\t\t\t\tawait resetDebugLogs();\n\t\t\t\tonTestFailed(async () => {\n\t\t\t\t\tconsole.log(`ID number from last create: ${idNumber}`);\n\t\t\t\t\tawait printDebugLogs();\n\t\t\t\t});\n\t\t\t\tconst res = await (await adapter()).create({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tname: \"user2\",\n\t\t\t\t\t\temail: getUniqueEmail(\"number-user2@email.com\"),\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tcleanup.push({ modelName: \"user\", id: res.id });\n\t\t\t\texpect(parseInt(res.id)).toBe(idNumber + 1);\n\t\t\t},\n\t\t);\n\t});\n\n\tdescribe(\"Should run normal adapter tests with number id enabled\", async () => {\n\t\tbeforeAll(async () => {\n\t\t\tfor (const { modelName, id } of cleanup) {\n\t\t\t\tawait (await adapter()).delete({\n\t\t\t\t\tmodel: modelName,\n\t\t\t\t\twhere: [{ field: \"id\", value: id }],\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\tawait adapterTest(\n\t\t\t{\n\t\t\t\t...opts,\n\t\t\t\tdisableTests: {\n\t\t\t\t\t...opts.disableTests,\n\t\t\t\t\tSHOULD_PREFER_GENERATE_ID_IF_PROVIDED: true,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tpredefinedOptions: {\n\t\t\t\t\tadvanced: {\n\t\t\t\t\t\tdatabase: {\n\t\t\t\t\t\t\tgenerateId: \"serial\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t});\n}\n\nexport function recoverProcessTZ() {\n\tconst originalTZ = process.env.TZ;\n\treturn {\n\t\t[Symbol.dispose]: () => {\n\t\t\tprocess.env.TZ = originalTZ;\n\t\t},\n\t};\n}\n"],"mappings":"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"}