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' , ( ) => {
@@ -26,32 +27,68 @@ describe('Json Component', () => {
2627 } )
2728
2829 it ( 'renders nested objects' , ( ) => {
30+ const { getByText } = render ( < Json json = { { obj : { arr : [ 314 , '42' ] } } } /> )
31+ expect ( getByText ( 'obj:' ) ) . toBeDefined ( )
32+ expect ( getByText ( 'arr:' ) ) . toBeDefined ( )
33+ expect ( getByText ( '314' ) ) . toBeDefined ( )
34+ expect ( getByText ( '"42"' ) ) . toBeDefined ( )
35+ } )
36+
37+ it ( 'collapses non-primitive nested objects' , ( ) => {
2938 const { getByText } = render ( < Json json = { { obj : { arr : [ 314 , null ] } } } /> )
3039 expect ( getByText ( 'obj:' ) ) . toBeDefined ( )
3140 expect ( getByText ( 'arr:' ) ) . toBeDefined ( )
3241 expect ( getByText ( '314' ) ) . toBeDefined ( )
33- expect ( getByText ( 'null ' ) ) . toBeDefined ( )
42+ expect ( getByText ( '... ' ) ) . toBeDefined ( )
3443 } )
3544
3645 it ( 'toggles array collapse state' , ( ) => {
37- const { getByText, queryByText } = render ( < Json json = { [ 'foo' , 'bar' ] } /> )
46+ const { getByText, queryByText } = render ( < Json json = { [ 'foo' , null ] } /> )
3847 expect ( getByText ( '"foo"' ) ) . toBeDefined ( )
39- expect ( getByText ( '"bar"' ) ) . toBeDefined ( )
48+ expect ( queryByText ( 'null' ) ) . toBeNull ( )
49+ fireEvent . click ( getByText ( '▶' ) )
50+ expect ( getByText ( 'null' ) ) . toBeDefined ( )
4051 fireEvent . click ( getByText ( '▼' ) )
41- expect ( queryByText ( '0: 1' ) ) . toBeNull ( )
42- fireEvent . click ( getByText ( '[...]' ) )
4352 expect ( getByText ( '"foo"' ) ) . toBeDefined ( )
44- expect ( getByText ( '"bar" ') ) . toBeDefined ( )
53+ expect ( queryByText ( 'null ') ) . toBeNull ( )
4554 } )
4655
4756 it ( 'toggles object collapse state' , ( ) => {
4857 const { getByText, queryByText } = render ( < Json json = { { key : 'value' } } /> )
4958 expect ( getByText ( 'key:' ) ) . toBeDefined ( )
5059 expect ( getByText ( '"value"' ) ) . toBeDefined ( )
51- fireEvent . click ( getByText ( '▼ ' ) )
60+ fireEvent . click ( getByText ( '▶ ' ) )
5261 expect ( queryByText ( 'key: "value"' ) ) . toBeNull ( )
53- fireEvent . click ( getByText ( '{...} ' ) )
62+ fireEvent . click ( getByText ( '▼ ' ) )
5463 expect ( getByText ( 'key:' ) ) . toBeDefined ( )
5564 expect ( getByText ( '"value"' ) ) . toBeDefined ( )
5665 } )
5766} )
67+
68+ describe ( 'isPrimitive' , ( ) => {
69+ it ( 'returns true only for primitive types' , ( ) => {
70+ expect ( isPrimitive ( 'test' ) ) . toBe ( true )
71+ expect ( isPrimitive ( 42 ) ) . toBe ( true )
72+ expect ( isPrimitive ( true ) ) . toBe ( true )
73+ expect ( isPrimitive ( 1n ) ) . toBe ( true )
74+ expect ( isPrimitive ( null ) ) . toBe ( false )
75+ expect ( isPrimitive ( undefined ) ) . toBe ( false )
76+ expect ( isPrimitive ( { } ) ) . toBe ( false )
77+ expect ( isPrimitive ( [ ] ) ) . toBe ( false )
78+ } )
79+ } )
80+
81+ describe ( 'shouldObjectCollapse' , ( ) => {
82+ it ( 'returns true for objects with all primitive values' , ( ) => {
83+ expect ( shouldObjectCollapse ( { a : 1 , b : 'test' } ) ) . toBe ( true )
84+ } )
85+
86+ it ( 'returns false for objects with non-primitive values' , ( ) => {
87+ expect ( shouldObjectCollapse ( { a : 1 , b : { } } ) ) . toBe ( false )
88+ } )
89+
90+ it ( 'returns true for large objects' , ( ) => {
91+ const largeObject = Object . fromEntries ( Array . from ( { length : 101 } , ( _ , i ) => [ `key${ i } ` , i ] ) )
92+ expect ( shouldObjectCollapse ( largeObject ) ) . toBe ( true )
93+ } )
94+ } )
0 commit comments