From 49e682994ffebfb49046f5f10fec584d7c75e43c Mon Sep 17 00:00:00 2001 From: CristyNel Date: Sun, 6 Oct 2024 18:46:37 +0100 Subject: [PATCH] Update venom tests --- .github/workflows/D-comp.yml | 76 ------------------- .github/workflows/git_envs.yml | 76 +++++++++++++++++++ .github/workflows/unit-tests.yml | 2 +- .github/workflows/venom-tests.yml | 100 +++++++++++-------------- api/cmd/main.go | 15 ++-- api/go.mod | 2 +- api/handlers/home.go | 8 +- api/handlers/home_test.go | 4 +- api/handlers/templates.go | 6 +- api/handlers/templates_test.go | 2 +- api/handlers/users.go | 100 ++++++++++++++----------- api/internal/app/app.go | 2 + api/internal/utils/utils.go | 2 +- api/internal/utils/utils_test.go | 4 +- api/mock/mock_db.go | 2 +- api/routes/router.go | 9 +-- api/tests/e2etests.yml | 117 +++++++++++++++++++++++++----- docker-compose.yml | 52 +++++++++---- 18 files changed, 343 insertions(+), 236 deletions(-) delete mode 100644 .github/workflows/D-comp.yml create mode 100644 .github/workflows/git_envs.yml diff --git a/.github/workflows/D-comp.yml b/.github/workflows/D-comp.yml deleted file mode 100644 index 2053669..0000000 --- a/.github/workflows/D-comp.yml +++ /dev/null @@ -1,76 +0,0 @@ -# * .github/docker-compose.yml ---- -name: CI - -on: - push: - branches: - - main - pull_request: - branches: - - main - -jobs: - build: - runs-on: ubuntu-latest - - services: - cv_db-service: - image: mysql:9.0 - env: - MYSQL_ROOT_PASSWORD: ${{ secrets.MYSQL_ROOT_PASSWORD }} - MYSQL_DATABASE: ${{ secrets.MYSQL_DATABASE }} - MYSQL_USER: ${{ secrets.MYSQL_USER }} - MYSQL_PASSWORD: ${{ secrets.MYSQL_PASSWORD }} - MYSQL_CONTAINER: ${{ secrets.MYSQL_CONTAINER }} - ports: - - 3307:3306 - options: >- - --health-cmd="mysqladmin ping -h localhost" - --health-interval=12s - --health-timeout=8s - --health-retries=5 - --health-start-period=5s - volumes: - - ./sql/schemadump.sql:/docker-entrypoint-initdb.d/dump.sql - - steps: - - name: Checkout code - uses: actions/checkout@v2 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 - - - name: Build and push API service - uses: docker/build-push-action@v2 - with: - context: . - file: Dockerfile.api - push: false - tags: ${{ secrets.API_IMG }}:${{ secrets.API_TAG }} - - - name: Build and push BFF service - uses: docker/build-push-action@v2 - with: - context: . - file: Dockerfile.bff - push: false - tags: ${{ secrets.BFF_IMG }}:${{ secrets.BFF_TAG }} - - - name: Run Docker Compose - run: docker-compose up --build -d - env: - MYSQL_ROOT_PASSWORD: ${{ secrets.MYSQL_ROOT_PASSWORD }} - MYSQL_DATABASE: ${{ secrets.MYSQL_DATABASE }} - MYSQL_USER: ${{ secrets.MYSQL_USER }} - MYSQL_PASSWORD: ${{ secrets.MYSQL_PASSWORD }} - MYSQL_CONTAINER: ${{ secrets.MYSQL_CONTAINER }} - API_IMG: ${{ secrets.API_IMG }} - API_TAG: ${{ secrets.API_TAG }} - API_CONTAINER: ${{ secrets.API_CONTAINER }} - MYSQL_HOST: ${{ secrets.MYSQL_HOST }} - BFF_IMG: ${{ secrets.BFF_IMG }} - BFF_TAG: ${{ secrets.BFF_TAG }} - BFF_CONTAINER: ${{ secrets.BFF_CONTAINER }} - API_IP: ${{ secrets.API_IP }} - API_PORT: ${{ secrets.API_PORT }} diff --git a/.github/workflows/git_envs.yml b/.github/workflows/git_envs.yml new file mode 100644 index 0000000..2437464 --- /dev/null +++ b/.github/workflows/git_envs.yml @@ -0,0 +1,76 @@ +# .github/workflows/git_envs.yml +name: 💻 Display Variables + +on: + push: + branches: + - main + +jobs: + display-vars: + runs-on: ubuntu-latest + environment: CV_project-staging + + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Display Environment Variables + env: + API_CONTAINER: ${{ vars.API_CONTAINER }} + API_HOST: ${{ vars.API_HOST }} + API_IMG: ${{ vars.API_IMG }} + API_IP: ${{ vars.API_IP }} + API_PORT: ${{ vars.API_PORT }} + API_SERVICE: ${{ vars.API_SERVICE }} + API_TAG: ${{ vars.API_TAG }} + API_URL: ${{ vars.API_URL }} + BFF_CONTAINER: ${{ vars.BFF_CONTAINER }} + BFF_HOST: ${{ vars.BFF_HOST }} + BFF_IMG: ${{ vars.BFF_IMG }} + BFF_IP: ${{ vars.BFF_IP }} + BFF_PORT: ${{ vars.BFF_PORT }} + BFF_SERVICE: ${{ vars.BFF_SERVICE }} + BFF_TAG: ${{ vars.BFF_TAG }} + CV_NETWORK: ${{ vars.CV_NETWORK }} + MYSQL_ADDR: ${{ vars.MYSQL_ADDR }} + MYSQL_CONTAINER: ${{ vars.MYSQL_CONTAINER }} + MYSQL_DATABASE: ${{ vars.MYSQL_DATABASE }} + MYSQL_HOST: ${{ vars.MYSQL_HOST }} + MYSQL_IMG: ${{ vars.MYSQL_IMG }} + MYSQL_IP: ${{ vars.MYSQL_IP }} + MYSQL_LOCAL_IP: ${{ vars.MYSQL_LOCAL_IP }} + run: | + echo -e '\033[94;1m * * * 🛠️ Displaying Environment Variables' + echo "API_CONTAINER=${API_CONTAINER}" + echo "API_HOST=${API_HOST}" + echo "API_IMG=${API_IMG}" + echo "API_IP=${API_IP}" + echo "API_PORT=${API_PORT}" + echo "API_SERVICE=${API_SERVICE}" + echo "API_TAG=${API_TAG}" + echo "API_URL=${API_URL}" + echo "BFF_CONTAINER=${BFF_CONTAINER}" + echo "BFF_HOST=${BFF_HOST}" + echo "BFF_IMG=${BFF_IMG}" + echo "BFF_IP=${BFF_IP}" + echo "BFF_PORT=${BFF_PORT}" + echo "BFF_SERVICE=${BFF_SERVICE}" + echo "BFF_TAG=${BFF_TAG}" + echo "CV_NETWORK=${CV_NETWORK}" + echo "MYSQL_ADDR=${MYSQL_ADDR}" + echo "MYSQL_CONTAINER=${MYSQL_CONTAINER}" + echo "MYSQL_DATABASE=${MYSQL_DATABASE}" + echo "MYSQL_HOST=${MYSQL_HOST}" + echo "MYSQL_IMG=${MYSQL_IMG}" + echo "MYSQL_IP=${MYSQL_IP}" + echo "MYSQL_LOCAL_IP=${MYSQL_LOCAL_IP}" + + - name: Display Secrets + env: + MYSQL_ROOT_PASSWORD: ${{ secrets.MYSQL_ROOT_PASSWORD }} + MYSQL_PASSWORD: ${{ secrets.MYSQL_PASSWORD }} + run: | + echo -e '\033[94;1m * * * 🛠️ Displaying Secrets' + echo "MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}" + echo "MYSQL_PASSWORD=${MYSQL_PASSWORD}" diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index e61ff74..80e2330 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -1,6 +1,6 @@ #? CV_project/.github/workflows/unit-tests.yml --- -name: unit tests +name: 🔩 Unit tests on: push: diff --git a/.github/workflows/venom-tests.yml b/.github/workflows/venom-tests.yml index b195c46..bec868e 100644 --- a/.github/workflows/venom-tests.yml +++ b/.github/workflows/venom-tests.yml @@ -1,6 +1,6 @@ #? CV_project/.github/workflows/venom-tests.yml --- -name: venom tests +name: 🐍 Venom tests # events workflow on: @@ -15,63 +15,49 @@ on: jobs: venom-tests: runs-on: ubuntu-latest - + environment: CV_project-staging steps: - - name: checkout code - uses: actions/checkout@v4 - - - name: set up go - uses: actions/setup-go@v5 - with: - go-version: 1.23.1 - - # - name: Verify go installation - # run: | - # echo -e '\033[94;1m * * * 🔗 pwd = '$(pwd) '\n\033[94;1m * * * 🐹 Go version' - # go version - - # - name: Install dependencies - # working-directory: ./api - # run: | - # echo -e '\033[94;1m * * * 🔗 pwd = '$(pwd) '\n\033[94;1m * * * 🧰 Install dependencies' - # go mod tidy + - name: Checkout + uses: actions/checkout@main - # - name: Install docker compose - # run: | - # echo -e '\033[94;1m * * * 🐳 Installing docker compose' - # sudo curl -L "https://github.com/docker/compose/releases/download/v2.21.0/docker-compose-linux-x86_64" -o /usr/local/bin/docker-compose - # sudo chmod +x /usr/local/bin/docker-compose - - # - name: Set up Docker Compose - # run: | - # echo -e '\033[94;1m * * * 🛠️ Set up Docker' - # docker-compose -f ./docker-compose.yml up -d - # env: - # MYSQL_CONTAINER: ${{ secrets.MYSQL_CONTAINER }} - # MYSQL_ROOT_PASSWORD: ${{ secrets.MYSQL_ROOT_PASSWORD }} - # MYSQL_DATABASE: ${{ secrets.MYSQL_DATABASE }} - # MYSQL_USER: ${{ secrets.MYSQL_USER }} - # MYSQL_PASSWORD: ${{ secrets.MYSQL_PASSWORD }} - # API_IMG: ${{ secrets.API_IMG }} - # API_TAG: ${{ secrets.API_TAG }} - # API_CONTAINER: ${{ secrets.API_CONTAINER }} - # BFF_IMG: ${{ secrets.BFF_IMG }} - # BFF_TAG: ${{ secrets.BFF_TAG }} - # BFF_CONTAINER: ${{ secrets.BFF_CONTAINER }} - - - name: Install venom + - name: Install docker compose run: | - echo -e '\033[94;1m * * * 🐍 Installing venom' - curl https://github.com/ovh/venom/releases/download/v1.0.1/venom.linux-amd64 -L -o /usr/local/bin/venom - chmod +x /usr/local/bin/venom - - - name: Run e2e tests - working-directory: ./api/tests + echo -e '\033[94;1m * * * 🐳 Installing docker compose' + sudo curl -L "https://github.com/docker/compose/releases/download/v2.21.0/docker-compose-linux-x86_64" -o /usr/local/bin/docker-compose + sudo chmod +x /usr/local/bin/docker-compose + + - name: Set up Docker Compose + env: + MYSQL_ROOT_PASSWORD: ${{ secrets.MYSQL_ROOT_PASSWORD }} + MYSQL_PASSWORD: ${{ secrets.MYSQL_PASSWORD }} + MYSQL_ROOT_USER: ${{ secrets.MYSQL_ROOT_USER }} + MYSQL_USER: ${{ secrets.MYSQL_USER }} + API_CONTAINER: ${{ vars.API_CONTAINER }} + API_HOST: ${{ vars.API_HOST }} + API_IMG: ${{ vars.API_IMG }} + API_IP: ${{ vars.API_IP }} + API_PORT: ${{ vars.API_PORT }} + API_SERVICE: ${{ vars.API_SERVICE }} + API_TAG: ${{ vars.API_TAG }} + API_URL: ${{ vars.API_URL }} + BFF_CONTAINER: ${{ vars.BFF_CONTAINER }} + BFF_HOST: ${{ vars.BFF_HOST }} + BFF_IMG: ${{ vars.BFF_IMG }} + BFF_IP: ${{ vars.BFF_IP }} + BFF_PORT: ${{ vars.BFF_PORT }} + BFF_SERVICE: ${{ vars.BFF_SERVICE }} + BFF_TAG: ${{ vars.BFF_TAG }} + CV_NETWORK: ${{ vars.CV_NETWORK }} + MYSQL_ADDR: ${{ vars.MYSQL_ADDR }} + MYSQL_CONTAINER: ${{ vars.MYSQL_CONTAINER }} + MYSQL_DATABASE: ${{ vars.MYSQL_DATABASE }} + MYSQL_HOST: ${{ vars.MYSQL_HOST }} + MYSQL_IMG: ${{ vars.MYSQL_IMG }} + MYSQL_IP: ${{ vars.MYSQL_IP }} + MYSQL_LOCAL_IP: ${{ vars.MYSQL_LOCAL_IP }} run: | - echo -e '\033[94;1m * * * 🔗 pwd = '$(pwd) '\n\033[94;1m * * * ⭐ Run e2e tests' - venom run e2etests.yml - - # - name: Stop docker compose - # run: | - # echo -e '\033[94;1m * * * ❌ Stop docker compose' - # docker-compose -f ./docker-compose.yml down --volumes + echo -e '\033[94;1m * * * 🛠️ Set up Docker''\033[94;1m * * * 🔗 pwd = '$(pwd) '\n\033[94;1m * * * ⭐ Run e2e tests' + echo 0 > venom-status.txt + docker-compose -f ./docker-compose.yml --profile=test up --build --exit-code-from cv_venom-service || echo $$ > venom-status.txt + exit `cat venom-status.txt` + working-directory: . diff --git a/api/cmd/main.go b/api/cmd/main.go index c15e319..a418850 100644 --- a/api/cmd/main.go +++ b/api/cmd/main.go @@ -7,10 +7,10 @@ import ( "log" "net/http" - "github.com/damarisnicolae/CV_project/api/internal/app" - "github.com/damarisnicolae/CV_project/api/internal/database" - "github.com/damarisnicolae/CV_project/api/mock" - "github.com/damarisnicolae/CV_project/api/routes" + "github.com/CristyNel/CV_project/tree/main/api/internal/app" + "github.com/CristyNel/CV_project/tree/main/api/internal/database" + "github.com/CristyNel/CV_project/tree/main/api/mock" + "github.com/CristyNel/CV_project/tree/main/api/routes" ) func main() { @@ -18,18 +18,17 @@ func main() { Db, err := database.ConnectToDatabases(sql.Open) if err != nil { - log.Printf("\033[1;31;1m * Failed to connect to the database: %v\033[0m", err) + log.Printf("\033[1;31;1m * * * 🚨 Failed to connect to the database: %v\033[0m", err) return } defer Db.Close() if Db == nil { - log.Fatalf("\033[1;31;1m * Failed to initialize the database connection.\033[0m") + log.Fatalf("\033[1;31;1m * * * 🚨 Failed to initialize the database connection.\033[0m") } // Use the mock logger logger := mock.NewMockLogger() - app := &app.App{ DB: Db, Logger: logger, @@ -37,7 +36,7 @@ func main() { r := routes.InitializeRouter(app) - app.Logger.Printf("\n\033[1;37;1m * * * Starting the HTTP server on port: ➮\033[1;94;1m 8080\033[0m") + app.Logger.Printf("\n\033[1;37;1m * * * 🛫 Starting the HTTP server on port: ➮\033[1;94;1m 8080\033[0m") if err := http.ListenAndServe(":8080", r); err != nil { app.Logger.Fatalf("\n * Failed to start HTTP server: %s\n", err) } diff --git a/api/go.mod b/api/go.mod index 3e861fe..f6ed8d7 100644 --- a/api/go.mod +++ b/api/go.mod @@ -1,5 +1,5 @@ // bcn/github/CV_project/api/go.mod -module github.com/damarisnicolae/CV_project/api +module github.com/CristyNel/CV_project/tree/main/api go 1.22 diff --git a/api/handlers/home.go b/api/handlers/home.go index 63fe060..13ce1d7 100644 --- a/api/handlers/home.go +++ b/api/handlers/home.go @@ -5,12 +5,12 @@ import ( "encoding/json" "net/http" - "github.com/damarisnicolae/CV_project/api/internal/app" - "github.com/damarisnicolae/CV_project/api/models" + "github.com/CristyNel/CV_project/tree/main/api/internal/app" + "github.com/CristyNel/CV_project/tree/main/api/models" ) func HomeUsers(app *app.App, w http.ResponseWriter, r *http.Request) { - app.Logger.Println("Received request for /users") + app.Logger.Println(" * * * ☎️ Received request for /users") if r.Method != "GET" { w.WriteHeader(http.StatusMethodNotAllowed) @@ -47,7 +47,7 @@ func Home(app *app.App, w http.ResponseWriter, r *http.Request) { return } - app.Logger.Println("Received request for /") + app.Logger.Println(" * * * ☎️ Received request for /") rows, err := app.DB.Query("SELECT id, jobtitle, firstname, lastname, email, phone, address, city, country, postalcode, dateofbirth, nationality, summary, workexperience, education, skills, languages FROM users") if err != nil { diff --git a/api/handlers/home_test.go b/api/handlers/home_test.go index ebe1aae..9b59214 100644 --- a/api/handlers/home_test.go +++ b/api/handlers/home_test.go @@ -7,9 +7,9 @@ import ( "net/http/httptest" "testing" + "github.com/CristyNel/CV_project/tree/main/api/mock" + "github.com/CristyNel/CV_project/tree/main/api/models" "github.com/DATA-DOG/go-sqlmock" - "github.com/damarisnicolae/CV_project/api/mock" - "github.com/damarisnicolae/CV_project/api/models" "github.com/stretchr/testify/assert" ) diff --git a/api/handlers/templates.go b/api/handlers/templates.go index a5644a9..a2a9c1a 100644 --- a/api/handlers/templates.go +++ b/api/handlers/templates.go @@ -11,10 +11,10 @@ import ( "strconv" "strings" + "github.com/CristyNel/CV_project/tree/main/api/internal/app" + "github.com/CristyNel/CV_project/tree/main/api/internal/utils" + "github.com/CristyNel/CV_project/tree/main/api/models" wkhtml "github.com/SebastiaanKlippert/go-wkhtmltopdf" - "github.com/damarisnicolae/CV_project/api/internal/app" - "github.com/damarisnicolae/CV_project/api/internal/utils" - "github.com/damarisnicolae/CV_project/api/models" ) func GenerateTemplate(app *app.App, w http.ResponseWriter, r *http.Request) { diff --git a/api/handlers/templates_test.go b/api/handlers/templates_test.go index a745178..516cd1e 100644 --- a/api/handlers/templates_test.go +++ b/api/handlers/templates_test.go @@ -10,9 +10,9 @@ import ( "path/filepath" "testing" + "github.com/CristyNel/CV_project/tree/main/api/mock" "github.com/DATA-DOG/go-sqlmock" wkhtml "github.com/SebastiaanKlippert/go-wkhtmltopdf" - "github.com/damarisnicolae/CV_project/api/mock" "github.com/stretchr/testify/assert" ) diff --git a/api/handlers/users.go b/api/handlers/users.go index 97e33bb..2ccac47 100644 --- a/api/handlers/users.go +++ b/api/handlers/users.go @@ -8,48 +8,54 @@ import ( "strconv" "strings" - "github.com/damarisnicolae/CV_project/api/internal/app" - "github.com/damarisnicolae/CV_project/api/internal/utils" - "github.com/damarisnicolae/CV_project/api/models" + "github.com/CristyNel/CV_project/tree/main/api/internal/app" + "github.com/CristyNel/CV_project/tree/main/api/internal/utils" + "github.com/CristyNel/CV_project/tree/main/api/models" "github.com/gorilla/mux" "golang.org/x/crypto/bcrypt" ) +// SignupRequest represents the request payload for user signup +type SignupRequest struct { + Email string `json:"email"` + Password string `json:"password"` +} + func LoginHandler(app *app.App, w http.ResponseWriter, r *http.Request) { - app.Logger.Println("Received request for /login") - - if err := r.ParseForm(); err != nil { - app.Logger.Println("Error parsing form:", err) - http.Error(w, "Internal Server Error", http.StatusInternalServerError) - return - } - - username := strings.TrimSpace(r.Form.Get("username")) - password := r.Form.Get("password") - - app.Logger.Println("Parsed form data - Username:", username) // , "Password:", password - - if username == "" || password == "" { - app.Logger.Println("Missing username or password") - http.Error(w, "Bad Request", http.StatusBadRequest) - return - } - - if utils.VerifyLogin(app, username, password) { - response := struct { - Username string `json:"username"` - }{ - Username: username, - } - - w.Header().Set("Content-Type", "application/json") - utils.SetSession(app, username, w) - w.WriteHeader(http.StatusOK) - json.NewEncoder(w).Encode(response) - } else { - app.Logger.Println("Unauthorized access attempt by:", username) - http.Error(w, "Unauthorized", http.StatusUnauthorized) - } + app.Logger.Println("Received request for /login") + + if err := r.ParseForm(); err != nil { + app.Logger.Println("Error parsing form:", err) + http.Error(w, "Internal Server Error", http.StatusInternalServerError) + return + } + + username := strings.TrimSpace(r.Form.Get("username")) + password := r.Form.Get("password") + + app.Logger.Println("Parsed form data - Username:", username) // , "Password:", password + + if username == "" || password == "" { + app.Logger.Println("Missing username or password") + http.Error(w, "Bad Request", http.StatusBadRequest) + return + } + + if utils.VerifyLogin(app, username, password) { + response := struct { + Username string `json:"username"` + }{ + Username: username, + } + + w.Header().Set("Content-Type", "application/json") + utils.SetSession(app, username, w) + w.WriteHeader(http.StatusOK) + json.NewEncoder(w).Encode(response) + } else { + app.Logger.Println("Unauthorized access attempt by:", username) + http.Error(w, "Unauthorized", http.StatusUnauthorized) + } } func LogoutHandler(app *app.App, w http.ResponseWriter, r *http.Request) { @@ -70,15 +76,23 @@ func LogoutHandler(app *app.App, w http.ResponseWriter, r *http.Request) { func SignupHandler(app *app.App, w http.ResponseWriter, r *http.Request) { app.Logger.Println("Received request for /signup") - err := r.ParseForm() + // Check if the Content-Type is application/json + if r.Header.Get("Content-Type") != "application/json" { + http.Error(w, "Invalid Content-Type", http.StatusUnsupportedMediaType) + return + } + + // Decode the JSON request body + var req SignupRequest + err := json.NewDecoder(r.Body).Decode(&req) if err != nil { - app.Logger.Println("Error parse form: ", err) - http.Error(w, err.Error(), http.StatusInternalServerError) + app.Logger.Println("Error decoding JSON: ", err) + http.Error(w, err.Error(), http.StatusBadRequest) return } - email := strings.TrimSpace(r.Form.Get("email")) - password := r.Form.Get("password") + email := strings.TrimSpace(req.Email) + password := req.Password if email == "" || password == "" { http.Error(w, "Bad Request", http.StatusBadRequest) @@ -98,7 +112,7 @@ func SignupHandler(app *app.App, w http.ResponseWriter, r *http.Request) { return } - w.WriteHeader(http.StatusNoContent) + w.WriteHeader(http.StatusCreated) w.Write([]byte("User signup successfully")) } diff --git a/api/internal/app/app.go b/api/internal/app/app.go index 70fcda7..94fedf5 100644 --- a/api/internal/app/app.go +++ b/api/internal/app/app.go @@ -19,3 +19,5 @@ type App struct { DB *sql.DB Logger Logger } + + diff --git a/api/internal/utils/utils.go b/api/internal/utils/utils.go index 5c3cbb6..a856cba 100644 --- a/api/internal/utils/utils.go +++ b/api/internal/utils/utils.go @@ -8,7 +8,7 @@ import ( "net/http" "os" - "github.com/damarisnicolae/CV_project/api/internal/app" + "github.com/CristyNel/CV_project/tree/main/api/internal/app" "github.com/gorilla/securecookie" "golang.org/x/crypto/bcrypt" ) diff --git a/api/internal/utils/utils_test.go b/api/internal/utils/utils_test.go index 7614b54..07fb2b8 100644 --- a/api/internal/utils/utils_test.go +++ b/api/internal/utils/utils_test.go @@ -9,8 +9,8 @@ import ( "os" "testing" - "github.com/damarisnicolae/CV_project/api/internal/app" - "github.com/damarisnicolae/CV_project/api/mock" + "github.com/CristyNel/CV_project/tree/main/api/internal/app" + "github.com/CristyNel/CV_project/tree/main/api/mock" "github.com/gorilla/securecookie" _ "github.com/mattn/go-sqlite3" "github.com/stretchr/testify/assert" diff --git a/api/mock/mock_db.go b/api/mock/mock_db.go index 5677553..985aa24 100644 --- a/api/mock/mock_db.go +++ b/api/mock/mock_db.go @@ -5,8 +5,8 @@ import ( "database/sql" "testing" + "github.com/CristyNel/CV_project/tree/main/api/internal/app" "github.com/DATA-DOG/go-sqlmock" - "github.com/damarisnicolae/CV_project/api/internal/app" "github.com/sirupsen/logrus" ) diff --git a/api/routes/router.go b/api/routes/router.go index 32b555f..0d21a9c 100644 --- a/api/routes/router.go +++ b/api/routes/router.go @@ -4,9 +4,8 @@ package routes import ( "net/http" - "github.com/damarisnicolae/CV_project/api/handlers" - "github.com/damarisnicolae/CV_project/api/internal/app" - + "github.com/CristyNel/CV_project/tree/main/api/handlers" + "github.com/CristyNel/CV_project/tree/main/api/internal/app" "github.com/gorilla/mux" ) @@ -31,8 +30,8 @@ func InitializeRouter(app *app.App) *mux.Router { }).Methods("POST") r.HandleFunc("/user/{id}", func(w http.ResponseWriter, r *http.Request) { - handlers.ShowUser(app, w, r) // <-- Added this route - }).Methods("GET") + handlers.ShowUser(app, w, r) // <-- Added this route + }).Methods("GET") r.HandleFunc("/user/{id}", func(w http.ResponseWriter, r *http.Request) { handlers.UpdateUser(app, w, r) diff --git a/api/tests/e2etests.yml b/api/tests/e2etests.yml index a5e76e3..8db90dc 100644 --- a/api/tests/e2etests.yml +++ b/api/tests/e2etests.yml @@ -3,35 +3,118 @@ name: API E2E Tests vars: sql_ip: "" - api_ip: "" + api_ip: "cv_api-service" + username: "{{ MYSQL_USER }}" + user_password: "{{ MYSQL_PASSWORD }}" testcases: - - name: Fetch DB Container IP + - name: Home steps: - - type: exec - script: docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' cv_db-container + - type: http + method: GET + url: "http://{{.api_ip}}:8080/" assertions: - - result.code ShouldEqual 0 - extract: - sql_ip: result.systemout + - result.statuscode ShouldEqual 200 - - name: Fetch API Container IP + - name: HomeUsers steps: - - type: exec - script: docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' cv_api-container + - type: http + method: GET + url: "http://{{.api_ip}}:8080/users" assertions: - - result.code ShouldEqual 0 - extract: - api_ip: result.systemout + - result.statuscode ShouldEqual 200 + + - name: ShowUser + steps: + - type: http + method: GET + url: "http://{{.api_ip}}:8080/user/6" + assertions: + - result.statuscode ShouldEqual 200 + + - name: ShowUsers + steps: + - type: http + method: GET + url: "http://{{.api_ip}}:8080/user" + assertions: + - result.statuscode ShouldEqual 200 - name: DeleteUser steps: - type: http method: DELETE - # url: "http://cv_api-service:8080/user/2" only if manualy solve ip - # url: "http://172.26.0.3:8080/user/5" # merge - url: "http://{{.api_ip}}:8080/user/7" # merge + url: "http://{{.api_ip}}:8080/user/6" + assertions: + - result.statuscode ShouldEqual 204 + + - name: UpdateUser + steps: + - type: http + method: PUT + url: "http://{{.api_ip}}:8080/user/6" headers: Content-Type: application/json + body: '{"name": "cristy buliga", "email": "cristybuliga@example.com"}' assertions: - - result.statuscode ShouldEqual 204 + - result.statuscode ShouldEqual 200 + + - name: HealthCheck + steps: + - type: http + method: GET + url: "http://{{.api_ip}}:8080/health" + assertions: + - result.statuscode ShouldEqual 200 +# failing test + +# - name: CreateUser +# steps: +# - type: http +# method: POST +# url: "http://{{.api_ip}}:8080/user" +# headers: +# Content-Type: application/json +# body: '{"name": "cristy buliga", "email": "cristybuliga@example.com"}' +# assertions: +# - result.statuscode ShouldEqual 201 + +# - name: GenerateTemplate +# steps: +# - type: http +# method: GET +# url: "http://{{.api_ip}}:8080/pdf" +# assertions: +# - result.statuscode ShouldEqual 200 + +# - name: Login +# steps: +# - type: http +# method: POST +# url: "http://cv_bff-service:5000/login" +# headers: +# Content-Type: application/json +# body: '{"username": "{{.username}}", "password": "{{.user_password}}"}' +# assertions: +# - result.statuscode ShouldEqual 200 + +# - name: Signup +# steps: +# - type: http +# method: POST +# url: "http://{{.api_ip}}:8080/signup" +# headers: +# Content-Type: application/json +# body: '{"username": "Nelu", "password": "pass"}' +# assertions: +# - result.statuscode ShouldEqual 201 + +# +# - name: Logout +# steps: +# - type: http +# method: POST +# url: "http://{{.api_ip}}:8080/logout" +# assertions: +# - result.statuscode ShouldEqual 200 + diff --git a/docker-compose.yml b/docker-compose.yml index f341eb9..cfece5c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,8 +1,8 @@ # ./docker-compose.yml services: cv_db-service: - env_file: - - ./.secrets + # env_file: + # - ./.secrets environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_DATABASE: ${MYSQL_DATABASE} @@ -28,8 +28,8 @@ services: command: mysqld cv_api-service: - env_file: - - ./.secrets + # env_file: + # - ./.secrets environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_DATABASE: ${MYSQL_DATABASE} @@ -54,8 +54,8 @@ services: restart: always cv_bff-service: - env_file: - - ./.secrets + # env_file: + # - ./.secrets environment: BFF_IMG: ${BFF_IMG} BFF_TAG: ${BFF_TAG} @@ -76,6 +76,38 @@ services: cv_db-service: condition: service_healthy + cv_venom-service: + container_name: cv_venom-container + image: alpine:3.12 #curl -s https://registry.hub.docker.com/v2/repositories/ovhcom/venom/tags | jq -r '.results[] | .name + " - " + (.last_updated | split("T")[0])' | sort -t '-' -k 2 -r + profiles: [ "test" ] + # env_file: + # - ./.secrets + environment: + MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} + MYSQL_DATABASE: ${MYSQL_DATABASE} + MYSQL_USER: ${MYSQL_USER} + MYSQL_PASSWORD: ${MYSQL_PASSWORD} + MYSQL_HOST: ${MYSQL_HOST} + # api + API_CONTAINER: ${API_CONTAINER} + API_IP: ${API_IP} + API_PORT: ${API_PORT} + # bff + BFF_IMG: ${BFF_IMG} + BFF_TAG: ${BFF_TAG} + BFF_CONTAINER: ${BFF_CONTAINER} + depends_on: + cv_db-service: + condition: service_healthy + entrypoint: [ "sh", "-c", "wget https://github.com/ovh/venom/releases/download/v1.1.0/venom.linux-amd64 -O /usr/local/bin/venom && chmod +x /usr/local/bin/venom && venom run e2etests.yml" ] + volumes: + - ./api/tests:/app + working_dir: /app + networks: + - cv-network + + + networks: cv-network: name: cv-network @@ -88,11 +120,3 @@ networks: # mysql-data: # name: cv_db-volume - # venom: - # build: - # context: tests - # container_name: venom - # profiles: [ "test" ] - # depends_on: - # api: - # condition: service_healthy