import { replaceEqualById } from '../replace_equal_by_id' type Record = { type: 'Message'; id: string; text: string; attachments: string[] } type Pages = { pages: { data: Record[]; links: {}; meta: {} }[]; pageParams: unknown[] } const record = (id: string, text = id): Record => ({ type: 'Message', id, text, attachments: [] }) const pagesOf = (...pages: Record[][]): Pages => ({ pages: pages.map(data => ({ data, links: {}, meta: {} })), pageParams: pages.map(() => ({})), }) const share = (prev: Pages, next: Pages) => replaceEqualById(prev, next) as Pages describe('replaceEqualById', () => { it('returns the previous data when nothing changed', () => { const prev = pagesOf([record('c'), record('b')], [record('a')]) const next = pagesOf([record('c'), record('b')], [record('a')]) expect(share(prev, next)).toBe(prev) }) it('keeps every existing record when one is inserted at the head', () => { const [c, b] = [record('c'), record('b')] const prev = pagesOf([c, b]) const next = pagesOf([record('d'), record('c'), record('b')]) const result = share(prev, next) expect(result.pages[0].data[1]).toBe(c) expect(result.pages[0].data[2]).toBe(b) expect(result.pages[0].data[0].id).toBe('d') }) it('keeps the survivors when a record is removed', () => { const [c, b, a] = [record('c'), record('b'), record('a')] const prev = pagesOf([c, b, a]) const next = pagesOf([record('c'), record('a')]) const result = share(prev, next) expect(result.pages[0].data).toEqual([c, a]) expect(result.pages[0].data[0]).toBe(c) expect(result.pages[0].data[1]).toBe(a) }) it('replaces only the changed record and keeps its untouched nested references', () => { const b = record('b') const prev = pagesOf([record('c'), b]) const next = pagesOf([record('c'), { ...record('b', 'edited'), attachments: [] }]) const result = share(prev, next) expect(result.pages[0].data[0]).toBe(prev.pages[0].data[0]) expect(result.pages[0].data[1]).not.toBe(b) expect(result.pages[0].data[1].text).toBe('edited') expect(result.pages[0].data[1].attachments).toBe(b.attachments) }) it('keeps untouched pages when only another page changed', () => { const prev = pagesOf([record('c')], [record('a')]) const next = pagesOf([record('d'), record('c')], [record('a')]) const result = share(prev, next) expect(result.pages[1]).toBe(prev.pages[1]) }) it('returns the new data when there is nothing to share with', () => { const next = pagesOf([record('a')]) expect(replaceEqualById(undefined, next)).toBe(next) }) })