github.com/khulnasoft-lab/defsec@v1.0.5-0.20230827010352-5e9f46893d95/test/testutil/util.go (about) 1 package testutil 2 3 import ( 4 "encoding/json" 5 "io/fs" 6 "path/filepath" 7 "strings" 8 "testing" 9 10 "github.com/khulnasoft-lab/defsec/pkg/scan" 11 "github.com/liamg/memoryfs" 12 "github.com/stretchr/testify/assert" 13 "github.com/stretchr/testify/require" 14 ) 15 16 func AssertRuleFound(t *testing.T, ruleID string, results scan.Results, message string, args ...interface{}) { 17 found := ruleIDInResults(ruleID, results.GetFailed()) 18 assert.True(t, found, append([]interface{}{message}, args...)...) 19 for _, result := range results.GetFailed() { 20 if result.Rule().LongID() == ruleID { 21 m := result.Metadata() 22 meta := &m 23 for meta != nil { 24 assert.NotNil(t, meta.Range(), 0) 25 assert.Greater(t, meta.Range().GetStartLine(), 0) 26 assert.Greater(t, meta.Range().GetEndLine(), 0) 27 meta = meta.Parent() 28 } 29 } 30 } 31 } 32 33 func AssertRuleNotFound(t *testing.T, ruleID string, results scan.Results, message string, args ...interface{}) { 34 found := ruleIDInResults(ruleID, results.GetFailed()) 35 assert.False(t, found, append([]interface{}{message}, args...)...) 36 } 37 38 func ruleIDInResults(ruleID string, results scan.Results) bool { 39 for _, res := range results { 40 if res.Rule().LongID() == ruleID { 41 return true 42 } 43 } 44 return false 45 } 46 47 func CreateFS(t *testing.T, files map[string]string) fs.FS { 48 memfs := memoryfs.New() 49 for name, content := range files { 50 name := strings.TrimPrefix(name, "/") 51 err := memfs.MkdirAll(filepath.Dir(name), 0o700) 52 require.NoError(t, err) 53 err = memfs.WriteFile(name, []byte(content), 0o644) 54 require.NoError(t, err) 55 } 56 return memfs 57 } 58 59 func AssertDefsecEqual(t *testing.T, expected interface{}, actual interface{}) { 60 expectedJson, err := json.MarshalIndent(expected, "", "\t") 61 require.NoError(t, err) 62 actualJson, err := json.MarshalIndent(actual, "", "\t") 63 require.NoError(t, err) 64 65 if expectedJson[0] == '[' { 66 var expectedSlice []map[string]interface{} 67 require.NoError(t, json.Unmarshal(expectedJson, &expectedSlice)) 68 var actualSlice []map[string]interface{} 69 require.NoError(t, json.Unmarshal(actualJson, &actualSlice)) 70 expectedSlice = purgeMetadataSlice(expectedSlice) 71 actualSlice = purgeMetadataSlice(actualSlice) 72 assert.Equal(t, expectedSlice, actualSlice, "defsec adapted and expected values do not match") 73 } else { 74 var expectedMap map[string]interface{} 75 require.NoError(t, json.Unmarshal(expectedJson, &expectedMap)) 76 var actualMap map[string]interface{} 77 require.NoError(t, json.Unmarshal(actualJson, &actualMap)) 78 expectedMap = purgeMetadata(expectedMap) 79 actualMap = purgeMetadata(actualMap) 80 assert.Equal(t, expectedMap, actualMap, "defsec adapted and expected values do not match") 81 } 82 } 83 84 func purgeMetadata(input map[string]interface{}) map[string]interface{} { 85 for k, v := range input { 86 if k == "metadata" || k == "Metadata" { 87 delete(input, k) 88 continue 89 } 90 if v, ok := v.(map[string]interface{}); ok { 91 input[k] = purgeMetadata(v) 92 } 93 if v, ok := v.([]interface{}); ok { 94 if len(v) > 0 { 95 if _, ok := v[0].(map[string]interface{}); ok { 96 maps := make([]map[string]interface{}, len(v)) 97 for i := range v { 98 maps[i] = v[i].(map[string]interface{}) 99 } 100 input[k] = purgeMetadataSlice(maps) 101 } 102 } 103 } 104 } 105 return input 106 } 107 108 func purgeMetadataSlice(input []map[string]interface{}) []map[string]interface{} { 109 for i := range input { 110 input[i] = purgeMetadata(input[i]) 111 } 112 return input 113 }