diff --git a/core/cautils/controllink_test.go b/core/cautils/controllink_test.go new file mode 100644 index 00000000..441d39ed --- /dev/null +++ b/core/cautils/controllink_test.go @@ -0,0 +1,53 @@ +package cautils + +import ( + "testing" +) + +// Returns a valid URL when given a valid control ID. +func TestGetControlLink_ValidControlID(t *testing.T) { + controlID := "cis-1.1.3" + expectedURL := "https://hub.armosec.io/docs/cis-1-1-3" + + result := GetControlLink(controlID) + + if result != expectedURL { + t.Errorf("Expected URL: %s, but got: %s", expectedURL, result) + } +} + +// Replaces dots with hyphens in the control ID to generate the correct documentation link. +func TestGetControlLink_DotsInControlID(t *testing.T) { + controlID := "cis.1.1.3" + expectedURL := "https://hub.armosec.io/docs/cis-1-1-3" + + result := GetControlLink(controlID) + + if result != expectedURL { + t.Errorf("Expected URL: %s, but got: %s", expectedURL, result) + } +} + +// Returns a lowercase URL. +func TestGetControlLink_LowercaseURL(t *testing.T) { + controlID := "CIS-1.1.3" + expectedURL := "https://hub.armosec.io/docs/cis-1-1-3" + + result := GetControlLink(controlID) + + if result != expectedURL { + t.Errorf("Expected URL: %s, but got: %s", expectedURL, result) + } +} + +// Returns URL to armosec docs when given an empty control ID. +func TestGetControlLink_EmptyControlID(t *testing.T) { + controlID := "" + expectedURL := "https://hub.armosec.io/docs/" + + result := GetControlLink(controlID) + + if result != expectedURL { + t.Errorf("Expected URL: %s, but got: %s", expectedURL, result) + } +} diff --git a/core/cautils/display_test.go b/core/cautils/display_test.go index 85bb7533..718240dd 100644 --- a/core/cautils/display_test.go +++ b/core/cautils/display_test.go @@ -1,9 +1,12 @@ package cautils import ( + "io" + "os" "testing" "github.com/kubescape/go-logger" + "github.com/stretchr/testify/assert" ) func TestStartSpinner(t *testing.T) { @@ -30,3 +33,422 @@ func TestStartSpinner(t *testing.T) { }) } } + +func TestFailureDisplay(t *testing.T) { + tests := []struct { + text string + want string + }{ + { + text: "Test", + want: "Test", + }, + { + text: "", + want: "", + }, + } + + for _, tt := range tests { + t.Run(tt.text, func(t *testing.T) { + // Redirect stdout to a buffer + rescueStdout := os.Stdout + r, w, _ := os.Pipe() + os.Stdout = w + + FailureDisplay(os.Stdout, tt.text) + + w.Close() + got, _ := io.ReadAll(r) + os.Stdout = rescueStdout + + assert.Equal(t, tt.want, string(got)) + }) + } +} + +func TestWarningDisplay(t *testing.T) { + tests := []struct { + text string + want string + }{ + { + text: "Test", + want: "Test", + }, + { + text: "", + want: "", + }, + } + + for _, tt := range tests { + t.Run(tt.text, func(t *testing.T) { + // Redirect stdout to a buffer + rescueStdout := os.Stdout + r, w, _ := os.Pipe() + os.Stdout = w + + WarningDisplay(os.Stdout, tt.text) + + w.Close() + got, _ := io.ReadAll(r) + os.Stdout = rescueStdout + + assert.Equal(t, tt.want, string(got)) + }) + } +} + +func TestFailureTextDisplay(t *testing.T) { + tests := []struct { + text string + want string + }{ + { + text: "Test", + want: "Test", + }, + { + text: "", + want: "", + }, + } + + for _, tt := range tests { + t.Run(tt.text, func(t *testing.T) { + // Redirect stdout to a buffer + rescueStdout := os.Stdout + r, w, _ := os.Pipe() + os.Stdout = w + + FailureTextDisplay(os.Stdout, tt.text) + + w.Close() + got, _ := io.ReadAll(r) + os.Stdout = rescueStdout + + assert.Equal(t, tt.want, string(got)) + }) + } +} + +func TestInfoDisplay(t *testing.T) { + tests := []struct { + text string + want string + }{ + { + text: "Test", + want: "Test", + }, + { + text: "", + want: "", + }, + } + + for _, tt := range tests { + t.Run(tt.text, func(t *testing.T) { + // Redirect stdout to a buffer + rescueStdout := os.Stdout + r, w, _ := os.Pipe() + os.Stdout = w + + InfoDisplay(os.Stdout, tt.text) + + w.Close() + got, _ := io.ReadAll(r) + os.Stdout = rescueStdout + + assert.Equal(t, tt.want, string(got)) + }) + } +} + +func TestInfoTextDisplay(t *testing.T) { + tests := []struct { + text string + want string + }{ + { + text: "Test", + want: "Test", + }, + { + text: "", + want: "", + }, + } + + for _, tt := range tests { + t.Run(tt.text, func(t *testing.T) { + // Redirect stdout to a buffer + rescueStdout := os.Stdout + r, w, _ := os.Pipe() + os.Stdout = w + + InfoTextDisplay(os.Stdout, tt.text) + + w.Close() + got, _ := io.ReadAll(r) + os.Stdout = rescueStdout + + assert.Equal(t, tt.want, string(got)) + }) + } +} + +func TestSimpleDisplay(t *testing.T) { + tests := []struct { + text string + want string + }{ + { + text: "Test", + want: "Test", + }, + { + text: "", + want: "", + }, + } + + for _, tt := range tests { + t.Run(tt.text, func(t *testing.T) { + // Redirect stdout to a buffer + rescueStdout := os.Stdout + r, w, _ := os.Pipe() + os.Stdout = w + + SimpleDisplay(os.Stdout, tt.text) + + w.Close() + got, _ := io.ReadAll(r) + os.Stdout = rescueStdout + + assert.Equal(t, tt.want, string(got)) + }) + } +} + +func TestSuccessDisplay(t *testing.T) { + tests := []struct { + text string + want string + }{ + { + text: "Test", + want: "Test", + }, + { + text: "", + want: "", + }, + } + + for _, tt := range tests { + t.Run(tt.text, func(t *testing.T) { + // Redirect stdout to a buffer + rescueStdout := os.Stdout + r, w, _ := os.Pipe() + os.Stdout = w + + SuccessDisplay(os.Stdout, tt.text) + + w.Close() + got, _ := io.ReadAll(r) + os.Stdout = rescueStdout + + assert.Equal(t, tt.want, string(got)) + }) + } +} + +func TestDescriptionDisplay(t *testing.T) { + tests := []struct { + text string + want string + }{ + { + text: "Test", + want: "Test", + }, + { + text: "", + want: "", + }, + } + + for _, tt := range tests { + t.Run(tt.text, func(t *testing.T) { + // Redirect stdout to a buffer + rescueStdout := os.Stdout + r, w, _ := os.Pipe() + os.Stdout = w + + DescriptionDisplay(os.Stdout, tt.text) + + w.Close() + got, _ := io.ReadAll(r) + os.Stdout = rescueStdout + + assert.Equal(t, tt.want, string(got)) + }) + } +} + +func TestBoldDisplay(t *testing.T) { + tests := []struct { + text string + want string + }{ + { + text: "Test", + want: "Test", + }, + { + text: "", + want: "", + }, + } + + for _, tt := range tests { + t.Run(tt.text, func(t *testing.T) { + // Redirect stdout to a buffer + rescueStdout := os.Stdout + r, w, _ := os.Pipe() + os.Stdout = w + + BoldDisplay(os.Stdout, tt.text) + + w.Close() + got, _ := io.ReadAll(r) + os.Stdout = rescueStdout + + assert.Equal(t, tt.want, string(got)) + }) + } +} + +func TestLineDisplay(t *testing.T) { + tests := []struct { + text string + want string + }{ + { + text: "Test", + want: "Test", + }, + { + text: "", + want: "", + }, + } + + for _, tt := range tests { + t.Run(tt.text, func(t *testing.T) { + // Redirect stdout to a buffer + rescueStdout := os.Stdout + r, w, _ := os.Pipe() + os.Stdout = w + + LineDisplay(os.Stdout, tt.text) + + w.Close() + got, _ := io.ReadAll(r) + os.Stdout = rescueStdout + + assert.Equal(t, tt.want, string(got)) + }) + } +} + +func TestSectionHeadingDisplay(t *testing.T) { + tests := []struct { + text string + want string + }{ + { + text: "Test Section", + want: "\nTest Section\n────────────\n\n", + }, + { + text: "", + want: "\n\n\n\n", + }, + } + + for _, tt := range tests { + t.Run(tt.text, func(t *testing.T) { + // Redirect stdout to a buffer + rescueStdout := os.Stdout + r, w, _ := os.Pipe() + os.Stdout = w + + SectionHeadingDisplay(os.Stdout, tt.text) + + w.Close() + got, _ := io.ReadAll(r) + os.Stdout = rescueStdout + + assert.Equal(t, tt.want, string(got)) + }) + } +} + +func TestStarDisplay(t *testing.T) { + tests := []struct { + text string + want string + }{ + { + text: "Test", + want: "* Test", + }, + { + text: "", + want: "* ", + }, + } + + for _, tt := range tests { + t.Run(tt.text, func(t *testing.T) { + // Redirect stdout to a buffer + rescueStdout := os.Stdout + r, w, _ := os.Pipe() + os.Stdout = w + + StarDisplay(os.Stdout, tt.text) + + w.Close() + got, _ := io.ReadAll(r) + os.Stdout = rescueStdout + + assert.Equal(t, tt.want, string(got)) + }) + } +} + +// Returns a new instance of ProgressHandler with the given title. +func TestNewProgressHandler_(t *testing.T) { + tests := []struct { + title string + }{ + { + title: "Test title", + }, + { + title: "", + }, + } + + for _, tt := range tests { + t.Run(tt.title, func(t *testing.T) { + progressHandler := NewProgressHandler(tt.title) + assert.NotNil(t, progressHandler) + + assert.Equal(t, tt.title, progressHandler.title) + }) + } +} diff --git a/core/cautils/fileutils_test.go b/core/cautils/fileutils_test.go index 28fa94bb..b132f75a 100644 --- a/core/cautils/fileutils_test.go +++ b/core/cautils/fileutils_test.go @@ -105,3 +105,110 @@ func getRelativePath(p string) string { pp := strings.SplitAfter(p, "api=") return pp[1] } + +// Converts a YAML object to a JSON object +func TestConvertYamlToJson(t *testing.T) { + tests := []struct { + yamlObj map[interface{}]interface{} + jsonObj map[string]interface{} + }{ + { + yamlObj: map[interface{}]interface{}{ + "name": "John", + "age": 30, + "city": "New York", + }, + jsonObj: map[string]interface{}{ + "name": "John", + "age": 30, + "city": "New York", + }, + }, + } + + for _, tt := range tests { + t.Run("", func(t *testing.T) { + assert.Equal(t, tt.jsonObj, convertYamlToJson(tt.yamlObj)) + }) + } +} + +func TestIsYaml(t *testing.T) { + tests := []struct { + path string + want bool + }{ + { + path: "temp.yaml", + want: true, + }, + { + path: "temp.json", + want: false, + }, + { + path: "random.txt", + want: false, + }, + } + + for _, tt := range tests { + t.Run(tt.path, func(t *testing.T) { + assert.Equal(t, tt.want, IsYaml(tt.path)) + }) + } +} + +func TestIsJson(t *testing.T) { + tests := []struct { + path string + want bool + }{ + { + path: "temp.yaml", + want: false, + }, + { + path: "temp.json", + want: true, + }, + { + path: "random.txt", + want: false, + }, + } + + for _, tt := range tests { + t.Run(tt.path, func(t *testing.T) { + assert.Equal(t, tt.want, IsJson(tt.path)) + }) + } + +} + +func TestGetFileFormat(t *testing.T) { + tests := []struct { + path string + want FileFormat + }{ + { + path: "temp.yaml", + want: YAML_FILE_FORMAT, + }, + { + path: "temp.json", + want: JSON_FILE_FORMAT, + }, + { + path: "random.txt", + want: "random.txt", + }, + } + + for _, tt := range tests { + t.Run(tt.path, func(t *testing.T) { + assert.Equal(t, tt.want, GetFileFormat(tt.path)) + }) + } + +} diff --git a/core/cautils/getter/getpoliciesutils_test.go b/core/cautils/getter/getpoliciesutils_test.go index 3f56bd70..884a774b 100644 --- a/core/cautils/getter/getpoliciesutils_test.go +++ b/core/cautils/getter/getpoliciesutils_test.go @@ -1,12 +1,15 @@ package getter import ( + "io/ioutil" "net/http" "os" "path/filepath" + "strings" "testing" beClient "github.com/kubescape/backend/pkg/client/v1" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -96,3 +99,45 @@ func TestHttpMethods(t *testing.T) { require.EqualValues(t, "body-delete", resp) }) } + +// Returns an empty string and nil error when given a nil response or nil response body. +func TestHttpRespToString_NilResponse(t *testing.T) { + resp := &http.Response{} + result, err := httpRespToString(resp) + assert.Equal(t, "", result) + assert.Nil(t, err) +} + +func TestHttpRespToString_ValidResponse(t *testing.T) { + resp := &http.Response{ + Body: ioutil.NopCloser(strings.NewReader("test response")), + Status: "200 OK", + StatusCode: 200, + } + result, err := httpRespToString(resp) + assert.Equal(t, "test response", result) + assert.Nil(t, err) +} + +// Returns an error with status and reason when unable to read response body. +func TestHttpRespToString_ReadError(t *testing.T) { + resp := &http.Response{ + Body: ioutil.NopCloser(strings.NewReader("test response")), + } + resp.Body.Close() + result, err := httpRespToString(resp) + assert.EqualError(t, err, "http-error: '', reason: 'test response'") + assert.Equal(t, "test response", result) +} + +// Returns an error with status and reason when unable to read response body. +func TestHttpRespToString_ErrorCodeLessThan200(t *testing.T) { + resp := &http.Response{ + Body: ioutil.NopCloser(strings.NewReader("test response")), + StatusCode: 100, + } + resp.Body.Close() + result, err := httpRespToString(resp) + assert.EqualError(t, err, "http-error: '', reason: 'test response'") + assert.Equal(t, "test response", result) +} diff --git a/core/cautils/getter/utils_test.go b/core/cautils/getter/utils_test.go new file mode 100644 index 00000000..a5937ff2 --- /dev/null +++ b/core/cautils/getter/utils_test.go @@ -0,0 +1,43 @@ +package getter + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +// should return true if the string is present in the slice +func TestContains(t *testing.T) { + tests := []struct { + str []string + key string + want bool + }{ + { + str: []string{"apple", "banana", "orange"}, + key: "banana", + want: true, + }, + { + str: []string{"apple", "banana", "orange"}, + key: "mango", + want: false, + }, + { + str: []string{"", "banana", "banana"}, + key: "banana", + want: true, + }, + { + str: []string{"", "", ""}, + key: "grape", + want: false, + }, + } + + for _, tt := range tests { + t.Run(tt.key, func(t *testing.T) { + assert.Equal(t, tt.want, contains(tt.str, tt.key)) + }) + } +}