@@ -39,69 +39,79 @@ afterEach(() => {
3939 vi . useRealTimers ( ) ;
4040} ) ;
4141
42+ const defaultSortProps = {
43+ sortOptions : [
44+ { label : "Updated" , field : "updatedAt" , type : "date" as const } ,
45+ { label : "Created" , field : "createdAt" , type : "date" as const } ,
46+ ] ,
47+ sortValue : "updatedAt" ,
48+ sortDirection : "desc" as const ,
49+ onSortChange : vi . fn ( ) ,
50+ } ;
51+
4252describe ( "FilterBar" , ( ) => {
4353 it ( "renders org and repo filter dropdowns" , ( ) => {
44- render ( ( ) => < FilterBar /> ) ;
54+ render ( ( ) => < FilterBar { ... defaultSortProps } /> ) ;
4555 screen . getByLabelText ( "Filter by organization" ) ;
4656 screen . getByLabelText ( "Filter by repository" ) ;
4757 } ) ;
4858
4959 it ( "renders refresh button" , ( ) => {
50- render ( ( ) => < FilterBar /> ) ;
60+ render ( ( ) => < FilterBar { ... defaultSortProps } /> ) ;
5161 screen . getByLabelText ( "Refresh data" ) ;
5262 } ) ;
5363
5464 it ( "refresh button is enabled by default" , ( ) => {
55- render ( ( ) => < FilterBar /> ) ;
65+ render ( ( ) => < FilterBar { ... defaultSortProps } /> ) ;
5666 const refreshBtn = screen . getByLabelText ( "Refresh data" ) as HTMLButtonElement ;
5767 expect ( refreshBtn . disabled ) . toBe ( false ) ;
5868 } ) ;
5969
6070 it ( "refresh button is disabled when isRefreshing=true" , ( ) => {
61- render ( ( ) => < FilterBar isRefreshing = { true } /> ) ;
71+ render ( ( ) => < FilterBar { ... defaultSortProps } isRefreshing = { true } /> ) ;
6272 const refreshBtn = screen . getByLabelText ( "Refresh data" ) as HTMLButtonElement ;
6373 expect ( refreshBtn . disabled ) . toBe ( true ) ;
6474 } ) ;
6575
6676 it ( "shows 'Refreshing...' when isRefreshing=true" , ( ) => {
67- render ( ( ) => < FilterBar isRefreshing = { true } /> ) ;
77+ render ( ( ) => < FilterBar { ... defaultSortProps } isRefreshing = { true } /> ) ;
6878 screen . getByText ( "Refreshing..." ) ;
6979 } ) ;
7080
7181 it ( "shows last refreshed time when lastRefreshedAt provided" , ( ) => {
7282 const now = new Date ( ) ;
7383 const tenSecondsAgo = new Date ( now . getTime ( ) - 10_000 ) ;
74- render ( ( ) => < FilterBar lastRefreshedAt = { tenSecondsAgo } /> ) ;
84+ render ( ( ) => < FilterBar { ... defaultSortProps } lastRefreshedAt = { tenSecondsAgo } /> ) ;
7585 screen . getByText ( "Updated 10s ago" ) ;
7686 } ) ;
7787
7888 it ( "shows minutes when lastRefreshedAt is more than 60s ago" , ( ) => {
7989 const twoMinutesAgo = new Date ( Date . now ( ) - 2 * 60 * 1000 ) ;
80- render ( ( ) => < FilterBar lastRefreshedAt = { twoMinutesAgo } /> ) ;
90+ render ( ( ) => < FilterBar { ... defaultSortProps } lastRefreshedAt = { twoMinutesAgo } /> ) ;
8191 screen . getByText ( "Updated 2m ago" ) ;
8292 } ) ;
8393
8494 it ( "does not show updated label when lastRefreshedAt is null" , ( ) => {
85- render ( ( ) => < FilterBar lastRefreshedAt = { null } /> ) ;
86- expect ( screen . queryByText ( / U p d a t e d / ) ) . toBeNull ( ) ;
95+ render ( ( ) => < FilterBar { ... defaultSortProps } lastRefreshedAt = { null } /> ) ;
96+ expect ( screen . queryByText ( / U p d a t e d \d + [ s m ] a g o / ) ) . toBeNull ( ) ;
8797 } ) ;
8898
8999 it ( "calls onRefresh when refresh button clicked" , async ( ) => {
90100 const user = userEvent . setup ( { delay : null } ) ;
91101 const onRefresh = vi . fn ( ) ;
92- render ( ( ) => < FilterBar onRefresh = { onRefresh } /> ) ;
102+ render ( ( ) => < FilterBar { ... defaultSortProps } onRefresh = { onRefresh } /> ) ;
93103 await user . click ( screen . getByLabelText ( "Refresh data" ) ) ;
94104 expect ( onRefresh ) . toHaveBeenCalledOnce ( ) ;
95105 } ) ;
96106
97107 it ( "org trigger shows 'All orgs' by default" , ( ) => {
98- render ( ( ) => < FilterBar /> ) ;
108+ render ( ( ) => < FilterBar { ... defaultSortProps } /> ) ;
99109 const orgTrigger = screen . getByLabelText ( "Filter by organization" ) ;
100110 expect ( orgTrigger . textContent ) . toContain ( "All orgs" ) ;
101111 } ) ;
102112
103113 it ( "repo trigger shows 'All repos' by default" , ( ) => {
104- render ( ( ) => < FilterBar /> ) ;
114+ render ( ( ) => < FilterBar { ... defaultSortProps } /> ) ;
105115 const repoTrigger = screen . getByLabelText ( "Filter by repository" ) ;
106116 expect ( repoTrigger . textContent ) . toContain ( "All repos" ) ;
107117 } ) ;
@@ -111,14 +121,14 @@ describe("FilterBar", () => {
111121 org : "myorg" ,
112122 repo : null ,
113123 } ;
114- render ( ( ) => < FilterBar /> ) ;
124+ render ( ( ) => < FilterBar { ... defaultSortProps } /> ) ;
115125 const orgTrigger = screen . getByLabelText ( "Filter by organization" ) ;
116126 expect ( orgTrigger . textContent ) . toContain ( "myorg" ) ;
117127 } ) ;
118128
119129 it ( "clicking org trigger opens listbox with org options" , async ( ) => {
120130 const user = userEvent . setup ( { delay : null } ) ;
121- render ( ( ) => < FilterBar /> ) ;
131+ render ( ( ) => < FilterBar { ... defaultSortProps } /> ) ;
122132 const orgTrigger = screen . getByLabelText ( "Filter by organization" ) ;
123133 await user . click ( orgTrigger ) ;
124134 // Options should now be visible in the listbox
@@ -128,7 +138,7 @@ describe("FilterBar", () => {
128138
129139 it ( "clicking org trigger opens listbox with repo options" , async ( ) => {
130140 const user = userEvent . setup ( { delay : null } ) ;
131- render ( ( ) => < FilterBar /> ) ;
141+ render ( ( ) => < FilterBar { ... defaultSortProps } /> ) ;
132142 const repoTrigger = screen . getByLabelText ( "Filter by repository" ) ;
133143 await user . click ( repoTrigger ) ;
134144 expect ( screen . getByRole ( "option" , { name : "myorg/repo-a" } ) ) . toBeDefined ( ) ;
@@ -138,7 +148,7 @@ describe("FilterBar", () => {
138148
139149 it ( "selecting an org option calls setGlobalFilter and resets repo" , async ( ) => {
140150 const user = userEvent . setup ( { delay : null } ) ;
141- render ( ( ) => < FilterBar /> ) ;
151+ render ( ( ) => < FilterBar { ... defaultSortProps } /> ) ;
142152 const orgTrigger = screen . getByLabelText ( "Filter by organization" ) ;
143153 await user . click ( orgTrigger ) ;
144154 const myorgOption = screen . getByRole ( "option" , { name : "myorg" } ) ;
@@ -148,7 +158,7 @@ describe("FilterBar", () => {
148158
149159 it ( "selecting a repo option calls setGlobalFilter with current org and new repo" , async ( ) => {
150160 const user = userEvent . setup ( { delay : null } ) ;
151- render ( ( ) => < FilterBar /> ) ;
161+ render ( ( ) => < FilterBar { ... defaultSortProps } /> ) ;
152162 const repoTrigger = screen . getByLabelText ( "Filter by repository" ) ;
153163 await user . click ( repoTrigger ) ;
154164 const repoOption = screen . getByRole ( "option" , { name : "myorg/repo-a" } ) ;
@@ -158,7 +168,7 @@ describe("FilterBar", () => {
158168
159169 it ( "selecting 'All orgs' option calls setGlobalFilter with null org" , async ( ) => {
160170 const user = userEvent . setup ( { delay : null } ) ;
161- render ( ( ) => < FilterBar /> ) ;
171+ render ( ( ) => < FilterBar { ... defaultSortProps } /> ) ;
162172 const orgTrigger = screen . getByLabelText ( "Filter by organization" ) ;
163173 await user . click ( orgTrigger ) ;
164174 const allOrgsOption = screen . getByRole ( "option" , { name : "All orgs" } ) ;
0 commit comments