@@ -100,16 +100,22 @@ describe("UsageHeatmap", () => {
100100 expect ( grid ) . toBeTruthy ( )
101101 } )
102102
103- it ( "renders 30d and 90d range toggle buttons" , ( ) => {
103+ it ( "renders 30d, 60d, 120d, and 360d range toggle buttons" , ( ) => {
104104 const { container } = render ( < UsageHeatmap buckets = { [ ] } /> )
105105
106106 const btn30d = container . querySelector ( '[data-testid="heatmap-range-30d"]' )
107- const btn90d = container . querySelector ( '[data-testid="heatmap-range-90d"]' )
107+ const btn60d = container . querySelector ( '[data-testid="heatmap-range-60d"]' )
108+ const btn120d = container . querySelector ( '[data-testid="heatmap-range-120d"]' )
109+ const btn360d = container . querySelector ( '[data-testid="heatmap-range-360d"]' )
108110
109111 expect ( btn30d ) . toBeTruthy ( )
110- expect ( btn90d ) . toBeTruthy ( )
112+ expect ( btn60d ) . toBeTruthy ( )
113+ expect ( btn120d ) . toBeTruthy ( )
114+ expect ( btn360d ) . toBeTruthy ( )
111115 expect ( btn30d ?. textContent ) . toContain ( "stats:heatmap.30d" )
112- expect ( btn90d ?. textContent ) . toContain ( "stats:heatmap.90d" )
116+ expect ( btn60d ?. textContent ) . toContain ( "stats:heatmap.60d" )
117+ expect ( btn120d ?. textContent ) . toContain ( "stats:heatmap.120d" )
118+ expect ( btn360d ?. textContent ) . toContain ( "stats:heatmap.360d" )
113119 } )
114120
115121 it ( "defaults to 30d range" , ( ) => {
@@ -125,32 +131,32 @@ describe("UsageHeatmap", () => {
125131 expect ( cells . length ) . toBe ( 30 )
126132 } )
127133
128- it ( "switches to 90d range when 90d button is clicked" , ( ) => {
134+ it ( "switches to 60d range when 60d button is clicked" , ( ) => {
129135 const buckets = [
130136 makeBucket ( { key : { day : daysAgoKey ( 0 ) } , totalTokens : 1000 , events : 1 } ) ,
131137 ]
132138
133139 const { container } = render ( < UsageHeatmap buckets = { buckets } /> )
134140
135- const btn90d = container . querySelector ( '[data-testid="heatmap-range-90d "]' ) as HTMLButtonElement
136- fireEvent . click ( btn90d )
141+ const btn60d = container . querySelector ( '[data-testid="heatmap-range-60d "]' ) as HTMLButtonElement
142+ fireEvent . click ( btn60d )
137143
138- // In 90d mode, 90 date cells are generated
144+ // In 60d mode, 60 date cells are generated
139145 const cells = container . querySelectorAll ( '[role="img"] [aria-label]' )
140- expect ( cells . length ) . toBe ( 90 )
146+ expect ( cells . length ) . toBe ( 60 )
141147 } )
142148
143- it ( "switches back to 30d range when 30d button is clicked after 90d " , ( ) => {
149+ it ( "switches back to 30d range when 30d button is clicked after 60d " , ( ) => {
144150 const buckets = [
145151 makeBucket ( { key : { day : daysAgoKey ( 0 ) } , totalTokens : 1000 , events : 1 } ) ,
146152 ]
147153
148154 const { container } = render ( < UsageHeatmap buckets = { buckets } /> )
149155
150- // Switch to 90d
151- const btn90d = container . querySelector ( '[data-testid="heatmap-range-90d "]' ) as HTMLButtonElement
152- fireEvent . click ( btn90d )
153- expect ( container . querySelectorAll ( '[role="img"] [aria-label]' ) . length ) . toBe ( 90 )
156+ // Switch to 60d
157+ const btn60d = container . querySelector ( '[data-testid="heatmap-range-60d "]' ) as HTMLButtonElement
158+ fireEvent . click ( btn60d )
159+ expect ( container . querySelectorAll ( '[role="img"] [aria-label]' ) . length ) . toBe ( 60 )
154160
155161 // Switch back to 30d
156162 const btn30d = container . querySelector ( '[data-testid="heatmap-range-30d"]' ) as HTMLButtonElement
@@ -242,25 +248,24 @@ describe("UsageHeatmap", () => {
242248 expect ( grid ) . toBeFalsy ( )
243249 } )
244250
245- it ( "uses smaller cell size in 90d mode" , ( ) => {
251+ it ( "uses tighter gap in 360d mode" , ( ) => {
246252 const buckets = [
247253 makeBucket ( { key : { day : daysAgoKey ( 0 ) } , totalTokens : 1000 , events : 1 } ) ,
248254 ]
249255
250256 const { container } = render ( < UsageHeatmap buckets = { buckets } /> )
251257
252- // Cell size in 30d mode
253- const btn90d = container . querySelector ( '[data-testid="heatmap-range-90d "]' ) as HTMLButtonElement
254- fireEvent . click ( btn90d )
258+ // Switch to 360d mode
259+ const btn360d = container . querySelector ( '[data-testid="heatmap-range-360d "]' ) as HTMLButtonElement
260+ fireEvent . click ( btn360d )
255261
256- // In 90d mode, smaller cell class is applied
262+ // In 360d mode, gap-px class is applied
257263 const grid = container . querySelector ( '[role="img"]' )
258264 expect ( grid ) . toBeTruthy ( )
259- // In 90d mode, gap-0.5 class is applied
260- expect ( grid ?. className ) . toContain ( "gap-0.5" )
265+ expect ( grid ?. className ) . toContain ( "gap-px" )
261266 } )
262267
263- it ( "uses larger cell size in 30d mode" , ( ) => {
268+ it ( "uses gap-0.5 in 30d mode" , ( ) => {
264269 const buckets = [
265270 makeBucket ( { key : { day : daysAgoKey ( 0 ) } , totalTokens : 1000 , events : 1 } ) ,
266271 ]
@@ -270,13 +275,13 @@ describe("UsageHeatmap", () => {
270275 // Default 30d mode
271276 const grid = container . querySelector ( '[role="img"]' )
272277 expect ( grid ) . toBeTruthy ( )
273- // In 30d mode, gap-1 class is applied
274- expect ( grid ?. className ) . toContain ( "gap-1 " )
278+ // In 30d mode, gap-0.5 class is applied
279+ expect ( grid ?. className ) . toContain ( "gap-0.5 " )
275280 } )
276281
277282 it ( "computes intensity levels based on max token value" , ( ) => {
278283 const buckets = [
279- makeBucket ( { key : { day : daysAgoKey ( 0 ) } , totalTokens : 4000 , events : 4 } ) , // 100% → level 4
284+ makeBucket ( { key : { day : daysAgoKey ( 0 ) } , totalTokens : 4000 , events : 4 } ) , // 100% → level 5
280285 makeBucket ( { key : { day : daysAgoKey ( 1 ) } , totalTokens : 1000 , events : 1 } ) , // 25% → level 1
281286 ]
282287
@@ -286,9 +291,9 @@ describe("UsageHeatmap", () => {
286291 const heatmap = container . querySelector ( '[data-testid="usage-heatmap"]' )
287292 expect ( heatmap ?. textContent ) . not . toContain ( "stats:heatmap.noData" )
288293
289- // Legend should be rendered (4 level colors)
294+ // Legend should be rendered (6 level colors: 0-5 )
290295 const legendCells = container . querySelectorAll ( ".w-3.h-3.rounded-sm" )
291- expect ( legendCells . length ) . toBe ( 4 )
296+ expect ( legendCells . length ) . toBe ( 6 )
292297 } )
293298
294299 it ( "handles buckets with day key but zero events" , ( ) => {
@@ -319,21 +324,21 @@ describe("UsageHeatmap", () => {
319324 expect ( style ) . toContain ( "repeat(5" )
320325 } )
321326
322- it ( "renders grid with correct column count for 90d mode" , ( ) => {
327+ it ( "renders grid with correct column count for 60d mode" , ( ) => {
323328 const buckets = [
324329 makeBucket ( { key : { day : daysAgoKey ( 0 ) } , totalTokens : 1000 , events : 1 } ) ,
325330 ]
326331
327332 const { container } = render ( < UsageHeatmap buckets = { buckets } /> )
328333
329- const btn90d = container . querySelector ( '[data-testid="heatmap-range-90d "]' ) as HTMLButtonElement
330- fireEvent . click ( btn90d )
334+ const btn60d = container . querySelector ( '[data-testid="heatmap-range-60d "]' ) as HTMLButtonElement
335+ fireEvent . click ( btn60d )
331336
332337 const grid = container . querySelector ( '[role="img"]' )
333338 expect ( grid ) . toBeTruthy ( )
334- // 90d mode: 90 cells / 7 rows = 13 columns (ceil(90 /7) = 13 )
339+ // 60d mode: 60 cells / 7 rows = 9 columns (ceil(60 /7) = 9 )
335340 const style = grid ?. getAttribute ( "style" ) ?? ""
336341 expect ( style . toLowerCase ( ) ) . toContain ( "grid-template-columns" )
337- expect ( style ) . toContain ( "repeat(13 " )
342+ expect ( style ) . toContain ( "repeat(9 " )
338343 } )
339344} )
0 commit comments