mirror of
https://git.rwth-aachen.de/acs/public/villas/web-backend-go/
synced 2025-03-30 00:00:12 +01:00

# Conflicts: # helper/amqp.go # helper/test_utilities.go # routes/component-configuration/config_methods.go # routes/file/file_test.go # routes/infrastructure-component/ic_amqpmethods.go # routes/infrastructure-component/ic_apiquery.go # routes/infrastructure-component/ic_test.go # routes/register_test.go # routes/result/result_methods.go # routes/result/result_test.go # routes/scenario/scenario_middleware.go # routes/scenario/scenario_test.go # routes/signal/signal_test.go # routes/user/user_validators.go
794 lines
26 KiB
Go
794 lines
26 KiB
Go
/** InfrastructureComponent package, testing.
|
|
*
|
|
* @author Sonja Happ <sonja.happ@eonerc.rwth-aachen.de>
|
|
* @copyright 2014-2019, Institute for Automation of Complex Power Systems, EONERC
|
|
* @license GNU General Public License (version 3)
|
|
*
|
|
* VILLASweb-backend-go
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*********************************************************************************/
|
|
package infrastructure_component
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"os"
|
|
"testing"
|
|
"time"
|
|
|
|
"git.rwth-aachen.de/acs/public/villas/web-backend-go/helper"
|
|
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/stretchr/testify/assert"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
"git.rwth-aachen.de/acs/public/villas/web-backend-go/configuration"
|
|
"git.rwth-aachen.de/acs/public/villas/web-backend-go/database"
|
|
"git.rwth-aachen.de/acs/public/villas/web-backend-go/routes/user"
|
|
)
|
|
|
|
var router *gin.Engine
|
|
var api *gin.RouterGroup
|
|
var waitingTime time.Duration = 1
|
|
|
|
type ICRequest struct {
|
|
UUID string `json:"uuid,omitempty"`
|
|
WebsocketURL string `json:"websocketurl,omitempty"`
|
|
APIURL string `json:"apiurl,omitempty"`
|
|
Type string `json:"type,omitempty"`
|
|
Name string `json:"name,omitempty"`
|
|
Category string `json:"category,omitempty"`
|
|
State string `json:"state,omitempty"`
|
|
Location string `json:"location,omitempty"`
|
|
Description string `json:"description,omitempty"`
|
|
StartParameterSchema postgres.Jsonb `json:"startparameterschema,omitempty"`
|
|
CreateParameterSchema postgres.Jsonb `json:"createparameterschema,omitempty"`
|
|
ManagedExternally *bool `json:"managedexternally"`
|
|
Manager string `json:"manager,omitempty"`
|
|
}
|
|
|
|
type ScenarioRequest struct {
|
|
Name string `json:"name,omitempty"`
|
|
StartParameters postgres.Jsonb `json:"startParameters,omitempty"`
|
|
}
|
|
|
|
type ConfigRequest struct {
|
|
Name string `json:"name,omitempty"`
|
|
ScenarioID uint `json:"scenarioID,omitempty"`
|
|
ICID uint `json:"icID,omitempty"`
|
|
StartParameters postgres.Jsonb `json:"startParameters,omitempty"`
|
|
FileIDs []int64 `json:"fileIDs,omitempty"`
|
|
}
|
|
|
|
var newIC1 = ICRequest{
|
|
UUID: "7be0322d-354e-431e-84bd-ae4c9633138b",
|
|
WebsocketURL: "https://villas.k8s.eonerc.rwth-aachen.de/ws/ws_sig",
|
|
APIURL: "https://villas.k8s.eonerc.rwth-aachen.de/ws/api/v2",
|
|
Type: "villas-node",
|
|
Name: "ACS Demo Signals",
|
|
Category: "gateway",
|
|
State: "idle",
|
|
Location: "k8s",
|
|
Description: "A signal generator for testing purposes",
|
|
StartParameterSchema: postgres.Jsonb{RawMessage: json.RawMessage(`{"startprop1" : "a nice prop"}`)},
|
|
CreateParameterSchema: postgres.Jsonb{RawMessage: json.RawMessage(`{"createprop1" : "a really nice prop"}`)},
|
|
ManagedExternally: newFalse(),
|
|
Manager: "7be0322d-354e-431e-84bd-ae4c9633beef",
|
|
}
|
|
|
|
var newIC2 = ICRequest{
|
|
UUID: "4854af30-325f-44a5-ad59-b67b2597de68",
|
|
WebsocketURL: "xxx.yyy.zzz.aaa",
|
|
APIURL: "https://villas.k8s.eonerc.rwth-aachen.de/ws/api/v2",
|
|
Type: "dpsim",
|
|
Name: "Test DPsim Simulator",
|
|
Category: "simulator",
|
|
State: "running",
|
|
Location: "k8s",
|
|
Description: "This is a test description",
|
|
StartParameterSchema: postgres.Jsonb{RawMessage: json.RawMessage(`{"startprop1" : "a nice prop"}`)},
|
|
CreateParameterSchema: postgres.Jsonb{RawMessage: json.RawMessage(`{"createprop1" : "a really nice prop"}`)},
|
|
ManagedExternally: newTrue(),
|
|
Manager: "4854af30-325f-44a5-ad59-b67b2597de99",
|
|
}
|
|
|
|
func TestMain(m *testing.M) {
|
|
err := configuration.InitConfig()
|
|
if err != nil {
|
|
panic(m)
|
|
}
|
|
|
|
err = database.InitDB(configuration.GlobalConfig, true)
|
|
if err != nil {
|
|
panic(m)
|
|
}
|
|
defer database.DBpool.Close()
|
|
|
|
router = gin.Default()
|
|
api = router.Group("/api/v2")
|
|
|
|
user.RegisterAuthenticate(api.Group("/authenticate"))
|
|
api.Use(user.Authentication())
|
|
RegisterICEndpoints(api.Group("/ic"))
|
|
// component configuration endpoints required to associate an IC with a component config
|
|
component_configuration.RegisterComponentConfigurationEndpoints(api.Group("/configs"))
|
|
// scenario endpoints required here to first add a scenario to the DB
|
|
// that can be associated with a new component configuration
|
|
scenario.RegisterScenarioEndpoints(api.Group("/scenarios"))
|
|
|
|
// connect AMQP client
|
|
// Make sure that AMQP_HOST, AMQP_USER, AMQP_PASS are set
|
|
host, _ := configuration.GlobalConfig.String("amqp.host")
|
|
usr, _ := configuration.GlobalConfig.String("amqp.user")
|
|
pass, _ := 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
|
|
session = helper.NewAMQPSession("villas-test-session", amqpURI, "villas", ProcessMessage)
|
|
SetAMQPSession(session)
|
|
|
|
os.Exit(m.Run())
|
|
}
|
|
|
|
func TestAddICAsAdmin(t *testing.T) {
|
|
database.DropTables()
|
|
database.MigrateModels()
|
|
assert.NoError(t, database.AddTestUsers())
|
|
|
|
// authenticate as admin
|
|
token, err := helper.AuthenticateForTest(router, database.AdminCredentials)
|
|
assert.NoError(t, err)
|
|
|
|
// try to POST with non JSON body
|
|
// should result in bad request
|
|
code, resp, err := helper.TestEndpoint(router, token,
|
|
"/api/v2/ic", "POST", "This is no JSON")
|
|
assert.NoError(t, err)
|
|
assert.Equalf(t, 400, code, "Response body: \n%v\n", resp)
|
|
|
|
// try to POST malformed IC (required fields missing, validation should fail)
|
|
// should result in an unprocessable entity
|
|
newMalformedIC := ICRequest{
|
|
UUID: newIC2.UUID,
|
|
}
|
|
code, resp, err = helper.TestEndpoint(router, token,
|
|
"/api/v2/ic", "POST", helper.KeyModels{"ic": newMalformedIC})
|
|
assert.NoError(t, err)
|
|
assert.Equalf(t, 422, code, "Response body: \n%v\n", resp)
|
|
|
|
// test POST ic/ $newIC
|
|
code, resp, err = helper.TestEndpoint(router, token,
|
|
"/api/v2/ic", "POST", helper.KeyModels{"ic": newIC1})
|
|
assert.NoError(t, err)
|
|
assert.Equalf(t, 200, code, "Response body: \n%v\n", resp)
|
|
|
|
// Compare POST's response with the newIC
|
|
err = helper.CompareResponse(resp, helper.KeyModels{"ic": newIC1})
|
|
assert.NoError(t, err)
|
|
|
|
// Read newIC's ID from the response
|
|
newICID, err := helper.GetResponseID(resp)
|
|
assert.NoError(t, err)
|
|
|
|
// Get the newIC
|
|
code, resp, err = helper.TestEndpoint(router, token,
|
|
fmt.Sprintf("/api/v2/ic/%v", newICID), "GET", nil)
|
|
assert.NoError(t, err)
|
|
|
|
assert.Equalf(t, 200, code, "Response body: \n%v\n", resp)
|
|
|
|
// Compare GET's response with the newIC
|
|
err = helper.CompareResponse(resp, helper.KeyModels{"ic": newIC1})
|
|
assert.NoError(t, err)
|
|
|
|
// Try to GET a IC that does not exist
|
|
// should result in not found
|
|
code, resp, err = helper.TestEndpoint(router, token,
|
|
fmt.Sprintf("/api/v2/ic/%v", newICID+1), "GET", nil)
|
|
assert.NoError(t, err)
|
|
assert.Equalf(t, 404, code, "Response body: \n%v\n", resp)
|
|
|
|
// test creation of external IC (should lead to bad request)
|
|
code, resp, err = helper.TestEndpoint(router, token,
|
|
"/api/v2/ic", "POST", helper.KeyModels{"ic": newIC2})
|
|
assert.NoError(t, err)
|
|
assert.Equalf(t, 400, code, "Response body: \n%v\n", resp)
|
|
}
|
|
|
|
func TestAddICAsUser(t *testing.T) {
|
|
database.DropTables()
|
|
database.MigrateModels()
|
|
assert.NoError(t, database.AddTestUsers())
|
|
|
|
// authenticate as user
|
|
token, err := helper.AuthenticateForTest(router, database.UserACredentials)
|
|
assert.NoError(t, err)
|
|
|
|
// 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/v2/ic", "POST", helper.KeyModels{"ic": newIC1})
|
|
assert.NoError(t, err)
|
|
assert.Equalf(t, 422, code, "Response body: \n%v\n", resp)
|
|
}
|
|
|
|
func TestUpdateICAsAdmin(t *testing.T) {
|
|
database.DropTables()
|
|
database.MigrateModels()
|
|
assert.NoError(t, database.AddTestUsers())
|
|
|
|
// authenticate as admin
|
|
token, err := helper.AuthenticateForTest(router, database.AdminCredentials)
|
|
assert.NoError(t, err)
|
|
|
|
// test POST ic/ $newIC
|
|
newIC1.ManagedExternally = newFalse()
|
|
code, resp, err := helper.TestEndpoint(router, token,
|
|
"/api/v2/ic", "POST", helper.KeyModels{"ic": newIC1})
|
|
assert.NoError(t, err)
|
|
assert.Equalf(t, 200, code, "Response body: \n%v\n", resp)
|
|
|
|
// Compare POST's response with the newIC
|
|
err = helper.CompareResponse(resp, helper.KeyModels{"ic": newIC1})
|
|
assert.NoError(t, err)
|
|
|
|
// Read newIC's ID from the response
|
|
newICID, err := helper.GetResponseID(resp)
|
|
assert.NoError(t, err)
|
|
|
|
// try to PUT with non JSON body
|
|
// should result in bad request
|
|
code, resp, err = helper.TestEndpoint(router, token,
|
|
fmt.Sprintf("/api/v2/ic/%v", newICID), "PUT", "This is no JSON")
|
|
assert.NoError(t, err)
|
|
assert.Equalf(t, 400, code, "Response body: \n%v\n", resp)
|
|
|
|
// Test PUT IC
|
|
newIC1.WebsocketURL = "ThisIsMyNewURL"
|
|
code, resp, err = helper.TestEndpoint(router, token,
|
|
fmt.Sprintf("/api/v2/ic/%v", newICID), "PUT", helper.KeyModels{"ic": newIC1})
|
|
assert.NoError(t, err)
|
|
assert.Equalf(t, 200, code, "Response body: \n%v\n", resp)
|
|
|
|
// Compare PUT's response with the updated newIC
|
|
err = helper.CompareResponse(resp, helper.KeyModels{"ic": newIC1})
|
|
assert.NoError(t, err)
|
|
|
|
// Get the updated newIC
|
|
code, resp, err = helper.TestEndpoint(router, token,
|
|
fmt.Sprintf("/api/v2/ic/%v", newICID), "GET", nil)
|
|
assert.NoError(t, err)
|
|
|
|
assert.Equalf(t, 200, code, "Response body: \n%v\n", resp)
|
|
|
|
// Compare GET's response with the updated newIC
|
|
err = helper.CompareResponse(resp, helper.KeyModels{"ic": newIC1})
|
|
assert.NoError(t, err)
|
|
|
|
// fake an IC update (create) message
|
|
var update ICUpdate
|
|
update.Status.State = "idle"
|
|
update.Status.ManagedBy = newIC2.Manager
|
|
update.Properties.Name = newIC2.Name
|
|
update.Properties.Category = newIC2.Category
|
|
update.Properties.Type = newIC2.Type
|
|
update.Properties.UUID = newIC2.UUID
|
|
|
|
payload, err := json.Marshal(update)
|
|
assert.NoError(t, err)
|
|
|
|
//var headers map[string]interface{}
|
|
//headers = make(map[string]interface{}) // empty map
|
|
//headers["uuid"] = newIC2.Manager // set uuid
|
|
|
|
err = session.CheckConnection()
|
|
assert.NoError(t, err)
|
|
|
|
err = session.Send(payload, newIC2.Manager)
|
|
assert.NoError(t, err)
|
|
|
|
// Wait until externally managed IC is created (happens async)
|
|
time.Sleep(waitingTime * time.Second)
|
|
|
|
// try to update this IC
|
|
var updatedIC ICRequest
|
|
updatedIC.Name = "a new name"
|
|
|
|
// Should result in bad request return code 400
|
|
code, resp, err = helper.TestEndpoint(router, token,
|
|
fmt.Sprintf("/api/v2/ic/%v", 2), "PUT", helper.KeyModels{"ic": updatedIC})
|
|
assert.NoError(t, err)
|
|
assert.Equalf(t, 400, code, "Response body: \n%v\n", resp)
|
|
}
|
|
|
|
func TestUpdateICAsUser(t *testing.T) {
|
|
database.DropTables()
|
|
database.MigrateModels()
|
|
assert.NoError(t, database.AddTestUsers())
|
|
|
|
// authenticate as admin
|
|
token, err := helper.AuthenticateForTest(router, database.AdminCredentials)
|
|
assert.NoError(t, err)
|
|
|
|
// test POST ic/ $newIC
|
|
code, resp, err := helper.TestEndpoint(router, token,
|
|
"/api/v2/ic", "POST", helper.KeyModels{"ic": newIC1})
|
|
assert.NoError(t, err)
|
|
assert.Equalf(t, 200, code, "Response body: \n%v\n", resp)
|
|
|
|
// Read newIC's ID from the response
|
|
newICID, err := helper.GetResponseID(resp)
|
|
assert.NoError(t, err)
|
|
|
|
// authenticate as user
|
|
token, err = helper.AuthenticateForTest(router, database.UserACredentials)
|
|
assert.NoError(t, err)
|
|
|
|
// Test PUT IC
|
|
// This should fail with unprocessable entity status code 422
|
|
newIC1.WebsocketURL = "ThisIsMyNewURL2"
|
|
code, resp, err = helper.TestEndpoint(router, token,
|
|
fmt.Sprintf("/api/v2/ic/%v", newICID), "PUT", helper.KeyModels{"ic": newIC1})
|
|
assert.NoError(t, err)
|
|
assert.Equalf(t, 422, code, "Response body: \n%v\n", resp)
|
|
|
|
}
|
|
|
|
func TestDeleteICAsAdmin(t *testing.T) {
|
|
database.DropTables()
|
|
database.MigrateModels()
|
|
assert.NoError(t, database.AddTestUsers())
|
|
|
|
// authenticate as admin
|
|
token, err := helper.AuthenticateForTest(router, database.AdminCredentials)
|
|
assert.NoError(t, err)
|
|
|
|
// test POST ic/ $newIC
|
|
code, resp, err := helper.TestEndpoint(router, token,
|
|
"/api/v2/ic", "POST", helper.KeyModels{"ic": newIC1})
|
|
assert.NoError(t, err)
|
|
assert.Equalf(t, 200, code, "Response body: \n%v\n", resp)
|
|
|
|
// Read newIC's ID from the response
|
|
newICID, err := helper.GetResponseID(resp)
|
|
assert.NoError(t, err)
|
|
|
|
// Count the number of all the ICs returned for admin
|
|
initialNumber, err := helper.LengthOfResponse(router, token,
|
|
"/api/v2/ic", "GET", nil)
|
|
assert.NoError(t, err)
|
|
|
|
// Delete the added newIC
|
|
code, resp, err = helper.TestEndpoint(router, token,
|
|
fmt.Sprintf("/api/v2/ic/%v", newICID), "DELETE", nil)
|
|
assert.NoError(t, err)
|
|
assert.Equalf(t, 200, code, "Response body: \n%v\n", resp)
|
|
|
|
// Compare DELETE's response with the newIC
|
|
err = helper.CompareResponse(resp, helper.KeyModels{"ic": newIC1})
|
|
assert.NoError(t, err)
|
|
|
|
// Again count the number of all the ICs returned
|
|
finalNumber, err := helper.LengthOfResponse(router, token,
|
|
"/api/v2/ic", "GET", nil)
|
|
assert.NoError(t, err)
|
|
|
|
assert.Equal(t, finalNumber, initialNumber-1)
|
|
|
|
// fake an IC update (create) message
|
|
var update ICUpdate
|
|
update.Status.State = "idle"
|
|
update.Status.ManagedBy = newIC2.Manager
|
|
update.Properties.Name = newIC2.Name
|
|
update.Properties.Category = newIC2.Category
|
|
update.Properties.Type = newIC2.Type
|
|
update.Properties.UUID = newIC2.UUID
|
|
|
|
payload, err := json.Marshal(update)
|
|
assert.NoError(t, err)
|
|
|
|
err = session.CheckConnection()
|
|
assert.NoError(t, err)
|
|
|
|
err = session.Send(payload, newIC2.UUID)
|
|
assert.NoError(t, err)
|
|
|
|
// Wait until externally managed IC is created (happens async)
|
|
time.Sleep(waitingTime * time.Second)
|
|
|
|
// Delete the added external IC (triggers a bad request error)
|
|
code, resp, err = helper.TestEndpoint(router, token,
|
|
fmt.Sprintf("/api/v2/ic/%v", 2), "DELETE", nil)
|
|
assert.NoError(t, err)
|
|
assert.Equalf(t, 400, code, "Response body: \n%v\n", resp)
|
|
|
|
// Again count the number of all the ICs returned
|
|
finalNumberAfterExtneralDelete, err := helper.LengthOfResponse(router, token,
|
|
"/api/v2/ic", "GET", nil)
|
|
assert.NoError(t, err)
|
|
|
|
assert.Equal(t, finalNumber+1, finalNumberAfterExtneralDelete)
|
|
|
|
}
|
|
|
|
func TestDeleteICAsUser(t *testing.T) {
|
|
database.DropTables()
|
|
database.MigrateModels()
|
|
assert.NoError(t, database.AddTestUsers())
|
|
|
|
// authenticate as admin
|
|
token, err := helper.AuthenticateForTest(router, database.AdminCredentials)
|
|
assert.NoError(t, err)
|
|
|
|
// test POST ic/ $newIC
|
|
code, resp, err := helper.TestEndpoint(router, token,
|
|
"/api/v2/ic", "POST", helper.KeyModels{"ic": newIC1})
|
|
assert.NoError(t, err)
|
|
assert.Equalf(t, 200, code, "Response body: \n%v\n", resp)
|
|
|
|
// Read newIC's ID from the response
|
|
newICID, err := helper.GetResponseID(resp)
|
|
assert.NoError(t, err)
|
|
|
|
// authenticate as user
|
|
token, err = helper.AuthenticateForTest(router, database.UserACredentials)
|
|
assert.NoError(t, err)
|
|
|
|
// Test DELETE ICs
|
|
// This should fail with unprocessable entity status code 422
|
|
newIC1.WebsocketURL = "ThisIsMyNewURL3"
|
|
code, resp, err = helper.TestEndpoint(router, token,
|
|
fmt.Sprintf("/api/v2/ic/%v", newICID), "DELETE", nil)
|
|
assert.NoError(t, err)
|
|
assert.Equalf(t, 422, code, "Response body: \n%v\n", resp)
|
|
}
|
|
|
|
func TestGetAllICs(t *testing.T) {
|
|
database.DropTables()
|
|
database.MigrateModels()
|
|
assert.NoError(t, database.AddTestUsers())
|
|
|
|
// authenticate as admin
|
|
token, err := helper.AuthenticateForTest(router, database.AdminCredentials)
|
|
assert.NoError(t, err)
|
|
|
|
// get the length of the GET all ICs response for user
|
|
initialNumber, err := helper.LengthOfResponse(router, token,
|
|
"/api/v2/ic", "GET", nil)
|
|
assert.NoError(t, err)
|
|
|
|
// test POST ic/ $newICA
|
|
code, resp, err := helper.TestEndpoint(router, token,
|
|
"/api/v2/ic", "POST", helper.KeyModels{"ic": newIC1})
|
|
assert.NoError(t, err)
|
|
assert.Equalf(t, 200, code, "Response body: \n%v\n", resp)
|
|
|
|
// test POST ic/ $newICB
|
|
|
|
code, resp, err = helper.TestEndpoint(router, token,
|
|
"/api/v2/ic", "POST", helper.KeyModels{"ic": newIC1})
|
|
assert.NoError(t, err)
|
|
assert.Equalf(t, 200, code, "Response body: \n%v\n", resp)
|
|
|
|
// get the length of the GET all ICs response again
|
|
finalNumber, err := helper.LengthOfResponse(router, token,
|
|
"/api/v2/ic", "GET", nil)
|
|
assert.NoError(t, err)
|
|
|
|
assert.Equal(t, finalNumber, initialNumber+2)
|
|
|
|
// authenticate as normal user
|
|
token, err = helper.AuthenticateForTest(router, database.UserACredentials)
|
|
assert.NoError(t, err)
|
|
|
|
// get the length of the GET all ICs response again
|
|
finalNumber2, err := helper.LengthOfResponse(router, token,
|
|
"/api/v2/ic", "GET", nil)
|
|
assert.NoError(t, err)
|
|
|
|
assert.Equal(t, finalNumber2, initialNumber+2)
|
|
}
|
|
|
|
func TestGetConfigsOfIC(t *testing.T) {
|
|
database.DropTables()
|
|
database.MigrateModels()
|
|
assert.NoError(t, database.AddTestUsers())
|
|
|
|
// authenticate as admin
|
|
token, err := helper.AuthenticateForTest(router, database.AdminCredentials)
|
|
assert.NoError(t, err)
|
|
|
|
// test POST ic/ $newICA
|
|
code, resp, err := helper.TestEndpoint(router, token,
|
|
"/api/v2/ic", "POST", helper.KeyModels{"ic": newIC1})
|
|
assert.NoError(t, err)
|
|
assert.Equalf(t, 200, code, "Response body: \n%v\n", resp)
|
|
|
|
// Read newIC's ID from the response
|
|
newICID, err := helper.GetResponseID(resp)
|
|
assert.NoError(t, err)
|
|
|
|
// test GET ic/ID/confis
|
|
numberOfConfigs, err := helper.LengthOfResponse(router, token,
|
|
fmt.Sprintf("/api/v2/ic/%v/configs", newICID), "GET", nil)
|
|
assert.NoError(t, err)
|
|
assert.Equalf(t, 200, code, "Response body: \n%v\n", resp)
|
|
|
|
assert.Equal(t, 0, numberOfConfigs)
|
|
|
|
// authenticate as normal user
|
|
token, err = helper.AuthenticateForTest(router, database.UserACredentials)
|
|
assert.NoError(t, err)
|
|
|
|
// test GET ic/ID/configs
|
|
numberOfConfigs, err = helper.LengthOfResponse(router, token,
|
|
fmt.Sprintf("/api/v2/ic/%v/configs", newICID), "GET", nil)
|
|
assert.NoError(t, err)
|
|
assert.Equalf(t, 200, code, "Response body: \n%v\n", resp)
|
|
|
|
assert.Equal(t, 0, numberOfConfigs)
|
|
|
|
// Try to get configs of IC that does not exist
|
|
// should result in not found
|
|
code, resp, err = helper.TestEndpoint(router, token,
|
|
fmt.Sprintf("/api/v2/ic/%v/configs", newICID+1), "GET", nil)
|
|
assert.NoError(t, err)
|
|
assert.Equalf(t, 404, code, "Response body: \n%v\n", resp)
|
|
}
|
|
|
|
func TestSendActionToIC(t *testing.T) {
|
|
database.DropTables()
|
|
database.MigrateModels()
|
|
assert.NoError(t, database.AddTestUsers())
|
|
|
|
// authenticate as admin
|
|
token, err := helper.AuthenticateForTest(router, database.AdminCredentials)
|
|
assert.NoError(t, err)
|
|
|
|
// test POST ic/ $newICA
|
|
code, resp, err := helper.TestEndpoint(router, token,
|
|
"/api/v2/ic", "POST", helper.KeyModels{"ic": newIC1})
|
|
assert.NoError(t, err)
|
|
assert.Equalf(t, 200, code, "Response body: \n%v\n", resp)
|
|
|
|
// Read newIC's ID from the response
|
|
newICID, err := helper.GetResponseID(resp)
|
|
assert.NoError(t, err)
|
|
|
|
// create action to be sent to IC
|
|
action1 := Action{
|
|
Act: "start",
|
|
When: time.Now().Unix(),
|
|
}
|
|
|
|
type startParams struct {
|
|
UUID string `json:"uuid"`
|
|
}
|
|
var params startParams
|
|
params.UUID = newIC1.UUID
|
|
|
|
paramsRaw, _ := json.Marshal(¶ms)
|
|
action1.Parameters = paramsRaw
|
|
actions := [1]Action{action1}
|
|
|
|
// Send action to IC
|
|
code, resp, err = helper.TestEndpoint(router, token,
|
|
fmt.Sprintf("/api/v2/ic/%v/action", newICID), "POST", actions)
|
|
assert.NoError(t, err)
|
|
assert.Equalf(t, 200, code, "Response body: \n%v\n", resp)
|
|
|
|
// Send malformed actions array to IC (should yield bad request)
|
|
code, resp, err = helper.TestEndpoint(router, token,
|
|
fmt.Sprintf("/api/v2/ic/%v/action", newICID), "POST", action1)
|
|
assert.NoError(t, err)
|
|
assert.Equalf(t, 400, code, "Response body: \n%v\n", resp)
|
|
}
|
|
|
|
func TestCreateUpdateViaAMQPRecv(t *testing.T) {
|
|
|
|
database.DropTables()
|
|
database.MigrateModels()
|
|
assert.NoError(t, database.AddTestUsers())
|
|
|
|
// authenticate as admin
|
|
token, err := helper.AuthenticateForTest(router, database.AdminCredentials)
|
|
assert.NoError(t, err)
|
|
|
|
// fake an IC update message
|
|
var update ICUpdate
|
|
update.Status.State = "idle"
|
|
|
|
payload, err := json.Marshal(update)
|
|
assert.NoError(t, err)
|
|
|
|
err = session.CheckConnection()
|
|
assert.NoError(t, err)
|
|
|
|
err = session.Send(payload, newIC1.Manager)
|
|
assert.NoError(t, err)
|
|
|
|
time.Sleep(waitingTime * time.Second)
|
|
|
|
// get the length of the GET all ICs response for user
|
|
number, err := helper.LengthOfResponse(router, token,
|
|
"/api/v2/ic", "GET", nil)
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, 0, number)
|
|
|
|
// complete the (required) data of an IC
|
|
update.Properties.Name = newIC1.Name
|
|
update.Properties.Category = newIC1.Category
|
|
update.Properties.Type = newIC1.Type
|
|
update.Status.Uptime = 1000.1
|
|
update.Status.ManagedBy = newIC1.Manager
|
|
update.Properties.WS_url = newIC1.WebsocketURL
|
|
update.Properties.API_url = newIC1.APIURL
|
|
update.Properties.Description = newIC1.Description
|
|
update.Properties.Location = newIC1.Location
|
|
update.Properties.UUID = newIC1.UUID
|
|
|
|
payload, err = json.Marshal(update)
|
|
assert.NoError(t, err)
|
|
|
|
err = session.Send(payload, newIC1.Manager)
|
|
assert.NoError(t, err)
|
|
|
|
time.Sleep(waitingTime * time.Second)
|
|
|
|
// get the length of the GET all ICs response for user
|
|
number, err = helper.LengthOfResponse(router, token,
|
|
"/api/v2/ic", "GET", nil)
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, 1, number)
|
|
|
|
// modify status update
|
|
update.Properties.Name = "This is the new name"
|
|
payload, err = json.Marshal(update)
|
|
assert.NoError(t, err)
|
|
|
|
err = session.Send(payload, newIC1.Manager)
|
|
assert.NoError(t, err)
|
|
|
|
time.Sleep(waitingTime * time.Second)
|
|
// get the length of the GET all ICs response for user
|
|
number, err = helper.LengthOfResponse(router, token,
|
|
"/api/v2/ic", "GET", nil)
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, 1, number)
|
|
|
|
}
|
|
|
|
func TestDeleteICViaAMQPRecv(t *testing.T) {
|
|
|
|
database.DropTables()
|
|
database.MigrateModels()
|
|
assert.NoError(t, database.AddTestUsers())
|
|
|
|
// authenticate as admin
|
|
token, err := helper.AuthenticateForTest(router, database.AdminCredentials)
|
|
assert.NoError(t, err)
|
|
|
|
// fake an IC update message
|
|
var update ICUpdate
|
|
update.Status.State = "idle"
|
|
// complete the (required) data of an IC
|
|
update.Properties.Name = newIC1.Name
|
|
update.Properties.Category = newIC1.Category
|
|
update.Properties.Type = newIC1.Type
|
|
update.Status.Uptime = 500.544
|
|
update.Status.ManagedBy = newIC1.Manager
|
|
update.Properties.WS_url = newIC1.WebsocketURL
|
|
update.Properties.API_url = newIC1.APIURL
|
|
update.Properties.Description = newIC1.Description
|
|
update.Properties.Location = newIC1.Location
|
|
update.Properties.UUID = newIC1.UUID
|
|
|
|
payload, err := json.Marshal(update)
|
|
assert.NoError(t, err)
|
|
|
|
err = session.CheckConnection()
|
|
assert.NoError(t, err)
|
|
|
|
err = session.Send(payload, newIC1.Manager)
|
|
assert.NoError(t, err)
|
|
|
|
time.Sleep(waitingTime * time.Second)
|
|
|
|
// get the length of the GET all ICs response for user
|
|
number, err := helper.LengthOfResponse(router, token,
|
|
"/api/v2/ic", "GET", nil)
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, 1, number)
|
|
|
|
// add scenario
|
|
newScenario := ScenarioRequest{
|
|
Name: "ScenarioA",
|
|
StartParameters: postgres.Jsonb{RawMessage: json.RawMessage(`{"parameter1" : "testValue1B", "parameter2" : "testValue2B", "parameter3" : 55}`)},
|
|
}
|
|
|
|
code, resp, err := helper.TestEndpoint(router, token,
|
|
"/api/v2/scenarios", "POST", helper.KeyModels{"scenario": newScenario})
|
|
assert.NoError(t, err)
|
|
assert.Equalf(t, 200, code, "Response body: \n%v\n", resp)
|
|
|
|
// Compare POST's response with the newScenario
|
|
err = helper.CompareResponse(resp, helper.KeyModels{"scenario": newScenario})
|
|
assert.NoError(t, err)
|
|
|
|
// Read newScenario's ID from the response
|
|
newScenarioID, err := helper.GetResponseID(resp)
|
|
assert.NoError(t, err)
|
|
|
|
// Add component config and associate with IC and scenario
|
|
newConfig := ConfigRequest{
|
|
Name: "ConfigA",
|
|
ScenarioID: uint(newScenarioID),
|
|
ICID: 1,
|
|
StartParameters: postgres.Jsonb{
|
|
RawMessage: json.RawMessage(`{"parameter1" : "testValue1B", "parameter2" : "testValue2B", "parameter3" : 55}`),
|
|
},
|
|
FileIDs: []int64{},
|
|
}
|
|
|
|
code, resp, err = helper.TestEndpoint(router, token,
|
|
"/api/v2/configs", "POST", helper.KeyModels{"config": newConfig})
|
|
assert.NoError(t, err)
|
|
assert.Equalf(t, 200, code, "Response body: \n%v\n", resp)
|
|
|
|
// Compare POST's response with the newConfig
|
|
err = helper.CompareResponse(resp, helper.KeyModels{"config": newConfig})
|
|
assert.NoError(t, err)
|
|
|
|
// Read newConfig's ID from the response
|
|
newConfigID, err := helper.GetResponseID(resp)
|
|
assert.NoError(t, err)
|
|
|
|
// modify status update to state "gone"
|
|
update.Status.State = "gone"
|
|
payload, err = json.Marshal(update)
|
|
assert.NoError(t, err)
|
|
|
|
err = session.Send(payload, newIC1.Manager)
|
|
assert.NoError(t, err)
|
|
|
|
time.Sleep(waitingTime * time.Second)
|
|
|
|
// get the length of the GET all ICs response for user
|
|
number, err = helper.LengthOfResponse(router, token,
|
|
"/api/v2/ic", "GET", nil)
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, 1, number)
|
|
|
|
// Delete component config from earlier
|
|
code, resp, err = helper.TestEndpoint(router, token,
|
|
fmt.Sprintf("/api/v2/configs/%v", newConfigID), "DELETE", nil)
|
|
assert.NoError(t, err)
|
|
assert.Equalf(t, 200, code, "Response body: \n%v\n", resp)
|
|
|
|
// Compare DELETE's response with the newConfig
|
|
err = helper.CompareResponse(resp, helper.KeyModels{"config": newConfig})
|
|
assert.NoError(t, err)
|
|
|
|
// get the length of the GET all ICs response for user
|
|
number, err = helper.LengthOfResponse(router, token,
|
|
"/api/v2/ic", "GET", nil)
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, 0, number)
|
|
}
|