Skip to main content
Glama
prisma

Prisma MCP Server

Official
by prisma
complex-queries.test.ts12.9 kB
import { describe, expect, it } from 'vitest' import { PARAM_PLACEHOLDER, parameterizeQuery } from '../parameterize' describe('parameterizeQuery - complex nested queries', () => { it('handles deeply nested structure with all features', () => { const query = { arguments: { where: { AND: [ { email: { contains: '@company.com' } }, { OR: [{ role: 'ADMIN' }, { permissions: { some: { name: 'WRITE' } } }], }, ], }, take: 10, skip: 0, }, selection: { $scalars: true, posts: { arguments: { where: { published: true }, orderBy: { createdAt: { sort: 'desc' } }, }, selection: { $scalars: true }, }, }, } expect(parameterizeQuery(query)).toEqual({ arguments: { where: { AND: [ { email: { contains: PARAM_PLACEHOLDER } }, { OR: [{ role: PARAM_PLACEHOLDER }, { permissions: { some: { name: PARAM_PLACEHOLDER } } }], }, ], }, take: 10, skip: 0, }, selection: { $scalars: true, posts: { arguments: { where: { published: PARAM_PLACEHOLDER }, orderBy: { createdAt: { sort: 'desc' } }, }, selection: { $scalars: true }, }, }, }) }) it('handles query with multiple nested selections and filters', () => { const query = { arguments: { where: { id: 1, isActive: true, }, }, selection: { $scalars: true, profile: { selection: { $scalars: true, avatar: { selection: { $scalars: true }, }, }, }, posts: { arguments: { where: { OR: [{ published: true }, { authorId: 1 }], }, take: 5, orderBy: { createdAt: { sort: 'desc' } }, }, selection: { $scalars: true, comments: { arguments: { where: { approved: true }, take: 10, }, selection: { $scalars: true, author: { selection: { $scalars: true }, }, }, }, }, }, }, } expect(parameterizeQuery(query)).toEqual({ arguments: { where: { id: PARAM_PLACEHOLDER, isActive: PARAM_PLACEHOLDER, }, }, selection: { $scalars: true, profile: { selection: { $scalars: true, avatar: { selection: { $scalars: true }, }, }, }, posts: { arguments: { where: { OR: [{ published: PARAM_PLACEHOLDER }, { authorId: PARAM_PLACEHOLDER }], }, take: 5, orderBy: { createdAt: { sort: 'desc' } }, }, selection: { $scalars: true, comments: { arguments: { where: { approved: PARAM_PLACEHOLDER }, take: 10, }, selection: { $scalars: true, author: { selection: { $scalars: true }, }, }, }, }, }, }, }) }) it('handles create with nested relations and where conditions', () => { const query = { arguments: { data: { email: 'user@example.com', name: 'Test User', profile: { create: { bio: 'Hello world', settings: { create: { theme: 'dark', notifications: true, }, }, }, }, posts: { create: [ { title: 'First Post', content: 'Content here', tags: { connect: [{ id: 1 }, { id: 2 }], }, }, ], }, }, }, selection: { $scalars: true, profile: { selection: { $scalars: true }, }, posts: { selection: { $scalars: true, tags: { selection: { $scalars: true }, }, }, }, }, } expect(parameterizeQuery(query)).toEqual({ arguments: { data: { email: PARAM_PLACEHOLDER, name: PARAM_PLACEHOLDER, profile: { create: { bio: PARAM_PLACEHOLDER, settings: { create: { theme: PARAM_PLACEHOLDER, notifications: PARAM_PLACEHOLDER, }, }, }, }, posts: { create: [ { title: PARAM_PLACEHOLDER, content: PARAM_PLACEHOLDER, tags: { connect: [{ id: PARAM_PLACEHOLDER }, { id: PARAM_PLACEHOLDER }], }, }, ], }, }, }, selection: { $scalars: true, profile: { selection: { $scalars: true }, }, posts: { selection: { $scalars: true, tags: { selection: { $scalars: true }, }, }, }, }, }) }) it('handles update with complex nested operations', () => { const query = { arguments: { where: { id: 1 }, data: { email: 'updated@example.com', profile: { update: { bio: 'Updated bio', }, }, posts: { create: { title: 'New Post' }, update: { where: { id: 100 }, data: { title: 'Updated Title' }, }, deleteMany: { where: { published: false }, }, }, tags: { set: [{ id: 1 }, { id: 2 }], disconnect: [{ id: 3 }], }, }, }, selection: { $scalars: true }, } expect(parameterizeQuery(query)).toEqual({ arguments: { where: { id: PARAM_PLACEHOLDER }, data: { email: PARAM_PLACEHOLDER, profile: { update: { bio: PARAM_PLACEHOLDER, }, }, posts: { create: { title: PARAM_PLACEHOLDER }, update: { where: { id: PARAM_PLACEHOLDER }, data: { title: PARAM_PLACEHOLDER }, }, deleteMany: { where: { published: PARAM_PLACEHOLDER }, }, }, tags: { set: [{ id: PARAM_PLACEHOLDER }, { id: PARAM_PLACEHOLDER }], disconnect: [{ id: PARAM_PLACEHOLDER }], }, }, }, selection: { $scalars: true }, }) }) it('handles query with aggregations in selection', () => { const query = { arguments: { where: { status: 'ACTIVE' }, }, selection: { $scalars: true, _count: { selection: { posts: true, comments: true, }, }, posts: { arguments: { where: { published: true }, }, selection: { $scalars: true, _count: { selection: { comments: true, likes: true, }, }, }, }, }, } expect(parameterizeQuery(query)).toEqual({ arguments: { where: { status: PARAM_PLACEHOLDER }, }, selection: { $scalars: true, _count: { selection: { posts: true, comments: true, }, }, posts: { arguments: { where: { published: PARAM_PLACEHOLDER }, }, selection: { $scalars: true, _count: { selection: { comments: true, likes: true, }, }, }, }, }, }) }) it('handles upsert with complex where and data', () => { const query = { arguments: { where: { email_tenantId: { email: 'user@example.com', tenantId: 'tenant-123', }, }, create: { email: 'user@example.com', tenantId: 'tenant-123', name: 'New User', profile: { create: { bio: 'New profile' }, }, }, update: { name: 'Updated User', profile: { upsert: { create: { bio: 'Created profile' }, update: { bio: 'Updated profile' }, }, }, }, }, selection: { $scalars: true, profile: { selection: { $scalars: true }, }, }, } expect(parameterizeQuery(query)).toEqual({ arguments: { where: { email_tenantId: { email: PARAM_PLACEHOLDER, tenantId: PARAM_PLACEHOLDER, }, }, create: { email: PARAM_PLACEHOLDER, tenantId: PARAM_PLACEHOLDER, name: PARAM_PLACEHOLDER, profile: { create: { bio: PARAM_PLACEHOLDER }, }, }, update: { name: PARAM_PLACEHOLDER, profile: { upsert: { create: { bio: PARAM_PLACEHOLDER }, update: { bio: PARAM_PLACEHOLDER }, }, }, }, }, selection: { $scalars: true, profile: { selection: { $scalars: true }, }, }, }) }) it('handles complex filter with multiple relation traversals', () => { const query = { arguments: { where: { AND: [ { author: { profile: { is: { verified: true, }, }, }, }, { categories: { some: { parent: { name: 'Technology', }, }, }, }, { NOT: { tags: { none: { name: { in: ['spam', 'blocked'] }, }, }, }, }, ], }, orderBy: [{ createdAt: { sort: 'desc' } }, { title: { sort: 'asc' } }], take: 20, skip: 0, }, selection: { $scalars: true, author: { selection: { $scalars: true, profile: { selection: { $scalars: true }, }, }, }, categories: { selection: { $scalars: true, parent: { selection: { $scalars: true }, }, }, }, tags: { selection: { $scalars: true }, }, }, } expect(parameterizeQuery(query)).toEqual({ arguments: { where: { AND: [ { author: { profile: { is: { verified: PARAM_PLACEHOLDER, }, }, }, }, { categories: { some: { parent: { name: PARAM_PLACEHOLDER, }, }, }, }, { NOT: { tags: { none: { name: { in: [PARAM_PLACEHOLDER, PARAM_PLACEHOLDER] }, }, }, }, }, ], }, orderBy: [{ createdAt: { sort: 'desc' } }, { title: { sort: 'asc' } }], take: 20, skip: 0, }, selection: { $scalars: true, author: { selection: { $scalars: true, profile: { selection: { $scalars: true }, }, }, }, categories: { selection: { $scalars: true, parent: { selection: { $scalars: true }, }, }, }, tags: { selection: { $scalars: true }, }, }, }) }) })

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/prisma/prisma'

If you have feedback or need assistance with the MCP directory API, please join our Discord server