From c972d9c2422c60dffcea864cdf666bb31b2a42e7 Mon Sep 17 00:00:00 2001 From: kirby Date: Wed, 7 May 2025 17:46:34 +0200 Subject: [PATCH] update tests --- Database/server.go | 6 +-- Http/server.go | 70 ++++++++++++++----------- Http/server_test.go | 124 ++++++++++++++++++++++++-------------------- 3 files changed, 111 insertions(+), 89 deletions(-) diff --git a/Database/server.go b/Database/server.go index dc64eb6..d017a1d 100644 --- a/Database/server.go +++ b/Database/server.go @@ -38,14 +38,14 @@ func GetServersList(db *sql.DB) ([]Server, error) { return servers, err } -func GetServersbyID(db *sql.DB, id int64) Server { +func GetServersbyID(db *sql.DB, id int64) (Server, error) { var s Server rows := db.QueryRow("SELECT * FROM dashboard_server WHERE id = ?", id) err := rows.Scan(&s.ID, &s.Hostname, &s.OsId) if err != nil { - return Server{} + return Server{}, nil } - return s + return s, err } func GetServersbyOS(db *sql.DB, id int64) ([]Server, error) { diff --git a/Http/server.go b/Http/server.go index 5293f4d..ffb3388 100644 --- a/Http/server.go +++ b/Http/server.go @@ -52,14 +52,23 @@ func GetServersbyID(w http.ResponseWriter, r *http.Request) { } dbConn := db.GetDatabaseConnection() defer dbConn.Close() - server = db.GetServersbyID(dbConn, int64(id)) - logRequest(t, r, status) - w.Header().Set("Content-Type", "application/json") - err = json.NewEncoder(w).Encode(server) + server, err = db.GetServersbyID(dbConn, int64(id)) if err != nil { - log.Println("Error getting OS list") - return + log.Println("Error getting Server by ID", err) + status = 500 } + if status != 500 { + w.Header().Set("Content-Type", "application/json") + err = json.NewEncoder(w).Encode(server) + if err != nil { + log.Println("Error getting OS list") + w.WriteHeader(http.StatusInternalServerError) + logRequest(t, r, status) + return + } + } + w.WriteHeader(status) + logRequest(t, r, status) } func GetServersbyOS(w http.ResponseWriter, r *http.Request) { @@ -74,9 +83,6 @@ func GetServersbyOS(w http.ResponseWriter, r *http.Request) { if err != nil { log.Println("Error converting ID", err) status = 500 - logRequest(t, r, status) - w.WriteHeader(status) - return } dbConn := db.GetDatabaseConnection() defer dbConn.Close() @@ -84,20 +90,21 @@ func GetServersbyOS(w http.ResponseWriter, r *http.Request) { if err != nil { log.Println("Error getting servers by OS", err) status = 500 - logRequest(t, r, status) - w.WriteHeader(status) - return + } + if status != 500 { + w.Header().Set("Content-Type", "application/json") + err = json.NewEncoder(w).Encode(servers) + if err != nil { + log.Println("Error encoding OS list") + w.Header().Del("Content-Type") + logRequest(t, r, status) + w.WriteHeader(http.StatusInternalServerError) + return + } } logRequest(t, r, status) - w.Header().Set("Content-Type", "application/json") - err = json.NewEncoder(w).Encode(servers) - if err != nil { - log.Println("Error getting OS list") - status = 500 - logRequest(t, r, status) - w.WriteHeader(status) - return - } + w.WriteHeader(status) + return } func CreateServer(w http.ResponseWriter, r *http.Request) { @@ -110,23 +117,26 @@ func CreateServer(w http.ResponseWriter, r *http.Request) { body, err := io.ReadAll(r.Body) if err != nil { log.Println(err.Error(), "Error reading request body") + status = 500 } params := make(map[string]null.String) err = json.Unmarshal(body, ¶ms) if err != nil { log.Println(err.Error(), "Error parsing request body") - return - } - server.Hostname = params["hostname"] - server.OsId = params["os_id"] - dbConn := db.GetDatabaseConnection() - defer dbConn.Close() - err = db.CreateServer(server, dbConn) - if err != nil { - log.Println(err.Error(), "Error creating server") status = 500 } + if status != 500 { + server.Hostname = params["hostname"] + server.OsId = params["os_id"] + dbConn := db.GetDatabaseConnection() + defer dbConn.Close() + err = db.CreateServer(server, dbConn) + if err != nil { + log.Println(err.Error(), "Error creating server") + status = 500 + } + } logRequest(t, r, status) w.WriteHeader(status) } diff --git a/Http/server_test.go b/Http/server_test.go index b5ee64c..fb75aa8 100644 --- a/Http/server_test.go +++ b/Http/server_test.go @@ -88,74 +88,86 @@ func TestGetServerList(t *testing.T) { } func TestGetServerbyID(t *testing.T) { - // Créer une connexion à la base de données simulée - dbConn, mock, err := sqlmock.New() + mockDB, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual)) 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 - mockServer := db.Server{ - ID: 1, Hostname: null.StringFrom("testsla"), OsId: null.StringFrom("8"), - } - - rows := sqlmock.NewRows([]string{"id", "hostname", "os_id"}). - AddRow(1, "testsla", "8") - - mock.ExpectQuery(regexp.QuoteMeta("SELECT * FROM dashboard_server WHERE id = ?")).WithArgs(sqlmock.AnyArg()).WillReturnRows(rows) - - // Remplacer la fonction GetDatabaseConnection par une version mockée - originalGetDatabaseConnection := db.GetDatabaseConnection + defer mockDB.Close() db.GetDatabaseConnection = func() *sql.DB { - return dbConn - } - defer func() { db.GetDatabaseConnection = originalGetDatabaseConnection }() - - // Créer une requête HTTP - req, err := http.NewRequest("GET", "/server/1", nil) - if err != nil { - t.Fatal(err) + return mockDB } - // 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(GetServersbyID) - - // Appeler la fonction GetServer - 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) + mockServer := []db.Server{ + {ID: 1, Hostname: null.StringFrom("testsla"), OsId: null.StringFrom("8")}, } - // 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) + tests := []struct { + name string + requestParam string + mockBehavior func() + expectedStatus int + expectedContentType string + }{ + { + name: "Successfully get Server by OS ID", + requestParam: "1", + mockBehavior: func() { + rows := sqlmock.NewRows([]string{"id", "hostname", "os_id"}).AddRow(1, "testsla", "8") + mock.ExpectQuery("SELECT * FROM dashboard_server WHERE id = ?").WithArgs(sqlmock.AnyArg()).WillReturnRows(rows) + }, + expectedStatus: http.StatusOK, + expectedContentType: "application/json", + }, + { + name: "Error getting Server by ID", + requestParam: "test", + mockBehavior: func() {}, + expectedStatus: http.StatusInternalServerError, + expectedContentType: "", + }, } - // Vérifier le corps de la réponse - var responseServer db.Server - err = json.NewDecoder(rr.Body).Decode(&responseServer) - if err != nil { - t.Fatal("Error decoding json request", err) - } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tt.mockBehavior() - if !reflect.DeepEqual(responseServer, mockServer) { - t.Errorf("handler returned unexpected body: got %v want %v", - responseServer, mockServer) - } + req, err := http.NewRequest("GET", "/server/", nil) + if err != nil { + t.Fatal(err) + } + req = mux.SetURLVars(req, map[string]string{"id": tt.requestParam}) - // Vérifier que toutes les attentes ont été satisfaites - if err := mock.ExpectationsWereMet(); err != nil { - t.Errorf("there were unfulfilled expectations: %s", err) + rr := httptest.NewRecorder() + handler := http.HandlerFunc(GetServersbyID) + handler.ServeHTTP(rr, req) + + if status := rr.Code; status != tt.expectedStatus { + t.Errorf("handler returned wrong status code: got %v want %v", + status, tt.expectedStatus) + } + + if ct := rr.Header().Get("Content-Type"); ct != tt.expectedContentType { + t.Errorf("handler returned wrong content type: got %v want %v", + ct, tt.expectedContentType) + } + + var responseServer []db.Server + if len(responseServer) > 0 { + err = json.NewDecoder(rr.Body).Decode(&responseServer) + if err != nil { + t.Fatal("Error decoding json request", err) + } + + if !reflect.DeepEqual(responseServer, mockServer) { + t.Errorf("handler returned unexpected body: got %v want %v", + responseServer, mockServer) + } + + } + if err := mock.ExpectationsWereMet(); err != nil { + t.Errorf("there were unfulfilled expectations: %s", err) + } + }) } }