From 886c07e918d492c295e82e2ee3aa421f2df26f92 Mon Sep 17 00:00:00 2001 From: Sasha <64744993+r1tsuu@users.noreply.github.com> Date: Tue, 24 Jun 2025 17:59:47 +0300 Subject: [PATCH] test: fix `database` integration tests with postgres (#12919) Fixes failing postgres integration tests in the `database` test suite --- test/database/config.ts | 8 +- test/database/int.spec.ts | 107 ++++++++--------- test/database/payload-types.ts | 18 +-- .../migrations/20250616_190121.ts | 112 ------------------ ...50616_190121.json => 20250624_142145.json} | 2 +- .../migrations/20250624_142145.ts | 92 ++++++++++++++ .../up-down-migration/migrations/index.ts | 8 +- 7 files changed, 165 insertions(+), 182 deletions(-) delete mode 100644 test/database/up-down-migration/migrations/20250616_190121.ts rename test/database/up-down-migration/migrations/{20250616_190121.json => 20250624_142145.json} (99%) create mode 100644 test/database/up-down-migration/migrations/20250624_142145.ts diff --git a/test/database/config.ts b/test/database/config.ts index fe42546d81..62723eff60 100644 --- a/test/database/config.ts +++ b/test/database/config.ts @@ -78,14 +78,14 @@ export default buildConfigWithDefaults({ name: 'blocks', blocks: [ { - slug: 'block', + slug: 'block-third', fields: [ { type: 'blocks', name: 'nested', blocks: [ { - slug: 'block', + slug: 'block-fourth', fields: [ { type: 'blocks', @@ -198,7 +198,7 @@ export default buildConfigWithDefaults({ type: 'blocks', blocks: [ { - slug: 'block', + slug: 'block-first', fields: [ { name: 'text', @@ -456,7 +456,7 @@ export default buildConfigWithDefaults({ type: 'blocks', blocks: [ { - slug: 'block', + slug: 'block-second', dbName: 'customBlocks', fields: [ { diff --git a/test/database/int.spec.ts b/test/database/int.spec.ts index de708935b9..00c59a1a36 100644 --- a/test/database/int.spec.ts +++ b/test/database/int.spec.ts @@ -165,7 +165,7 @@ describe('database', () => { ], blocksWithIDs: [ { - blockType: 'block', + blockType: 'block-first', id: blockID, }, ], @@ -191,7 +191,7 @@ describe('database', () => { ], blocksWithIDs: [ { - blockType: 'block', + blockType: 'block-first', id: blockID, }, ], @@ -776,7 +776,7 @@ describe('database', () => { ], blocks: [ { - blockType: 'block', + blockType: 'block-second', localizedText: 'goodbye', text: 'hello', }, @@ -2223,6 +2223,7 @@ describe('database', () => { }) it('should allow to query by virtual field 2x deep with draft:true', async () => { + await payload.delete({ collection: 'virtual-relations', where: {} }) const category = await payload.create({ collection: 'categories', data: { title: '3-category' }, @@ -2637,54 +2638,6 @@ describe('database', () => { expect(res.testBlocksLocalized[0]?.text).toBe('text-localized') }) - it('should CRUD with blocks as JSON in SQL adapters', async () => { - // eslint-disable-next-line jest/no-conditional-in-test - if (!('drizzle' in payload.db)) { - return - } - - process.env.PAYLOAD_FORCE_DRIZZLE_PUSH = 'true' - payload.db.blocksAsJSON = true - delete payload.db.pool - await payload.db.init() - await payload.db.connect() - expect(payload.db.tables.blocks_docs.testBlocks).toBeDefined() - expect(payload.db.tables.blocks_docs_locales.testBlocksLocalized).toBeDefined() - const res = await payload.create({ - collection: 'blocks-docs', - data: { - testBlocks: [{ blockType: 'cta', text: 'text' }], - testBlocksLocalized: [{ blockType: 'cta', text: 'text-localized' }], - }, - }) - expect(res.testBlocks[0]?.text).toBe('text') - expect(res.testBlocksLocalized[0]?.text).toBe('text-localized') - const res_es = await payload.update({ - collection: 'blocks-docs', - id: res.id, - locale: 'es', - data: { - testBlocksLocalized: [{ blockType: 'cta', text: 'text-localized-es' }], - testBlocks: [{ blockType: 'cta', text: 'text_updated' }], - }, - }) - expect(res_es.testBlocks[0]?.text).toBe('text_updated') - expect(res_es.testBlocksLocalized[0]?.text).toBe('text-localized-es') - const res_all = await payload.findByID({ - collection: 'blocks-docs', - id: res.id, - locale: 'all', - }) - expect(res_all.testBlocks[0]?.text).toBe('text_updated') - expect(res_all.testBlocksLocalized.es[0]?.text).toBe('text-localized-es') - expect(res_all.testBlocksLocalized.en[0]?.text).toBe('text-localized') - payload.db.blocksAsJSON = false - process.env.PAYLOAD_FORCE_DRIZZLE_PUSH = 'false' - delete payload.db.pool - await payload.db.init() - await payload.db.connect() - }) - it('should support in with null', async () => { await payload.delete({ collection: 'posts', where: {} }) const post_1 = await payload.create({ @@ -2741,10 +2694,10 @@ describe('database', () => { title: 'title', blocks: [ { - blockType: 'block', + blockType: 'block-third', nested: [ { - blockType: 'block', + blockType: 'block-fourth', nested: [], }, ], @@ -2757,4 +2710,52 @@ describe('database', () => { expect(res.blocks[0]?.nested).toHaveLength(1) expect(res.blocks[0]?.nested[0]?.nested).toHaveLength(0) }) + + it('should CRUD with blocks as JSON in SQL adapters', async () => { + // eslint-disable-next-line jest/no-conditional-in-test + if (!('drizzle' in payload.db)) { + return + } + + process.env.PAYLOAD_FORCE_DRIZZLE_PUSH = 'true' + payload.db.blocksAsJSON = true + delete payload.db.pool + await payload.db.init() + await payload.db.connect() + expect(payload.db.tables.blocks_docs.testBlocks).toBeDefined() + expect(payload.db.tables.blocks_docs_locales.testBlocksLocalized).toBeDefined() + const res = await payload.create({ + collection: 'blocks-docs', + data: { + testBlocks: [{ blockType: 'cta', text: 'text' }], + testBlocksLocalized: [{ blockType: 'cta', text: 'text-localized' }], + }, + }) + expect(res.testBlocks[0]?.text).toBe('text') + expect(res.testBlocksLocalized[0]?.text).toBe('text-localized') + const res_es = await payload.update({ + collection: 'blocks-docs', + id: res.id, + locale: 'es', + data: { + testBlocksLocalized: [{ blockType: 'cta', text: 'text-localized-es' }], + testBlocks: [{ blockType: 'cta', text: 'text_updated' }], + }, + }) + expect(res_es.testBlocks[0]?.text).toBe('text_updated') + expect(res_es.testBlocksLocalized[0]?.text).toBe('text-localized-es') + const res_all = await payload.findByID({ + collection: 'blocks-docs', + id: res.id, + locale: 'all', + }) + expect(res_all.testBlocks[0]?.text).toBe('text_updated') + expect(res_all.testBlocksLocalized.es[0]?.text).toBe('text-localized-es') + expect(res_all.testBlocksLocalized.en[0]?.text).toBe('text-localized') + payload.db.blocksAsJSON = false + process.env.PAYLOAD_FORCE_DRIZZLE_PUSH = 'false' + delete payload.db.pool + await payload.db.init() + await payload.db.connect() + }) }) diff --git a/test/database/payload-types.ts b/test/database/payload-types.ts index 886a1cf637..2c5b4fd44a 100644 --- a/test/database/payload-types.ts +++ b/test/database/payload-types.ts @@ -168,6 +168,7 @@ export interface Category { title?: string | null; updatedAt: string; createdAt: string; + _status?: ('draft' | 'published') | null; } /** * This interface was referenced by `Config`'s JSON-Schema @@ -187,12 +188,12 @@ export interface Post { nested?: unknown[] | null; id?: string | null; blockName?: string | null; - blockType: 'block'; + blockType: 'block-fourth'; }[] | null; id?: string | null; blockName?: string | null; - blockType: 'block'; + blockType: 'block-third'; }[] | null; D1?: { @@ -215,7 +216,7 @@ export interface Post { text?: string | null; id?: string | null; blockName?: string | null; - blockType: 'block'; + blockType: 'block-first'; }[] | null; updatedAt: string; @@ -369,7 +370,7 @@ export interface CustomSchema { localizedText?: string | null; id?: string | null; blockName?: string | null; - blockType: 'block'; + blockType: 'block-second'; }[] | null; updatedAt: string; @@ -702,6 +703,7 @@ export interface CategoriesSelect { title?: T; updatedAt?: T; createdAt?: T; + _status?: T; } /** * This interface was referenced by `Config`'s JSON-Schema @@ -716,13 +718,13 @@ export interface PostsSelect { blocks?: | T | { - block?: + 'block-third'?: | T | { nested?: | T | { - block?: + 'block-fourth'?: | T | { nested?: T | {}; @@ -758,7 +760,7 @@ export interface PostsSelect { blocksWithIDs?: | T | { - block?: + 'block-first'?: | T | { text?: T; @@ -885,7 +887,7 @@ export interface CustomSchemaSelect { blocks?: | T | { - block?: + 'block-second'?: | T | { text?: T; diff --git a/test/database/up-down-migration/migrations/20250616_190121.ts b/test/database/up-down-migration/migrations/20250616_190121.ts deleted file mode 100644 index 086047bb65..0000000000 --- a/test/database/up-down-migration/migrations/20250616_190121.ts +++ /dev/null @@ -1,112 +0,0 @@ -import type { MigrateDownArgs, MigrateUpArgs} from '@payloadcms/db-postgres'; - -import { sql } from '@payloadcms/db-postgres' - -export async function up({ db, payload, req }: MigrateUpArgs): Promise { - await db.execute(sql` - CREATE TABLE IF NOT EXISTS "users" ( - "id" serial PRIMARY KEY NOT NULL, - "updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL, - "created_at" timestamp(3) with time zone DEFAULT now() NOT NULL, - "email" varchar NOT NULL, - "reset_password_token" varchar, - "reset_password_expiration" timestamp(3) with time zone, - "salt" varchar, - "hash" varchar, - "login_attempts" numeric DEFAULT 0, - "lock_until" timestamp(3) with time zone - ); - - CREATE TABLE IF NOT EXISTS "payload_locked_documents" ( - "id" serial PRIMARY KEY NOT NULL, - "global_slug" varchar, - "updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL, - "created_at" timestamp(3) with time zone DEFAULT now() NOT NULL - ); - - CREATE TABLE IF NOT EXISTS "payload_locked_documents_rels" ( - "id" serial PRIMARY KEY NOT NULL, - "order" integer, - "parent_id" integer NOT NULL, - "path" varchar NOT NULL, - "users_id" integer - ); - - CREATE TABLE IF NOT EXISTS "payload_preferences" ( - "id" serial PRIMARY KEY NOT NULL, - "key" varchar, - "value" jsonb, - "updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL, - "created_at" timestamp(3) with time zone DEFAULT now() NOT NULL - ); - - CREATE TABLE IF NOT EXISTS "payload_preferences_rels" ( - "id" serial PRIMARY KEY NOT NULL, - "order" integer, - "parent_id" integer NOT NULL, - "path" varchar NOT NULL, - "users_id" integer - ); - - CREATE TABLE IF NOT EXISTS "payload_migrations" ( - "id" serial PRIMARY KEY NOT NULL, - "name" varchar, - "batch" numeric, - "updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL, - "created_at" timestamp(3) with time zone DEFAULT now() NOT NULL - ); - - DO $$ BEGIN - ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_parent_fk" FOREIGN KEY ("parent_id") REFERENCES "public"."payload_locked_documents"("id") ON DELETE cascade ON UPDATE no action; - EXCEPTION - WHEN duplicate_object THEN null; - END $$; - - DO $$ BEGIN - ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_users_fk" FOREIGN KEY ("users_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action; - EXCEPTION - WHEN duplicate_object THEN null; - END $$; - - DO $$ BEGIN - ALTER TABLE "payload_preferences_rels" ADD CONSTRAINT "payload_preferences_rels_parent_fk" FOREIGN KEY ("parent_id") REFERENCES "public"."payload_preferences"("id") ON DELETE cascade ON UPDATE no action; - EXCEPTION - WHEN duplicate_object THEN null; - END $$; - - DO $$ BEGIN - ALTER TABLE "payload_preferences_rels" ADD CONSTRAINT "payload_preferences_rels_users_fk" FOREIGN KEY ("users_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action; - EXCEPTION - WHEN duplicate_object THEN null; - END $$; - - CREATE INDEX IF NOT EXISTS "users_updated_at_idx" ON "users" USING btree ("updated_at"); - CREATE INDEX IF NOT EXISTS "users_created_at_idx" ON "users" USING btree ("created_at"); - CREATE UNIQUE INDEX IF NOT EXISTS "users_email_idx" ON "users" USING btree ("email"); - CREATE INDEX IF NOT EXISTS "payload_locked_documents_global_slug_idx" ON "payload_locked_documents" USING btree ("global_slug"); - CREATE INDEX IF NOT EXISTS "payload_locked_documents_updated_at_idx" ON "payload_locked_documents" USING btree ("updated_at"); - CREATE INDEX IF NOT EXISTS "payload_locked_documents_created_at_idx" ON "payload_locked_documents" USING btree ("created_at"); - CREATE INDEX IF NOT EXISTS "payload_locked_documents_rels_order_idx" ON "payload_locked_documents_rels" USING btree ("order"); - CREATE INDEX IF NOT EXISTS "payload_locked_documents_rels_parent_idx" ON "payload_locked_documents_rels" USING btree ("parent_id"); - CREATE INDEX IF NOT EXISTS "payload_locked_documents_rels_path_idx" ON "payload_locked_documents_rels" USING btree ("path"); - CREATE INDEX IF NOT EXISTS "payload_locked_documents_rels_users_id_idx" ON "payload_locked_documents_rels" USING btree ("users_id"); - CREATE INDEX IF NOT EXISTS "payload_preferences_key_idx" ON "payload_preferences" USING btree ("key"); - CREATE INDEX IF NOT EXISTS "payload_preferences_updated_at_idx" ON "payload_preferences" USING btree ("updated_at"); - CREATE INDEX IF NOT EXISTS "payload_preferences_created_at_idx" ON "payload_preferences" USING btree ("created_at"); - CREATE INDEX IF NOT EXISTS "payload_preferences_rels_order_idx" ON "payload_preferences_rels" USING btree ("order"); - CREATE INDEX IF NOT EXISTS "payload_preferences_rels_parent_idx" ON "payload_preferences_rels" USING btree ("parent_id"); - CREATE INDEX IF NOT EXISTS "payload_preferences_rels_path_idx" ON "payload_preferences_rels" USING btree ("path"); - CREATE INDEX IF NOT EXISTS "payload_preferences_rels_users_id_idx" ON "payload_preferences_rels" USING btree ("users_id"); - CREATE INDEX IF NOT EXISTS "payload_migrations_updated_at_idx" ON "payload_migrations" USING btree ("updated_at"); - CREATE INDEX IF NOT EXISTS "payload_migrations_created_at_idx" ON "payload_migrations" USING btree ("created_at");`) -} - -export async function down({ db, payload, req }: MigrateDownArgs): Promise { - await db.execute(sql` - DROP TABLE "users" CASCADE; - DROP TABLE "payload_locked_documents" CASCADE; - DROP TABLE "payload_locked_documents_rels" CASCADE; - DROP TABLE "payload_preferences" CASCADE; - DROP TABLE "payload_preferences_rels" CASCADE; - DROP TABLE "payload_migrations" CASCADE;`) -} diff --git a/test/database/up-down-migration/migrations/20250616_190121.json b/test/database/up-down-migration/migrations/20250624_142145.json similarity index 99% rename from test/database/up-down-migration/migrations/20250616_190121.json rename to test/database/up-down-migration/migrations/20250624_142145.json index c5489918fc..5f1b064996 100644 --- a/test/database/up-down-migration/migrations/20250616_190121.json +++ b/test/database/up-down-migration/migrations/20250624_142145.json @@ -1,5 +1,5 @@ { - "id": "3c35a6b5-e20d-4a43-af15-a6b3a0844000", + "id": "e7129a5b-a5af-490a-8ad9-318e3caeca26", "prevId": "00000000-0000-0000-0000-000000000000", "version": "7", "dialect": "postgresql", diff --git a/test/database/up-down-migration/migrations/20250624_142145.ts b/test/database/up-down-migration/migrations/20250624_142145.ts new file mode 100644 index 0000000000..a5346c2c98 --- /dev/null +++ b/test/database/up-down-migration/migrations/20250624_142145.ts @@ -0,0 +1,92 @@ +import type { MigrateDownArgs, MigrateUpArgs} from '@payloadcms/db-postgres'; + +import { sql } from '@payloadcms/db-postgres' + +export async function up({ db, payload, req }: MigrateUpArgs): Promise { + await db.execute(sql` + CREATE TABLE "users" ( + "id" serial PRIMARY KEY NOT NULL, + "updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL, + "created_at" timestamp(3) with time zone DEFAULT now() NOT NULL, + "email" varchar NOT NULL, + "reset_password_token" varchar, + "reset_password_expiration" timestamp(3) with time zone, + "salt" varchar, + "hash" varchar, + "login_attempts" numeric DEFAULT 0, + "lock_until" timestamp(3) with time zone + ); + + CREATE TABLE "payload_locked_documents" ( + "id" serial PRIMARY KEY NOT NULL, + "global_slug" varchar, + "updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL, + "created_at" timestamp(3) with time zone DEFAULT now() NOT NULL + ); + + CREATE TABLE "payload_locked_documents_rels" ( + "id" serial PRIMARY KEY NOT NULL, + "order" integer, + "parent_id" integer NOT NULL, + "path" varchar NOT NULL, + "users_id" integer + ); + + CREATE TABLE "payload_preferences" ( + "id" serial PRIMARY KEY NOT NULL, + "key" varchar, + "value" jsonb, + "updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL, + "created_at" timestamp(3) with time zone DEFAULT now() NOT NULL + ); + + CREATE TABLE "payload_preferences_rels" ( + "id" serial PRIMARY KEY NOT NULL, + "order" integer, + "parent_id" integer NOT NULL, + "path" varchar NOT NULL, + "users_id" integer + ); + + CREATE TABLE "payload_migrations" ( + "id" serial PRIMARY KEY NOT NULL, + "name" varchar, + "batch" numeric, + "updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL, + "created_at" timestamp(3) with time zone DEFAULT now() NOT NULL + ); + + ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_parent_fk" FOREIGN KEY ("parent_id") REFERENCES "public"."payload_locked_documents"("id") ON DELETE cascade ON UPDATE no action; + ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_users_fk" FOREIGN KEY ("users_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action; + ALTER TABLE "payload_preferences_rels" ADD CONSTRAINT "payload_preferences_rels_parent_fk" FOREIGN KEY ("parent_id") REFERENCES "public"."payload_preferences"("id") ON DELETE cascade ON UPDATE no action; + ALTER TABLE "payload_preferences_rels" ADD CONSTRAINT "payload_preferences_rels_users_fk" FOREIGN KEY ("users_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action; + CREATE INDEX "users_updated_at_idx" ON "users" USING btree ("updated_at"); + CREATE INDEX "users_created_at_idx" ON "users" USING btree ("created_at"); + CREATE UNIQUE INDEX "users_email_idx" ON "users" USING btree ("email"); + CREATE INDEX "payload_locked_documents_global_slug_idx" ON "payload_locked_documents" USING btree ("global_slug"); + CREATE INDEX "payload_locked_documents_updated_at_idx" ON "payload_locked_documents" USING btree ("updated_at"); + CREATE INDEX "payload_locked_documents_created_at_idx" ON "payload_locked_documents" USING btree ("created_at"); + CREATE INDEX "payload_locked_documents_rels_order_idx" ON "payload_locked_documents_rels" USING btree ("order"); + CREATE INDEX "payload_locked_documents_rels_parent_idx" ON "payload_locked_documents_rels" USING btree ("parent_id"); + CREATE INDEX "payload_locked_documents_rels_path_idx" ON "payload_locked_documents_rels" USING btree ("path"); + CREATE INDEX "payload_locked_documents_rels_users_id_idx" ON "payload_locked_documents_rels" USING btree ("users_id"); + CREATE INDEX "payload_preferences_key_idx" ON "payload_preferences" USING btree ("key"); + CREATE INDEX "payload_preferences_updated_at_idx" ON "payload_preferences" USING btree ("updated_at"); + CREATE INDEX "payload_preferences_created_at_idx" ON "payload_preferences" USING btree ("created_at"); + CREATE INDEX "payload_preferences_rels_order_idx" ON "payload_preferences_rels" USING btree ("order"); + CREATE INDEX "payload_preferences_rels_parent_idx" ON "payload_preferences_rels" USING btree ("parent_id"); + CREATE INDEX "payload_preferences_rels_path_idx" ON "payload_preferences_rels" USING btree ("path"); + CREATE INDEX "payload_preferences_rels_users_id_idx" ON "payload_preferences_rels" USING btree ("users_id"); + CREATE INDEX "payload_migrations_updated_at_idx" ON "payload_migrations" USING btree ("updated_at"); + CREATE INDEX "payload_migrations_created_at_idx" ON "payload_migrations" USING btree ("created_at");`) +} + +export async function down({ db, payload, req }: MigrateDownArgs): Promise { + await db.execute(sql` + DROP TABLE "users" CASCADE; + DROP TABLE "payload_locked_documents" CASCADE; + DROP TABLE "payload_locked_documents_rels" CASCADE; + DROP TABLE "payload_preferences" CASCADE; + DROP TABLE "payload_preferences_rels" CASCADE; + DROP TABLE "payload_migrations" CASCADE;`) +} diff --git a/test/database/up-down-migration/migrations/index.ts b/test/database/up-down-migration/migrations/index.ts index 05cb8d8f08..7a353ffcca 100644 --- a/test/database/up-down-migration/migrations/index.ts +++ b/test/database/up-down-migration/migrations/index.ts @@ -1,9 +1,9 @@ -import * as migration_20250616_190121 from './20250616_190121.js' +import * as migration_20250624_142145 from './20250624_142145.js' export const migrations = [ { - up: migration_20250616_190121.up, - down: migration_20250616_190121.down, - name: '20250616_190121', + up: migration_20250624_142145.up, + down: migration_20250624_142145.down, + name: '20250624_142145', }, ]