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  }