11import { fireEvent , render } from '@testing-library/react'
22import { describe , expect , it } from 'vitest'
33import Json from './Json.js'
4+ import { isPrimitive , shouldObjectCollapse } from './helpers.js'
45
56describe ( 'Json Component' , ( ) => {
67 it ( 'renders primitive types correctly' , ( ) => {
@@ -19,39 +20,81 @@ describe('Json Component', () => {
1920 expect ( getByText ( '"bar"' ) ) . toBeDefined ( )
2021 } )
2122
23+ it . for ( [ [ 'foo' , 'bar' ] ] ) ( 'collapses any array' , ( array ) => {
24+ const { queryByText } = render ( < Json json = { array } /> )
25+ expect ( queryByText ( '▶' ) ) . toBeDefined ( )
26+ expect ( queryByText ( '▼' ) ) . toBeNull ( )
27+ } )
28+
2229 it ( 'renders an object' , ( ) => {
2330 const { getByText } = render ( < Json json = { { key : 'value' } } /> )
2431 expect ( getByText ( 'key:' ) ) . toBeDefined ( )
2532 expect ( getByText ( '"value"' ) ) . toBeDefined ( )
2633 } )
2734
2835 it ( 'renders nested objects' , ( ) => {
36+ const { getByText } = render ( < Json json = { { obj : { arr : [ 314 , '42' ] } } } /> )
37+ expect ( getByText ( 'obj:' ) ) . toBeDefined ( )
38+ expect ( getByText ( 'arr:' ) ) . toBeDefined ( )
39+ expect ( getByText ( '314' ) ) . toBeDefined ( )
40+ expect ( getByText ( '"42"' ) ) . toBeDefined ( )
41+ } )
42+
43+ it ( 'collapses non-primitive nested objects' , ( ) => {
2944 const { getByText } = render ( < Json json = { { obj : { arr : [ 314 , null ] } } } /> )
3045 expect ( getByText ( 'obj:' ) ) . toBeDefined ( )
3146 expect ( getByText ( 'arr:' ) ) . toBeDefined ( )
3247 expect ( getByText ( '314' ) ) . toBeDefined ( )
33- expect ( getByText ( 'null ' ) ) . toBeDefined ( )
48+ expect ( getByText ( '... ' ) ) . toBeDefined ( )
3449 } )
3550
3651 it ( 'toggles array collapse state' , ( ) => {
37- const { getByText, queryByText } = render ( < Json json = { [ 'foo' , 'bar' ] } /> )
52+ const { getByText, queryByText } = render ( < Json json = { [ 'foo' , null ] } /> )
3853 expect ( getByText ( '"foo"' ) ) . toBeDefined ( )
39- expect ( getByText ( '"bar"' ) ) . toBeDefined ( )
54+ expect ( queryByText ( 'null' ) ) . toBeNull ( )
55+ fireEvent . click ( getByText ( '▶' ) )
56+ expect ( getByText ( 'null' ) ) . toBeDefined ( )
4057 fireEvent . click ( getByText ( '▼' ) )
41- expect ( queryByText ( '0: 1' ) ) . toBeNull ( )
42- fireEvent . click ( getByText ( '[...]' ) )
4358 expect ( getByText ( '"foo"' ) ) . toBeDefined ( )
44- expect ( getByText ( '"bar" ') ) . toBeDefined ( )
59+ expect ( queryByText ( 'null ') ) . toBeNull ( )
4560 } )
4661
4762 it ( 'toggles object collapse state' , ( ) => {
4863 const { getByText, queryByText } = render ( < Json json = { { key : 'value' } } /> )
4964 expect ( getByText ( 'key:' ) ) . toBeDefined ( )
5065 expect ( getByText ( '"value"' ) ) . toBeDefined ( )
51- fireEvent . click ( getByText ( '▼ ' ) )
66+ fireEvent . click ( getByText ( '▶ ' ) )
5267 expect ( queryByText ( 'key: "value"' ) ) . toBeNull ( )
53- fireEvent . click ( getByText ( '{...} ' ) )
68+ fireEvent . click ( getByText ( '▼ ' ) )
5469 expect ( getByText ( 'key:' ) ) . toBeDefined ( )
5570 expect ( getByText ( '"value"' ) ) . toBeDefined ( )
5671 } )
5772} )
73+
74+ describe ( 'isPrimitive' , ( ) => {
75+ it ( 'returns true only for primitive types' , ( ) => {
76+ expect ( isPrimitive ( 'test' ) ) . toBe ( true )
77+ expect ( isPrimitive ( 42 ) ) . toBe ( true )
78+ expect ( isPrimitive ( true ) ) . toBe ( true )
79+ expect ( isPrimitive ( 1n ) ) . toBe ( true )
80+ expect ( isPrimitive ( null ) ) . toBe ( false )
81+ expect ( isPrimitive ( undefined ) ) . toBe ( false )
82+ expect ( isPrimitive ( { } ) ) . toBe ( false )
83+ expect ( isPrimitive ( [ ] ) ) . toBe ( false )
84+ } )
85+ } )
86+
87+ describe ( 'shouldObjectCollapse' , ( ) => {
88+ it ( 'returns true for objects with all primitive values' , ( ) => {
89+ expect ( shouldObjectCollapse ( { a : 1 , b : 'test' } ) ) . toBe ( true )
90+ } )
91+
92+ it ( 'returns false for objects with non-primitive values' , ( ) => {
93+ expect ( shouldObjectCollapse ( { a : 1 , b : { } } ) ) . toBe ( false )
94+ } )
95+
96+ it ( 'returns true for large objects' , ( ) => {
97+ const largeObject = Object . fromEntries ( Array . from ( { length : 101 } , ( _ , i ) => [ `key${ i } ` , i ] ) )
98+ expect ( shouldObjectCollapse ( largeObject ) ) . toBe ( true )
99+ } )
100+ } )
0 commit comments