2023-02-26 18:04:05 +01:00
|
|
|
package plugins
|
2022-12-16 23:02:16 +01:00
|
|
|
|
|
|
|
import (
|
|
|
|
"github.com/go-resty/resty/v2"
|
|
|
|
"github.com/jarcoal/httpmock"
|
2024-06-23 10:55:06 +02:00
|
|
|
"github.com/mariocandela/beelzebub/v3/tracer"
|
2022-12-16 23:02:16 +01:00
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
"net/http"
|
|
|
|
"testing"
|
|
|
|
)
|
|
|
|
|
2024-06-23 10:55:06 +02:00
|
|
|
const SystemPromptLen = 4
|
|
|
|
|
2022-12-16 23:02:16 +01:00
|
|
|
func TestBuildPromptEmptyHistory(t *testing.T) {
|
|
|
|
//Given
|
2024-06-23 10:55:06 +02:00
|
|
|
var histories []Message
|
2022-12-16 23:02:16 +01:00
|
|
|
command := "pwd"
|
|
|
|
|
|
|
|
//When
|
2024-06-23 10:55:06 +02:00
|
|
|
prompt, err := buildPrompt(histories, tracer.SSH, command)
|
2022-12-16 23:02:16 +01:00
|
|
|
|
|
|
|
//Then
|
2024-06-23 10:55:06 +02:00
|
|
|
assert.Nil(t, err)
|
|
|
|
assert.Equal(t, SystemPromptLen, len(prompt))
|
2022-12-16 23:02:16 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestBuildPromptWithHistory(t *testing.T) {
|
|
|
|
//Given
|
2024-06-23 10:55:06 +02:00
|
|
|
var histories = []Message{
|
2022-12-16 23:02:16 +01:00
|
|
|
{
|
2024-06-23 10:55:06 +02:00
|
|
|
Role: "cat hello.txt",
|
|
|
|
Content: "world",
|
2022-12-16 23:02:16 +01:00
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
command := "pwd"
|
|
|
|
|
|
|
|
//When
|
2024-06-23 10:55:06 +02:00
|
|
|
prompt, err := buildPrompt(histories, tracer.SSH, command)
|
2022-12-16 23:02:16 +01:00
|
|
|
|
|
|
|
//Then
|
2024-06-23 10:55:06 +02:00
|
|
|
assert.Nil(t, err)
|
|
|
|
assert.Equal(t, SystemPromptLen+1, len(prompt))
|
2022-12-16 23:02:16 +01:00
|
|
|
}
|
|
|
|
|
2023-10-09 01:16:53 +02:00
|
|
|
func TestBuildGetCompletionsFailValidation(t *testing.T) {
|
2024-06-23 10:55:06 +02:00
|
|
|
openAIGPTVirtualTerminal := Init(make([]Message, 0), "", tracer.SSH)
|
2023-10-09 01:16:53 +02:00
|
|
|
|
|
|
|
_, err := openAIGPTVirtualTerminal.GetCompletions("test")
|
|
|
|
|
|
|
|
assert.Equal(t, "openAIKey is empty", err.Error())
|
|
|
|
}
|
|
|
|
|
2024-06-23 10:55:06 +02:00
|
|
|
func TestBuildGetCompletionsFailValidationStrategyType(t *testing.T) {
|
|
|
|
openAIGPTVirtualTerminal := Init(make([]Message, 0), "", tracer.TCP)
|
|
|
|
|
|
|
|
_, err := openAIGPTVirtualTerminal.GetCompletions("test")
|
|
|
|
|
|
|
|
assert.Equal(t, "no prompt for protocol selected", err.Error())
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestBuildGetCompletionsSSHWithResults(t *testing.T) {
|
2022-12-16 23:02:16 +01:00
|
|
|
client := resty.New()
|
|
|
|
httpmock.ActivateNonDefault(client.GetClient())
|
|
|
|
defer httpmock.DeactivateAndReset()
|
|
|
|
|
|
|
|
// Given
|
|
|
|
httpmock.RegisterResponder("POST", openAIGPTEndpoint,
|
|
|
|
func(req *http.Request) (*http.Response, error) {
|
|
|
|
resp, err := httpmock.NewJsonResponse(200, &gptResponse{
|
|
|
|
Choices: []Choice{
|
|
|
|
{
|
2024-06-23 10:55:06 +02:00
|
|
|
Message: Message{
|
|
|
|
Role: SYSTEM.String(),
|
|
|
|
Content: "prova.txt",
|
|
|
|
},
|
2022-12-16 23:02:16 +01:00
|
|
|
},
|
|
|
|
},
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
return httpmock.NewStringResponse(500, ""), nil
|
|
|
|
}
|
|
|
|
return resp, nil
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
2024-06-23 10:55:06 +02:00
|
|
|
openAIGPTVirtualTerminal := Init(make([]Message, 0), "sdjdnklfjndslkjanfk", tracer.SSH)
|
2023-10-09 01:16:53 +02:00
|
|
|
openAIGPTVirtualTerminal.client = client
|
2022-12-16 23:02:16 +01:00
|
|
|
|
|
|
|
//When
|
|
|
|
str, err := openAIGPTVirtualTerminal.GetCompletions("ls")
|
|
|
|
|
|
|
|
//Then
|
|
|
|
assert.Nil(t, err)
|
|
|
|
assert.Equal(t, "prova.txt", str)
|
|
|
|
}
|
2023-10-09 01:16:53 +02:00
|
|
|
|
2024-06-23 10:55:06 +02:00
|
|
|
func TestBuildGetCompletionsSSHWithoutResults(t *testing.T) {
|
2023-10-09 01:16:53 +02:00
|
|
|
client := resty.New()
|
|
|
|
httpmock.ActivateNonDefault(client.GetClient())
|
|
|
|
defer httpmock.DeactivateAndReset()
|
|
|
|
|
|
|
|
// Given
|
|
|
|
httpmock.RegisterResponder("POST", openAIGPTEndpoint,
|
|
|
|
func(req *http.Request) (*http.Response, error) {
|
|
|
|
resp, err := httpmock.NewJsonResponse(200, &gptResponse{
|
|
|
|
Choices: []Choice{},
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
return httpmock.NewStringResponse(500, ""), nil
|
|
|
|
}
|
|
|
|
return resp, nil
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
2024-06-23 10:55:06 +02:00
|
|
|
openAIGPTVirtualTerminal := Init(make([]Message, 0), "sdjdnklfjndslkjanfk", tracer.SSH)
|
2023-10-09 01:16:53 +02:00
|
|
|
openAIGPTVirtualTerminal.client = client
|
|
|
|
|
|
|
|
//When
|
|
|
|
_, err := openAIGPTVirtualTerminal.GetCompletions("ls")
|
|
|
|
|
|
|
|
//Then
|
|
|
|
assert.Equal(t, "no choices", err.Error())
|
|
|
|
}
|
2024-06-23 10:55:06 +02:00
|
|
|
|
|
|
|
func TestBuildGetCompletionsHTTPWithResults(t *testing.T) {
|
|
|
|
client := resty.New()
|
|
|
|
httpmock.ActivateNonDefault(client.GetClient())
|
|
|
|
defer httpmock.DeactivateAndReset()
|
|
|
|
|
|
|
|
// Given
|
|
|
|
httpmock.RegisterResponder("POST", openAIGPTEndpoint,
|
|
|
|
func(req *http.Request) (*http.Response, error) {
|
|
|
|
resp, err := httpmock.NewJsonResponse(200, &gptResponse{
|
|
|
|
Choices: []Choice{
|
|
|
|
{
|
|
|
|
Message: Message{
|
|
|
|
Role: SYSTEM.String(),
|
|
|
|
Content: "[default]\nregion = us-west-2\noutput = json",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
return httpmock.NewStringResponse(500, ""), nil
|
|
|
|
}
|
|
|
|
return resp, nil
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
openAIGPTVirtualTerminal := Init(make([]Message, 0), "sdjdnklfjndslkjanfk", tracer.HTTP)
|
|
|
|
openAIGPTVirtualTerminal.client = client
|
|
|
|
|
|
|
|
//When
|
|
|
|
str, err := openAIGPTVirtualTerminal.GetCompletions("GET /.aws/credentials")
|
|
|
|
|
|
|
|
//Then
|
|
|
|
assert.Nil(t, err)
|
|
|
|
assert.Equal(t, "[default]\nregion = us-west-2\noutput = json", str)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestBuildGetCompletionsHTTPWithoutResults(t *testing.T) {
|
|
|
|
client := resty.New()
|
|
|
|
httpmock.ActivateNonDefault(client.GetClient())
|
|
|
|
defer httpmock.DeactivateAndReset()
|
|
|
|
|
|
|
|
// Given
|
|
|
|
httpmock.RegisterResponder("POST", openAIGPTEndpoint,
|
|
|
|
func(req *http.Request) (*http.Response, error) {
|
|
|
|
resp, err := httpmock.NewJsonResponse(200, &gptResponse{
|
|
|
|
Choices: []Choice{},
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
return httpmock.NewStringResponse(500, ""), nil
|
|
|
|
}
|
|
|
|
return resp, nil
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
openAIGPTVirtualTerminal := Init(make([]Message, 0), "sdjdnklfjndslkjanfk", tracer.HTTP)
|
|
|
|
openAIGPTVirtualTerminal.client = client
|
|
|
|
|
|
|
|
//When
|
|
|
|
_, err := openAIGPTVirtualTerminal.GetCompletions("GET /.aws/credentials")
|
|
|
|
|
|
|
|
//Then
|
|
|
|
assert.Equal(t, "no choices", err.Error())
|
|
|
|
}
|