From d1c3e3163b42a1022c3084759fb6789327335b88 Mon Sep 17 00:00:00 2001
From: Yoav Hizkiahou <yoav.hizkiahou@aquasec.com>
Date: Mon, 6 May 2019 12:30:11 +0300
Subject: [PATCH] Genereate expected result automatically for each test

---
 check/check.go |  2 ++
 check/test.go  | 21 ++++++++++++++++++++-
 2 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/check/check.go b/check/check.go
index 3c7884f..485cca9 100644
--- a/check/check.go
+++ b/check/check.go
@@ -72,6 +72,7 @@ type Check struct {
 	State       `json:"status"`
 	ActualValue string `json:"actual_value"`
 	Scored      bool   `json:"scored"`
+	ExpectedResult string `json:"expected_result"`
 }
 
 // Runner wraps the basic Run method.
@@ -188,6 +189,7 @@ func (c *Check) run() State {
 	finalOutput := c.Tests.execute(out.String())
 	if finalOutput != nil {
 		c.ActualValue = finalOutput.actualResult
+		c.ExpectedResult = finalOutput.ExpectedResult
 		if finalOutput.testResult {
 			c.State = PASS
 		} else {
diff --git a/check/test.go b/check/test.go
index 059642f..9e2746b 100644
--- a/check/test.go
+++ b/check/test.go
@@ -58,6 +58,7 @@ type compare struct {
 type testOutput struct {
 	testResult   bool
 	actualResult string
+	ExpectedResult string
 }
 
 func failTestItem(s string) *testOutput {
@@ -135,8 +136,10 @@ func (t *testItem) execute(s string) *testOutput {
 				}
 			}
 
+			expectedResultPattern := ""
 			switch t.Compare.Op {
 			case "eq":
+				expectedResultPattern = "'%s' is equal to '%s'"
 				value := strings.ToLower(flagVal)
 				// Do case insensitive comparaison for booleans ...
 				if value == "false" || value == "true" {
@@ -146,6 +149,7 @@ func (t *testItem) execute(s string) *testOutput {
 				}
 
 			case "noteq":
+				expectedResultPattern = "'%s' is not equal to '%s'"
 				value := strings.ToLower(flagVal)
 				// Do case insensitive comparaison for booleans ...
 				if value == "false" || value == "true" {
@@ -155,32 +159,41 @@ func (t *testItem) execute(s string) *testOutput {
 				}
 
 			case "gt":
+				expectedResultPattern = "%s is greater then %s"
 				a, b := toNumeric(flagVal, t.Compare.Value)
 				result.testResult = a > b
 
 			case "gte":
+				expectedResultPattern = "%s is greater or equal to %s"
 				a, b := toNumeric(flagVal, t.Compare.Value)
 				result.testResult = a >= b
 
 			case "lt":
+				expectedResultPattern = "%s is lower then %s"
 				a, b := toNumeric(flagVal, t.Compare.Value)
 				result.testResult = a < b
 
 			case "lte":
+				expectedResultPattern = "%s is lower or equal to %s"
 				a, b := toNumeric(flagVal, t.Compare.Value)
 				result.testResult = a <= b
 
 			case "has":
+				expectedResultPattern = "'%s' has '%s'"
 				result.testResult = strings.Contains(flagVal, t.Compare.Value)
 
 			case "nothave":
+				expectedResultPattern = " '%s' not have '%s'"
 				result.testResult = !strings.Contains(flagVal, t.Compare.Value)
 			}
+
+			result.ExpectedResult = fmt.Sprintf(expectedResultPattern, t.Flag, t.Compare.Value)
 		} else {
+			result.ExpectedResult = fmt.Sprintf("'%s' is present", t.Flag)
 			result.testResult = isset
 		}
-
 	} else {
+		result.ExpectedResult = fmt.Sprintf("'%s' is not present", t.Flag)
 		notset := !match
 		result.testResult = notset
 	}
@@ -219,13 +232,19 @@ func (ts *tests) execute(s string) *testOutput {
 	case and, "":
 		result = true
 		for i := range res {
+			finalOutput.ExpectedResult += fmt.Sprintf("%s AND ", res[i].ExpectedResult)
 			result = result && res[i].testResult
 		}
+		// Delete last iteration ' AND '
+		finalOutput.ExpectedResult = finalOutput.ExpectedResult[:len(finalOutput.ExpectedResult)-5]
 	case or:
 		result = false
 		for i := range res {
+			finalOutput.ExpectedResult += fmt.Sprintf("%s OR ", res[i].ExpectedResult)
 			result = result || res[i].testResult
 		}
+		// Delete last iteration ' OR '
+		finalOutput.ExpectedResult = finalOutput.ExpectedResult[:len(finalOutput.ExpectedResult)-4]
 	}
 
 	finalOutput.testResult = result
-- 
GitLab