diff --git a/apps/electron/yarn.lock b/apps/electron/yarn.lock index bfd4351296..697d65cc6e 100644 --- a/apps/electron/yarn.lock +++ b/apps/electron/yarn.lock @@ -12,7 +12,7 @@ __metadata: languageName: node linkType: hard -"@affine-test/fixtures@workspace:../../tests/fixtures, @affine-test/fixtures@workspace:^": +"@affine-test/fixtures@workspace:*, @affine-test/fixtures@workspace:../../tests/fixtures": version: 0.0.0-use.local resolution: "@affine-test/fixtures@workspace:../../tests/fixtures" languageName: unknown @@ -161,7 +161,7 @@ __metadata: version: 0.0.0-use.local resolution: "@affine/workspace@workspace:../../packages/workspace" dependencies: - "@affine-test/fixtures": "workspace:^" + "@affine-test/fixtures": "workspace:*" "@affine/component": "workspace:*" "@affine/debug": "workspace:*" "@affine/env": "workspace:*" diff --git a/apps/web/package.json b/apps/web/package.json index 43f81f6793..cbb14b3631 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -9,6 +9,7 @@ "lint": "next lint" }, "dependencies": { + "@affine-test/fixtures": "workspace:*", "@affine/component": "workspace:*", "@affine/debug": "workspace:*", "@affine/env": "workspace:*", diff --git a/apps/web/src/atoms/public-workspace/index.ts b/apps/web/src/atoms/public-workspace/index.ts index 520f3fef15..21ee4dafea 100644 --- a/apps/web/src/atoms/public-workspace/index.ts +++ b/apps/web/src/atoms/public-workspace/index.ts @@ -1,6 +1,6 @@ import { getLoginStorage } from '@affine/workspace/affine/login'; import { createEmptyBlockSuiteWorkspace } from '@affine/workspace/utils'; -import { atom } from 'jotai/index'; +import { atom } from 'jotai'; import { BlockSuiteWorkspace } from '../../shared'; import { affineApis } from '../../shared/apis'; diff --git a/apps/web/src/shared/__tests__/apis.spec.ts b/apps/web/src/shared/__tests__/apis.spec.ts new file mode 100644 index 0000000000..e72d8f7797 --- /dev/null +++ b/apps/web/src/shared/__tests__/apis.spec.ts @@ -0,0 +1,39 @@ +/** + * @vitest-environment node + */ +import { loginResponseSchema } from '@affine/workspace/affine/login'; +import { beforeAll, describe, expect, it, vi } from 'vitest'; + +import type { affineApis as API } from '../apis'; + +let affineApis: typeof API; + +beforeAll(async () => { + // @ts-expect-error + globalThis.window = undefined; + affineApis = (await import('../apis')).affineApis; +}); + +describe('apis', () => { + it('should defined', async () => { + expect(affineApis).toBeDefined(); + expect(affineApis).toBe(globalThis.AFFINE_APIS); + }); + + it('login mock user', async () => { + const setItem = vi.fn((key: string, value: unknown) => { + expect(key).toBe('affine-login-v2'); + expect(value).toBeTypeOf('string'); + loginResponseSchema.parse(JSON.parse(value as string)); + }); + vi.stubGlobal('localStorage', { + setItem, + }); + expect(globalThis.AFFINE_DEBUG).toBeDefined(); + expect(globalThis.AFFINE_DEBUG.loginMockUser1).toBeTypeOf('function'); + expect(globalThis.AFFINE_DEBUG.loginMockUser2).toBeTypeOf('function'); + await (globalThis.AFFINE_DEBUG.loginMockUser1 as () => Promise)(); + await (globalThis.AFFINE_DEBUG.loginMockUser2 as () => Promise)(); + expect(setItem).toBeCalledTimes(2); + }); +}); diff --git a/apps/web/src/shared/apis.ts b/apps/web/src/shared/apis.ts index 0f485a614e..4e3f08cc05 100644 --- a/apps/web/src/shared/apis.ts +++ b/apps/web/src/shared/apis.ts @@ -18,11 +18,7 @@ if (typeof window === 'undefined') { // This is for Server side rendering support prefixUrl = new URL('http://' + config.serverAPI + '/').origin; } else { - try { - new URL(serverAPI); - } catch (e) { - console.warn('serverAPI is not a valid URL', config.serverAPI); - } + prefixUrl = serverAPI; } } else { const params = new URLSearchParams(window.location.search); @@ -40,6 +36,41 @@ if (!globalThis.AFFINE_APIS) { jotaiStore.set(currentAffineUserAtom, parseIdToken(response.token)); setLoginStorage(response); }; + const loginMockUser1 = async () => { + const user1 = await import('@affine-test/fixtures/built-in-user1.json'); + const data = await fetch(prefixUrl + 'api/user/token', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + type: 'DebugLoginUser', + email: user1.email, + password: user1.password, + }), + }).then(r => r.json()); + setLogin(data); + }; + const loginMockUser2 = async () => { + const user2 = await import('@affine-test/fixtures/built-in-user2.json'); + const data = await fetch(prefixUrl + 'api/user/token', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + type: 'DebugLoginUser', + email: user2.email, + password: user2.password, + }), + }).then(r => r.json()); + setLogin(data); + }; + + globalThis.AFFINE_DEBUG = { + loginMockUser1, + loginMockUser2, + }; } declare global { @@ -50,6 +81,8 @@ declare global { | undefined | (ReturnType & ReturnType); + // eslint-disable-next-line no-var + var AFFINE_DEBUG: Record; } export { affineApis }; diff --git a/packages/workspace/package.json b/packages/workspace/package.json index f513ca8377..5d1ddf6e5c 100644 --- a/packages/workspace/package.json +++ b/packages/workspace/package.json @@ -9,7 +9,7 @@ "./affine/sync": "./src/affine/sync.js" }, "dependencies": { - "@affine-test/fixtures": "workspace:^", + "@affine-test/fixtures": "workspace:*", "@affine/component": "workspace:*", "@affine/debug": "workspace:*", "@affine/env": "workspace:*", diff --git a/scripts/vitest/next-config-mock.ts b/scripts/vitest/next-config-mock.ts index 4e809a6ace..ab9f3b0cc9 100644 --- a/scripts/vitest/next-config-mock.ts +++ b/scripts/vitest/next-config-mock.ts @@ -6,7 +6,7 @@ export default function getConfig() { gitVersion: 'UNKNOWN', hash: 'UNKNOWN', editorVersion: 'UNKNOWN', - serverAPI: 'http://localhost:3000/api', + serverAPI: 'http://localhost:3000/', enableBroadCastChannelProvider: true, enableIndexedDBProvider: true, enableDebugPage: true, diff --git a/yarn.lock b/yarn.lock index 40d45f9066..7d4519f447 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,7 +12,7 @@ __metadata: languageName: node linkType: hard -"@affine-test/fixtures@workspace:^, @affine-test/fixtures@workspace:tests/fixtures": +"@affine-test/fixtures@workspace:*, @affine-test/fixtures@workspace:tests/fixtures": version: 0.0.0-use.local resolution: "@affine-test/fixtures@workspace:tests/fixtures" languageName: unknown @@ -170,6 +170,7 @@ __metadata: version: 0.0.0-use.local resolution: "@affine/web@workspace:apps/web" dependencies: + "@affine-test/fixtures": "workspace:*" "@affine/component": "workspace:*" "@affine/debug": "workspace:*" "@affine/env": "workspace:*" @@ -227,7 +228,7 @@ __metadata: version: 0.0.0-use.local resolution: "@affine/workspace@workspace:packages/workspace" dependencies: - "@affine-test/fixtures": "workspace:^" + "@affine-test/fixtures": "workspace:*" "@affine/component": "workspace:*" "@affine/debug": "workspace:*" "@affine/env": "workspace:*"