mattermost-mobile/app/utils/mix.test.ts
2024-07-05 07:17:09 +08:00

63 lines
1.9 KiB
TypeScript

// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import mix from './mix';
describe('MixinBuilder', () => {
class BaseClass {
baseMethod() {
return 'base method';
}
}
const MixinA = (superclass: any) => class extends superclass {
mixinAMethod() {
return 'mixin A method';
}
};
const MixinB = (superclass: any) => class extends superclass {
mixinBMethod() {
return 'mixin B method';
}
};
test('applies mixins correctly', () => {
const MixedClass = mix(BaseClass).with(MixinA, MixinB);
const instance = new MixedClass();
expect(instance.baseMethod()).toBe('base method');
// @ts-expect-error mixin method not defined
expect(instance.mixinAMethod()).toBe('mixin A method');
// @ts-expect-error mixin method not defined
expect(instance.mixinBMethod()).toBe('mixin B method');
});
test('applies a single mixin correctly', () => {
const MixedClass = mix(BaseClass).with(MixinA);
const instance = new MixedClass();
expect(instance.baseMethod()).toBe('base method');
// @ts-expect-error mixin method not defined
expect(instance.mixinAMethod()).toBe('mixin A method');
// @ts-expect-error mixin method not defined
expect(() => instance.mixinBMethod()).toThrow(TypeError);
});
test('returns the superclass if no mixins are provided', () => {
const MixedClass = mix(BaseClass).with();
const instance = new MixedClass();
expect(instance.baseMethod()).toBe('base method');
// @ts-expect-error mixin method not defined
expect(() => instance.mixinAMethod()).toThrow(TypeError);
// @ts-expect-error mixin method not defined
expect(() => instance.mixinBMethod()).toThrow(TypeError);
});
});