150 lines
3.8 KiB
Go
150 lines
3.8 KiB
Go
package handlers_test
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
"cangui/whatsapp/backend/handlers"
|
|
"cangui/whatsapp/backend/models"
|
|
"github.com/gorilla/mux"
|
|
"github.com/stretchr/testify/assert"
|
|
"golang.org/x/crypto/bcrypt"
|
|
"gorm.io/driver/sqlite"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
func initTestDB() *gorm.DB {
|
|
database, _ := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
|
|
database.AutoMigrate(&models.User{}, &models.Consumption{}, &models.MonthlyConsumption{}, &models.Conversation{})
|
|
return database
|
|
}
|
|
|
|
func createTestUser(db *gorm.DB) models.User {
|
|
hash, _ := bcrypt.GenerateFromPassword([]byte("testpass"), bcrypt.DefaultCost)
|
|
user := models.User{
|
|
Email: "test@example.com",
|
|
Password: string(hash),
|
|
SSOID: "ssoid123",
|
|
Role: models.ROLE_ADMIN,
|
|
IsActive: true,
|
|
WhatsappToken: "test-token",
|
|
WhatsappPhoneNumberID: "123456",
|
|
}
|
|
db.Create(&user)
|
|
return user
|
|
}
|
|
|
|
func TestCreateUser(t *testing.T) {
|
|
db := initTestDB()
|
|
h := handlers.CreateUser(db)
|
|
|
|
user := models.User{
|
|
Email: "new@example.com",
|
|
Password: "newpass",
|
|
SSOID: "newssoid",
|
|
Role: models.ROLE_CLIENT,
|
|
}
|
|
body, _ := json.Marshal(user)
|
|
r := httptest.NewRequest("POST", "/api/user/create", bytes.NewReader(body))
|
|
r.Header.Set("Content-Type", "application/json")
|
|
w := httptest.NewRecorder()
|
|
|
|
h(w, r)
|
|
assert.Equal(t, http.StatusOK, w.Code)
|
|
}
|
|
|
|
func TestLoginHandler_Invalid(t *testing.T) {
|
|
db := initTestDB()
|
|
h := handlers.LoginHandler(db)
|
|
r := httptest.NewRequest("POST", "/api/login", bytes.NewReader([]byte(`{}`)))
|
|
r.Header.Set("Content-Type", "application/json")
|
|
w := httptest.NewRecorder()
|
|
h(w, r)
|
|
assert.Equal(t, http.StatusUnauthorized, w.Code)
|
|
}
|
|
|
|
func TestSendWhatsAppMessage_Unauthorized(t *testing.T) {
|
|
db := initTestDB()
|
|
h := handlers.SendWhatsAppMessage(db)
|
|
r := httptest.NewRequest("POST", "/api/message/send", nil)
|
|
w := httptest.NewRecorder()
|
|
h(w, r)
|
|
assert.Equal(t, http.StatusUnauthorized, w.Code)
|
|
}
|
|
|
|
func TestBuildMessageFromPayload_Text(t *testing.T) {
|
|
payload := map[string]interface{}{
|
|
"to": "33600000000",
|
|
"type": "text",
|
|
"text": map[string]interface{}{"body": "Bonjour"},
|
|
}
|
|
msg, err := models.BuildMessageFromPayload(payload)
|
|
assert.NoError(t, err)
|
|
assert.NotNil(t, msg)
|
|
}
|
|
|
|
func TestBuildMessageFromPayload_Invalid(t *testing.T) {
|
|
payload := map[string]interface{}{
|
|
"to": "33600000000",
|
|
"type": "unknown",
|
|
}
|
|
_, err := models.BuildMessageFromPayload(payload)
|
|
assert.Error(t, err)
|
|
}
|
|
|
|
func TestGetAllUsers(t *testing.T) {
|
|
db := initTestDB()
|
|
createTestUser(db)
|
|
h := handlers.GetAllUsers(db)
|
|
w := httptest.NewRecorder()
|
|
r := httptest.NewRequest("GET", "/api/user/all", nil)
|
|
h(w, r)
|
|
assert.Equal(t, http.StatusOK, w.Code)
|
|
}
|
|
|
|
func TestGetUserByID(t *testing.T) {
|
|
db := initTestDB()
|
|
user := createTestUser(db)
|
|
h := handlers.GetUserByID(db)
|
|
r := httptest.NewRequest("GET", "/api/user/1", nil)
|
|
r = mux.SetURLVars(r, map[string]string{"id": "1"})
|
|
w := httptest.NewRecorder()
|
|
h(w, r)
|
|
assert.Equal(t, http.StatusOK, w.Code)
|
|
var u models.User
|
|
json.Unmarshal(w.Body.Bytes(), &u)
|
|
assert.Equal(t, user.Email, u.Email)
|
|
}
|
|
|
|
func TestUpdateUser(t *testing.T) {
|
|
db := initTestDB()
|
|
createTestUser(db)
|
|
h := handlers.UpdateUser(db)
|
|
|
|
updated := map[string]interface{}{
|
|
"email": "updated@example.com",
|
|
"role": "ADMIN",
|
|
"is_active": true,
|
|
}
|
|
body, _ := json.Marshal(updated)
|
|
r := httptest.NewRequest("PUT", "/api/user/update/1", bytes.NewReader(body))
|
|
r = mux.SetURLVars(r, map[string]string{"id": "1"})
|
|
r.Header.Set("Content-Type", "application/json")
|
|
w := httptest.NewRecorder()
|
|
h(w, r)
|
|
assert.Equal(t, http.StatusOK, w.Code)
|
|
}
|
|
|
|
func TestDeleteUser(t *testing.T) {
|
|
db := initTestDB()
|
|
createTestUser(db)
|
|
h := handlers.DeleteUser(db)
|
|
r := httptest.NewRequest("DELETE", "/api/user/delete/1", nil)
|
|
r = mux.SetURLVars(r, map[string]string{"id": "1"})
|
|
w := httptest.NewRecorder()
|
|
h(w, r)
|
|
assert.Equal(t, http.StatusNoContent, w.Code)
|
|
}
|