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) } }