203 lines
5.8 KiB
TypeScript
203 lines
5.8 KiB
TypeScript
import { DauCalculationService } from '../../../../src/domain/services/dau-calculation.service';
|
|
import { DauQueryResult } from '../../../../src/domain/repositories/event-log.repository.interface';
|
|
|
|
describe('DauCalculationService', () => {
|
|
let service: DauCalculationService;
|
|
|
|
beforeEach(() => {
|
|
service = new DauCalculationService();
|
|
});
|
|
|
|
describe('createStatsFromQueryResult', () => {
|
|
it('should create DailyActiveStats from query result', () => {
|
|
const day = new Date('2025-01-01');
|
|
const result: DauQueryResult = {
|
|
total: 1000,
|
|
byProvince: new Map([
|
|
['Shanghai', 500],
|
|
['Beijing', 300],
|
|
]),
|
|
byCity: new Map([
|
|
['Shanghai', 500],
|
|
['Haidian', 300],
|
|
]),
|
|
};
|
|
|
|
const stats = service.createStatsFromQueryResult(day, result);
|
|
|
|
expect(stats.day).toEqual(day);
|
|
expect(stats.dauCount).toBe(1000);
|
|
expect(stats.dauByProvince.get('Shanghai')).toBe(500);
|
|
expect(stats.dauByProvince.get('Beijing')).toBe(300);
|
|
expect(stats.dauByCity.get('Shanghai')).toBe(500);
|
|
expect(stats.dauByCity.get('Haidian')).toBe(300);
|
|
});
|
|
|
|
it('should handle empty province and city maps', () => {
|
|
const day = new Date('2025-01-01');
|
|
const result: DauQueryResult = {
|
|
total: 100,
|
|
byProvince: new Map(),
|
|
byCity: new Map(),
|
|
};
|
|
|
|
const stats = service.createStatsFromQueryResult(day, result);
|
|
|
|
expect(stats.dauCount).toBe(100);
|
|
expect(stats.dauByProvince.size).toBe(0);
|
|
expect(stats.dauByCity.size).toBe(0);
|
|
});
|
|
|
|
it('should handle zero total', () => {
|
|
const day = new Date('2025-01-01');
|
|
const result: DauQueryResult = {
|
|
total: 0,
|
|
byProvince: new Map(),
|
|
byCity: new Map(),
|
|
};
|
|
|
|
const stats = service.createStatsFromQueryResult(day, result);
|
|
|
|
expect(stats.dauCount).toBe(0);
|
|
});
|
|
});
|
|
|
|
describe('mergeQueryResults', () => {
|
|
it('should return empty result for empty input', () => {
|
|
const merged = service.mergeQueryResults([]);
|
|
|
|
expect(merged.total).toBe(0);
|
|
expect(merged.byProvince.size).toBe(0);
|
|
expect(merged.byCity.size).toBe(0);
|
|
});
|
|
|
|
it('should return single result unchanged', () => {
|
|
const result: DauQueryResult = {
|
|
total: 500,
|
|
byProvince: new Map([['Shanghai', 500]]),
|
|
byCity: new Map([['Shanghai', 500]]),
|
|
};
|
|
|
|
const merged = service.mergeQueryResults([result]);
|
|
|
|
expect(merged.total).toBe(500);
|
|
expect(merged.byProvince.get('Shanghai')).toBe(500);
|
|
expect(merged.byCity.get('Shanghai')).toBe(500);
|
|
});
|
|
|
|
it('should take max total from multiple results', () => {
|
|
const results: DauQueryResult[] = [
|
|
{
|
|
total: 300,
|
|
byProvince: new Map(),
|
|
byCity: new Map(),
|
|
},
|
|
{
|
|
total: 500,
|
|
byProvince: new Map(),
|
|
byCity: new Map(),
|
|
},
|
|
{
|
|
total: 400,
|
|
byProvince: new Map(),
|
|
byCity: new Map(),
|
|
},
|
|
];
|
|
|
|
const merged = service.mergeQueryResults(results);
|
|
|
|
expect(merged.total).toBe(500);
|
|
});
|
|
|
|
it('should take max count per province from multiple results', () => {
|
|
const results: DauQueryResult[] = [
|
|
{
|
|
total: 1000,
|
|
byProvince: new Map([
|
|
['Shanghai', 500],
|
|
['Beijing', 200],
|
|
]),
|
|
byCity: new Map(),
|
|
},
|
|
{
|
|
total: 1200,
|
|
byProvince: new Map([
|
|
['Shanghai', 600],
|
|
['Guangdong', 300],
|
|
]),
|
|
byCity: new Map(),
|
|
},
|
|
];
|
|
|
|
const merged = service.mergeQueryResults(results);
|
|
|
|
expect(merged.byProvince.get('Shanghai')).toBe(600);
|
|
expect(merged.byProvince.get('Beijing')).toBe(200);
|
|
expect(merged.byProvince.get('Guangdong')).toBe(300);
|
|
});
|
|
|
|
it('should take max count per city from multiple results', () => {
|
|
const results: DauQueryResult[] = [
|
|
{
|
|
total: 1000,
|
|
byProvince: new Map(),
|
|
byCity: new Map([
|
|
['Shenzhen', 400],
|
|
['Guangzhou', 300],
|
|
]),
|
|
},
|
|
{
|
|
total: 1200,
|
|
byProvince: new Map(),
|
|
byCity: new Map([
|
|
['Shenzhen', 500],
|
|
['Beijing', 200],
|
|
]),
|
|
},
|
|
];
|
|
|
|
const merged = service.mergeQueryResults(results);
|
|
|
|
expect(merged.byCity.get('Shenzhen')).toBe(500);
|
|
expect(merged.byCity.get('Guangzhou')).toBe(300);
|
|
expect(merged.byCity.get('Beijing')).toBe(200);
|
|
});
|
|
|
|
it('should handle mixed data from multiple results', () => {
|
|
const results: DauQueryResult[] = [
|
|
{
|
|
total: 800,
|
|
byProvince: new Map([['Shanghai', 400]]),
|
|
byCity: new Map([['Shanghai', 400]]),
|
|
},
|
|
{
|
|
total: 1000,
|
|
byProvince: new Map([
|
|
['Shanghai', 500],
|
|
['Beijing', 300],
|
|
]),
|
|
byCity: new Map([
|
|
['Shanghai', 500],
|
|
['Haidian', 300],
|
|
]),
|
|
},
|
|
{
|
|
total: 900,
|
|
byProvince: new Map([['Guangdong', 450]]),
|
|
byCity: new Map([['Shenzhen', 450]]),
|
|
},
|
|
];
|
|
|
|
const merged = service.mergeQueryResults(results);
|
|
|
|
expect(merged.total).toBe(1000);
|
|
expect(merged.byProvince.get('Shanghai')).toBe(500);
|
|
expect(merged.byProvince.get('Beijing')).toBe(300);
|
|
expect(merged.byProvince.get('Guangdong')).toBe(450);
|
|
expect(merged.byCity.get('Shanghai')).toBe(500);
|
|
expect(merged.byCity.get('Haidian')).toBe(300);
|
|
expect(merged.byCity.get('Shenzhen')).toBe(450);
|
|
});
|
|
});
|
|
});
|