mirror of
https://git.rwth-aachen.de/acs/public/villas/web-backend-go/
synced 2025-03-30 00:00:12 +01:00
fix IC and register tests
This commit is contained in:
parent
6a23b6d8c3
commit
ae4436be6d
3 changed files with 153 additions and 120 deletions
|
@ -304,6 +304,10 @@ func processMessage(message amqp.Delivery) error {
|
|||
|
||||
func createExternalIC(payload ICUpdate, ICUUID string) error {
|
||||
|
||||
if payload.Properties == nil {
|
||||
return fmt.Errorf("AMQP: Cannot create new IC, Propertie field missing")
|
||||
}
|
||||
|
||||
var newICReq AddICRequest
|
||||
newICReq.InfrastructureComponent.UUID = ICUUID
|
||||
if payload.Properties.Name == nil ||
|
||||
|
@ -317,15 +321,21 @@ func createExternalIC(payload ICUpdate, ICUUID string) error {
|
|||
newICReq.InfrastructureComponent.Type = *payload.Properties.Type
|
||||
|
||||
// add optional params
|
||||
if payload.Status.State != nil {
|
||||
newICReq.InfrastructureComponent.State = *payload.Status.State
|
||||
} else {
|
||||
newICReq.InfrastructureComponent.State = "unknown"
|
||||
}
|
||||
if newICReq.InfrastructureComponent.State == "gone" {
|
||||
// Check if state is "gone" and abort creation of IC in this case
|
||||
log.Println("AMQP: Aborting creation of IC with state gone")
|
||||
return nil
|
||||
if payload.Status != nil {
|
||||
if payload.Status.State != nil {
|
||||
newICReq.InfrastructureComponent.State = *payload.Status.State
|
||||
} else {
|
||||
newICReq.InfrastructureComponent.State = "unknown"
|
||||
}
|
||||
if newICReq.InfrastructureComponent.State == "gone" {
|
||||
// Check if state is "gone" and abort creation of IC in this case
|
||||
log.Println("AMQP: Aborting creation of IC with state gone")
|
||||
return nil
|
||||
}
|
||||
|
||||
if payload.Status.Uptime != nil {
|
||||
newICReq.InfrastructureComponent.Uptime = *payload.Status.Uptime
|
||||
}
|
||||
}
|
||||
|
||||
if payload.Properties.WS_url != nil {
|
||||
|
@ -340,9 +350,7 @@ func createExternalIC(payload ICUpdate, ICUUID string) error {
|
|||
if payload.Properties.Description != nil {
|
||||
newICReq.InfrastructureComponent.Description = *payload.Properties.Description
|
||||
}
|
||||
if payload.Status.Uptime != nil {
|
||||
newICReq.InfrastructureComponent.Uptime = *payload.Status.Uptime
|
||||
}
|
||||
|
||||
// TODO add JSON start parameter scheme
|
||||
|
||||
// set managed externally to true because this IC is created via AMQP
|
||||
|
@ -380,47 +388,51 @@ func createExternalIC(payload ICUpdate, ICUUID string) error {
|
|||
func (s *InfrastructureComponent) updateExternalIC(payload ICUpdate) error {
|
||||
|
||||
var updatedICReq UpdateICRequest
|
||||
if payload.Status.State != nil {
|
||||
updatedICReq.InfrastructureComponent.State = *payload.Status.State
|
||||
|
||||
if *payload.Status.State == "gone" {
|
||||
// remove IC from DB
|
||||
log.Println("AMQP: Deleting IC with state gone")
|
||||
err := s.delete(true)
|
||||
if err != nil {
|
||||
// if component could not be deleted there are still configurations using it in the DB
|
||||
// continue with the update to save the new state of the component and get back to the deletion later
|
||||
log.Println("AMQP: Deletion of IC postponed (config(s) associated to it)")
|
||||
if payload.Status != nil {
|
||||
if payload.Status.State != nil {
|
||||
updatedICReq.InfrastructureComponent.State = *payload.Status.State
|
||||
|
||||
if *payload.Status.State == "gone" {
|
||||
// remove IC from DB
|
||||
log.Println("AMQP: Deleting IC with state gone")
|
||||
err := s.delete(true)
|
||||
if err != nil {
|
||||
// if component could not be deleted there are still configurations using it in the DB
|
||||
// continue with the update to save the new state of the component and get back to the deletion later
|
||||
log.Println("AMQP: Deletion of IC postponed (config(s) associated to it)")
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if payload.Status.Uptime != nil {
|
||||
updatedICReq.InfrastructureComponent.Uptime = *payload.Status.Uptime
|
||||
}
|
||||
}
|
||||
|
||||
if payload.Status.Uptime != nil {
|
||||
updatedICReq.InfrastructureComponent.Uptime = *payload.Status.Uptime
|
||||
}
|
||||
|
||||
if payload.Properties.Type != nil {
|
||||
updatedICReq.InfrastructureComponent.Type = *payload.Properties.Type
|
||||
}
|
||||
if payload.Properties.Category != nil {
|
||||
updatedICReq.InfrastructureComponent.Category = *payload.Properties.Category
|
||||
}
|
||||
if payload.Properties.Name != nil {
|
||||
updatedICReq.InfrastructureComponent.Name = *payload.Properties.Name
|
||||
}
|
||||
if payload.Properties.WS_url != nil {
|
||||
updatedICReq.InfrastructureComponent.WebsocketURL = *payload.Properties.WS_url
|
||||
}
|
||||
if payload.Properties.API_url != nil {
|
||||
updatedICReq.InfrastructureComponent.APIURL = *payload.Properties.API_url
|
||||
}
|
||||
if payload.Properties.Location != nil {
|
||||
//postgres.Jsonb{json.RawMessage(`{"location" : " ` + *payload.Status.Location + `"}`)}
|
||||
updatedICReq.InfrastructureComponent.Location = *payload.Properties.Location
|
||||
}
|
||||
if payload.Properties.Description != nil {
|
||||
updatedICReq.InfrastructureComponent.Description = *payload.Properties.Description
|
||||
if payload.Properties != nil {
|
||||
if payload.Properties.Type != nil {
|
||||
updatedICReq.InfrastructureComponent.Type = *payload.Properties.Type
|
||||
}
|
||||
if payload.Properties.Category != nil {
|
||||
updatedICReq.InfrastructureComponent.Category = *payload.Properties.Category
|
||||
}
|
||||
if payload.Properties.Name != nil {
|
||||
updatedICReq.InfrastructureComponent.Name = *payload.Properties.Name
|
||||
}
|
||||
if payload.Properties.WS_url != nil {
|
||||
updatedICReq.InfrastructureComponent.WebsocketURL = *payload.Properties.WS_url
|
||||
}
|
||||
if payload.Properties.API_url != nil {
|
||||
updatedICReq.InfrastructureComponent.APIURL = *payload.Properties.API_url
|
||||
}
|
||||
if payload.Properties.Location != nil {
|
||||
updatedICReq.InfrastructureComponent.Location = *payload.Properties.Location
|
||||
}
|
||||
if payload.Properties.Description != nil {
|
||||
updatedICReq.InfrastructureComponent.Description = *payload.Properties.Description
|
||||
}
|
||||
}
|
||||
|
||||
// set raw status update if IC
|
||||
|
|
|
@ -24,6 +24,8 @@ package infrastructure_component
|
|||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/streadway/amqp"
|
||||
"log"
|
||||
"os"
|
||||
"testing"
|
||||
"time"
|
||||
|
@ -32,7 +34,6 @@ import (
|
|||
component_configuration "git.rwth-aachen.de/acs/public/villas/web-backend-go/routes/component-configuration"
|
||||
"git.rwth-aachen.de/acs/public/villas/web-backend-go/routes/scenario"
|
||||
"github.com/jinzhu/gorm/dialects/postgres"
|
||||
"github.com/streadway/amqp"
|
||||
"github.com/stretchr/testify/assert"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
|
@ -141,6 +142,27 @@ func TestMain(m *testing.M) {
|
|||
// that can be associated with a new component configuration
|
||||
scenario.RegisterScenarioEndpoints(api.Group("/scenarios"))
|
||||
|
||||
// check AMQP connection
|
||||
err = CheckConnection()
|
||||
if err.Error() != "connection is nil" {
|
||||
return
|
||||
}
|
||||
|
||||
// connect AMQP client
|
||||
// Make sure that AMQP_HOST, AMQP_USER, AMQP_PASS are set
|
||||
host, err := configuration.GlobalConfig.String("amqp.host")
|
||||
usr, err := configuration.GlobalConfig.String("amqp.user")
|
||||
pass, err := configuration.GlobalConfig.String("amqp.pass")
|
||||
amqpURI := "amqp://" + usr + ":" + pass + "@" + host
|
||||
|
||||
// AMQP Connection startup is tested here
|
||||
// Not repeated in other tests because it is only needed once
|
||||
err = StartAMQP(amqpURI, api)
|
||||
if err != nil {
|
||||
log.Println("unable to connect to AMQP")
|
||||
return
|
||||
}
|
||||
|
||||
os.Exit(m.Run())
|
||||
}
|
||||
|
||||
|
@ -149,22 +171,6 @@ func TestAddICAsAdmin(t *testing.T) {
|
|||
database.MigrateModels()
|
||||
assert.NoError(t, helper.AddTestUsers())
|
||||
|
||||
// check AMQP connection
|
||||
err := CheckConnection()
|
||||
assert.Errorf(t, err, "connection is nil")
|
||||
|
||||
// connect AMQP client
|
||||
// Make sure that AMQP_HOST, AMQP_USER, AMQP_PASS are set
|
||||
host, err := configuration.GlobalConfig.String("amqp.host")
|
||||
user, err := configuration.GlobalConfig.String("amqp.user")
|
||||
pass, err := configuration.GlobalConfig.String("amqp.pass")
|
||||
amqpURI := "amqp://" + user + ":" + pass + "@" + host
|
||||
|
||||
// AMQP Connection startup is tested here
|
||||
// Not repeated in other tests because it is only needed once
|
||||
err = StartAMQP(amqpURI, api)
|
||||
assert.NoError(t, err)
|
||||
|
||||
// authenticate as admin
|
||||
token, err := helper.AuthenticateForTest(router,
|
||||
"/api/authenticate", "POST", helper.AdminCredentials)
|
||||
|
@ -228,6 +234,9 @@ func TestAddICAsAdmin(t *testing.T) {
|
|||
// Compare POST's response with the newExternalIC
|
||||
err = helper.CompareResponse(resp, helper.KeyModels{"ic": newIC2})
|
||||
assert.NoError(t, err)
|
||||
|
||||
// wait to have async operation be completed
|
||||
time.Sleep(waitingTime * time.Second)
|
||||
}
|
||||
|
||||
func TestAddICAsUser(t *testing.T) {
|
||||
|
@ -243,6 +252,7 @@ func TestAddICAsUser(t *testing.T) {
|
|||
// test POST ic/ $newIC
|
||||
// This should fail with unprocessable entity 422 error code
|
||||
// Normal users are not allowed to add ICs
|
||||
newIC1.ManagedExternally = newFalse()
|
||||
code, resp, err := helper.TestEndpoint(router, token,
|
||||
"/api/ic", "POST", helper.KeyModels{"ic": newIC1})
|
||||
assert.NoError(t, err)
|
||||
|
@ -305,14 +315,15 @@ func TestUpdateICAsAdmin(t *testing.T) {
|
|||
// fake an IC update (create) message
|
||||
var update ICUpdate
|
||||
update.Status = new(ICStatus)
|
||||
update.Properties = new(ICProperties)
|
||||
update.Status.State = new(string)
|
||||
*update.Status.State = "idle"
|
||||
update.Status.Name = new(string)
|
||||
*update.Status.Name = newIC2.Name
|
||||
update.Status.Category = new(string)
|
||||
*update.Status.Category = newIC2.Category
|
||||
update.Status.Type = new(string)
|
||||
*update.Status.Type = newIC2.Type
|
||||
update.Properties.Name = new(string)
|
||||
*update.Properties.Name = newIC2.Name
|
||||
update.Properties.Category = new(string)
|
||||
*update.Properties.Category = newIC2.Category
|
||||
update.Properties.Type = new(string)
|
||||
*update.Properties.Type = newIC2.Type
|
||||
|
||||
payload, err := json.Marshal(update)
|
||||
assert.NoError(t, err)
|
||||
|
@ -435,14 +446,15 @@ func TestDeleteICAsAdmin(t *testing.T) {
|
|||
// fake an IC update (create) message
|
||||
var update ICUpdate
|
||||
update.Status = new(ICStatus)
|
||||
update.Properties = new(ICProperties)
|
||||
update.Status.State = new(string)
|
||||
*update.Status.State = "idle"
|
||||
update.Status.Name = new(string)
|
||||
*update.Status.Name = newIC2.Name
|
||||
update.Status.Category = new(string)
|
||||
*update.Status.Category = newIC2.Category
|
||||
update.Status.Type = new(string)
|
||||
*update.Status.Type = newIC2.Type
|
||||
update.Properties.Name = new(string)
|
||||
*update.Properties.Name = newIC2.Name
|
||||
update.Properties.Category = new(string)
|
||||
*update.Properties.Category = newIC2.Category
|
||||
update.Properties.Type = new(string)
|
||||
*update.Properties.Type = newIC2.Type
|
||||
|
||||
payload, err := json.Marshal(update)
|
||||
assert.NoError(t, err)
|
||||
|
@ -676,6 +688,7 @@ func TestCreateUpdateViaAMQPRecv(t *testing.T) {
|
|||
// fake an IC update message
|
||||
var update ICUpdate
|
||||
update.Status = new(ICStatus)
|
||||
update.Properties = new(ICProperties)
|
||||
update.Status.State = new(string)
|
||||
*update.Status.State = "idle"
|
||||
|
||||
|
@ -715,22 +728,22 @@ func TestCreateUpdateViaAMQPRecv(t *testing.T) {
|
|||
assert.Equal(t, 0, number)
|
||||
|
||||
// complete the (required) data of an IC
|
||||
update.Status.Name = new(string)
|
||||
*update.Status.Name = newIC1.Name
|
||||
update.Status.Category = new(string)
|
||||
*update.Status.Category = newIC1.Category
|
||||
update.Status.Type = new(string)
|
||||
*update.Status.Type = newIC1.Type
|
||||
update.Properties.Name = new(string)
|
||||
*update.Properties.Name = newIC1.Name
|
||||
update.Properties.Category = new(string)
|
||||
*update.Properties.Category = newIC1.Category
|
||||
update.Properties.Type = new(string)
|
||||
*update.Properties.Type = newIC1.Type
|
||||
update.Status.Uptime = new(float64)
|
||||
*update.Status.Uptime = -1.0
|
||||
update.Status.WS_url = new(string)
|
||||
*update.Status.WS_url = newIC1.WebsocketURL
|
||||
update.Status.API_url = new(string)
|
||||
*update.Status.API_url = newIC1.APIURL
|
||||
update.Status.Description = new(string)
|
||||
*update.Status.Description = newIC1.Description
|
||||
update.Status.Location = new(string)
|
||||
*update.Status.Location = newIC1.Location
|
||||
update.Properties.WS_url = new(string)
|
||||
*update.Properties.WS_url = newIC1.WebsocketURL
|
||||
update.Properties.API_url = new(string)
|
||||
*update.Properties.API_url = newIC1.APIURL
|
||||
update.Properties.Description = new(string)
|
||||
*update.Properties.Description = newIC1.Description
|
||||
update.Properties.Location = new(string)
|
||||
*update.Properties.Location = newIC1.Location
|
||||
|
||||
payload, err = json.Marshal(update)
|
||||
assert.NoError(t, err)
|
||||
|
@ -765,7 +778,7 @@ func TestCreateUpdateViaAMQPRecv(t *testing.T) {
|
|||
assert.Equal(t, 1, number)
|
||||
|
||||
// modify status update
|
||||
*update.Status.Name = "This is the new name"
|
||||
*update.Properties.Name = "This is the new name"
|
||||
payload, err = json.Marshal(update)
|
||||
assert.NoError(t, err)
|
||||
|
||||
|
@ -809,26 +822,26 @@ func TestDeleteICViaAMQPRecv(t *testing.T) {
|
|||
// fake an IC update message
|
||||
var update ICUpdate
|
||||
update.Status = new(ICStatus)
|
||||
|
||||
update.Properties = new(ICProperties)
|
||||
update.Status.State = new(string)
|
||||
*update.Status.State = "idle"
|
||||
// complete the (required) data of an IC
|
||||
update.Status.Name = new(string)
|
||||
*update.Status.Name = newIC1.Name
|
||||
update.Status.Category = new(string)
|
||||
*update.Status.Category = newIC1.Category
|
||||
update.Status.Type = new(string)
|
||||
*update.Status.Type = newIC1.Type
|
||||
update.Properties.Name = new(string)
|
||||
*update.Properties.Name = newIC1.Name
|
||||
update.Properties.Category = new(string)
|
||||
*update.Properties.Category = newIC1.Category
|
||||
update.Properties.Type = new(string)
|
||||
*update.Properties.Type = newIC1.Type
|
||||
update.Status.Uptime = new(float64)
|
||||
*update.Status.Uptime = -1.0
|
||||
update.Status.WS_url = new(string)
|
||||
*update.Status.WS_url = newIC1.WebsocketURL
|
||||
update.Status.API_url = new(string)
|
||||
*update.Status.API_url = newIC1.APIURL
|
||||
update.Status.Description = new(string)
|
||||
*update.Status.Description = newIC1.Description
|
||||
update.Status.Location = new(string)
|
||||
*update.Status.Location = newIC1.Location
|
||||
update.Properties.WS_url = new(string)
|
||||
*update.Properties.WS_url = newIC1.WebsocketURL
|
||||
update.Properties.API_url = new(string)
|
||||
*update.Properties.API_url = newIC1.APIURL
|
||||
update.Properties.Description = new(string)
|
||||
*update.Properties.Description = newIC1.Description
|
||||
update.Properties.Location = new(string)
|
||||
*update.Properties.Location = newIC1.Location
|
||||
|
||||
payload, err := json.Marshal(update)
|
||||
assert.NoError(t, err)
|
||||
|
|
|
@ -23,17 +23,18 @@
|
|||
package routes
|
||||
|
||||
import (
|
||||
infrastructure_component "git.rwth-aachen.de/acs/public/villas/web-backend-go/routes/infrastructure-component"
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"git.rwth-aachen.de/acs/public/villas/web-backend-go/configuration"
|
||||
"git.rwth-aachen.de/acs/public/villas/web-backend-go/database"
|
||||
infrastructure_component "git.rwth-aachen.de/acs/public/villas/web-backend-go/routes/infrastructure-component"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
var router *gin.Engine
|
||||
var api *gin.RouterGroup
|
||||
|
||||
func TestMain(m *testing.M) {
|
||||
err := configuration.InitConfig()
|
||||
|
@ -49,35 +50,42 @@ func TestMain(m *testing.M) {
|
|||
|
||||
router = gin.Default()
|
||||
|
||||
// connect AMQP client (make sure that AMQP_HOST, AMQP_USER, AMQP_PASS are set via command line parameters)
|
||||
basePath, _ := configuration.GlobalConfig.String("base.path")
|
||||
api = router.Group(basePath)
|
||||
os.Exit(m.Run())
|
||||
}
|
||||
|
||||
/*
|
||||
* The order of test functions is important here
|
||||
* 1. Start and connect AMQP
|
||||
* 2. Register endpoints
|
||||
* 3. Add test data
|
||||
*/
|
||||
|
||||
func TestStartAMQP(t *testing.T) {
|
||||
// connect AMQP client
|
||||
// Make sure that AMQP_HOST, AMQP_USER, AMQP_PASS are set
|
||||
host, err := configuration.GlobalConfig.String("amqp.host")
|
||||
user, err := configuration.GlobalConfig.String("amqp.user")
|
||||
pass, err := configuration.GlobalConfig.String("amqp.pass")
|
||||
|
||||
amqpURI := "amqp://" + user + ":" + pass + "@" + host
|
||||
|
||||
err = infrastructure_component.ConnectAMQP(amqpURI)
|
||||
|
||||
os.Exit(m.Run())
|
||||
// AMQP Connection startup is tested here
|
||||
// Not repeated in other tests because it is only needed once
|
||||
err = infrastructure_component.StartAMQP(amqpURI, api)
|
||||
assert.NoError(t, err)
|
||||
}
|
||||
|
||||
func TestRegisterEndpoints(t *testing.T) {
|
||||
database.DropTables()
|
||||
database.MigrateModels()
|
||||
|
||||
basePath, err := configuration.GlobalConfig.String("base.path")
|
||||
assert.NoError(t, err)
|
||||
api := router.Group(basePath)
|
||||
RegisterEndpoints(router, api)
|
||||
}
|
||||
|
||||
func TestAddTestData(t *testing.T) {
|
||||
err := configuration.InitConfig()
|
||||
if err != nil {
|
||||
panic(t)
|
||||
}
|
||||
|
||||
err = ReadTestDataFromJson("../database/testdata.json")
|
||||
err := ReadTestDataFromJson("../database/testdata.json")
|
||||
assert.NoError(t, err)
|
||||
|
||||
resp, err := AddTestData(configuration.GlobalConfig, router)
|
||||
|
|
Loading…
Add table
Reference in a new issue