diff --git a/.github/workflows/driver-adapter-smoke-tests.yml b/.github/workflows/driver-adapter-smoke-tests.yml new file mode 100644 index 00000000000..e3a233339b1 --- /dev/null +++ b/.github/workflows/driver-adapter-smoke-tests.yml @@ -0,0 +1,78 @@ +name: Driver Adapters, Smoke Tests +on: + push: + branches: + - main + pull_request: + paths-ignore: + - '.buildkite/**' + - '*.md' + - 'LICENSE' + - 'CODEOWNERS' + - 'renovate.json' + +jobs: + driver-adapter-smoke-tests: + name: Smoke tests for adapter ${{ matrix.adapter }} + + strategy: + fail-fast: false + matrix: + adapter: ["neon:ws", "neon:http", planetscale, pg] + + runs-on: ubuntu-latest + + services: + postgres: + image: postgres + env: + POSTGRES_PASSWORD: postgres + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + ports: + - 5432:5432 + + env: + JS_NEON_DATABASE_URL: ${{ secrets.JS_NEON_DATABASE_URL }} + JS_PLANETSCALE_DATABASE_URL: ${{ secrets.JS_PLANETSCALE_DATABASE_URL }} + JS_PG_DATABASE_URL: postgres://postgres:postgres@localhost:5432/test # ${{ secrets.JS_PG_DATABASE_URL }} + + steps: + - uses: actions/checkout@v4 + + - uses: dtolnay/rust-toolchain@stable + + - uses: pnpm/action-setup@v2 + with: + version: 8 + - uses: actions/setup-node@v3 + with: + node-version: 18 + #cache: 'pnpm' + + - name: Compile Query Engine + run: cargo build -p query-engine-node-api + + - name: Install Dependencies (Driver Adapters) + run: pnpm install + working-directory: ./query-engine/driver-adapters/js + - name: Build Driver Adapters + run: pnpm build + working-directory: ./query-engine/driver-adapters/js + + - run: pnpm prisma:${{ matrix.adapter }} + working-directory: ./query-engine/driver-adapters/js/smoke-test-js + - run: pnpm ${{ matrix.adapter }}:libquery + working-directory: ./query-engine/driver-adapters/js/smoke-test-js + - name: pnpm ${{ matrix.adapter }}:client (using @prisma/client - including engine! - from Npm) + run: pnpm ${{ matrix.adapter }}:client + if: always() + working-directory: ./query-engine/driver-adapters/js/smoke-test-js + + - name: pnpm errors + run: pnpm errors + if: always() + working-directory: ./query-engine/driver-adapters/js/smoke-test-js \ No newline at end of file diff --git a/query-engine/driver-adapters/js/pnpm-lock.yaml b/query-engine/driver-adapters/js/pnpm-lock.yaml index f919d4a1a06..ce7a442a538 100644 --- a/query-engine/driver-adapters/js/pnpm-lock.yaml +++ b/query-engine/driver-adapters/js/pnpm-lock.yaml @@ -103,8 +103,8 @@ importers: specifier: workspace:* version: link:../adapter-planetscale '@prisma/client': - specifier: 5.3.0-integration-feat-driver-adapters-in-client.3 - version: 5.3.0-integration-feat-driver-adapters-in-client.3(prisma@5.3.0-integration-feat-driver-adapters-in-client.3) + specifier: 5.4.0-dev.29 + version: 5.4.0-dev.29(prisma@5.4.0-dev.29) '@prisma/driver-adapter-utils': specifier: workspace:* version: link:../driver-adapter-utils @@ -128,8 +128,8 @@ importers: specifier: ^7.0.3 version: 7.0.3 prisma: - specifier: 5.3.0-integration-feat-driver-adapters-in-client.3 - version: 5.3.0-integration-feat-driver-adapters-in-client.3 + specifier: 5.4.0-dev.29 + version: 5.4.0-dev.29 tsx: specifier: ^3.12.7 version: 3.12.7 @@ -415,8 +415,8 @@ packages: resolution: {integrity: sha512-aWbU+D/IRHoDE9975y+Q4c+EwwAWxCPwFId+N1AhQVFXzbeJMkj6KN2iQtoi03elcLMRdfT+V3i9Z4WRw+/oIA==} engines: {node: '>=16'} - /@prisma/client@5.3.0-integration-feat-driver-adapters-in-client.3(prisma@5.3.0-integration-feat-driver-adapters-in-client.3): - resolution: {integrity: sha512-L/y90JbrWyJGXiXvtKfRKDgqTjTEQ2rkzdb0tlf4Uu9jIyBxiKr5qmDl7vRagN1JXeOkYqinsi+598MtJ7pGFA==} + /@prisma/client@5.4.0-dev.29(prisma@5.4.0-dev.29): + resolution: {integrity: sha512-rpuBku3CFmX6FDq2SANcc9Ch6ZTqT6fyhvhe66bI/kzJjVY4NN7PwleJesB8/VfS5TkAYMmK5HcPQUwi5hZEVw==} engines: {node: '>=16.13'} requiresBuild: true peerDependencies: @@ -425,16 +425,16 @@ packages: prisma: optional: true dependencies: - '@prisma/engines-version': 5.3.0-28.3457e5de04da1741c969a80068702ad103e99553 - prisma: 5.3.0-integration-feat-driver-adapters-in-client.3 + '@prisma/engines-version': 5.4.0-18.32692fd2ce90d456c093eb8eae68511575243419 + prisma: 5.4.0-dev.29 dev: false - /@prisma/engines-version@5.3.0-28.3457e5de04da1741c969a80068702ad103e99553: - resolution: {integrity: sha512-eb+8hgURyTu1qAWmTxgZCgBjf0UV6REC525fa1XnPpL6hxMZ7cEtFCX0f9GDopa/piCM9pq5H2ttthGOKQyVLA==} + /@prisma/engines-version@5.4.0-18.32692fd2ce90d456c093eb8eae68511575243419: + resolution: {integrity: sha512-6qgjyvmru90p7sn+mWQlZDmX8WgYTZ/cB2kpDShjbg1ymF4dIszqUm6RZqESoZ39Mgp5d620AgDtZqfFQ8sWRQ==} dev: false - /@prisma/engines@5.3.0-integration-feat-driver-adapters-in-client.3: - resolution: {integrity: sha512-Nt+lbsiE4jj4GGIyhLrcNy8fVwBjsZeQqNI2oMbgoCyMSZwkcUmMRuK7OJdzbxHBKpivnneF0WMhbv/fZTRGig==} + /@prisma/engines@5.4.0-dev.29: + resolution: {integrity: sha512-3uZ/rLbrJcVSv6js2haSGb2QqB4n26j3Gr4w7iySiQ5O83L11rtOjmkRGdX8yXxEBibuWtOn43SJb24AlQDj8g==} requiresBuild: true /@types/debug@4.1.8: @@ -1035,13 +1035,13 @@ packages: /postgres-range@1.1.3: resolution: {integrity: sha512-VdlZoocy5lCP0c/t66xAfclglEapXPCIVhqqJRncYpvbCgImF0w67aPKfbqUMr72tO2k5q0TdTZwCLjPTI6C9g==} - /prisma@5.3.0-integration-feat-driver-adapters-in-client.3: - resolution: {integrity: sha512-M9FQjLmJL7g4GnHwcsuf2WPqE3/B3k/laBkaq5XCxJcBMjoipNIGW0ZlZKY9t+TdJ14asGrv4+7o7mAmKLZqrw==} + /prisma@5.4.0-dev.29: + resolution: {integrity: sha512-TlhIZLVZsDVIQBcVZ8bRi9CJrThkEhKMJ9sEBtsINYx4ju3k7lGl9Kdqlm7zOW4FVwSNPgKvgsdzRgsO6fbDug==} engines: {node: '>=16.13'} hasBin: true requiresBuild: true dependencies: - '@prisma/engines': 5.3.0-integration-feat-driver-adapters-in-client.3 + '@prisma/engines': 5.4.0-dev.29 /punycode@2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} diff --git a/query-engine/driver-adapters/js/smoke-test-js/package.json b/query-engine/driver-adapters/js/smoke-test-js/package.json index 37cecd08239..95459d0237d 100644 --- a/query-engine/driver-adapters/js/smoke-test-js/package.json +++ b/query-engine/driver-adapters/js/smoke-test-js/package.json @@ -11,24 +11,26 @@ "prisma:db:push:mysql": "prisma db push --schema ./prisma/mysql/schema.prisma --force-reset", "prisma:db:execute:mysql": "prisma db execute --schema ./prisma/mysql/schema.prisma --file ./prisma/mysql/commands/type_test/insert.sql", "prisma:studio:mysql": "prisma studio --schema ./prisma/mysql/schema.prisma", + "prisma:neon:ws": "pnpm prisma:neon", + "prisma:neon:http": "pnpm prisma:neon", "prisma:neon": "cross-env-shell DATABASE_URL=\"${JS_NEON_DATABASE_URL}\" \"pnpm prisma:db:push:postgres && pnpm prisma:db:execute:postgres\"", "studio:neon": "cross-env-shell DATABASE_URL=\"${JS_NEON_DATABASE_URL}\" \"pnpm prisma:studio:postgres\"", - "neon:ws:libquery": "DATABASE_URL=\"${JS_NEON_DATABASE_URL}\" node --test --loader=tsx ./src/libquery/neon.ws.test.ts", - "neon:http:libquery": "DATABASE_URL=\"${JS_NEON_DATABASE_URL}\" node --test --loader=tsx ./src/libquery/neon.http.test.ts", - "neon:ws:client": "DATABASE_URL=\"${JS_NEON_DATABASE_URL}\" node --test --loader=tsx ./src/client/neon.ws.test.ts", - "neon:http:client": "DATABASE_URL=\"${JS_NEON_DATABASE_URL}\" node --test --loader=tsx ./src/client/neon.http.test.ts", + "neon:ws:libquery": "DATABASE_URL=\"${JS_NEON_DATABASE_URL}\" node --test --test-reporter spec --loader=tsx ./src/libquery/neon.ws.test.ts", + "neon:http:libquery": "DATABASE_URL=\"${JS_NEON_DATABASE_URL}\" node --test --test-reporter spec --loader=tsx ./src/libquery/neon.http.test.ts", + "neon:ws:client": "DATABASE_URL=\"${JS_NEON_DATABASE_URL}\" node --test --test-reporter spec --loader=tsx ./src/client/neon.ws.test.ts", + "neon:http:client": "DATABASE_URL=\"${JS_NEON_DATABASE_URL}\" node --test --test-reporter spec --loader=tsx ./src/client/neon.http.test.ts", "neon:ws": "pnpm neon:ws:libquery && pnpm neon:ws:client", "neon:http": "pnpm neon:http:libquery && pnpm neon:http:client", "prisma:pg": "cross-env-shell DATABASE_URL=\"${JS_PG_DATABASE_URL}\" \"pnpm prisma:db:push:postgres && pnpm prisma:db:execute:postgres\"", "studio:pg": "cross-env-shell DATABASE_URL=\"${JS_PG_DATABASE_URL}\" \"pnpm prisma:studio:postgres\"", - "pg:libquery": "cross-env-shell DATABASE_URL=\"${JS_PG_DATABASE_URL}\" node --test --loader=tsx ./src/libquery/pg.test.ts", - "pg:client": "DATABASE_URL=\"${JS_PG_DATABASE_URL}\" node --test --loader=tsx ./src/client/pg.test.ts", + "pg:libquery": "cross-env-shell DATABASE_URL=\"${JS_PG_DATABASE_URL}\" node --test --test-reporter spec --loader=tsx ./src/libquery/pg.test.ts", + "pg:client": "DATABASE_URL=\"${JS_PG_DATABASE_URL}\" node --test --test-reporter spec --loader=tsx ./src/client/pg.test.ts", "pg": "pnpm pg:libquery && pnpm pg:client", - "errors": "DATABASE_URL=\"${JS_PG_DATABASE_URL}\" node --test --loader=tsx ./src/libquery/errors.test.ts", + "errors": "DATABASE_URL=\"${JS_PG_DATABASE_URL}\" node --test --test-reporter spec --loader=tsx ./src/libquery/errors.test.ts", "prisma:planetscale": "cross-env-shell DATABASE_URL=\"${JS_PLANETSCALE_DATABASE_URL}\" \"pnpm prisma:db:push:mysql && pnpm prisma:db:execute:mysql\"", "studio:planetscale": "cross-env-shell DATABASE_URL=\"${JS_PLANETSCALE_DATABASE_URL}\" \"pnpm prisma:studio:mysql\"", - "planetscale:libquery": "DATABASE_URL=\"${JS_PLANETSCALE_DATABASE_URL}\" node --test --loader=tsx ./src/libquery/planetscale.test.ts", - "planetscale:client": "DATABASE_URL=\"${JS_PLANETSCALE_DATABASE_URL}\" node --test --loader=tsx ./src/client/planetscale.test.ts", + "planetscale:libquery": "DATABASE_URL=\"${JS_PLANETSCALE_DATABASE_URL}\" node --test --test-reporter spec --loader=tsx ./src/libquery/planetscale.test.ts", + "planetscale:client": "DATABASE_URL=\"${JS_PLANETSCALE_DATABASE_URL}\" node --test --test-reporter spec --loader=tsx ./src/client/planetscale.test.ts", "planetscale": "pnpm planetscale:libquery && pnpm planetscale:client" }, "keywords": [], @@ -36,13 +38,13 @@ "license": "Apache-2.0", "sideEffects": true, "dependencies": { + "@neondatabase/serverless": "^0.6.0", + "@planetscale/database": "^1.11.0", "@prisma/adapter-neon": "workspace:*", - "@prisma/adapter-planetscale": "workspace:*", "@prisma/adapter-pg": "workspace:*", + "@prisma/adapter-planetscale": "workspace:*", + "@prisma/client": "5.4.0-dev.29", "@prisma/driver-adapter-utils": "workspace:*", - "@neondatabase/serverless": "^0.6.0", - "@planetscale/database": "^1.11.0", - "@prisma/client": "5.3.0-integration-feat-driver-adapters-in-client.3", "pg": "^8.11.3", "superjson": "^1.13.1", "undici": "^5.23.0" @@ -51,7 +53,7 @@ "@types/node": "^20.5.1", "@types/pg": "^8.10.2", "cross-env": "^7.0.3", - "prisma": "5.3.0-integration-feat-driver-adapters-in-client.3", + "prisma": "5.4.0-dev.29", "tsx": "^3.12.7" } } diff --git a/query-engine/driver-adapters/js/smoke-test-js/src/client/client.ts b/query-engine/driver-adapters/js/smoke-test-js/src/client/client.ts index ca434271c8d..35a7e8975f2 100644 --- a/query-engine/driver-adapters/js/smoke-test-js/src/client/client.ts +++ b/query-engine/driver-adapters/js/smoke-test-js/src/client/client.ts @@ -1,7 +1,9 @@ import { describe, it } from 'node:test' +import path from 'node:path' import assert from 'node:assert' import { PrismaClient } from '@prisma/client' import type { DriverAdapter } from '@prisma/driver-adapter-utils' +import { getLibQueryEnginePath } from '../libquery/util' export async function smokeTestClient(driverAdapter: DriverAdapter) { const provider = driverAdapter.flavour @@ -13,6 +15,9 @@ export async function smokeTestClient(driverAdapter: DriverAdapter) { } as const, ] + const dirname = path.dirname(new URL(import.meta.url).pathname) + process.env.PRISMA_QUERY_ENGINE_LIBRARY = getLibQueryEnginePath(dirname) + for (const adapter of [driverAdapter, undefined]) { const isUsingDriverAdapters = adapter !== undefined describe(isUsingDriverAdapters ? `using Driver Adapters` : `using Rust drivers`, () => { diff --git a/query-engine/driver-adapters/js/smoke-test-js/src/client/neon.http.test.ts b/query-engine/driver-adapters/js/smoke-test-js/src/client/neon.http.test.ts index 44cb1fde98a..53156ac5624 100644 --- a/query-engine/driver-adapters/js/smoke-test-js/src/client/neon.http.test.ts +++ b/query-engine/driver-adapters/js/smoke-test-js/src/client/neon.http.test.ts @@ -6,10 +6,7 @@ import { smokeTestClient } from './client' describe('neon with @prisma/client', async () => { const connectionString = process.env.JS_NEON_DATABASE_URL ?? '' - const connection = neon(connectionString, { - arrayMode: false, - fullResults: true, - }) + const connection = neon(connectionString) const adapter = new PrismaNeonHTTP(connection) smokeTestClient(adapter) diff --git a/query-engine/driver-adapters/js/smoke-test-js/src/libquery/util.ts b/query-engine/driver-adapters/js/smoke-test-js/src/libquery/util.ts index ad453ae9313..783eb76759d 100644 --- a/query-engine/driver-adapters/js/smoke-test-js/src/libquery/util.ts +++ b/query-engine/driver-adapters/js/smoke-test-js/src/libquery/util.ts @@ -9,11 +9,9 @@ export function initQueryEngine( driver: ErrorCapturingDriverAdapter, prismaSchemaRelativePath: string, ): QueryEngineInstance { - // I assume nobody will run this on Windows ¯\_(ツ)_/¯ - const libExt = os.platform() === 'darwin' ? 'dylib' : 'so' const dirname = path.dirname(new URL(import.meta.url).pathname) + const libQueryEnginePath = getLibQueryEnginePath(dirname) - const libQueryEnginePath = path.join(dirname, `../../../../../../target/debug/libquery_engine.${libExt}`) const schemaPath = path.join(dirname, prismaSchemaRelativePath) console.log('[nodejs] read Prisma schema from', schemaPath) @@ -43,6 +41,12 @@ export function initQueryEngine( return engine } +export function getLibQueryEnginePath(dirname: String) { + // I assume nobody will run this on Windows ¯\_(ツ)_/¯ + const libExt = os.platform() === 'darwin' ? 'dylib' : 'so' + return path.join(dirname, `../../../../../../target/debug/libquery_engine.${libExt}`) +} + export function createQueryFn(engine: QueryEngineInstance, adapter: ErrorCapturingDriverAdapter) { return async function doQuery(query: JsonQuery, tx_id?: string) { const result = await engine.query(JSON.stringify(query), 'trace', tx_id)