feat: dashboard
This commit is contained in:
142
server/src/cqrs/queries/handlers/server-ranking.util.spec.ts
Normal file
142
server/src/cqrs/queries/handlers/server-ranking.util.spec.ts
Normal file
@@ -0,0 +1,142 @@
|
||||
import {
|
||||
describe,
|
||||
it,
|
||||
expect
|
||||
} from 'vitest';
|
||||
import {
|
||||
rankFeaturedServers,
|
||||
rankTrendingServers,
|
||||
RankableServer
|
||||
} from './server-ranking.util';
|
||||
|
||||
function server(id: string, lastSeen: number): RankableServer {
|
||||
return { id, lastSeen };
|
||||
}
|
||||
|
||||
describe('rankFeaturedServers', () => {
|
||||
it('orders by membership count descending', () => {
|
||||
const rows = [
|
||||
server('a', 100),
|
||||
server('b', 100),
|
||||
server('c', 100)
|
||||
];
|
||||
const counts = new Map([
|
||||
['a', 2],
|
||||
['b', 10],
|
||||
['c', 5]
|
||||
]);
|
||||
const ranked = rankFeaturedServers(rows, counts);
|
||||
|
||||
expect(ranked.map((row) => row.id)).toEqual([
|
||||
'b',
|
||||
'c',
|
||||
'a'
|
||||
]);
|
||||
});
|
||||
|
||||
it('breaks membership ties by most recent activity', () => {
|
||||
const rows = [
|
||||
server('a', 50),
|
||||
server('b', 200),
|
||||
server('c', 120)
|
||||
];
|
||||
const counts = new Map([
|
||||
['a', 5],
|
||||
['b', 5],
|
||||
['c', 5]
|
||||
]);
|
||||
const ranked = rankFeaturedServers(rows, counts);
|
||||
|
||||
expect(ranked.map((row) => row.id)).toEqual([
|
||||
'b',
|
||||
'c',
|
||||
'a'
|
||||
]);
|
||||
});
|
||||
|
||||
it('treats missing counts as zero', () => {
|
||||
const rows = [server('a', 10), server('b', 10)];
|
||||
const counts = new Map([['a', 1]]);
|
||||
const ranked = rankFeaturedServers(rows, counts);
|
||||
|
||||
expect(ranked.map((row) => row.id)).toEqual(['a', 'b']);
|
||||
});
|
||||
|
||||
it('applies the limit', () => {
|
||||
const rows = [
|
||||
server('a', 1),
|
||||
server('b', 2),
|
||||
server('c', 3)
|
||||
];
|
||||
const counts = new Map([
|
||||
['a', 3],
|
||||
['b', 2],
|
||||
['c', 1]
|
||||
]);
|
||||
|
||||
expect(rankFeaturedServers(rows, counts, 2).map((row) => row.id)).toEqual(['a', 'b']);
|
||||
});
|
||||
|
||||
it('returns an empty array for a non-positive limit', () => {
|
||||
const rows = [server('a', 1)];
|
||||
|
||||
expect(rankFeaturedServers(rows, new Map(), 0)).toEqual([]);
|
||||
expect(rankFeaturedServers(rows, new Map(), -5)).toEqual([]);
|
||||
});
|
||||
|
||||
it('does not mutate the input rows', () => {
|
||||
const rows = [server('a', 1), server('b', 2)];
|
||||
|
||||
rankFeaturedServers(rows, new Map([['b', 9]]));
|
||||
|
||||
expect(rows.map((row) => row.id)).toEqual(['a', 'b']);
|
||||
});
|
||||
});
|
||||
|
||||
describe('rankTrendingServers', () => {
|
||||
it('orders by most recent activity descending', () => {
|
||||
const rows = [
|
||||
server('a', 100),
|
||||
server('b', 300),
|
||||
server('c', 200)
|
||||
];
|
||||
const counts = new Map<string, number>();
|
||||
const ranked = rankTrendingServers(rows, counts);
|
||||
|
||||
expect(ranked.map((row) => row.id)).toEqual([
|
||||
'b',
|
||||
'c',
|
||||
'a'
|
||||
]);
|
||||
});
|
||||
|
||||
it('breaks activity ties by membership count', () => {
|
||||
const rows = [
|
||||
server('a', 100),
|
||||
server('b', 100),
|
||||
server('c', 100)
|
||||
];
|
||||
const counts = new Map([
|
||||
['a', 1],
|
||||
['b', 9],
|
||||
['c', 4]
|
||||
]);
|
||||
const ranked = rankTrendingServers(rows, counts);
|
||||
|
||||
expect(ranked.map((row) => row.id)).toEqual([
|
||||
'b',
|
||||
'c',
|
||||
'a'
|
||||
]);
|
||||
});
|
||||
|
||||
it('applies the limit', () => {
|
||||
const rows = [
|
||||
server('a', 1),
|
||||
server('b', 2),
|
||||
server('c', 3)
|
||||
];
|
||||
|
||||
expect(rankTrendingServers(rows, new Map(), 1).map((row) => row.id)).toEqual(['c']);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user