@@ -7,6 +7,7 @@ package github
7
7
8
8
import (
9
9
"context"
10
+ "encoding/json"
10
11
"fmt"
11
12
"net/http"
12
13
"strings"
@@ -239,8 +240,6 @@ func TestAuditEntry_Marshal(t *testing.T) {
239
240
t .Parallel ()
240
241
testJSONMarshal (t , & AuditEntry {}, "{}" )
241
242
242
- testJSONMarshal (t , & AuditEntry {AdditionalFields : map [string ]interface {}{}}, "{}" )
243
-
244
243
u := & AuditEntry {
245
244
Action : Ptr ("a" ),
246
245
Actor : Ptr ("ac" ),
@@ -437,3 +436,128 @@ func TestAuditEntry_Marshal(t *testing.T) {
437
436
438
437
testJSONMarshal (t , u , want )
439
438
}
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