@@ -10,6 +10,7 @@ import { describe, it, expect, vi, beforeEach } from 'vitest';
1010import { render , screen , fireEvent } from '@testing-library/react' ;
1111import { ListView } from '../ListView' ;
1212import type { ListViewSchema } from '@object-ui/types' ;
13+ import { SchemaRendererProvider } from '@object-ui/react' ;
1314
1415// Mock localStorage
1516const localStorageMock = ( ( ) => {
@@ -22,6 +23,22 @@ const localStorageMock = (() => {
2223 } ;
2324} ) ( ) ;
2425
26+ const mockDataSource = {
27+ find : vi . fn ( ) . mockResolvedValue ( [ ] ) ,
28+ findOne : vi . fn ( ) ,
29+ create : vi . fn ( ) ,
30+ update : vi . fn ( ) ,
31+ delete : vi . fn ( ) ,
32+ } ;
33+
34+ const renderWithProvider = ( component : React . ReactNode ) => {
35+ return render (
36+ < SchemaRendererProvider dataSource = { mockDataSource } >
37+ { component }
38+ </ SchemaRendererProvider >
39+ ) ;
40+ } ;
41+
2542Object . defineProperty ( window , 'localStorage' , { value : localStorageMock } ) ;
2643
2744describe ( 'ListView' , ( ) => {
@@ -45,7 +62,7 @@ describe('ListView', () => {
4562 fields : [ 'name' , 'email' ] ,
4663 } ;
4764
48- const { container } = render ( < ListView schema = { schema } /> ) ;
65+ const { container } = renderWithProvider ( < ListView schema = { schema } /> ) ;
4966 expect ( container ) . toBeTruthy ( ) ;
5067 } ) ;
5168
@@ -57,7 +74,7 @@ describe('ListView', () => {
5774 fields : [ 'name' , 'email' ] ,
5875 } ;
5976
60- render ( < ListView schema = { schema } /> ) ;
77+ renderWithProvider ( < ListView schema = { schema } /> ) ;
6178 const searchInput = screen . getByPlaceholderText ( / s e a r c h / i) ;
6279 expect ( searchInput ) . toBeInTheDocument ( ) ;
6380 } ) ;
@@ -71,7 +88,7 @@ describe('ListView', () => {
7188 fields : [ 'name' , 'email' ] ,
7289 } ;
7390
74- render ( < ListView schema = { schema } onSearchChange = { onSearchChange } /> ) ;
91+ renderWithProvider ( < ListView schema = { schema } onSearchChange = { onSearchChange } /> ) ;
7592 const searchInput = screen . getByPlaceholderText ( / s e a r c h / i) ;
7693
7794 fireEvent . change ( searchInput , { target : { value : 'test' } } ) ;
@@ -86,11 +103,20 @@ describe('ListView', () => {
86103 fields : [ 'name' , 'email' ] ,
87104 } ;
88105
89- render ( < ListView schema = { schema } /> ) ;
106+ renderWithProvider ( < ListView schema = { schema } /> ) ;
107+
108+ // Find list view button and click it
109+ // Using getAllByRole because there might be multiple buttons
110+ const buttons = screen . getAllByRole ( 'radio' ) ; // ToggleGroup usually uses radio role if type="single"
111+ // However, if it's implemented as buttons using ToggleGroup which is roving tabindex...
112+ // Let's try finding by aria-label which ViewSwitcher sets
113+ const listButton = screen . getByLabelText ( 'List' ) ;
114+
115+ fireEvent . click ( listButton ) ;
90116
91- // localStorage should be set with initial view
117+ // localStorage should be set with new view
92118 const storageKey = 'listview-contacts-view' ;
93- expect ( localStorageMock . getItem ( storageKey ) ) . toBeTruthy ( ) ;
119+ expect ( localStorageMock . getItem ( storageKey ) ) . toBe ( 'list' ) ;
94120 } ) ;
95121
96122 it ( 'should call onViewChange when view is changed' , ( ) => {
@@ -102,7 +128,7 @@ describe('ListView', () => {
102128 fields : [ 'name' , 'email' ] ,
103129 } ;
104130
105- const { rerender } = render ( < ListView schema = { schema } onViewChange = { onViewChange } /> ) ;
131+ renderWithProvider ( < ListView schema = { schema } onViewChange = { onViewChange } /> ) ;
106132
107133 // Simulate view change by updating the view prop in ViewSwitcher
108134 // Since we can't easily trigger the actual view switcher in tests,
@@ -121,7 +147,7 @@ describe('ListView', () => {
121147 fields : [ 'name' , 'email' ] ,
122148 } ;
123149
124- render ( < ListView schema = { schema } /> ) ;
150+ renderWithProvider ( < ListView schema = { schema } /> ) ;
125151
126152 // Find filter button (by icon or aria-label)
127153 const buttons = screen . getAllByRole ( 'button' ) ;
@@ -145,7 +171,7 @@ describe('ListView', () => {
145171 sort : [ { field : 'name' , order : 'asc' } ] ,
146172 } ;
147173
148- render ( < ListView schema = { schema } onSortChange = { onSortChange } /> ) ;
174+ renderWithProvider ( < ListView schema = { schema } onSortChange = { onSortChange } /> ) ;
149175
150176 // Find sort button
151177 const buttons = screen . getAllByRole ( 'button' ) ;
@@ -167,7 +193,7 @@ describe('ListView', () => {
167193 fields : [ 'name' , 'email' ] ,
168194 } ;
169195
170- render ( < ListView schema = { schema } /> ) ;
196+ renderWithProvider ( < ListView schema = { schema } /> ) ;
171197 const searchInput = screen . getByPlaceholderText ( / s e a r c h / i) as HTMLInputElement ;
172198
173199 // Type in search
0 commit comments