Commit f0aa8206 authored by nanahira's avatar nanahira

fix multi extend

parent 0419269e
......@@ -168,5 +168,5 @@ export function registerModel(
throw new Error(`Model of ${cls.name} is not defined`);
}
ctx.model.extend(tableName, ...registrar.getModelResult());
ctx.model.config[tableName].internal = registrar.getInternal();
Object.assign(ctx.model.config[tableName].internal, registrar.getInternal());
}
......@@ -78,6 +78,8 @@ describe('Model test', () => {
expect(dress.primary[0]).toBe('id');
expect(dress.unique[0][0]).toBe('name');
expect(dress.foreign.parentId).toStrictEqual(['dress', 'id']);
expect(dress.internal['']).toEqual(Dress.prototype);
expect(dress.internal['properties.']).toEqual(DressProperty.prototype);
});
it('should make class instance', async () => {
......@@ -92,8 +94,10 @@ describe('Model test', () => {
},
]);
const [dress] = await app.database.get('dress', { id: 777 });
expect(dress).toBeInstanceOf(Dress);
expect(dress.id).toBe(777);
expect(dress.getName()).toBe('Dress of Shigma');
expect(dress.properties).toBeInstanceOf(DressProperty);
expect(dress.properties.getProperty()).toBe('red 10');
});
});
import { ChildModel, DefineModel, ModelField } from '../src/decorators';
import { App } from 'koishi';
import { registerModel } from '../src/register';
import MemoryDatabase from '@koishijs/plugin-database-memory';
declare module 'koishi' {
// eslint-disable-next-line @typescript-eslint/no-empty-interface
interface User {
dress: Dress;
shirt: Shirt;
}
}
class Dress {
@ModelField('string(8)')
color: string;
@ModelField('integer(7)')
size: string;
}
class Shirt {
@ModelField('string(8)')
color: string;
@ModelField('integer(7)')
size: string;
}
@DefineModel('user')
class UserMixin1 {
@ChildModel()
dress: Dress;
}
@DefineModel('user')
class UserMixin2 {
@ChildModel()
shirt: Shirt;
}
describe('Model test', () => {
let app: App;
beforeEach(async () => {
app = new App();
app.plugin(MemoryDatabase);
await app.start();
});
it('should register model fields', () => {
registerModel(app, UserMixin1);
registerModel(app, UserMixin2);
const { user } = app.model.config;
expect(user.fields['dress.color'].type).toBe('string');
expect(user.fields['dress.size'].type).toBe('integer');
expect(user.fields['dress.color'].length).toBe(8);
expect(user.fields['dress.size'].length).toBe(7);
expect(user.fields['shirt.color'].type).toBe('string');
expect(user.fields['shirt.size'].type).toBe('integer');
expect(user.fields['shirt.color'].length).toBe(8);
expect(user.fields['shirt.size'].length).toBe(7);
expect(user.internal['dress.']).toEqual(Dress.prototype);
expect(user.internal['shirt.']).toEqual(Shirt.prototype);
});
});
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment