rwadurian/backend/services/referral-service/test/domain/value-objects/referral-chain.vo.spec.ts

93 lines
3.2 KiB
TypeScript

import { ReferralChain } from '../../../src/domain/value-objects/referral-chain.vo';
describe('ReferralChain Value Object', () => {
describe('create', () => {
it('should create empty chain when no referrer', () => {
const chain = ReferralChain.create(null);
expect(chain.chain).toEqual([]);
expect(chain.depth).toBe(0);
});
it('should create chain with referrer', () => {
const chain = ReferralChain.create(100n);
expect(chain.chain).toEqual([100n]);
expect(chain.depth).toBe(1);
});
it('should create chain with parent chain', () => {
const parentChain = [200n, 300n, 400n];
const chain = ReferralChain.create(100n, parentChain);
expect(chain.chain).toEqual([100n, 200n, 300n, 400n]);
expect(chain.depth).toBe(4);
});
it('should truncate chain to MAX_DEPTH', () => {
const parentChain = [2n, 3n, 4n, 5n, 6n, 7n, 8n, 9n, 10n, 11n];
const chain = ReferralChain.create(1n, parentChain);
expect(chain.chain.length).toBe(10);
expect(chain.chain[0]).toBe(1n);
expect(chain.chain[9]).toBe(10n);
});
});
describe('fromArray', () => {
it('should create chain from array', () => {
const chain = ReferralChain.fromArray([1n, 2n, 3n]);
expect(chain.chain).toEqual([1n, 2n, 3n]);
});
it('should throw error if array exceeds MAX_DEPTH', () => {
const longArray = Array.from({ length: 11 }, (_, i) => BigInt(i + 1));
expect(() => ReferralChain.fromArray(longArray)).toThrow('推荐链深度不能超过 10');
});
});
describe('empty', () => {
it('should create empty chain', () => {
const chain = ReferralChain.empty();
expect(chain.chain).toEqual([]);
expect(chain.depth).toBe(0);
});
});
describe('directReferrer', () => {
it('should return direct referrer', () => {
const chain = ReferralChain.create(100n, [200n, 300n]);
expect(chain.directReferrer).toBe(100n);
});
it('should return null for empty chain', () => {
const chain = ReferralChain.empty();
expect(chain.directReferrer).toBeNull();
});
});
describe('getReferrerAtLevel', () => {
it('should return referrer at specified level', () => {
const chain = ReferralChain.fromArray([100n, 200n, 300n]);
expect(chain.getReferrerAtLevel(0)).toBe(100n);
expect(chain.getReferrerAtLevel(1)).toBe(200n);
expect(chain.getReferrerAtLevel(2)).toBe(300n);
});
it('should return null for out of bounds level', () => {
const chain = ReferralChain.fromArray([100n, 200n]);
expect(chain.getReferrerAtLevel(5)).toBeNull();
});
});
describe('getAllAncestors', () => {
it('should return all ancestors', () => {
const chain = ReferralChain.fromArray([100n, 200n, 300n]);
expect(chain.getAllAncestors()).toEqual([100n, 200n, 300n]);
});
it('should return copy of array', () => {
const chain = ReferralChain.fromArray([100n, 200n]);
const ancestors = chain.getAllAncestors();
ancestors.push(999n);
expect(chain.getAllAncestors()).toEqual([100n, 200n]);
});
});
});