@aaronshaf/ger
Version:
Gerrit CLI and SDK - A modern CLI tool and TypeScript SDK for Gerrit Code Review, built with Effect-TS
228 lines (196 loc) • 6.69 kB
text/typescript
import { describe, expect, test } from 'bun:test'
import { filterMeaningfulMessages, sortMessagesByDate } from '@/utils/message-filters'
import type { MessageInfo } from '@/schemas/gerrit'
describe('Message Filters', () => {
describe('filterMeaningfulMessages', () => {
test('should filter out empty messages', () => {
const messages: MessageInfo[] = [
{
id: 'msg1',
message: 'Code-Review+2',
author: { _account_id: 1001, name: 'Jane Reviewer' },
date: '2024-01-15 11:30:00.000000000',
},
{
id: 'msg2',
message: '',
author: { _account_id: 1002, name: 'Bob Reviewer' },
date: '2024-01-15 11:31:00.000000000',
},
{
id: 'msg3',
message: ' ',
author: { _account_id: 1003, name: 'Alice Reviewer' },
date: '2024-01-15 11:32:00.000000000',
},
]
const filtered = filterMeaningfulMessages(messages)
expect(filtered).toHaveLength(1)
expect(filtered[0].id).toBe('msg1')
})
test('should filter out autogenerated newPatchSet messages', () => {
const messages: MessageInfo[] = [
{
id: 'msg1',
message: 'Uploaded patch set 1.',
author: { _account_id: 1001, name: 'Author' },
date: '2024-01-15 11:30:00.000000000',
tag: 'autogenerated:gerrit:newPatchSet',
},
{
id: 'msg2',
message: 'Code-Review+2',
author: { _account_id: 1002, name: 'Reviewer' },
date: '2024-01-15 11:31:00.000000000',
},
]
const filtered = filterMeaningfulMessages(messages)
expect(filtered).toHaveLength(1)
expect(filtered[0].id).toBe('msg2')
})
test('should filter out autogenerated merged messages', () => {
const messages: MessageInfo[] = [
{
id: 'msg1',
message: 'Change has been successfully merged',
author: { _account_id: 1001, name: 'Author' },
date: '2024-01-15 11:30:00.000000000',
tag: 'autogenerated:gerrit:merged',
},
{
id: 'msg2',
message: 'Code-Review+2',
author: { _account_id: 1002, name: 'Reviewer' },
date: '2024-01-15 11:31:00.000000000',
},
]
const filtered = filterMeaningfulMessages(messages)
expect(filtered).toHaveLength(1)
expect(filtered[0].id).toBe('msg2')
})
test('should keep build and review status messages', () => {
const messages: MessageInfo[] = [
{
id: 'msg1',
message: 'Patch Set 1: Verified+1\\n\\nBuild Successful',
author: { _account_id: 1001, name: 'Jenkins' },
date: '2024-01-15 11:30:00.000000000',
},
{
id: 'msg2',
message: 'Patch Set 1: Code-Review+2',
author: { _account_id: 1002, name: 'Reviewer' },
date: '2024-01-15 11:31:00.000000000',
},
{
id: 'msg3',
message: 'Patch Set 1: Lint-Review-1\\n\\nThis commit may not be safe to merge',
author: { _account_id: 1003, name: 'Lint Bot' },
date: '2024-01-15 11:32:00.000000000',
},
]
const filtered = filterMeaningfulMessages(messages)
expect(filtered).toHaveLength(3)
expect(filtered.map((m) => m.id)).toEqual(['msg1', 'msg2', 'msg3'])
})
test('should handle messages without author', () => {
const messages: MessageInfo[] = [
{
id: 'msg1',
message: 'System message',
date: '2024-01-15 11:30:00.000000000',
},
]
const filtered = filterMeaningfulMessages(messages)
expect(filtered).toHaveLength(1)
expect(filtered[0].id).toBe('msg1')
})
test('should handle empty input array', () => {
const filtered = filterMeaningfulMessages([])
expect(filtered).toHaveLength(0)
})
})
describe('sortMessagesByDate', () => {
test('should sort messages by date with newest first', () => {
const messages: MessageInfo[] = [
{
id: 'msg1',
message: 'First message',
date: '2024-01-15 11:30:00.000000000',
author: { _account_id: 1001 },
},
{
id: 'msg2',
message: 'Second message',
date: '2024-01-15 11:31:00.000000000',
author: { _account_id: 1002 },
},
{
id: 'msg3',
message: 'Third message',
date: '2024-01-15 11:29:00.000000000',
author: { _account_id: 1003 },
},
]
const sorted = sortMessagesByDate(messages)
expect(sorted.map((m) => m.id)).toEqual(['msg2', 'msg1', 'msg3'])
})
test('should handle messages with same timestamp', () => {
const messages: MessageInfo[] = [
{
id: 'msg1',
message: 'First message',
date: '2024-01-15 11:30:00.000000000',
author: { _account_id: 1001 },
},
{
id: 'msg2',
message: 'Second message',
date: '2024-01-15 11:30:00.000000000',
author: { _account_id: 1002 },
},
]
const sorted = sortMessagesByDate(messages)
expect(sorted).toHaveLength(2)
// Order should be maintained for same timestamps
expect(sorted.map((m) => m.id)).toEqual(['msg1', 'msg2'])
})
test('should not mutate original array', () => {
const messages: MessageInfo[] = [
{
id: 'msg1',
message: 'First message',
date: '2024-01-15 11:31:00.000000000',
author: { _account_id: 1001 },
},
{
id: 'msg2',
message: 'Second message',
date: '2024-01-15 11:30:00.000000000',
author: { _account_id: 1002 },
},
]
const originalOrder = messages.map((m) => m.id)
const sorted = sortMessagesByDate(messages)
expect(messages.map((m) => m.id)).toEqual(originalOrder)
expect(sorted.map((m) => m.id)).toEqual(['msg1', 'msg2'])
})
test('should handle empty input array', () => {
const sorted = sortMessagesByDate([])
expect(sorted).toHaveLength(0)
})
test('should handle readonly arrays', () => {
const messages: readonly MessageInfo[] = [
{
id: 'msg1',
message: 'Message',
date: '2024-01-15 11:30:00.000000000',
author: { _account_id: 1001 },
},
] as const
const sorted = sortMessagesByDate(messages)
expect(sorted).toHaveLength(1)
expect(sorted[0].id).toBe('msg1')
})
})
})