170 lines
6.1 KiB
TypeScript
170 lines
6.1 KiB
TypeScript
import { AppVersion } from '../../../../src/domain/entities/app-version.entity';
|
|
import { Platform } from '../../../../src/domain/enums/platform.enum';
|
|
import { VersionCode } from '../../../../src/domain/value-objects/version-code.vo';
|
|
import { VersionName } from '../../../../src/domain/value-objects/version-name.vo';
|
|
import { BuildNumber } from '../../../../src/domain/value-objects/build-number.vo';
|
|
import { DownloadUrl } from '../../../../src/domain/value-objects/download-url.vo';
|
|
import { FileSize } from '../../../../src/domain/value-objects/file-size.vo';
|
|
import { FileSha256 } from '../../../../src/domain/value-objects/file-sha256.vo';
|
|
import { Changelog } from '../../../../src/domain/value-objects/changelog.vo';
|
|
|
|
describe('AppVersion Entity', () => {
|
|
const createValidParams = () => ({
|
|
platform: Platform.ANDROID,
|
|
versionCode: VersionCode.create(100),
|
|
versionName: VersionName.create('1.0.0'),
|
|
buildNumber: BuildNumber.create('100'),
|
|
downloadUrl: DownloadUrl.create('https://example.com/app.apk'),
|
|
fileSize: FileSize.create(10485760n), // 10 MB
|
|
fileSha256: FileSha256.create('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'),
|
|
changelog: Changelog.create('Initial release with basic features'),
|
|
isForceUpdate: false,
|
|
createdBy: 'admin',
|
|
});
|
|
|
|
describe('create', () => {
|
|
it('should create valid app version', () => {
|
|
const params = createValidParams();
|
|
const appVersion = AppVersion.create(params);
|
|
|
|
expect(appVersion.id).toBeDefined();
|
|
expect(appVersion.platform).toBe(Platform.ANDROID);
|
|
expect(appVersion.versionCode).toBe(params.versionCode);
|
|
expect(appVersion.versionName).toBe(params.versionName);
|
|
expect(appVersion.isEnabled).toBe(true);
|
|
expect(appVersion.isForceUpdate).toBe(false);
|
|
expect(appVersion.releaseDate).toBeNull();
|
|
expect(appVersion.createdBy).toBe('admin');
|
|
expect(appVersion.createdAt).toBeInstanceOf(Date);
|
|
});
|
|
|
|
it('should create with optional min OS version', () => {
|
|
const params = createValidParams();
|
|
const appVersion = AppVersion.create({
|
|
...params,
|
|
minOsVersion: null,
|
|
});
|
|
|
|
expect(appVersion.minOsVersion).toBeNull();
|
|
});
|
|
});
|
|
|
|
describe('business methods', () => {
|
|
describe('disable', () => {
|
|
it('should disable the version', () => {
|
|
const appVersion = AppVersion.create(createValidParams());
|
|
const beforeUpdate = new Date(appVersion.updatedAt);
|
|
|
|
appVersion.disable('admin');
|
|
|
|
expect(appVersion.isEnabled).toBe(false);
|
|
expect(appVersion.updatedBy).toBe('admin');
|
|
expect(appVersion.updatedAt.getTime()).toBeGreaterThanOrEqual(beforeUpdate.getTime());
|
|
});
|
|
});
|
|
|
|
describe('enable', () => {
|
|
it('should enable the version', () => {
|
|
const appVersion = AppVersion.create(createValidParams());
|
|
appVersion.disable('admin');
|
|
|
|
appVersion.enable('admin');
|
|
|
|
expect(appVersion.isEnabled).toBe(true);
|
|
expect(appVersion.updatedBy).toBe('admin');
|
|
});
|
|
});
|
|
|
|
describe('setForceUpdate', () => {
|
|
it('should set force update flag', () => {
|
|
const appVersion = AppVersion.create(createValidParams());
|
|
|
|
appVersion.setForceUpdate(true, 'admin');
|
|
|
|
expect(appVersion.isForceUpdate).toBe(true);
|
|
expect(appVersion.updatedBy).toBe('admin');
|
|
});
|
|
|
|
it('should unset force update flag', () => {
|
|
const appVersion = AppVersion.create(createValidParams());
|
|
appVersion.setForceUpdate(true, 'admin');
|
|
|
|
appVersion.setForceUpdate(false, 'admin');
|
|
|
|
expect(appVersion.isForceUpdate).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe('setReleaseDate', () => {
|
|
it('should set release date', () => {
|
|
const appVersion = AppVersion.create(createValidParams());
|
|
const releaseDate = new Date('2024-01-01');
|
|
|
|
appVersion.setReleaseDate(releaseDate, 'admin');
|
|
|
|
expect(appVersion.releaseDate).toEqual(releaseDate);
|
|
expect(appVersion.updatedBy).toBe('admin');
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('query methods', () => {
|
|
describe('isNewerThan', () => {
|
|
it('should return true for newer version', () => {
|
|
const oldVersion = AppVersion.create(createValidParams());
|
|
const newParams = createValidParams();
|
|
newParams.versionCode = VersionCode.create(200);
|
|
const newVersion = AppVersion.create(newParams);
|
|
|
|
expect(newVersion.isNewerThan(VersionCode.create(100))).toBe(true);
|
|
});
|
|
|
|
it('should return false for same or older version', () => {
|
|
const version = AppVersion.create(createValidParams());
|
|
|
|
expect(version.isNewerThan(VersionCode.create(100))).toBe(false);
|
|
expect(version.isNewerThan(VersionCode.create(200))).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe('shouldForceUpdate', () => {
|
|
it('should return true when force update is enabled', () => {
|
|
const appVersion = AppVersion.create(createValidParams());
|
|
appVersion.setForceUpdate(true, 'admin');
|
|
|
|
expect(appVersion.shouldForceUpdate()).toBe(true);
|
|
});
|
|
|
|
it('should return false when force update is disabled', () => {
|
|
const appVersion = AppVersion.create(createValidParams());
|
|
|
|
expect(appVersion.shouldForceUpdate()).toBe(false);
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('reconstitute', () => {
|
|
it('should reconstitute from persistence', () => {
|
|
const id = 'test-id';
|
|
const createdAt = new Date('2024-01-01');
|
|
const updatedAt = new Date('2024-01-02');
|
|
|
|
const appVersion = AppVersion.reconstitute({
|
|
id,
|
|
...createValidParams(),
|
|
isEnabled: true,
|
|
isForceUpdate: false,
|
|
minOsVersion: null,
|
|
releaseDate: null,
|
|
createdAt,
|
|
updatedAt,
|
|
updatedBy: null,
|
|
});
|
|
|
|
expect(appVersion.id).toBe(id);
|
|
expect(appVersion.createdAt).toEqual(createdAt);
|
|
expect(appVersion.updatedAt).toEqual(updatedAt);
|
|
});
|
|
});
|
|
});
|