From accb2a59b9f461c7c043e65c949ac0e0b5fc9067 Mon Sep 17 00:00:00 2001 From: ChengLei Shao Date: Fri, 11 Mar 2022 10:08:58 +0800 Subject: [PATCH] test: update reverseField (#231) * test: update reverseField * fix: reverseField test * feat: throw error when reverseField exists --- packages/database/src/repository.ts | 2 +- .../src/__tests__/fields/reverseField.test.ts | 74 +++++++++++++++++++ .../src/__tests__/index.ts | 3 + .../plugin-collection-manager/src/plugin.ts | 14 +++- 4 files changed, 91 insertions(+), 2 deletions(-) diff --git a/packages/database/src/repository.ts b/packages/database/src/repository.ts index 3ba130fd7..23b1875bd 100644 --- a/packages/database/src/repository.ts +++ b/packages/database/src/repository.ts @@ -9,7 +9,7 @@ import { ModelCtor, Op, Transaction, - UpdateOptions as SequelizeUpdateOptions + UpdateOptions as SequelizeUpdateOptions, } from 'sequelize'; import { Collection } from './collection'; import { Database } from './database'; diff --git a/packages/plugin-collection-manager/src/__tests__/fields/reverseField.test.ts b/packages/plugin-collection-manager/src/__tests__/fields/reverseField.test.ts index ba74bba22..64ed01791 100644 --- a/packages/plugin-collection-manager/src/__tests__/fields/reverseField.test.ts +++ b/packages/plugin-collection-manager/src/__tests__/fields/reverseField.test.ts @@ -56,4 +56,78 @@ describe('reverseField options', () => { }); expect(json.foreignKey).toBe(json.reverseField.foreignKey); }); + + it('should update reverseField', async () => { + const field = await Field.repository.create({ + values: { + type: 'hasMany', + collectionName: 'tests', + target: 'targets', + reverseField: {}, + }, + }); + + expect( + await Field.repository.count({ + filter: { + collectionName: 'targets', + }, + }), + ).toEqual(1); + + let reverseField = await Field.repository.findOne({ + filter: { + collectionName: 'targets', + }, + }); + + let err; + + try { + await Field.repository.update({ + filterByTk: field.get('key') as string, + values: { + reverseField: { + uiSchema: { + title: '123', + }, + }, + }, + }); + } catch (e) { + err = e; + } + + expect(err).toBeDefined(); + + await Field.repository.update({ + filterByTk: field.get('key') as string, + values: { + reverseField: { + key: reverseField.get('key'), + uiSchema: { + title: '123', + }, + }, + }, + }); + + expect( + await Field.repository.count({ + filter: { + collectionName: 'targets', + }, + }), + ).toEqual(1); + + reverseField = await db.getRepository('fields').findOne({ + filter: { + key: reverseField.get('key'), + }, + appends: ['uiSchema'], + }); + + const uiSchema = reverseField.get('uiSchema'); + expect(uiSchema['schema']).toEqual({ title: '123' }); + }); }); diff --git a/packages/plugin-collection-manager/src/__tests__/index.ts b/packages/plugin-collection-manager/src/__tests__/index.ts index 961430805..1f5fdc956 100644 --- a/packages/plugin-collection-manager/src/__tests__/index.ts +++ b/packages/plugin-collection-manager/src/__tests__/index.ts @@ -1,10 +1,13 @@ import { mockServer } from '@nocobase/test'; +import PluginUiSchema from '@nocobase/plugin-ui-schema-storage'; + import CollectionManagerPlugin from '..'; export async function createApp() { const app = mockServer(); await app.cleanDb(); app.plugin(CollectionManagerPlugin); + app.plugin(PluginUiSchema); await app.load(); return app; } diff --git a/packages/plugin-collection-manager/src/plugin.ts b/packages/plugin-collection-manager/src/plugin.ts index 71bbeaf34..1b278d5de 100644 --- a/packages/plugin-collection-manager/src/plugin.ts +++ b/packages/plugin-collection-manager/src/plugin.ts @@ -5,9 +5,10 @@ import { afterCreateForReverseField, beforeCreateForChildrenCollection, beforeCreateForReverseField, - beforeInitOptions + beforeInitOptions, } from './hooks'; import { CollectionModel, FieldModel } from './models'; +import lodash from 'lodash'; export class CollectionManagerPlugin extends Plugin { async beforeLoad() { @@ -20,6 +21,17 @@ export class CollectionManagerPlugin extends Plugin { CollectionRepository, }); + this.app.db.on('fields.beforeUpdate', async (model, options) => { + const newValue = options.values; + if ( + model.get('reverseKey') && + lodash.get(newValue, 'reverseField') && + !lodash.get(newValue, 'reverseField.key') + ) { + throw new Error('cant update field without a reverseField key'); + } + }); + // 要在 beforeInitOptions 之前处理 this.app.db.on('fields.beforeCreate', beforeCreateForReverseField(this.app.db)); this.app.db.on('fields.beforeCreate', beforeCreateForChildrenCollection(this.app.db));