Skip to content

Commit

Permalink
add dependency of http capability on http request and tests
Browse files Browse the repository at this point in the history
  • Loading branch information
lucamrgs committed Mar 7, 2024
1 parent af1aeeb commit d70123b
Show file tree
Hide file tree
Showing 2 changed files with 175 additions and 2 deletions.
8 changes: 6 additions & 2 deletions internal/capability/http/http.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import (
// Return response

type HttpCapability struct {
soarca_http_request http.IHttpRequest
}

type Empty struct{}
Expand All @@ -25,21 +26,24 @@ func init() {
log = logger.Logger(component, logger.Info, "", logger.Json)
}

func New(httpRequest http.IHttpRequest) *HttpCapability {
return &HttpCapability{soarca_http_request: httpRequest}
}

func (httpCapability *HttpCapability) Execute(
metadata execution.Metadata,
command cacao.Command,
authentication cacao.AuthenticationInformation,
target cacao.AgentTarget,
variables cacao.VariableMap) (cacao.VariableMap, error) {

soarca_http_request := new(http.HttpRequest)
soarca_http_options := http.HttpOptions{
Target: &target,
Command: &command,
Auth: &authentication,
}

responseBytes, err := soarca_http_request.Request(soarca_http_options)
responseBytes, err := httpCapability.soarca_http_request.Request(soarca_http_options)
if err != nil {
log.Error(err)
return cacao.VariableMap{}, err
Expand Down
169 changes: 169 additions & 0 deletions test/unittest/capability/http/http_test.go
Original file line number Diff line number Diff line change
@@ -1 +1,170 @@
package http_test

// Build http capability with New() using mock http Request
// test correct parsing of HttpOptions fields and errors handling

import (
"errors"
"fmt"
"soarca/internal/capability/http"
"soarca/models/cacao"
"soarca/models/execution"
mock_request "soarca/test/unittest/mocks/mock_utils/http"
http_request "soarca/utils/http"
"testing"

"github.com/go-playground/assert/v2"
"github.com/google/uuid"
)

func TestHTTPOptionsCorrectlyGenerated(t *testing.T) {
mock_http_request := &mock_request.MockHttpRequest{}
httpCapability := http.New(mock_http_request)

var oauth2_info = cacao.AuthenticationInformation{
ID: "6ba7b810-9dad-11d1-80b4-00c04fd430c9",
Type: "oauth2",
Token: "this-is-a-test",
}

target := cacao.AgentTarget{HttpUrl: "https://httpbin.org/post"}
command := cacao.Command{
Type: "http-api",
Command: "POST / HTTP/1.1",
Headers: map[string]string{"accept": "application/json"},
}

var variable1 = cacao.Variable{
Type: "string",
Name: "test request building",
Value: "",
}

var executionId, _ = uuid.Parse("6ba7b810-9dad-11d1-80b4-00c04fd430c8")
var playbookId, _ = uuid.Parse("d09351a2-a075-40c8-8054-0b7c423db83f")
var stepId, _ = uuid.Parse("81eff59f-d084-4324-9e0a-59e353dbd28f")
metadata := execution.Metadata{ExecutionId: executionId, PlaybookId: playbookId.String(), StepId: stepId.String()}

httpOptions := http_request.HttpOptions{
Command: &command,
Target: &target,
Auth: &oauth2_info,
}

payload := "payload test"
payload_byte := []byte(payload)
mock_http_request.On("Request", httpOptions).Return(payload_byte, nil)

results, err := httpCapability.Execute(
metadata,
command,
oauth2_info,
target,
cacao.VariableMap{"test": variable1})
if err != nil {
fmt.Println(err)
t.Fail()
}
assert.Equal(t, results["__soarca_http_result__"].Value, payload)
fmt.Println(results)

mock_http_request.AssertExpectations(t)
}

func TestHTTPOptionsEmptyAuth(t *testing.T) {
mock_http_request := &mock_request.MockHttpRequest{}
httpCapability := http.New(mock_http_request)

target := cacao.AgentTarget{HttpUrl: "https://httpbin.org/post"}
command := cacao.Command{
Type: "http-api",
Command: "POST / HTTP/1.1",
Headers: map[string]string{"accept": "application/json"},
}

var variable1 = cacao.Variable{
Type: "string",
Name: "test request building",
Value: "",
}

var executionId, _ = uuid.Parse("6ba7b810-9dad-11d1-80b4-00c04fd430c8")
var playbookId, _ = uuid.Parse("d09351a2-a075-40c8-8054-0b7c423db83f")
var stepId, _ = uuid.Parse("81eff59f-d084-4324-9e0a-59e353dbd28f")
metadata := execution.Metadata{ExecutionId: executionId, PlaybookId: playbookId.String(), StepId: stepId.String()}
empty_auth := new(cacao.AuthenticationInformation)

httpOptions := http_request.HttpOptions{
Command: &command,
Target: &target,
Auth: empty_auth,
}

payload := "payload test"
payload_byte := []byte(payload)
mock_http_request.On("Request", httpOptions).Return(payload_byte, nil)

results, err := httpCapability.Execute(
metadata,
command,
*empty_auth,
target,
cacao.VariableMap{"test": variable1})
if err != nil {
fmt.Println(err)
t.Fail()
}
assert.Equal(t, results["__soarca_http_result__"].Value, payload)
fmt.Println(results)

mock_http_request.AssertExpectations(t)
}

func TestHTTPOptionsEmptyCommand(t *testing.T) {
mock_http_request := &mock_request.MockHttpRequest{}
httpCapability := http.New(mock_http_request)

target := cacao.AgentTarget{HttpUrl: "https://httpbin.org/post"}
empty_command := new(cacao.Command)

var oauth2_info = cacao.AuthenticationInformation{
ID: "6ba7b810-9dad-11d1-80b4-00c04fd430c9",
Type: "oauth2",
Token: "this-is-a-test",
}

var variable1 = cacao.Variable{
Type: "string",
Name: "test request building",
Value: "",
}

var executionId, _ = uuid.Parse("6ba7b810-9dad-11d1-80b4-00c04fd430c8")
var playbookId, _ = uuid.Parse("d09351a2-a075-40c8-8054-0b7c423db83f")
var stepId, _ = uuid.Parse("81eff59f-d084-4324-9e0a-59e353dbd28f")
metadata := execution.Metadata{ExecutionId: executionId, PlaybookId: playbookId.String(), StepId: stepId.String()}

httpOptions := http_request.HttpOptions{
Command: empty_command,
Target: &target,
Auth: &oauth2_info,
}

expected_error := errors.New("command pointer is empty")
mock_http_request.On("Request", httpOptions).Return([]byte{}, expected_error)

results, err := httpCapability.Execute(
metadata,
*empty_command,
oauth2_info,
target,
cacao.VariableMap{"test": variable1})
if err == nil {
fmt.Println(err)
t.Fail()
}
assert.Equal(t, err, expected_error)
fmt.Println(results)

mock_http_request.AssertExpectations(t)
}

0 comments on commit d70123b

Please sign in to comment.