infra-dashboard/app/Http/os_test.go

231 lines
7.1 KiB
Go

package http
import (
"database/sql"
"encoding/json"
"github.com/DATA-DOG/go-sqlmock"
"github.com/gorilla/mux"
"gopkg.in/guregu/null.v4"
db "infra-dashboard/Database"
"log"
"net/http"
"net/http/httptest"
"reflect"
"regexp"
"testing"
)
func TestGetOS(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
mockOSList := []db.OS{
{ID: 1, Distribution: null.StringFrom("Ubuntu"), Version: null.StringFrom("22.04"), EndOfSupport: null.StringFrom("2026-04-01")},
{ID: 2, Distribution: null.StringFrom("Debian"), Version: null.StringFrom("12"), EndOfSupport: null.StringFrom("2028-04-01")},
}
rows := sqlmock.NewRows([]string{"id", "distribution", "version", "end_of_support"}).
AddRow(1, "Ubuntu", "22.04", "2026-04-01").
AddRow(2, "Debian", "12", "2028-04-01")
mock.ExpectQuery(regexp.QuoteMeta("SELECT * FROM dashboard_os")).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", "/os", nil)
if err != nil {
t.Fatal(err)
}
// Créer un ResponseRecorder pour enregistrer la réponse
rr := httptest.NewRecorder()
handler := http.HandlerFunc(GetOS)
// Appeler la fonction GetOS
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 responseOSList []db.OS
err = json.NewDecoder(rr.Body).Decode(&responseOSList)
if err != nil {
t.Fatal(err)
}
if !reflect.DeepEqual(responseOSList, mockOSList) {
t.Errorf("handler returned unexpected body: got %v want %v",
responseOSList, mockOSList)
}
// Vérifier que toutes les attentes ont été satisfaites
if err := mock.ExpectationsWereMet(); err != nil {
t.Errorf("there were unfulfilled expectations: %s", err)
}
}
func TestGetOSbyID(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
mockOS := db.OS{
ID: 1, Distribution: null.StringFrom("Ubuntu"), Version: null.StringFrom("22.04"), EndOfSupport: null.StringFrom("2026-04-01"),
}
rows := sqlmock.NewRows([]string{"id", "distribution", "version", "end_of_support"}).
AddRow(1, "Ubuntu", "22.04", "2026-04-01")
mock.ExpectQuery(regexp.QuoteMeta("SELECT * FROM dashboard_os 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", "/os/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(GetOSbyID)
// Appeler la fonction GetOS
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 responseOS db.OS
err = json.NewDecoder(rr.Body).Decode(&responseOS)
if err != nil {
t.Fatal("Error decoding json request", err)
}
if !reflect.DeepEqual(responseOS, mockOS) {
t.Errorf("handler returned unexpected body: got %v want %v",
responseOS, mockOS)
}
// Vérifier que toutes les attentes ont été satisfaites
if err := mock.ExpectationsWereMet(); err != nil {
t.Errorf("there were unfulfilled expectations: %s", err)
}
}
func TestGetDistributionList(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
mockDistributionList := []null.String{}
mockDistributionList = append(mockDistributionList, null.StringFrom("Ubuntu"))
mockDistributionList = append(mockDistributionList, null.StringFrom("Debian"))
rows := sqlmock.NewRows([]string{"distribution"}).
AddRow("Ubuntu").
AddRow("Debian")
mock.ExpectQuery(regexp.QuoteMeta("SELECT DISTINCT distribution FROM dashboard_os")).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", "/os/distribution", nil)
if err != nil {
t.Fatal(err)
}
// Créer un ResponseRecorder pour enregistrer la réponse
rr := httptest.NewRecorder()
handler := http.HandlerFunc(GetDistributionList)
// Appeler la fonction GetOS
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 responseOSList []null.String
err = json.NewDecoder(rr.Body).Decode(&responseOSList)
log.Println(responseOSList)
if err != nil {
t.Fatal(err)
}
if !reflect.DeepEqual(responseOSList, mockDistributionList) {
t.Errorf("handler returned unexpected body: got %v want %v",
responseOSList, mockDistributionList)
}
// Vérifier que toutes les attentes ont été satisfaites
if err := mock.ExpectationsWereMet(); err != nil {
t.Errorf("there were unfulfilled expectations: %s", err)
}
}