feat: add unit tests for collection utils (#2564)

Closes #2406
This commit is contained in:
Caleb Kniffen
2023-11-09 19:00:37 -06:00
parent 134924c395
commit 960182ecc3
2 changed files with 43 additions and 12 deletions

View File

@@ -14,20 +14,24 @@ type ValueOf<T> = T[keyof T]
*/ */
export function groupBy<T>( export function groupBy<T>(
array: T[], array: T[],
iteratee: (value: T, index: number, array: T[]) => string, iteratee: (value: T, index: number, array: T[]) => string | number,
): { [p: string]: T[] } { ): Record<string | number, T[]> {
// eslint-disable-next-line max-params -- need all the params for the fallback // eslint-disable-next-line max-params -- need all the params for the fallback
return array.reduce<{ [key: string]: T[] }>(function predicate( function predicate(
acc, acc: Record<string | number, T[]>,
value, value: T,
index, index: number,
arrayReference, arrayReference: T[],
) { ): Record<string | number, T[]> {
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- being safe for js users const key = iteratee(value, index, arrayReference) || 0
;(acc[iteratee(value, index, arrayReference)] ||= []).push(value) // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Find existing group or create a new one
const group = acc[key] || []
group.push(value)
acc[key] = group
return acc return acc
}, }
{})
return array.reduce(predicate, {})
} }
/** /**

View File

@@ -0,0 +1,27 @@
import { groupBy, omitBy } from '../../src/utils/collections'
describe('Collection Utils:', () => {
// Inspired from tests at https://github.com/lodash/lodash/blob/main/test/groupBy.spec.js
describe('groupBy', () => {
const array = [6.1, 4.2, 6.3]
it('should transform keys by `iteratee`', () => {
const actual = groupBy(array, Math.floor)
expect(actual).toEqual({ 4: [4.2], 6: [6.1, 6.3] })
})
it('should transform keys by `iteratee` that returns strings', () => {
const actual = groupBy(array, (item) => Math.floor(item).toString())
expect(actual).toEqual({ '4': [4.2], '6': [6.1, 6.3] })
})
})
// Taken from https://github.com/lodash/lodash/blob/main/test/omitBy.spec.js
describe('omitBy', () => {
it('should work with a predicate argument', () => {
const object = { aa: 1, bb: 2, cc: 3, dd: 4 }
const actual = omitBy(object, (num) => num !== 2 && num !== 4)
expect(actual).toEqual({ bb: 2, dd: 4 })
})
})
})