@@ -7,6 +7,7 @@ package github
77
88import  (
99	"context" 
10+ 	"encoding/json" 
1011	"fmt" 
1112	"net/http" 
1213	"strings" 
@@ -239,8 +240,6 @@ func TestAuditEntry_Marshal(t *testing.T) {
239240	t .Parallel ()
240241	testJSONMarshal (t , & AuditEntry {}, "{}" )
241242
242- 	testJSONMarshal (t , & AuditEntry {AdditionalFields : map [string ]interface {}{}}, "{}" )
243- 
244243	u  :=  & AuditEntry {
245244		Action :                   Ptr ("a" ),
246245		Actor :                    Ptr ("ac" ),
@@ -437,3 +436,128 @@ func TestAuditEntry_Marshal(t *testing.T) {
437436
438437	testJSONMarshal (t , u , want )
439438}
439+ 
440+ func  TestAuditEntry_Unmarshal (t  * testing.T ) {
441+ 	t .Parallel ()
442+ 
443+ 	// Test case 1: JSON with both defined fields and additional fields 
444+ 	jsonData  :=  `{ 
445+ 		"action": "org.update_member", 
446+ 		"actor": "testuser", 
447+ 		"actor_location": { 
448+ 			"country_code": "US" 
449+ 		}, 
450+ 		"created_at": "2021-03-07T00:35:08.000Z", 
451+ 		"org": "testorg", 
452+ 		"org_id": 12345, 
453+ 		"user": "memberuser", 
454+ 		"user_id": 67890, 
455+ 		"custom_field": "custom_value", 
456+ 		"another_field": 42, 
457+ 		"nested_field": { 
458+ 			"key": "value" 
459+ 		}, 
460+ 		"array_field": ["item1", "item2"] 
461+ 	}` 
462+ 
463+ 	var  entry  AuditEntry 
464+ 	err  :=  json .Unmarshal ([]byte (jsonData ), & entry )
465+ 	if  err  !=  nil  {
466+ 		t .Errorf ("Error unmarshaling JSON: %v" , err )
467+ 	}
468+ 
469+ 	// Check defined fields 
470+ 	if  * entry .Action  !=  "org.update_member"  {
471+ 		t .Errorf ("Action = %v, want %v" , * entry .Action , "org.update_member" )
472+ 	}
473+ 	if  * entry .Actor  !=  "testuser"  {
474+ 		t .Errorf ("Actor = %v, want %v" , * entry .Actor , "testuser" )
475+ 	}
476+ 	if  * entry .ActorLocation .CountryCode  !=  "US"  {
477+ 		t .Errorf ("ActorLocation.CountryCode = %v, want %v" , * entry .ActorLocation .CountryCode , "US" )
478+ 	}
479+ 	if  * entry .Org  !=  "testorg"  {
480+ 		t .Errorf ("Org = %v, want %v" , * entry .Org , "testorg" )
481+ 	}
482+ 	if  * entry .OrgID  !=  12345  {
483+ 		t .Errorf ("OrgID = %v, want %v" , * entry .OrgID , 12345 )
484+ 	}
485+ 	if  * entry .User  !=  "memberuser"  {
486+ 		t .Errorf ("User = %v, want %v" , * entry .User , "memberuser" )
487+ 	}
488+ 	if  * entry .UserID  !=  67890  {
489+ 		t .Errorf ("UserID = %v, want %v" , * entry .UserID , 67890 )
490+ 	}
491+ 
492+ 	// Check additional fields 
493+ 	if  entry .AdditionalFields ["custom_field" ] !=  "custom_value"  {
494+ 		t .Errorf ("AdditionalFields[\" custom_field\" ] = %v, want %v" , entry .AdditionalFields ["custom_field" ], "custom_value" )
495+ 	}
496+ 	if  entry .AdditionalFields ["another_field" ] !=  float64 (42 ) {
497+ 		t .Errorf ("AdditionalFields[\" another_field\" ] = %v, want %v" , entry .AdditionalFields ["another_field" ], float64 (42 ))
498+ 	}
499+ 
500+ 	// Check nested fields 
501+ 	nestedField , ok  :=  entry .AdditionalFields ["nested_field" ].(map [string ]interface {})
502+ 	if  ! ok  {
503+ 		t .Errorf ("AdditionalFields[\" nested_field\" ] is not a map" )
504+ 	} else  if  nestedField ["key" ] !=  "value"  {
505+ 		t .Errorf ("AdditionalFields[\" nested_field\" ][\" key\" ] = %v, want %v" , nestedField ["key" ], "value" )
506+ 	}
507+ 
508+ 	// Check array fields 
509+ 	arrayField , ok  :=  entry .AdditionalFields ["array_field" ].([]interface {})
510+ 	if  ! ok  {
511+ 		t .Errorf ("AdditionalFields[\" array_field\" ] is not an array" )
512+ 	} else  {
513+ 		if  len (arrayField ) !=  2  {
514+ 			t .Errorf ("len(AdditionalFields[\" array_field\" ]) = %v, want %v" , len (arrayField ), 2 )
515+ 		}
516+ 		if  arrayField [0 ] !=  "item1"  {
517+ 			t .Errorf ("AdditionalFields[\" array_field\" ][0] = %v, want %v" , arrayField [0 ], "item1" )
518+ 		}
519+ 		if  arrayField [1 ] !=  "item2"  {
520+ 			t .Errorf ("AdditionalFields[\" array_field\" ][1] = %v, want %v" , arrayField [1 ], "item2" )
521+ 		}
522+ 	}
523+ 
524+ 	// Test case 2: Empty JSON 
525+ 	err  =  json .Unmarshal ([]byte ("{}" ), & entry )
526+ 	if  err  !=  nil  {
527+ 		t .Errorf ("Error unmarshaling empty JSON: %v" , err )
528+ 	}
529+ 	if  entry .AdditionalFields  !=  nil  {
530+ 		t .Errorf ("AdditionalFields = %v, want nil" , entry .AdditionalFields )
531+ 	}
532+ 
533+ 	// Test case 3: JSON with only additional fields 
534+ 	jsonData  =  `{ 
535+ 		"custom_field": "custom_value", 
536+ 		"another_field": 42 
537+ 	}` 
538+ 
539+ 	err  =  json .Unmarshal ([]byte (jsonData ), & entry )
540+ 	if  err  !=  nil  {
541+ 		t .Errorf ("Error unmarshaling JSON with only additional fields: %v" , err )
542+ 	}
543+ 	if  entry .AdditionalFields ["custom_field" ] !=  "custom_value"  {
544+ 		t .Errorf ("AdditionalFields[\" custom_field\" ] = %v, want %v" , entry .AdditionalFields ["custom_field" ], "custom_value" )
545+ 	}
546+ 	if  entry .AdditionalFields ["another_field" ] !=  float64 (42 ) {
547+ 		t .Errorf ("AdditionalFields[\" another_field\" ] = %v, want %v" , entry .AdditionalFields ["another_field" ], float64 (42 ))
548+ 	}
549+ 
550+ 	// Test case 4: Test that nil values in AdditionalFields are removed 
551+ 	jsonData  =  `{ 
552+ 		"action": "org.update_member", 
553+ 		"null_field": null 
554+ 	}` 
555+ 
556+ 	err  =  json .Unmarshal ([]byte (jsonData ), & entry )
557+ 	if  err  !=  nil  {
558+ 		t .Errorf ("Error unmarshaling JSON with null field: %v" , err )
559+ 	}
560+ 	if  _ , exists  :=  entry .AdditionalFields ["null_field" ]; exists  {
561+ 		t .Errorf ("AdditionalFields contains null_field, but it should have been removed" )
562+ 	}
563+ }
0 commit comments