github.com/anchore/syft@v1.38.2/syft/format/syftjson/model/document_test.go (about)

     1  package model
     2  
     3  import (
     4  	"encoding/json"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/assert"
     8  	"github.com/stretchr/testify/require"
     9  )
    10  
    11  func TestDocumentUnmarshalJSON_SchemaDetection(t *testing.T) {
    12  	tests := []struct {
    13  		name     string
    14  		jsonData string
    15  		modes    []int
    16  	}{
    17  		{
    18  			name: "schema version 1.0.0 + anchorectl",
    19  			jsonData: `{
    20  				"files": [
    21  					{"metadata": {"mode": 493}},
    22  					{"metadata": {"mode": 420}}
    23  				],
    24  				"schema": {"version": "1.0.0"},
    25                  "descriptor": {
    26  					"name": "anchorectl"
    27  				}
    28  			}`,
    29  			modes: []int{755, 644},
    30  		},
    31  		{
    32  			name: "schema version 1.0.0 + syft",
    33  			jsonData: `{
    34  				"files": [
    35  					{"metadata": {"mode": 755}},
    36  					{"metadata": {"mode": 644}}
    37  				],
    38  				"schema": {"version": "1.0.0"},
    39                  "descriptor": {
    40  					"name": "syft"
    41  				}
    42  			}`,
    43  			modes: []int{755, 644},
    44  		},
    45  		{
    46  			name: "schema version 2.0.0 + anchorectl",
    47  			jsonData: `{
    48  				"files": [
    49  					{"metadata": {"mode": 755}},
    50  					{"metadata": {"mode": 644}}
    51  				],
    52  				"schema": {"version": "2.0.0"},
    53                  "descriptor": {
    54  					"name": "anchorectl"
    55  				}
    56  			}`,
    57  			modes: []int{755, 644},
    58  		},
    59  		{
    60  			name: "missing schema version should not convert modes",
    61  			jsonData: `{
    62  				"files": [
    63  					{"metadata": {"mode": 755}}
    64  				],
    65  				"schema": {}
    66  			}`,
    67  			modes: []int{755},
    68  		},
    69  		{
    70  			name: "empty files array with version 1.0.0",
    71  			jsonData: `{
    72  				"files": [],
    73  				"schema": {"version": "1.0.0"},
    74                  "descriptor": {
    75  					"name": "anchorectl"
    76  				}
    77  			}`,
    78  		},
    79  	}
    80  
    81  	for _, tt := range tests {
    82  		t.Run(tt.name, func(t *testing.T) {
    83  			var doc Document
    84  
    85  			err := json.Unmarshal([]byte(tt.jsonData), &doc)
    86  			if err != nil {
    87  				t.Fatalf("Failed to unmarshal JSON: %v", err)
    88  			}
    89  
    90  			var modes []int
    91  			for _, file := range doc.Files {
    92  				modes = append(modes, file.Metadata.Mode)
    93  			}
    94  
    95  			require.Len(t, doc.Files, len(tt.modes), "Unexpected number of files")
    96  			assert.Equal(t, tt.modes, modes, "File modes do not match expected values")
    97  		})
    98  	}
    99  }