Skip to content
This repository has been archived by the owner on Jun 6, 2024. It is now read-only.

Commit

Permalink
fix: clean cliClient
Browse files Browse the repository at this point in the history
  • Loading branch information
myishay committed Apr 20, 2021
1 parent 4248c00 commit 11095eb
Show file tree
Hide file tree
Showing 5 changed files with 136 additions and 103 deletions.
52 changes: 50 additions & 2 deletions bl/evaluator.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,29 +8,48 @@ import (
"github.com/datreeio/datree/pkg/cliClient"
"github.com/datreeio/datree/pkg/printer"
"github.com/datreeio/datree/pkg/propertiesExtractor"
"github.com/shirou/gopsutil/host"
)

type Printer interface {
PrintWarnings(warnings []printer.Warning)
PrintSummaryTable(summary printer.Summary)
}
type CLIClient interface {
RequestEvaluation(pattern string, files []*propertiesExtractor.FileProperties, cliId string, cliVersion string) (cliClient.EvaluationResponse, error)
RequestEvaluation(cliClient.EvaluationRequest) (cliClient.EvaluationResponse, error)
}
type PropertiesExtractor interface {
ReadFilesFromPattern(pattern string, conc int) ([]*propertiesExtractor.FileProperties, []propertiesExtractor.FileError, []error)
}

type Evaluator struct {
propertiesExtractor PropertiesExtractor
cliClient CLIClient
printer Printer
osInfo *OSInfo
}

type OSInfo struct {
OS string
PlatformVersion string
KernelVersion string
}

func createOSInfo() *OSInfo {
infoStat, _ := host.Info()
return &OSInfo{
OS: infoStat.OS,
KernelVersion: infoStat.KernelVersion,
PlatformVersion: infoStat.PlatformVersion,
}
}

func CreateNewEvaluator(pe PropertiesExtractor, c CLIClient, p Printer) *Evaluator {
return &Evaluator{
propertiesExtractor: pe,
cliClient: c,
printer: p,
osInfo: createOSInfo(),
}
}

Expand All @@ -43,6 +62,12 @@ type EvaluationResults struct {
}
}

type UserAgent struct {
OS string
PlatformVersion string
KernelVersion string
}

func (e *Evaluator) Evaluate(pattern string, cliId string, evaluationConc int, cliVersion string) (*EvaluationResults, []propertiesExtractor.FileError, error) {
files, fileErrors, errors := e.propertiesExtractor.ReadFilesFromPattern(pattern, evaluationConc)
if len(errors) > 0 {
Expand All @@ -53,7 +78,30 @@ func (e *Evaluator) Evaluate(pattern string, cliId string, evaluationConc int, c
return nil, fileErrors, fmt.Errorf("no files detected")
}

res, err := e.cliClient.RequestEvaluation(pattern, files, cliId, cliVersion)
var filesProperties []propertiesExtractor.FileProperties

for _, file := range files {
filesProperties = append(filesProperties, *file)
}

evaluationRequest := cliClient.EvaluationRequest{
CliId: cliId,
Pattern: pattern,
Metadata: struct {
CliVersion string "json:\"cliVersion\""
Os string "json:\"os\""
PlatformVersion string "json:\"platformVersion\""
KernelVersion string "json:\"kernelVersion\""
}{
CliVersion: cliVersion,
Os: e.osInfo.OS,
PlatformVersion: e.osInfo.PlatformVersion,
KernelVersion: e.osInfo.KernelVersion,
},
Files: filesProperties,
}

res, err := e.cliClient.RequestEvaluation(evaluationRequest)
if err != nil {
return nil, fileErrors, err
}
Expand Down
74 changes: 59 additions & 15 deletions bl/evaluator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ type mockCliClient struct {
mock.Mock
}

func (m *mockCliClient) RequestEvaluation(pattern string, files []*propertiesExtractor.FileProperties, cliId string, cliVersion string) (cliClient.EvaluationResponse, error) {
args := m.Called(pattern, files, cliId)
func (m *mockCliClient) RequestEvaluation(evaluationRequest cliClient.EvaluationRequest) (cliClient.EvaluationResponse, error) {
args := m.Called(evaluationRequest)
return args.Get(0).(cliClient.EvaluationResponse), args.Error(1)
}

Expand Down Expand Up @@ -59,9 +59,10 @@ type cliClientMockTestCase struct {
type evaluateTestCase struct {
name string
args struct {
pattern string
cliId string
evaluationConc int
pattern string
cliId string
evaluationConc int
evaluationRequest cliClient.EvaluationRequest
}
mock struct {
propertiesExtractor propertiesExtractorMockTestCase
Expand All @@ -86,18 +87,23 @@ func TestEvaluate(t *testing.T) {
printer := &mockPrinter{}

propertiesExtractor.On("ReadFilesFromPattern", mock.Anything, mock.Anything).Return(tt.mock.propertiesExtractor.readFilesFromPattern.properties, tt.mock.propertiesExtractor.readFilesFromPattern.filesErrors, tt.mock.propertiesExtractor.readFilesFromPattern.errors)
cliClient.On("RequestEvaluation", mock.Anything, mock.Anything, mock.Anything).Return(tt.mock.cliClient.requestEvaluation.response, tt.mock.cliClient.requestEvaluation.errors)
cliClient.On("RequestEvaluation", mock.Anything).Return(tt.mock.cliClient.requestEvaluation.response, tt.mock.cliClient.requestEvaluation.errors)

evaluator := &Evaluator{
propertiesExtractor: propertiesExtractor,
cliClient: cliClient,
printer: printer,
osInfo: &OSInfo{
OS: "darwin",
PlatformVersion: "1.2.3",
KernelVersion: "4.5.6",
},
}

actualResponse, actualFilesErrs, actualErr := evaluator.Evaluate(tt.args.pattern, tt.args.cliId, tt.args.evaluationConc, "0.0.1")

propertiesExtractor.AssertCalled(t, "ReadFilesFromPattern", tt.args.pattern, tt.args.evaluationConc)
cliClient.AssertCalled(t, "RequestEvaluation", tt.args.pattern, tt.mock.propertiesExtractor.readFilesFromPattern.properties, tt.args.cliId)
cliClient.AssertCalled(t, "RequestEvaluation", tt.args.evaluationRequest)

assert.Equal(t, tt.expected.response, actualResponse)
assert.Equal(t, tt.expected.fileErrors, actualFilesErrs)
Expand Down Expand Up @@ -125,14 +131,33 @@ func test_evaluate_success() *evaluateTestCase {
return &evaluateTestCase{
name: "success",
args: struct {
pattern string
cliId string
evaluationConc int
pattern string
cliId string
evaluationConc int
evaluationRequest cliClient.EvaluationRequest
}{
pattern: "*/*",
cliId: "cliId-test",
evaluationConc: 1,
},
evaluationRequest: cliClient.EvaluationRequest{
Pattern: "*/*",
CliId: "cliId-test",
Metadata: struct {
CliVersion string "json:\"cliVersion\""
Os string "json:\"os\""
PlatformVersion string "json:\"platformVersion\""
KernelVersion string "json:\"kernelVersion\""
}{
CliVersion: "0.0.1",
Os: "darwin",
PlatformVersion: "1.2.3",
KernelVersion: "4.5.6",
},
Files: []propertiesExtractor.FileProperties{{
FileName: "path1/path2/file.yaml",
Configurations: []propertiesExtractor.K8sConfiguration{{"apiVersion": "extensions/v1beta1"}},
}},
}},
mock: struct {
propertiesExtractor propertiesExtractorMockTestCase
cliClient cliClientMockTestCase
Expand Down Expand Up @@ -184,14 +209,33 @@ func test_evaluate_failedRequest() *evaluateTestCase {
return &evaluateTestCase{
name: "fail",
args: struct {
pattern string
cliId string
evaluationConc int
pattern string
cliId string
evaluationConc int
evaluationRequest cliClient.EvaluationRequest
}{
pattern: "*/*",
cliId: "cliId-test",
evaluationConc: 1,
},
evaluationRequest: cliClient.EvaluationRequest{
Pattern: "*/*",
CliId: "cliId-test",
Metadata: struct {
CliVersion string "json:\"cliVersion\""
Os string "json:\"os\""
PlatformVersion string "json:\"platformVersion\""
KernelVersion string "json:\"kernelVersion\""
}{
CliVersion: "0.0.1",
Os: "darwin",
PlatformVersion: "1.2.3",
KernelVersion: "4.5.6",
},
Files: []propertiesExtractor.FileProperties{{
FileName: "path1/path2/file.yaml",
Configurations: []propertiesExtractor.K8sConfiguration{{"apiVersion": "extensions/v1beta1"}},
}},
}},
mock: struct {
propertiesExtractor propertiesExtractorMockTestCase
cliClient cliClientMockTestCase
Expand Down
50 changes: 6 additions & 44 deletions pkg/cliClient/cliClient.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,16 @@ import (
type HTTPClient interface {
Request(method string, resourceURI string, body interface{}, headers map[string]string) (httpClient.Response, error)
}

type getUserAgentFn = func() (*UserAgent, error)
type CliClient struct {
baseUrl string
httpClient HTTPClient
getUserAgent getUserAgentFn
baseUrl string
httpClient HTTPClient
}

func NewCliClient(url string) *CliClient {
httpClient := httpClient.NewClient(url, nil)
return &CliClient{
baseUrl: url,
httpClient: httpClient,
getUserAgent: getUserAgent,
baseUrl: url,
httpClient: httpClient,
}
}

Expand Down Expand Up @@ -66,12 +62,8 @@ type EvaluationResponse struct {
Status string `json:"status"`
}

func (c *CliClient) RequestEvaluation(pattern string, files []*extractor.FileProperties, cliId string, cliVersion string) (EvaluationResponse, error) {
evaluationRequest, err := c.createEvaluationRequest(pattern, files, cliId, cliVersion)
if err != nil {
return EvaluationResponse{}, err
}
res, err := c.httpClient.Request(http.MethodPost, "/cli/evaluate", evaluationRequest, nil)
func (c *CliClient) RequestEvaluation(request EvaluationRequest) (EvaluationResponse, error) {
res, err := c.httpClient.Request(http.MethodPost, "/cli/evaluate", request, nil)
if err != nil {
return EvaluationResponse{}, err
}
Expand All @@ -84,33 +76,3 @@ func (c *CliClient) RequestEvaluation(pattern string, files []*extractor.FilePro

return *evaluationResponse, nil
}

func (c *CliClient) createEvaluationRequest(pattern string, files []*extractor.FileProperties, cliId string, cliVersion string) (EvaluationRequest, error) {
var filesProperties []extractor.FileProperties

for _, file := range files {
filesProperties = append(filesProperties, *file)
}

userAgent, err := c.getUserAgent()
if err != nil {
return EvaluationRequest{}, err
}
evaluationRequest := EvaluationRequest{
CliId: cliId,
Pattern: pattern,
Metadata: struct {
CliVersion string "json:\"cliVersion\""
Os string "json:\"os\""
PlatformVersion string "json:\"platformVersion\""
KernelVersion string "json:\"kernelVersion\""
}{
CliVersion: cliVersion,
Os: userAgent.OS,
PlatformVersion: userAgent.PlatformVersion,
KernelVersion: userAgent.KernelVersion,
},
Files: filesProperties,
}
return evaluationRequest, nil
}
42 changes: 21 additions & 21 deletions pkg/cliClient/cliClient_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,16 +26,13 @@ func (c *mockHTTPClient) Request(method string, resourceURI string, body interfa
type RequestEvaluationTestCase struct {
name string
args struct {
pattern string
cliId string
properties []*extractor.FileProperties
evaluationRequest *EvaluationRequest
}
mock struct {
response struct {
status int
body *EvaluationResponse
}
getUserAgentFn func() (*UserAgent, error)
}
expected struct {
request struct {
Expand All @@ -62,12 +59,11 @@ func TestRequestEvaluation(t *testing.T) {
httpClientMock.On("Request", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(mockedHTTPResponse, nil)

client := &CliClient{
baseUrl: "http://cli-service.test.io",
httpClient: &httpClientMock,
getUserAgent: tt.mock.getUserAgentFn,
baseUrl: "http://cli-service.test.io",
httpClient: &httpClientMock,
}

res, _ := client.RequestEvaluation(tt.args.pattern, tt.args.properties, tt.args.cliId, "0.0.1")
res, _ := client.RequestEvaluation(*tt.args.evaluationRequest)

httpClientMock.AssertCalled(t, "Request", tt.expected.request.method, tt.expected.request.uri, *tt.expected.request.body, tt.expected.request.headers)
assert.Equal(t, *tt.expected.response, res)
Expand Down Expand Up @@ -119,20 +115,30 @@ func test_requestEvaluation_success() *RequestEvaluationTestCase {
return &RequestEvaluationTestCase{
name: "success - request evaluation",
args: struct {
pattern string
cliId string
properties []*extractor.FileProperties
evaluationRequest *EvaluationRequest
}{
pattern: "pattern",
properties: castPropertiesPointersMock("service_mock", "mocks/service_mock.yaml"),
cliId: "cli-id-test",
evaluationRequest: &EvaluationRequest{
CliId: "cli-id-test",
Pattern: "pattern",
Files: castPropertiesMock("service_mock", "mocks/service_mock.yaml"),
Metadata: struct {
CliVersion string "json:\"cliVersion\""
Os string "json:\"os\""
PlatformVersion string "json:\"platformVersion\""
KernelVersion string "json:\"kernelVersion\""
}{
CliVersion: "0.0.1",
Os: "darwin",
PlatformVersion: "1.2.3",
KernelVersion: "4.5.6",
},
},
},
mock: struct {
response struct {
status int
body *EvaluationResponse
}
getUserAgentFn func() (*UserAgent, error)
}{
response: struct {
status int
Expand All @@ -141,12 +147,6 @@ func test_requestEvaluation_success() *RequestEvaluationTestCase {
status: http.StatusOK,
body: &EvaluationResponse{},
},
getUserAgentFn: func() (*UserAgent, error) {
return &UserAgent{
OS: "darwin",
PlatformVersion: "1.2.3",
KernelVersion: "4.5.6"}, nil
},
},
expected: struct {
request struct {
Expand Down
Loading

0 comments on commit 11095eb

Please sign in to comment.