Skip to content

Commit

Permalink
wip: migrate to postgres in local dev env
Browse files Browse the repository at this point in the history
  • Loading branch information
shikharish committed Dec 24, 2023
1 parent d70c415 commit 7650ed4
Show file tree
Hide file tree
Showing 18 changed files with 181 additions and 58 deletions.
4 changes: 1 addition & 3 deletions .env.template
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
DEV=false
DEV_DB_PATH=devDB.db
BACKEND_PORT=8080
DATABASE_HOST=
DATABASE_PORT=
DATABASE_NAME=
DATABASE_USERNAME=
DATABASE_PORT=
DATABASE_PASSWORD=
JWT_SECRET_KEY=
JWT_VALIDITY_TIME=720
GH_OAUTH_CLIENT_ID=
Expand Down
5 changes: 3 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
./backend
.env
*.db
/.env
*.db
vendor/
17 changes: 17 additions & 0 deletions docker-compose.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
services:
database:
image: postgres
restart: always
environment:
- POSTGRES_USER=${DATABASE_USERNAME}
- POSTGRES_PASSWORD=${DATABASE_PASSWORD}
- POSTGRES_DB=${DATABASE_NAME}
- PGPORT=${DATABASE_PORT}
- PGHOST=${DATABASE_HOST}
ports:
- ${DATABASE_PORT}:${DATABASE_PORT}
volumes:
- db:/var/lib/postgresql/data

volumes:
db:
11 changes: 11 additions & 0 deletions tests/.env
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
BACKEND_PORT=8080
DATABASE_HOST=localhost
DATABASE_PORT=5432
DATABASE_NAME=testDb
DATABASE_USERNAME=user
DATABASE_PASSWORD=pass
JWT_SECRET_KEY=
JWT_VALIDITY_TIME=720
GH_OAUTH_CLIENT_ID=
GITHUB_OAUTH_CLIENT_SECRET=
ORIGINS_ALLOWED=kwoc.kossiitkgp.org
14 changes: 8 additions & 6 deletions controllers/common_test.go → tests/common_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ import (
"testing"
"time"

"github.com/joho/godotenv"
"github.com/kossiitkgp/kwoc-backend/v2/models"
"github.com/kossiitkgp/kwoc-backend/v2/server"
"github.com/kossiitkgp/kwoc-backend/v2/utils"

Expand Down Expand Up @@ -53,18 +55,18 @@ func expectResponseJSONBodyToBe[T comparable](t *testing.T, res *httptest.Respon
}

func setTestDB() *gorm.DB {
os.Setenv("DEV", "true")
os.Setenv("DEV_DB_PATH", "testDB.db")
_ = godotenv.Load(".env")
db, _ := utils.GetDB()
_ = utils.MigrateModels(db)

return db
}

func unsetTestDB() {
os.Unsetenv("DEV_DB_PATH")
os.Unsetenv("DEV")
os.Remove("testDB.db")
func unsetTestDB(db *gorm.DB) {
db.Session(&gorm.Session{AllowGlobalUpdate: true}).Unscoped().Delete(&models.Mentor{})
db.Session(&gorm.Session{AllowGlobalUpdate: true}).Unscoped().Delete(&models.Student{})
db.Session(&gorm.Session{AllowGlobalUpdate: true}).Unscoped().Delete(&models.Stats{})
db.Session(&gorm.Session{AllowGlobalUpdate: true}).Unscoped().Delete(&models.Project{})
}

func setTestJwtSecretKey() {
Expand Down
17 changes: 17 additions & 0 deletions tests/docker-compose.test.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
services:
database:
image: postgres
restart: always
environment:
- POSTGRES_USER=${DATABASE_USERNAME}
- POSTGRES_PASSWORD=${DATABASE_PASSWORD}
- POSTGRES_DB=${DATABASE_NAME}
- PGPORT=${DATABASE_PORT}
- PGHOST=${DATABASE_HOST}
ports:
- ${DATABASE_PORT}:${DATABASE_PORT}
volumes:
- db:/var/lib/postgresql/data

volumes:
db:
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ func TestPing(t *testing.T) {

func TestHealthCheck(t *testing.T) {
db := setTestDB()
defer unsetTestDB()
defer unsetTestDB(db)

req, _ := http.NewRequest("GET", "/healthcheck/", nil)
res := executeRequest(req, db)
Expand Down
File renamed without changes.
81 changes: 77 additions & 4 deletions controllers/mentor_test.go → tests/mentor_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,13 @@ import (
"bytes"
"encoding/json"
"fmt"
"gorm.io/gorm"
"net/http"
"reflect"
"strings"
"testing"

"gorm.io/gorm"

"github.com/kossiitkgp/kwoc-backend/v2/controllers"
"github.com/kossiitkgp/kwoc-backend/v2/models"
"github.com/kossiitkgp/kwoc-backend/v2/utils"
Expand Down Expand Up @@ -133,7 +134,7 @@ func tMentorRegAsStudent(db *gorm.DB, t *testing.T) {
func TestMentorRegOK(t *testing.T) {
// Set up a local test database path
db := setTestDB()
defer unsetTestDB()
defer unsetTestDB(db)

// Generate a jwt secret key for testing
setTestJwtSecretKey()
Expand Down Expand Up @@ -164,6 +165,78 @@ func TestMentorRegOK(t *testing.T) {
)
}

func createFetchMentorRequest() *http.Request {
req, _ := http.NewRequest(
"GET",
"/mentor/all/",
nil,
)
return req
}

// Test unauthenticated request to /mentor/all/
func TestFetchMentorNoAuth(t *testing.T) {
testRequestNoAuth(t, "GET", "/mentor/all/")
}

// Test request to /mentor/all/ with invalid jwt
func TestFetchMentorInvalidAuth(t *testing.T) {
testRequestInvalidAuth(t, "GET", "/mentor/all/")
}

func TestFetchMentorOK(t *testing.T) {
const numMentors = 10
// Set up a local test database path
db := setTestDB()
defer unsetTestDB(db)

// Generate a jwt secret key for testing
setTestJwtSecretKey()
defer unsetTestJwtSecretKey()

// Test login fields
testUsername := getTestUsername()
testLoginFields := utils.LoginJwtFields{Username: testUsername}

testJwt, _ := utils.GenerateLoginJwtString(testLoginFields)

modelMentors := make([]models.Mentor, 0, numMentors)
var testMentors [numMentors]controllers.Mentor
for i := 0; i < numMentors; i++ {
modelMentors = append(modelMentors,
models.Mentor{
Name: fmt.Sprintf("Test%d", i),
Username: fmt.Sprintf("test%d", i),
Email: fmt.Sprintf("test%[email protected]", i),
})
testMentors[i] = controllers.Mentor{
Name: fmt.Sprintf("Test%d", i),
Username: fmt.Sprintf("test%d", i),
}

}
_ = db.Table("mentors").Create(modelMentors)

req := createFetchMentorRequest()
req.Header.Add("Bearer", testJwt)

res := executeRequest(req, db)

var resMentors []controllers.Mentor
_ = json.NewDecoder(res.Body).Decode(&resMentors)

expectStatusCodeToBe(t, res, http.StatusOK)
if len(resMentors) != numMentors {
t.Fatalf("Not getting expected numbers of mentors from /mentor/all/")
}

for i, mentor := range resMentors {
if mentor != testMentors[i] {
t.Fatalf("Incorrect mentors returned from /mentor/all/")
}
}
}

// Test unauthenticated request to /mentor/dashboard/
func TestMentorDashboardNoAuth(t *testing.T) {
testRequestNoAuth(t, "GET", "/mentor/dashboard/")
Expand All @@ -178,7 +251,7 @@ func TestMentorDashboardInvalidAuth(t *testing.T) {
func TestMentorDashboardNoReg(t *testing.T) {
// Set up a local test database path
db := setTestDB()
defer unsetTestDB()
defer unsetTestDB(db)

// Generate a jwt secret key for testing
setTestJwtSecretKey()
Expand Down Expand Up @@ -207,7 +280,7 @@ func TestMentorDashboardNoReg(t *testing.T) {
func TestMentorDashboardOK(t *testing.T) {
// Set up a local test database path
db := setTestDB()
defer unsetTestDB()
defer unsetTestDB(db)

// Generate a jwt secret key for testing
setTestJwtSecretKey()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ func areProjectsEquivalent(proj1 *controllers.Project, proj2 *models.Project) bo

func TestFetchAllProjects(t *testing.T) {
db := setTestDB()
defer unsetTestDB()
defer unsetTestDB(db)

testProjects := generateTestProjects(10, true, true)

Expand All @@ -98,6 +98,7 @@ func TestFetchAllProjects(t *testing.T) {
// Check if any projects with status false (not approved) are returned in the request
var areAllProjectsApproved bool = true

fmt.Println(len(resProjects))
for _, proj := range resProjects {
// Assuming projects are created in order
testProj := testProjects[proj.Id-1]
Expand Down Expand Up @@ -151,7 +152,7 @@ func TestFetchProjDetailsInvalidID(t *testing.T) {
// Try fetching a project that does not exist
func TestFetchProjDetailsDNE(t *testing.T) {
db := setTestDB()
defer unsetTestDB()
defer unsetTestDB(db)

// Generate a jwt secret key for testing
setTestJwtSecretKey()
Expand All @@ -176,7 +177,7 @@ func TestFetchProjDetailsDNE(t *testing.T) {
// Try to fetch a valid project
func TestFetchProjDetailsOK(t *testing.T) {
db := setTestDB()
defer unsetTestDB()
defer unsetTestDB(db)

// Generate a jwt secret key for testing
setTestJwtSecretKey()
Expand Down
7 changes: 4 additions & 3 deletions controllers/project_reg_test.go → tests/project_reg_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,13 @@ import (
"bytes"
"encoding/json"
"fmt"
"gorm.io/gorm"
"math/rand"
"net/http"
"strings"
"testing"

"gorm.io/gorm"

"github.com/kossiitkgp/kwoc-backend/v2/controllers"
"github.com/kossiitkgp/kwoc-backend/v2/utils"
)
Expand Down Expand Up @@ -74,7 +75,7 @@ func TestProjectRegSessionHijacking(t *testing.T) {
func TestProjectRegInvalidMentor(t *testing.T) {
// Set up a local test database path
db := setTestDB()
defer unsetTestDB()
defer unsetTestDB(db)

// Generate a jwt secret key for testing
setTestJwtSecretKey()
Expand Down Expand Up @@ -135,7 +136,7 @@ func tProjectRegExisting(db *gorm.DB, testUsername string, testJwt string, t *te
func TestProjectRegOK(t *testing.T) {
// Set up a local test database path
db := setTestDB()
defer unsetTestDB()
defer unsetTestDB(db)

// Generate a jwt secret key for testing
setTestJwtSecretKey()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ func tProjectUpdateExistent(db *gorm.DB, testUsername string, testJwt string, t
func TestProjectUpdateOK(t *testing.T) {
// Set up a local test database path
db := setTestDB()
defer unsetTestDB()
defer unsetTestDB(db)

// Generate a jwt secret key for testing
setTestJwtSecretKey()
Expand Down
14 changes: 14 additions & 0 deletions tests/run_tests.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#!/usr/bin/env bash

set -xe

REPO_PATH=$(git rev-parse --show-toplevel)

cd $REPO_PATH/tests
source .env

docker compose -f docker-compose.test.yaml up --build -d

go test ./... -p 1

docker compose -f docker-compose.test.yaml down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ func areOverallStatsEquivalent(stats *controllers.OverallStats, dbStats *models.

func TestFetchOverallStats(t *testing.T) {
db := setTestDB()
defer unsetTestDB()
defer unsetTestDB(db)

testStats := generateTestStats(10)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ func findProjIndex(repo_link string, list []models.Project) int {

func TestFetchAllProjectStats(t *testing.T) {
db := setTestDB()
defer unsetTestDB()
defer unsetTestDB(db)

test_projects := generateTestProjects(10, true, true)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ func areStudentStatsEquivalent(stats *controllers.StudentBriefStats, student *mo

func TestFetchAllStudentsStats(t *testing.T) {
db := setTestDB()
defer unsetTestDB()
defer unsetTestDB(db)

testStudents := generateTestStudents(10)

Expand Down
8 changes: 4 additions & 4 deletions controllers/student_test.go → tests/student_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ func tStudentRegAsMentor(db *gorm.DB, t *testing.T) {
func TestStudentRegOK(t *testing.T) {
// Set up a local test database path
db := setTestDB()
defer unsetTestDB()
defer unsetTestDB(db)

// Generate a jwt secret key for testing
setTestJwtSecretKey()
Expand Down Expand Up @@ -247,7 +247,7 @@ func tStudentBlogLinkNonExistingUser(db *gorm.DB, t *testing.T) {
func TestStudentBlogLink(t *testing.T) {
// Set up a local test database path
db := setTestDB()
defer unsetTestDB()
defer unsetTestDB(db)

// Generate a jwt secret key for testing
setTestJwtSecretKey()
Expand Down Expand Up @@ -284,7 +284,7 @@ func TestStudentDashboardInvalidAuth(t *testing.T) {
func TestStudentDashboardNoReg(t *testing.T) {
// Set up a local test database path
db := setTestDB()
defer unsetTestDB()
defer unsetTestDB(db)

// Generate a jwt secret key for testing
setTestJwtSecretKey()
Expand Down Expand Up @@ -313,7 +313,7 @@ func TestStudentDashboardNoReg(t *testing.T) {
func TestStudentDashboardOK(t *testing.T) {
// Set up a local test database path
db := setTestDB()
defer unsetTestDB()
defer unsetTestDB(db)

// Generate a jwt secret key for testing
setTestJwtSecretKey()
Expand Down
Loading

0 comments on commit 7650ed4

Please sign in to comment.