|
6 | 6 | package github |
7 | 7 |
|
8 | 8 | import ( |
| 9 | + "encoding/json" |
9 | 10 | "fmt" |
10 | 11 | "net/http" |
11 | 12 | "testing" |
@@ -366,5 +367,90 @@ func TestAuditEntry_MarshalJSON(t *testing.T) { |
366 | 367 |
|
367 | 368 | testJSONMarshalOnly(t, u, want) |
368 | 369 | testJSONMarshalOnly(t, &u, want) |
369 | | - // can't unmarshal AdditionalFields back into map[string]any, so skip testJSONUnmarshalOnly |
| 370 | +} |
| 371 | + |
| 372 | +func TestAuditEntry_UnmarshalJSON(t *testing.T) { |
| 373 | + t.Parallel() |
| 374 | + testJSONUnmarshalOnly(t, &AuditEntry{}, "{}") |
| 375 | + |
| 376 | + tests := []struct { |
| 377 | + name string |
| 378 | + payload string |
| 379 | + want *AuditEntry |
| 380 | + }{ |
| 381 | + { |
| 382 | + name: "org is scalar", |
| 383 | + payload: `{"action":"test","org":"myorg","org_id":42}`, |
| 384 | + want: &AuditEntry{Action: Ptr("test"), Org: Ptr("myorg"), OrgID: Ptr(int64(42))}, |
| 385 | + }, |
| 386 | + { |
| 387 | + name: "org is single element array", |
| 388 | + payload: `{"action":"test","org":["myorg"],"org_id":[42]}`, |
| 389 | + want: &AuditEntry{Action: Ptr("test"), Org: Ptr("myorg"), OrgID: Ptr(int64(42))}, |
| 390 | + }, |
| 391 | + { |
| 392 | + name: "org is multi-element array", |
| 393 | + payload: `{"action":"test","org":["org1","org2","org3"],"org_id":[1,2,3]}`, |
| 394 | + want: &AuditEntry{Action: Ptr("test"), Org: Ptr("org1, org2, org3"), OrgID: Ptr(int64(1))}, |
| 395 | + }, |
| 396 | + { |
| 397 | + name: "org_id is scalar", |
| 398 | + payload: `{"action":"test","org_id":42}`, |
| 399 | + want: &AuditEntry{Action: Ptr("test"), OrgID: Ptr(int64(42))}, |
| 400 | + }, |
| 401 | + { |
| 402 | + name: "org_id is array", |
| 403 | + payload: `{"action":"test","org_id":[42,43,44]}`, |
| 404 | + want: &AuditEntry{Action: Ptr("test"), OrgID: Ptr(int64(42))}, // first element |
| 405 | + }, |
| 406 | + { |
| 407 | + name: "org is empty array", |
| 408 | + payload: `{"action":"test","org":[]}`, |
| 409 | + want: &AuditEntry{Action: Ptr("test"), AdditionalFields: map[string]any{"org": []any{}}}, |
| 410 | + }, |
| 411 | + { |
| 412 | + name: "org_id is empty array", |
| 413 | + payload: `{"action":"test","org_id":[]}`, |
| 414 | + want: &AuditEntry{Action: Ptr("test"), AdditionalFields: map[string]any{"org_id": []any{}}}, |
| 415 | + }, |
| 416 | + { |
| 417 | + name: "org and org_id are null", |
| 418 | + payload: `{"action":"test","org":null,"org_id":null}`, |
| 419 | + want: &AuditEntry{Action: Ptr("test")}, |
| 420 | + }, |
| 421 | + } |
| 422 | + |
| 423 | + for _, tc := range tests { |
| 424 | + t.Run(tc.name, func(t *testing.T) { |
| 425 | + t.Parallel() |
| 426 | + testJSONUnmarshalOnly(t, tc.want, tc.payload) |
| 427 | + }) |
| 428 | + } |
| 429 | +} |
| 430 | + |
| 431 | +func TestAuditEntry_UnmarshalJSON_Errors(t *testing.T) { |
| 432 | + t.Parallel() |
| 433 | + tests := []struct { |
| 434 | + name string |
| 435 | + payload string |
| 436 | + }{ |
| 437 | + { |
| 438 | + name: "invalid org type", |
| 439 | + payload: `{"action":"test","org":{"key":"value"}}`, |
| 440 | + }, |
| 441 | + { |
| 442 | + name: "invalid org_id type", |
| 443 | + payload: `{"action":"test","org_id":{"key":"value"}}`, |
| 444 | + }, |
| 445 | + } |
| 446 | + |
| 447 | + for _, tc := range tests { |
| 448 | + t.Run(tc.name, func(t *testing.T) { |
| 449 | + t.Parallel() |
| 450 | + var entry AuditEntry |
| 451 | + if err := json.Unmarshal([]byte(tc.payload), &entry); err == nil { |
| 452 | + t.Errorf("AuditEntry.UnmarshalJSON(%q) = nil, but want error", tc.payload) |
| 453 | + } |
| 454 | + }) |
| 455 | + } |
370 | 456 | } |
0 commit comments