Skip to content

Commit 3b2f6fa

Browse files
committed
fix test for rowModel
1 parent 4f0149a commit 3b2f6fa

File tree

2 files changed

+127
-8
lines changed

2 files changed

+127
-8
lines changed

packages/angular-table/tests/createAngularTable.test.ts

Lines changed: 62 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,22 @@
1-
import { describe, expect, test } from 'vitest'
1+
import { describe, expect, test, vi } from 'vitest'
22
import {
33
type ColumnDef,
44
createAngularTable,
55
getCoreRowModel,
6+
type RowSelectionState,
67
type Table,
8+
RowModel,
9+
type PaginationState,
10+
getPaginationRowModel,
711
} from '../src/index'
8-
import { Component, input, isSignal, signal, untracked } from '@angular/core'
12+
import {
13+
Component,
14+
effect,
15+
input,
16+
isSignal,
17+
signal,
18+
untracked,
19+
} from '@angular/core'
920
import { TestBed } from '@angular/core/testing'
1021
import { setFixtureSignalInputs } from './test-utils'
1122

@@ -73,14 +84,62 @@ describe('createAngularTable', () => {
7384
const tableProperty = table[name as keyof typeof table]
7485
expect(isSignal(tableProperty)).toEqual(expected)
7586
})
87+
88+
test('Row model is reactive', () => {
89+
const coreRowModelFn = vi.fn<[RowModel<Data>]>()
90+
const rowModelFn = vi.fn<[RowModel<Data>]>()
91+
const pagination = signal<PaginationState>({
92+
pageSize: 5,
93+
pageIndex: 0,
94+
})
95+
const data = Array.from({ length: 10 }, (_, i) => ({
96+
id: String(i),
97+
title: `Title ${i}`,
98+
}))
99+
100+
TestBed.runInInjectionContext(() => {
101+
const table = createAngularTable(() => ({
102+
data,
103+
columns: columns,
104+
getCoreRowModel: getCoreRowModel(),
105+
getPaginationRowModel: getPaginationRowModel(),
106+
getRowId: row => row.id,
107+
state: {
108+
pagination: pagination(),
109+
},
110+
onPaginationChange: updater => {
111+
typeof updater === 'function'
112+
? pagination.update(updater)
113+
: pagination.set(updater)
114+
},
115+
}))
116+
117+
effect(() => coreRowModelFn(table.getCoreRowModel()))
118+
effect(() => rowModelFn(table.getRowModel()))
119+
120+
TestBed.flushEffects()
121+
122+
pagination.set({ pageIndex: 0, pageSize: 3 })
123+
124+
TestBed.flushEffects()
125+
})
126+
127+
expect(coreRowModelFn).toHaveBeenCalledOnce()
128+
expect(coreRowModelFn.mock.calls[0]![0].rows.length).toEqual(10)
129+
130+
expect(rowModelFn).toHaveBeenCalledTimes(2)
131+
expect(rowModelFn.mock.calls[0]![0].rows.length).toEqual(5)
132+
expect(rowModelFn.mock.calls[1]![0].rows.length).toEqual(3)
133+
})
76134
})
77135
})
78136

79137
const testShouldBeComputedProperty = (
80138
table: Table<any>,
81139
propertyName: string
82140
) => {
83-
if (propertyName.endsWith('Handler') || propertyName.endsWith('Model')) {
141+
if (propertyName.endsWith('Handler')) {
142+
// || propertyName.endsWith('Model')) {
84143
return false
85144
}
86145

packages/angular-table/tests/flex-render-table.test.ts

Lines changed: 65 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import {
22
ChangeDetectionStrategy,
33
Component,
4-
Input,
54
input,
65
signal,
76
type TemplateRef,
@@ -11,17 +10,19 @@ import {
1110
type CellContext,
1211
ColumnDef,
1312
getCoreRowModel,
13+
TableOptions,
14+
type TableState,
1415
} from '@tanstack/table-core'
1516
import {
1617
createAngularTable,
18+
FlexRender,
1719
flexRenderComponent,
18-
FlexRenderComponent,
1920
type FlexRenderContent,
2021
FlexRenderDirective,
2122
injectFlexRenderContext,
2223
} from '../src'
2324
import { TestBed } from '@angular/core/testing'
24-
import { describe, expect, test } from 'vitest'
25+
import { describe, expect, test, vi } from 'vitest'
2526
import { By } from '@angular/platform-browser'
2627

2728
const defaultData: TestData[] = [{ id: '1', title: 'My title' }] as TestData[]
@@ -149,6 +150,63 @@ describe('FlexRenderDirective', () => {
149150
expect(el!.tagName).toEqual('APP-TEST-BADGE')
150151
expect(el.textContent).toEqual('Updated status')
151152
})
153+
154+
test('Cell content always get the latest context value', async () => {
155+
const contextCaptor = vi.fn()
156+
157+
const tableState = signal<Partial<TableState>>({
158+
rowSelection: {},
159+
})
160+
161+
@Component({
162+
template: ``,
163+
})
164+
class EmptyCell {}
165+
166+
const { dom, fixture } = createTestTable(
167+
defaultData,
168+
[
169+
{
170+
id: 'cell',
171+
header: 'Header',
172+
cell: context => {
173+
contextCaptor(context)
174+
return flexRenderComponent(EmptyCell)
175+
},
176+
},
177+
],
178+
() => ({
179+
state: tableState(),
180+
onStateChange: updater => {
181+
return typeof updater === 'function'
182+
? tableState.update(updater as any)
183+
: tableState.set(updater)
184+
},
185+
})
186+
)
187+
188+
const latestCall = () =>
189+
contextCaptor.mock.lastCall[0] as CellContext<TestData, any>
190+
// TODO: As a perf improvement, check in a future if we can avoid evaluating the cell twice during the first render.
191+
// This is caused due to the registration of the initial effect and the first #getContentValue() to detect the
192+
// type of content to render.
193+
expect(contextCaptor).toHaveBeenCalledTimes(2)
194+
195+
expect(latestCall().row.getIsExpanded()).toEqual(false)
196+
expect(latestCall().row.getIsSelected()).toEqual(false)
197+
198+
fixture.componentInstance.table.getRow('0').toggleSelected(true)
199+
dom.clickTriggerCdButton2()
200+
expect(contextCaptor).toHaveBeenCalledTimes(3)
201+
expect(latestCall().row.getIsSelected()).toEqual(true)
202+
203+
fixture.componentInstance.table.getRow('0').toggleSelected(false)
204+
fixture.componentInstance.table.getRow('0').toggleExpanded(true)
205+
dom.clickTriggerCdButton2()
206+
expect(contextCaptor).toHaveBeenCalledTimes(4)
207+
expect(latestCall().row.getIsSelected()).toEqual(false)
208+
expect(latestCall().row.getIsExpanded()).toEqual(true)
209+
})
152210
})
153211

154212
function expectPrimitiveValueIs(
@@ -166,7 +224,8 @@ type TestData = { id: string; title: string }
166224

167225
export function createTestTable(
168226
data: TestData[],
169-
columns: ColumnDef<TestData, any>[]
227+
columns: ColumnDef<TestData, any>[],
228+
optionsFn?: () => Partial<TableOptions<TestData>>
170229
) {
171230
@Component({
172231
template: `
@@ -229,7 +288,7 @@ export function createTestTable(
229288
changeDetection: ChangeDetectionStrategy.OnPush,
230289
standalone: true,
231290
selector: 'app-table-test',
232-
imports: [FlexRenderDirective],
291+
imports: [FlexRender],
233292
})
234293
class TestComponent {
235294
readonly columns = input<ColumnDef<TestData>[]>(columns)
@@ -239,6 +298,7 @@ export function createTestTable(
239298

240299
readonly table = createAngularTable(() => {
241300
return {
301+
...(optionsFn?.() ?? {}),
242302
columns: this.columns(),
243303
data: this.data(),
244304
getCoreRowModel: getCoreRowModel(),

0 commit comments

Comments
 (0)