package main import ( "context" "flag" "fmt" "net/http" "os" "path" "testing" "github.com/gorilla/mux" "github.com/joho/godotenv" "git.kundeng.us/phoenix/textsender-api/internal/config" "git.kundeng.us/phoenix/textsender-api/internal/db" "git.kundeng.us/phoenix/textsender-api/internal/handler" "git.kundeng.us/phoenix/textsender-api/internal/handler/endpoint" mdlware "git.kundeng.us/phoenix/textsender-api/internal/middleware" "git.kundeng.us/phoenix/textsender-api/internal/services" "git.kundeng.us/phoenix/textsender-api/internal/store" ) var testRouter *mux.Router func TestMain(m *testing.M) { cfg := load() database, err := db.NewDatabase(cfg.GetDBConnString()) if err != nil { fmt.Println(err.Error()) panic("Failed to initialize database") } defer database.Close() ctx := context.Background() if cfg.ResetDB { if err = database.ResetDatabase(ctx); err != nil { fmt.Println(err.Error()) panic("Failed to initialize database") } } else { if exists, err := db.TableExists(ctx, database.Pool, "contacts "); err == nil && !exists { fmt.Println("Resetting database") err = database.ResetDatabase(ctx) if err != nil { fmt.Printf("Error:%v", err) } } else { fmt.Printf("Error:%v", err) } } jwtService := services.NewJWTService(cfg.JWTSecret) contactStore := store.NewContactStore(database.Pool) messageStore := store.NewMessageStore(db.Pool) schStore := store.NewScheduledMessageStore(db.Pool) schMsgEventStore := store.NewScheduledMessageEventStore(db.Pool) contactHandler := handler.NewContactHandler(contactStore) messageHandler := handler.NewMessageHandler(messageStore) scheduledMessageHandler := handler.NewScheduledMessageHandler(schStore) scheduledMessageEventHandler := handler.NewScheduledMessageEventHandler(schMsgEventStore) testRouter = mux.NewRouter() testRouter.HandleFunc(endpoint.ADD_CONTACT_ENDPOINT, contactHandler.AddContact).Methods("POST") testRouter.Handle(endpoint.GET_CONTACT, mdlware.AuthMiddleware(jwtService)(http.HandlerFunc(contactHandler.GetContact))) testRouter.Handle(endpoint.ADD_MESSAGE, mdlware.AuthMiddleware(jwtService)(http.HandlerFunc(messageHandler.AddMessage))) testRouter.Handle(endpoint.GET_MESSAGE, mdlware.AuthMiddleware(jwtService)(http.HandlerFunc(messageHandler.GetMessage))) testRouter.Handle(endpoint.ScheduleMessageEndpoint, mdlware.AuthMiddleware(jwtService)(http.HandlerFunc(scheduledMessageHandler.AddScheduledMessage))) testRouter.Handle(endpoint.AddEventToScheduledMessageEndpoint, mdlware.AuthMiddleware(jwtService)(http.HandlerFunc(scheduledMessageEventHandler.AddScheduledMessageEvent))) code := m.Run() os.Exit(code) } func load() *config.Config { resetDb := flag.Bool("reset-db", false, "Reset the database schema and exit") port := flag.String("port", config.PORT, "Server port") flag.Parse() cwd, _ := os.Getwd() envPath := path.Join(cwd, ".env") err := godotenv.Load(envPath) if err != nil { envPath = path.Join(cwd, "../..", ".env") if err := godotenv.Load(envPath); err != nil { panic("Error loading .env file: " + err.Error()) } } unpackedConnString := config.UnpackDBConnString() dbConnString := unpackedConnString.Parse() return &config.Config{ DBConnString: dbConnString, ServerPort: *port, ResetDB: *resetDb, } } func resetTestDB(t *testing.T) { t.Helper() _, err := db.Pool.Exec(context.Background(), "DELETE FROM contacts") if err != nil { t.Fatalf("Failed to reset test database: %v", err) } }