diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 981680c9c5..f4f2a94d66 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -116,7 +116,8 @@ jobs: run: | pnpm lint --max-warnings=0 PLAYWRIGHT_BROWSERS_PATH=0 npx playwright install chromium - PLAYWRIGHT_BROWSERS_PATH=0 pnpm test -- --forbid-only + PLAYWRIGHT_BROWSERS_PATH=0 pnpm test + PLAYWRIGHT_BROWSERS_PATH=0 pnpm test:dc env: NEXT_PUBLIC_FIREBASE_API_KEY: ${{ secrets.NEXT_PUBLIC_FIREBASE_API_KEY }} NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN: ${{ secrets.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN }} diff --git a/.github/workflows/temp_test.yml b/.github/workflows/temp_test.yml index 1bc2ec89f7..92ea7bcc9d 100644 --- a/.github/workflows/temp_test.yml +++ b/.github/workflows/temp_test.yml @@ -116,7 +116,8 @@ jobs: run: | pnpm lint --max-warnings=0 PLAYWRIGHT_BROWSERS_PATH=0 npx playwright install chromium - PLAYWRIGHT_BROWSERS_PATH=0 pnpm test -- --forbid-only + PLAYWRIGHT_BROWSERS_PATH=0 pnpm test + PLAYWRIGHT_BROWSERS_PATH=0 pnpm test:dc env: NEXT_PUBLIC_FIREBASE_API_KEY: ${{ secrets.NEXT_PUBLIC_FIREBASE_API_KEY }} NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN: ${{ secrets.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN }} diff --git a/package.json b/package.json index 8fbcc8190a..ff794e1b6e 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "start": "pnpm --filter @affine/app start", "lint": "pnpm --filter @affine/app lint", "test": "playwright test", - "test:e2e": "playwright test", + "test:dc": "pnpm --filter @affine/data-services test", "test:e2e:codegen": "npx playwright codegen http://localhost:8080", "test:unit": "jest", "postinstall": "husky install", @@ -24,7 +24,7 @@ }, "devDependencies": { "@jest/globals": "^29.3.1", - "@playwright/test": "^1.28.1", + "@playwright/test": "^1.29.1", "@typescript-eslint/eslint-plugin": "^5.47.0", "@typescript-eslint/parser": "^5.47.0", "@types/eslint": "^8.4.10", diff --git a/packages/data-services/.gitignore b/packages/data-services/.gitignore new file mode 100644 index 0000000000..75e854d8dc --- /dev/null +++ b/packages/data-services/.gitignore @@ -0,0 +1,4 @@ +node_modules/ +/test-results/ +/playwright-report/ +/playwright/.cache/ diff --git a/packages/data-services/package.json b/packages/data-services/package.json index 580c896cea..65bdc17129 100644 --- a/packages/data-services/package.json +++ b/packages/data-services/package.json @@ -10,7 +10,8 @@ ".": "./dist/src/index.js" }, "scripts": { - "build": "tsc --project ./tsconfig.json" + "build": "tsc --project ./tsconfig.json", + "test": "playwright test" }, "keywords": [], "author": "", @@ -19,15 +20,15 @@ "url": "git+https://github.com/toeverything/AFFiNE.git" }, "devDependencies": { + "@playwright/test": "^1.29.1", "typescript": "^4.8.4" }, "dependencies": { - "axios": "^1.2.0", "encoding": "^0.1.13", "firebase": "^9.13.0", "ky": "^0.33.0", - "swr": "^2.0.0", "lib0": "^0.2.58", + "swr": "^2.0.0", "y-protocols": "^1.0.5" } } diff --git a/packages/data-services/playwright.config.ts b/packages/data-services/playwright.config.ts new file mode 100644 index 0000000000..a8e718991a --- /dev/null +++ b/packages/data-services/playwright.config.ts @@ -0,0 +1,25 @@ +import type { PlaywrightTestConfig } from '@playwright/test'; + +const config: PlaywrightTestConfig = { + testDir: './tests', + timeout: 30 * 1000, + expect: { + /** + * Maximum time expect() should wait for the condition to be met. + * For example in `await expect(locator).toHaveText();` + */ + timeout: 5000, + }, + fullyParallel: true, + forbidOnly: !!process.env.CI, + retries: process.env.CI ? 2 : 0, + workers: process.env.CI ? 1 : undefined, + use: { + actionTimeout: 0, + + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + }, +}; + +export default config; diff --git a/packages/data-services/src/data-center.ts b/packages/data-services/src/data-center.ts new file mode 100644 index 0000000000..4c4f1e9916 --- /dev/null +++ b/packages/data-services/src/data-center.ts @@ -0,0 +1,19 @@ +class DataCenter { + static async init() { + return new DataCenter(); + } + + private constructor() { + // TODO + } +} + +let _dataCenterInstance: Promise; + +export const getDataCenter = () => { + if (!_dataCenterInstance) { + _dataCenterInstance = DataCenter.init(); + } + + return _dataCenterInstance; +}; diff --git a/packages/data-services/src/index.ts b/packages/data-services/src/index.ts index 64bd6aa430..89de33b6b8 100644 --- a/packages/data-services/src/index.ts +++ b/packages/data-services/src/index.ts @@ -2,3 +2,5 @@ export { signInWithGoogle, onAuthStateChanged } from './auth'; export * from './request'; export * from './sdks'; export * from './websocket'; + +export { getDataCenter } from './data-center'; diff --git a/packages/data-services/tests/datacenter.spec.ts b/packages/data-services/tests/datacenter.spec.ts new file mode 100644 index 0000000000..d5a4a267ef --- /dev/null +++ b/packages/data-services/tests/datacenter.spec.ts @@ -0,0 +1,8 @@ +import { test, expect } from '@playwright/test'; +import { getDataCenter } from './utils.js'; + +test('can init data center', async () => { + const dataCenter = await getDataCenter(); + + expect(dataCenter).toBeTruthy(); +}); diff --git a/packages/data-services/tests/utils.ts b/packages/data-services/tests/utils.ts new file mode 100644 index 0000000000..c06d906058 --- /dev/null +++ b/packages/data-services/tests/utils.ts @@ -0,0 +1,4 @@ +export const getDataCenter = () => + import('../src/data-center.js').then(async dataCenter => + dataCenter.getDataCenter() + ); diff --git a/playwright.config.ts b/playwright.config.ts index a4453b323b..d5a8721f60 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -24,8 +24,11 @@ const config: PlaywrightTestConfig = { // Record video only when retrying a test for the first time. video: 'on-first-retry', }, - retries: process.env.CI ? 3 : 0, - workers: '100%', + + fullyParallel: true, + forbidOnly: !!process.env.CI, + retries: process.env.CI ? 2 : 0, + workers: process.env.CI ? '100%' : undefined, webServer: { command: 'pnpm build && pnpm start -p 8080', diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ad65f27cf6..0b01c0454b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,7 +5,7 @@ importers: .: specifiers: '@jest/globals': ^29.3.1 - '@playwright/test': ^1.28.1 + '@playwright/test': ^1.29.1 '@types/eslint': ^8.4.10 '@types/node': ^18.11.17 '@typescript-eslint/eslint-plugin': ^5.47.0 @@ -23,7 +23,7 @@ importers: typescript: ^4.9.3 devDependencies: '@jest/globals': 29.3.1 - '@playwright/test': 1.28.1 + '@playwright/test': 1.29.1 '@types/eslint': 8.4.10 '@types/node': 18.11.17 '@typescript-eslint/eslint-plugin': 5.47.0_dvmqlqg4r5ba7a4i47pzcunkky @@ -123,7 +123,7 @@ importers: packages/data-services: specifiers: - axios: ^1.2.0 + '@playwright/test': ^1.29.1 encoding: ^0.1.13 firebase: ^9.13.0 ky: ^0.33.0 @@ -132,7 +132,6 @@ importers: typescript: ^4.8.4 y-protocols: ^1.0.5 dependencies: - axios: 1.2.0 encoding: 0.1.13 firebase: 9.13.0_encoding@0.1.13 ky: 0.33.0 @@ -140,6 +139,7 @@ importers: swr: 2.0.0 y-protocols: 1.0.5 devDependencies: + '@playwright/test': 1.29.1 typescript: 4.9.3 packages/logger: @@ -2037,13 +2037,13 @@ packages: fastq: 1.13.0 dev: true - /@playwright/test/1.28.1: - resolution: {integrity: sha512-xN6spdqrNlwSn9KabIhqfZR7IWjPpFK1835tFNgjrlysaSezuX8PYUwaz38V/yI8TJLG9PkAMEXoHRXYXlpTPQ==} + /@playwright/test/1.29.1: + resolution: {integrity: sha512-iQxk2DX5U9wOGV3+/Jh9OHPsw5H3mleUL2S4BgQuwtlAfK3PnKvn38m4Rg9zIViGHVW24opSm99HQm/UFLEy6w==} engines: {node: '>=14'} hasBin: true dependencies: '@types/node': 18.11.17 - playwright-core: 1.28.1 + playwright-core: 1.29.1 dev: true /@popperjs/core/2.11.6: @@ -2824,25 +2824,11 @@ packages: engines: {node: '>=8'} dev: true - /asynckit/0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: false - /axe-core/4.4.3: resolution: {integrity: sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w==} engines: {node: '>=4'} dev: true - /axios/1.2.0: - resolution: {integrity: sha512-zT7wZyNYu3N5Bu0wuZ6QccIf93Qk1eV8LOewxgjOZFd2DenOs98cJ7+Y6703d0wkaXGY6/nZd4EweJaHz9uzQw==} - dependencies: - follow-redirects: 1.15.2 - form-data: 4.0.0 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - dev: false - /axobject-query/2.2.0: resolution: {integrity: sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==} dev: true @@ -3164,13 +3150,6 @@ packages: resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} dev: true - /combined-stream/1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - dependencies: - delayed-stream: 1.0.0 - dev: false - /command-score/0.1.2: resolution: {integrity: sha512-VtDvQpIJBvBatnONUsPzXYFVKQQAhuf3XTNOAsdBxCNO/QCtUUd8LSgjn0GVarBkCad6aJCZfXgrjYbl/KRr7w==} dev: false @@ -3312,11 +3291,6 @@ packages: has-property-descriptors: 1.0.0 object-keys: 1.1.1 - /delayed-stream/1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dev: false - /detect-newline/3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} @@ -4221,30 +4195,11 @@ packages: resolution: {integrity: sha512-W7cHV7Hrwjid6lWmy0IhsWDFQboWSng25U3VVywpHOTJnnAZNPScog67G+cVpeX9f7yDD21ih0WDrMMT+JoaYg==} dev: false - /follow-redirects/1.15.2: - resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dev: false - /form-data-encoder/2.1.4: resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} engines: {node: '>= 14.17'} dev: true - /form-data/4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: false - /fs.realpath/1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -5523,18 +5478,6 @@ packages: picomatch: 2.3.1 dev: true - /mime-db/1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - dev: false - - /mime-types/2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - dev: false - /mimic-fn/2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -5956,8 +5899,8 @@ packages: find-up: 4.1.0 dev: true - /playwright-core/1.28.1: - resolution: {integrity: sha512-3PixLnGPno0E8rSBJjtwqTwJe3Yw72QwBBBxNoukIj3lEeBNXwbNiKrNuB1oyQgTBw5QHUhNO3SteEtHaMK6ag==} + /playwright-core/1.29.1: + resolution: {integrity: sha512-20Ai3d+lMkWpI9YZYlxk8gxatfgax5STW8GaMozAHwigLiyiKQrdkt7gaoT9UQR8FIVDg6qVXs9IoZUQrDjIIg==} engines: {node: '>=14'} hasBin: true dev: true @@ -6054,10 +5997,6 @@ packages: long: 5.2.0 dev: false - /proxy-from-env/1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - dev: false - /punycode/2.1.1: resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} engines: {node: '>=6'}