feat: Add database migration, seeding, and testing commands with Makefile integration
This commit is contained in:
@@ -0,0 +1,207 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"log"
|
||||
"time"
|
||||
|
||||
"github.com/oklog/ulid/v2"
|
||||
"github.com/timetracker/backend/internal/models"
|
||||
)
|
||||
|
||||
func main() {
|
||||
// Get database configuration with sensible defaults
|
||||
dbConfig := models.DefaultDatabaseConfig()
|
||||
|
||||
// Initialize database
|
||||
fmt.Println("Connecting to database...")
|
||||
if err := models.InitDB(dbConfig); err != nil {
|
||||
log.Fatalf("Error initializing database: %v", err)
|
||||
}
|
||||
defer func() {
|
||||
if err := models.CloseDB(); err != nil {
|
||||
log.Printf("Error closing database connection: %v", err)
|
||||
}
|
||||
}()
|
||||
fmt.Println("✓ Database connection successful")
|
||||
|
||||
// Create context with timeout
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
|
||||
defer cancel()
|
||||
|
||||
// Test Company model
|
||||
fmt.Println("\n=== Testing Company Model ===")
|
||||
testCompanyModel(ctx)
|
||||
|
||||
// Test User model
|
||||
fmt.Println("\n=== Testing User Model ===")
|
||||
testUserModel(ctx)
|
||||
|
||||
// Test relationships
|
||||
fmt.Println("\n=== Testing Relationships ===")
|
||||
testRelationships(ctx)
|
||||
|
||||
fmt.Println("\nModel tests completed successfully!")
|
||||
}
|
||||
|
||||
func testCompanyModel(ctx context.Context) {
|
||||
// Create a new company
|
||||
companyCreate := models.CompanyCreate{
|
||||
Name: "Test Company",
|
||||
}
|
||||
|
||||
company, err := models.CreateCompany(ctx, companyCreate)
|
||||
if err != nil {
|
||||
log.Fatalf("Error creating company: %v", err)
|
||||
}
|
||||
fmt.Printf("✓ Created company: %s (ID: %s)\n", company.Name, company.ID)
|
||||
|
||||
// Get the company by ID
|
||||
retrievedCompany, err := models.GetCompanyByID(ctx, company.ID)
|
||||
if err != nil {
|
||||
log.Fatalf("Error getting company: %v", err)
|
||||
}
|
||||
if retrievedCompany == nil {
|
||||
log.Fatalf("Company not found")
|
||||
}
|
||||
fmt.Printf("✓ Retrieved company: %s\n", retrievedCompany.Name)
|
||||
|
||||
// Update the company
|
||||
newName := "Updated Test Company"
|
||||
companyUpdate := models.CompanyUpdate{
|
||||
ID: company.ID,
|
||||
Name: &newName,
|
||||
}
|
||||
|
||||
updatedCompany, err := models.UpdateCompany(ctx, companyUpdate)
|
||||
if err != nil {
|
||||
log.Fatalf("Error updating company: %v", err)
|
||||
}
|
||||
fmt.Printf("✓ Updated company name to: %s\n", updatedCompany.Name)
|
||||
|
||||
// Get all companies
|
||||
companies, err := models.GetAllCompanies(ctx)
|
||||
if err != nil {
|
||||
log.Fatalf("Error getting all companies: %v", err)
|
||||
}
|
||||
fmt.Printf("✓ Retrieved %d companies\n", len(companies))
|
||||
}
|
||||
|
||||
func testUserModel(ctx context.Context) {
|
||||
// Get a company to associate with the user
|
||||
companies, err := models.GetAllCompanies(ctx)
|
||||
if err != nil || len(companies) == 0 {
|
||||
log.Fatalf("Error getting companies or no companies found: %v", err)
|
||||
}
|
||||
companyID := companies[0].ID
|
||||
|
||||
// Create a new user
|
||||
userCreate := models.UserCreate{
|
||||
Email: "test@example.com",
|
||||
Password: "Test@123456",
|
||||
Role: models.RoleUser,
|
||||
CompanyID: companyID,
|
||||
HourlyRate: 50.0,
|
||||
}
|
||||
|
||||
user, err := models.CreateUser(ctx, userCreate)
|
||||
if err != nil {
|
||||
log.Fatalf("Error creating user: %v", err)
|
||||
}
|
||||
fmt.Printf("✓ Created user: %s (ID: %s)\n", user.Email, user.ID)
|
||||
|
||||
// Get the user by ID
|
||||
retrievedUser, err := models.GetUserByID(ctx, user.ID)
|
||||
if err != nil {
|
||||
log.Fatalf("Error getting user: %v", err)
|
||||
}
|
||||
if retrievedUser == nil {
|
||||
log.Fatalf("User not found")
|
||||
}
|
||||
fmt.Printf("✓ Retrieved user: %s\n", retrievedUser.Email)
|
||||
|
||||
// Get the user by email
|
||||
emailUser, err := models.GetUserByEmail(ctx, user.Email)
|
||||
if err != nil {
|
||||
log.Fatalf("Error getting user by email: %v", err)
|
||||
}
|
||||
if emailUser == nil {
|
||||
log.Fatalf("User not found by email")
|
||||
}
|
||||
fmt.Printf("✓ Retrieved user by email: %s\n", emailUser.Email)
|
||||
|
||||
// Update the user
|
||||
newEmail := "updated@example.com"
|
||||
newRole := models.RoleAdmin
|
||||
newHourlyRate := 75.0
|
||||
userUpdate := models.UserUpdate{
|
||||
ID: user.ID,
|
||||
Email: &newEmail,
|
||||
Role: &newRole,
|
||||
HourlyRate: &newHourlyRate,
|
||||
}
|
||||
|
||||
updatedUser, err := models.UpdateUser(ctx, userUpdate)
|
||||
if err != nil {
|
||||
log.Fatalf("Error updating user: %v", err)
|
||||
}
|
||||
fmt.Printf("✓ Updated user email to: %s, role to: %s\n", updatedUser.Email, updatedUser.Role)
|
||||
|
||||
// Test authentication
|
||||
authUser, err := models.AuthenticateUser(ctx, updatedUser.Email, "Test@123456")
|
||||
if err != nil {
|
||||
log.Fatalf("Error authenticating user: %v", err)
|
||||
}
|
||||
if authUser == nil {
|
||||
log.Fatalf("Authentication failed")
|
||||
}
|
||||
fmt.Printf("✓ User authentication successful\n")
|
||||
|
||||
// Get all users
|
||||
users, err := models.GetAllUsers(ctx)
|
||||
if err != nil {
|
||||
log.Fatalf("Error getting all users: %v", err)
|
||||
}
|
||||
fmt.Printf("✓ Retrieved %d users\n", len(users))
|
||||
|
||||
// Get users by company ID
|
||||
companyUsers, err := models.GetUsersByCompanyID(ctx, companyID)
|
||||
if err != nil {
|
||||
log.Fatalf("Error getting users by company ID: %v", err)
|
||||
}
|
||||
fmt.Printf("✓ Retrieved %d users for company ID: %s\n", len(companyUsers), companyID)
|
||||
}
|
||||
|
||||
func testRelationships(ctx context.Context) {
|
||||
// Get a user with company
|
||||
users, err := models.GetAllUsers(ctx)
|
||||
if err != nil || len(users) == 0 {
|
||||
log.Fatalf("Error getting users or no users found: %v", err)
|
||||
}
|
||||
userID := users[0].ID
|
||||
|
||||
// Get user with company
|
||||
user, err := models.GetUserWithCompany(ctx, userID)
|
||||
if err != nil {
|
||||
log.Fatalf("Error getting user with company: %v", err)
|
||||
}
|
||||
if user == nil {
|
||||
log.Fatalf("User not found")
|
||||
}
|
||||
if user.Company == nil {
|
||||
log.Fatalf("User's company not loaded")
|
||||
}
|
||||
fmt.Printf("✓ Retrieved user %s with company %s\n", user.Email, user.Company.Name)
|
||||
|
||||
// Test invalid ID
|
||||
invalidID := ulid.MustNew(ulid.Timestamp(time.Now()), ulid.DefaultEntropy())
|
||||
invalidUser, err := models.GetUserByID(ctx, invalidID)
|
||||
if err != nil {
|
||||
log.Fatalf("Error getting user with invalid ID: %v", err)
|
||||
}
|
||||
if invalidUser != nil {
|
||||
log.Fatalf("User found with invalid ID")
|
||||
}
|
||||
fmt.Printf("✓ Correctly handled invalid user ID\n")
|
||||
}
|
||||
Reference in New Issue
Block a user