225 lines
7.4 KiB
Go
225 lines
7.4 KiB
Go
package handlers_test
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/pkg/errors"
|
|
|
|
"github.com/fiskerinc/cloud-services/services/attendant/handlers"
|
|
"github.com/fiskerinc/cloud-services/services/attendant/services"
|
|
|
|
"github.com/fiskerinc/cloud-services/pkg/common"
|
|
q "github.com/fiskerinc/cloud-services/pkg/db/queries"
|
|
"github.com/fiskerinc/cloud-services/pkg/db/queries/mocks"
|
|
"github.com/fiskerinc/cloud-services/pkg/grpc/sms"
|
|
"github.com/fiskerinc/cloud-services/pkg/redis/tester"
|
|
vconfig "github.com/fiskerinc/cloud-services/pkg/vehicleconfig"
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
var (
|
|
someErr = errors.New("some error")
|
|
vinMock = "FISKER123"
|
|
vodMock = "11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
|
|
confMock = "000000000000000000000000000000000000000"
|
|
validOrder = common.VehicleOrder{
|
|
SpecID: 800010200,
|
|
OrderNumber: 8000102,
|
|
MessageIdentifier: "VEHICLEORDERSUBMISSION",
|
|
VehicleSpecification: common.VehicleSpecification{
|
|
OrderIndicator: "S",
|
|
FleetOrderIndicator: "N",
|
|
ProductionPhaseIndicator: "01",
|
|
VehicleIndicator: "000",
|
|
ManufacturingPlant: "G",
|
|
ExpectedReferenceDate: common.ExpectedReferenceDate{
|
|
Time: time.Date(2022, 5, 26, 0, 0, 0, 0, time.UTC),
|
|
},
|
|
ModelType: "FM29",
|
|
ModelYearIndicator: 2023,
|
|
VehicleModel: "F29",
|
|
VinPrefix: "VCF1ZBU2_PG",
|
|
VehicleFeatures: []common.FeatureCodes{
|
|
{
|
|
FamilyCode: "2801",
|
|
FeatureCode: "280102",
|
|
},
|
|
{
|
|
FamilyCode: "2804",
|
|
FeatureCode: "280401",
|
|
},
|
|
{
|
|
FamilyCode: "2805",
|
|
FeatureCode: "280501",
|
|
},
|
|
},
|
|
},
|
|
}
|
|
validUpdateManifest = common.UpdateManifest{
|
|
ID: 1,
|
|
CarUpdateID: 1,
|
|
Version: fmt.Sprint(validOrder.OrderNumber),
|
|
Description: fmt.Sprintf("configuration %s %s", vinMock, validOrder.MessageIdentifier),
|
|
ManifestType: common.ConfigUpdateType,
|
|
VOD: "11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111",
|
|
}
|
|
validRespECUs = []*common.UpdateManifestECU{
|
|
{
|
|
UpdateManifestID: 1,
|
|
ECU: "ICC",
|
|
Configuration: confMock,
|
|
},
|
|
}
|
|
smsMock = sms.NewSMSMockSuccess()
|
|
mockCars = mocks.MockCars{}
|
|
)
|
|
|
|
func TestOrderUpdated(t *testing.T) {
|
|
handlers.ENABLE_ORDERUPDATE_SENDS = true
|
|
validUpdateManifestResp := validUpdateManifest
|
|
validUpdateManifestResp.ID = 1
|
|
validUpdateManifestResp.ECUs = validRespECUs
|
|
|
|
scrubbedValidUpdateManifest := validUpdateManifestResp.ToUpdateConfigManifest()
|
|
scrubbedValidUpdateManifest.Type = "standard"
|
|
|
|
successPayload, _ := json.Marshal(validOrder)
|
|
redisMock := tester.NewRedisMock()
|
|
services.SetRedisClientPool(tester.NewMockClientPool(redisMock))
|
|
mockSap := vconfig.SAPServiceMock{GetConfigurationMock: func(vin string) (common.SAPResponse, error) {
|
|
return common.SAPResponse{
|
|
ModelYear: 2023,
|
|
ModelType: "Ocean",
|
|
VersionDuringModelYear: "1",
|
|
Features: []common.SAPFeature{
|
|
{
|
|
FamilyCode: "FamilyCode1",
|
|
FeatureCode: "FeatureCode1",
|
|
},
|
|
{
|
|
FamilyCode: "FamilyCode2",
|
|
FeatureCode: "FeatureCode2",
|
|
},
|
|
{
|
|
FamilyCode: "VOD",
|
|
FeatureCode: vodMock,
|
|
},
|
|
}}, nil
|
|
}}
|
|
services.SetSapService(mockSap)
|
|
mockCars.SetLoadResp(&common.Car{
|
|
VIN: vinMock,
|
|
ICCID: "1234567890",
|
|
SoldStatus: common.CarSoldStatusRetailed,
|
|
})
|
|
|
|
tests := map[string]struct {
|
|
updateManifest q.UpdateManifestsInterface
|
|
cars q.CarsInterface
|
|
carsUpdate q.CarUpdatesInterface
|
|
ratePlan q.RatePlanInterface
|
|
vConfig vconfig.ConfigServiceInterface
|
|
payload []byte
|
|
expRedisMsgs map[string]interface{}
|
|
expErr error
|
|
}{
|
|
"success": {
|
|
updateManifest: &mocks.MockUpdateManifests{SelectResponse: []common.UpdateManifest{{ID: 1234}}},
|
|
cars: &mockCars,
|
|
carsUpdate: &mocks.MockCarUpdates{},
|
|
ratePlan: &mocks.MockRatePlan{},
|
|
vConfig: vconfig.ConfigMock{GetVODCDSCodingDataMock: SuccessGetCDSMock},
|
|
payload: successPayload,
|
|
expRedisMsgs: map[string]interface{}{
|
|
"2:" + vinMock: common.Message{
|
|
Handler: "car_update",
|
|
Data: common.CarUpdate{
|
|
ID: 1,
|
|
VIN: vinMock,
|
|
UpdateManifestID: 1,
|
|
UpdateManifest: &validUpdateManifestResp,
|
|
},
|
|
},
|
|
"1:" + vinMock: common.Message{
|
|
Handler: "config_update",
|
|
Data: scrubbedValidUpdateManifest,
|
|
},
|
|
},
|
|
expErr: nil,
|
|
},
|
|
"json_parse_err": {
|
|
payload: []byte(`12`),
|
|
expErr: errors.New("json: cannot unmarshal number into Go value of type common.VehicleOrder"),
|
|
},
|
|
"failed_cars_db": {
|
|
updateManifest: &mocks.MockUpdateManifests{SelectResponse: []common.UpdateManifest{{ID: 1234}}},
|
|
cars: &mocks.MockCars{
|
|
DBMockHelper: mocks.DBMockHelper{
|
|
Error: someErr,
|
|
},
|
|
},
|
|
carsUpdate: &mocks.MockCarUpdates{},
|
|
ratePlan: &mocks.MockRatePlan{},
|
|
vConfig: vconfig.ConfigMock{GetVODCDSCodingDataMock: SuccessGetCDSMock},
|
|
payload: successPayload,
|
|
expErr: someErr,
|
|
},
|
|
"failed_cds": {
|
|
updateManifest: &mocks.MockUpdateManifests{SelectResponse: []common.UpdateManifest{{ID: 1234}}},
|
|
carsUpdate: &mocks.MockCarUpdates{},
|
|
cars: &mockCars,
|
|
ratePlan: &mocks.MockRatePlan{},
|
|
vConfig: vconfig.ConfigMock{GetVODCDSCodingDataMock: FailedGetCDSMock},
|
|
payload: successPayload,
|
|
expErr: someErr,
|
|
},
|
|
"failed_db": {
|
|
updateManifest: &mocks.MockUpdateManifests{
|
|
DBMockHelper: mocks.DBMockHelper{
|
|
Error: someErr,
|
|
},
|
|
},
|
|
cars: &mockCars,
|
|
carsUpdate: &mocks.MockCarUpdates{},
|
|
ratePlan: &mocks.MockRatePlan{},
|
|
vConfig: vconfig.ConfigMock{GetVODCDSCodingDataMock: SuccessGetCDSMock},
|
|
payload: successPayload,
|
|
expErr: someErr,
|
|
},
|
|
}
|
|
|
|
for tname, tt := range tests {
|
|
t.Run(tname, func(t *testing.T) {
|
|
redisMock.Reset()
|
|
db := services.GetDB()
|
|
db.SetManifests(tt.updateManifest)
|
|
db.SetCars(tt.cars)
|
|
db.SetCarUpdates(tt.carsUpdate)
|
|
db.SetRatePlan(tt.ratePlan)
|
|
services.SetVehicleConfig(tt.vConfig)
|
|
err := handlers.OrderUpdated(db, &smsMock, vinMock, tt.payload)
|
|
if err != nil && tt.expErr != nil {
|
|
assert.Equal(t, tt.expErr.Error(), err.Error())
|
|
return
|
|
}
|
|
assert.Equal(t, tt.expErr, err)
|
|
// assert.Equal(t, tt.expRedisMsgs, redisMock.PublishedMessages)
|
|
})
|
|
}
|
|
}
|
|
|
|
func SuccessGetCDSMock(request common.VODCDSRequest) (map[string]string, error) {
|
|
ecus := map[string]string{
|
|
"VOD": vodMock,
|
|
"ICC": confMock,
|
|
}
|
|
|
|
return ecus, nil
|
|
}
|
|
func FailedGetCDSMock(request common.VODCDSRequest) (map[string]string, error) {
|
|
return nil, someErr
|
|
}
|