160 lines
4.6 KiB
Go
160 lines
4.6 KiB
Go
package http
|
|
|
|
import (
|
|
"database/sql"
|
|
"encoding/json"
|
|
db "infra-dashboard/Database"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"reflect"
|
|
"regexp"
|
|
"testing"
|
|
|
|
"github.com/DATA-DOG/go-sqlmock"
|
|
"github.com/gorilla/mux"
|
|
"gopkg.in/guregu/null.v4"
|
|
)
|
|
|
|
func TestGetPackage(t *testing.T) {
|
|
// Créer une connexion à la base de données simulée
|
|
dbConn, mock, err := sqlmock.New()
|
|
if err != nil {
|
|
t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
|
|
}
|
|
defer dbConn.Close()
|
|
|
|
// Simuler la réponse de la base de données
|
|
mockPackageList := []db.Package{
|
|
{ID: 1, Name: null.StringFrom("Redis"), Active: 1},
|
|
{ID: 2, Name: null.StringFrom("Rabbit"), Active: 0},
|
|
}
|
|
|
|
rows := sqlmock.NewRows([]string{"id", "name", "active"}).
|
|
AddRow(1, "Redis", "1").
|
|
AddRow(2, "Rabbit", "0")
|
|
|
|
mock.ExpectQuery(regexp.QuoteMeta("SELECT * FROM dashboard_package")).WillReturnRows(rows)
|
|
|
|
// Remplacer la fonction GetDatabaseConnection par une version mockée
|
|
originalGetDatabaseConnection := db.GetDatabaseConnection
|
|
db.GetDatabaseConnection = func() *sql.DB {
|
|
return dbConn
|
|
}
|
|
defer func() { db.GetDatabaseConnection = originalGetDatabaseConnection }()
|
|
|
|
// Créer une requête HTTP
|
|
req, err := http.NewRequest("GET", "/package", nil)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// Créer un ResponseRecorder pour enregistrer la réponse
|
|
rr := httptest.NewRecorder()
|
|
handler := http.HandlerFunc(GetAllPackages)
|
|
|
|
// Appeler la fonction GetPackage
|
|
handler.ServeHTTP(rr, req)
|
|
|
|
// Vérifier le statut de la réponse
|
|
if status := rr.Code; status != http.StatusOK {
|
|
t.Errorf("handler returned wrong status code: got %v want %v",
|
|
status, http.StatusOK)
|
|
}
|
|
|
|
// Vérifier le type de contenu de la réponse
|
|
expectedContentType := "application/json"
|
|
if ct := rr.Header().Get("Content-Type"); ct != expectedContentType {
|
|
t.Errorf("handler returned wrong content type: got %v want %v",
|
|
ct, expectedContentType)
|
|
}
|
|
|
|
// Vérifier le corps de la réponse
|
|
var responsePackageList []db.Package
|
|
err = json.NewDecoder(rr.Body).Decode(&responsePackageList)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if !reflect.DeepEqual(responsePackageList, mockPackageList) {
|
|
t.Errorf("handler returned unexpected body: got %v want %v",
|
|
responsePackageList, mockPackageList)
|
|
}
|
|
|
|
// Vérifier que toutes les attentes ont été satisfaites
|
|
if err := mock.ExpectationsWereMet(); err != nil {
|
|
t.Errorf("there were unfulfilled expectations: %s", err)
|
|
}
|
|
}
|
|
|
|
func TestGetPackagebyID(t *testing.T) {
|
|
// Créer une connexion à la base de données simulée
|
|
dbConn, mock, err := sqlmock.New()
|
|
if err != nil {
|
|
t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
|
|
}
|
|
defer dbConn.Close()
|
|
|
|
// Simuler la réponse de la base de données
|
|
mockPackage := db.Package{
|
|
ID: 1, Name: null.StringFrom("Redis"), Active: 1,
|
|
}
|
|
|
|
rows := sqlmock.NewRows([]string{"id", "name", "active"}).
|
|
AddRow(1, "Redis", "1")
|
|
|
|
mock.ExpectQuery(regexp.QuoteMeta("SELECT * FROM dashboard_package where id = ?")).WithArgs(sqlmock.AnyArg()).WillReturnRows(rows)
|
|
|
|
// Remplacer la fonction GetDatabaseConnection par une version mockée
|
|
originalGetDatabaseConnection := db.GetDatabaseConnection
|
|
db.GetDatabaseConnection = func() *sql.DB {
|
|
return dbConn
|
|
}
|
|
defer func() { db.GetDatabaseConnection = originalGetDatabaseConnection }()
|
|
|
|
// Créer une requête HTTP
|
|
req, err := http.NewRequest("GET", "/package/1", nil)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// Ajouter les paramètres de la route
|
|
req = mux.SetURLVars(req, map[string]string{"id": "1"})
|
|
|
|
// Créer un ResponseRecorder pour enregistrer la réponse
|
|
rr := httptest.NewRecorder()
|
|
handler := http.HandlerFunc(GetPackagebyID)
|
|
|
|
// Appeler la fonction GetPackage
|
|
handler.ServeHTTP(rr, req)
|
|
|
|
// Vérifier le statut de la réponse
|
|
if status := rr.Code; status != http.StatusOK {
|
|
t.Errorf("handler returned wrong status code: got %v want %v",
|
|
status, http.StatusOK)
|
|
}
|
|
|
|
// Vérifier le type de contenu de la réponse
|
|
expectedContentType := "application/json"
|
|
if ct := rr.Header().Get("Content-Type"); ct != expectedContentType {
|
|
t.Errorf("handler returned wrong content type: got %v want %v",
|
|
ct, expectedContentType)
|
|
}
|
|
|
|
// Vérifier le corps de la réponse
|
|
var responsePackage db.Package
|
|
err = json.NewDecoder(rr.Body).Decode(&responsePackage)
|
|
if err != nil {
|
|
t.Fatal("Error decoding json request", err)
|
|
}
|
|
|
|
if !reflect.DeepEqual(responsePackage, mockPackage) {
|
|
t.Errorf("handler returned unexpected body: got %v want %v",
|
|
responsePackage, mockPackage)
|
|
}
|
|
|
|
// Vérifier que toutes les attentes ont été satisfaites
|
|
if err := mock.ExpectationsWereMet(); err != nil {
|
|
t.Errorf("there were unfulfilled expectations: %s", err)
|
|
}
|
|
}
|