document-list-sorting.test.tsx 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. /**
  2. * Document List Sorting Tests
  3. */
  4. describe('Document List Sorting', () => {
  5. const mockDocuments = [
  6. { id: '1', name: 'Beta.pdf', word_count: 500, hit_count: 10, created_at: 1699123456 },
  7. { id: '2', name: 'Alpha.txt', word_count: 200, hit_count: 25, created_at: 1699123400 },
  8. { id: '3', name: 'Gamma.docx', word_count: 800, hit_count: 5, created_at: 1699123500 },
  9. ]
  10. const sortDocuments = (docs: any[], field: string, order: 'asc' | 'desc') => {
  11. return [...docs].sort((a, b) => {
  12. let aValue: any
  13. let bValue: any
  14. switch (field) {
  15. case 'name':
  16. aValue = a.name?.toLowerCase() || ''
  17. bValue = b.name?.toLowerCase() || ''
  18. break
  19. case 'word_count':
  20. aValue = a.word_count || 0
  21. bValue = b.word_count || 0
  22. break
  23. case 'hit_count':
  24. aValue = a.hit_count || 0
  25. bValue = b.hit_count || 0
  26. break
  27. case 'created_at':
  28. aValue = a.created_at
  29. bValue = b.created_at
  30. break
  31. default:
  32. return 0
  33. }
  34. if (field === 'name') {
  35. const result = aValue.localeCompare(bValue)
  36. return order === 'asc' ? result : -result
  37. }
  38. else {
  39. const result = aValue - bValue
  40. return order === 'asc' ? result : -result
  41. }
  42. })
  43. }
  44. test('sorts by name descending (default for UI consistency)', () => {
  45. const sorted = sortDocuments(mockDocuments, 'name', 'desc')
  46. expect(sorted.map(doc => doc.name)).toEqual(['Gamma.docx', 'Beta.pdf', 'Alpha.txt'])
  47. })
  48. test('sorts by name ascending (after toggle)', () => {
  49. const sorted = sortDocuments(mockDocuments, 'name', 'asc')
  50. expect(sorted.map(doc => doc.name)).toEqual(['Alpha.txt', 'Beta.pdf', 'Gamma.docx'])
  51. })
  52. test('sorts by word_count descending', () => {
  53. const sorted = sortDocuments(mockDocuments, 'word_count', 'desc')
  54. expect(sorted.map(doc => doc.word_count)).toEqual([800, 500, 200])
  55. })
  56. test('sorts by hit_count descending', () => {
  57. const sorted = sortDocuments(mockDocuments, 'hit_count', 'desc')
  58. expect(sorted.map(doc => doc.hit_count)).toEqual([25, 10, 5])
  59. })
  60. test('sorts by created_at descending (newest first)', () => {
  61. const sorted = sortDocuments(mockDocuments, 'created_at', 'desc')
  62. expect(sorted.map(doc => doc.created_at)).toEqual([1699123500, 1699123456, 1699123400])
  63. })
  64. test('handles empty values correctly', () => {
  65. const docsWithEmpty = [
  66. { id: '1', name: 'Test', word_count: 100, hit_count: 5, created_at: 1699123456 },
  67. { id: '2', name: 'Empty', word_count: 0, hit_count: 0, created_at: 1699123400 },
  68. ]
  69. const sorted = sortDocuments(docsWithEmpty, 'word_count', 'desc')
  70. expect(sorted.map(doc => doc.word_count)).toEqual([100, 0])
  71. })
  72. })