Files
poseidon/nomad/nomad_test.go
2021-05-18 12:10:39 +00:00

153 lines
4.5 KiB
Go

package nomad
import (
"errors"
nomadApi "github.com/hashicorp/nomad/api"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
"github.com/stretchr/testify/suite"
"net/url"
"testing"
)
func TestLoadRunnersTestSuite(t *testing.T) {
suite.Run(t, new(LoadRunnersTestSuite))
}
type LoadRunnersTestSuite struct {
suite.Suite
jobId string
mock *apiQuerierMock
nomadApiClient ApiClient
availableRunner *nomadApi.AllocationListStub
anotherAvailableRunner *nomadApi.AllocationListStub
stoppedRunner *nomadApi.AllocationListStub
stoppingRunner *nomadApi.AllocationListStub
}
func (suite *LoadRunnersTestSuite) SetupTest() {
suite.jobId = "1d-0f-v3ry-sp3c14l-j0b"
suite.mock = &apiQuerierMock{}
suite.nomadApiClient = ApiClient{apiQuerier: suite.mock}
suite.availableRunner = &nomadApi.AllocationListStub{
ID: "s0m3-r4nd0m-1d",
ClientStatus: nomadApi.AllocClientStatusRunning,
DesiredStatus: nomadApi.AllocDesiredStatusRun,
}
suite.anotherAvailableRunner = &nomadApi.AllocationListStub{
ID: "s0m3-s1m1l4r-1d",
ClientStatus: nomadApi.AllocClientStatusRunning,
DesiredStatus: nomadApi.AllocDesiredStatusRun,
}
suite.stoppedRunner = &nomadApi.AllocationListStub{
ID: "4n0th3r-1d",
ClientStatus: nomadApi.AllocClientStatusComplete,
DesiredStatus: nomadApi.AllocDesiredStatusRun,
}
suite.stoppingRunner = &nomadApi.AllocationListStub{
ID: "th1rd-1d",
ClientStatus: nomadApi.AllocClientStatusRunning,
DesiredStatus: nomadApi.AllocDesiredStatusStop,
}
}
func (suite *LoadRunnersTestSuite) TestErrorOfUnderlyingApiCallIsPropagated() {
errorString := "api errored"
suite.mock.On("loadRunners", mock.AnythingOfType("string")).
Return(nil, errors.New(errorString))
returnedIds, err := suite.nomadApiClient.LoadRunners(suite.jobId)
suite.Nil(returnedIds)
suite.Error(err)
}
func (suite *LoadRunnersTestSuite) TestThrowsNoErrorWhenUnderlyingApiCallDoesNot() {
suite.mock.On("loadRunners", mock.AnythingOfType("string")).
Return([]*nomadApi.AllocationListStub{}, nil)
_, err := suite.nomadApiClient.LoadRunners(suite.jobId)
suite.NoError(err)
}
func (suite *LoadRunnersTestSuite) TestAvailableRunnerIsReturned() {
suite.mock.On("loadRunners", mock.AnythingOfType("string")).
Return([]*nomadApi.AllocationListStub{suite.availableRunner}, nil)
returnedIds, _ := suite.nomadApiClient.LoadRunners(suite.jobId)
suite.Len(returnedIds, 1)
suite.Equal(suite.availableRunner.ID, returnedIds[0])
}
func (suite *LoadRunnersTestSuite) TestStoppedRunnerIsNotReturned() {
suite.mock.On("loadRunners", mock.AnythingOfType("string")).
Return([]*nomadApi.AllocationListStub{suite.stoppedRunner}, nil)
returnedIds, _ := suite.nomadApiClient.LoadRunners(suite.jobId)
suite.Empty(returnedIds)
}
func (suite *LoadRunnersTestSuite) TestStoppingRunnerIsNotReturned() {
suite.mock.On("loadRunners", mock.AnythingOfType("string")).
Return([]*nomadApi.AllocationListStub{suite.stoppingRunner}, nil)
returnedIds, _ := suite.nomadApiClient.LoadRunners(suite.jobId)
suite.Empty(returnedIds)
}
func (suite *LoadRunnersTestSuite) TestReturnsAllAvailableRunners() {
runnersList := []*nomadApi.AllocationListStub{
suite.availableRunner,
suite.anotherAvailableRunner,
suite.stoppedRunner,
suite.stoppingRunner,
}
suite.mock.On("loadRunners", mock.AnythingOfType("string")).
Return(runnersList, nil)
returnedIds, _ := suite.nomadApiClient.LoadRunners(suite.jobId)
suite.Len(returnedIds, 2)
suite.Contains(returnedIds, suite.availableRunner.ID)
suite.Contains(returnedIds, suite.anotherAvailableRunner.ID)
}
var (
TestURL = url.URL{
Scheme: "http",
Host: "127.0.0.1:4646",
}
)
const TestNamespace = "unit-tests"
func TestApiClient_init(t *testing.T) {
client := &ApiClient{apiQuerier: &nomadApiClient{}}
defaultJob := parseJob(defaultJobHCL)
err := client.init(&TestURL, TestNamespace)
require.Nil(t, err)
assert.Equal(t, *defaultJob, client.defaultJob)
}
func TestApiClientCanNotBeInitializedWithInvalidUrl(t *testing.T) {
client := &ApiClient{apiQuerier: &nomadApiClient{}}
err := client.init(&url.URL{
Scheme: "http",
Host: "http://127.0.0.1:4646",
}, TestNamespace)
assert.NotNil(t, err)
}
func TestNewExecutorApiCanBeCreatedWithoutError(t *testing.T) {
expectedClient := &ApiClient{apiQuerier: &nomadApiClient{}}
err := expectedClient.init(&TestURL, TestNamespace)
require.Nil(t, err)
_, err = NewExecutorApi(&TestURL, TestNamespace)
require.Nil(t, err)
}