UNPKG

@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
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') }) }) })