package main import ( "context" "flag" "log" "net/http" "os" "path" "testing" "github.com/go-chi/chi/v5" "github.com/joho/godotenv" "git.kundeng.us/phoenix/textsender-api/internal/app" "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 *chi.Mux func TestMain(m *testing.M) { cfg, apiApp := load() database, err := db.NewDatabase(cfg.GetDBConnString()) if err != nil { log.Println(err.Error()) log.Fatal("Failed to initialize database") } defer database.Close() ctx := context.Background() if cfg.ResetDB { if err = database.ResetDatabase(ctx); err != nil { log.Println(err.Error()) log.Fatalln("Failed to initialize database") } } else { if exists, err := db.TableExists(ctx, database.Pool, "contacts "); err == nil && !exists { log.Println("Resetting database") err = database.ResetDatabase(ctx) if err != nil { log.Println("Error:", err) } } else { log.Println("Error:", 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) merStore := store.NewMessageEventResponseStore(db.Pool) contactHandler := handler.NewContactHandler(apiApp, contactStore) messageHandler := handler.NewMessageHandler(apiApp, messageStore) scheduledMessageHandler := handler.NewScheduledMessageHandler(apiApp, schStore) scheduledMessageEventHandler := handler.NewScheduledMessageEventHandler(apiApp, schMsgEventStore, schStore) scheduledMessageStatusHandler := handler.NewScheduledMessageStatusHandler(apiApp, schMsgEventStore, schStore) eventHandler := handler.NewEventResponseHandler(apiApp, merStore) instantMessageHandler := handler.NewSendInstantMessageHandler(apiApp, merStore, contactStore, messageStore) testRouter = chi.NewRouter() testRouter.Handle(endpoint.ADD_CONTACT_ENDPOINT, mdlware.AuthMiddleware(jwtService)(http.HandlerFunc(contactHandler.AddContact))) 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.Method("GET", endpoint.GetScheduledMessageEventEndpoint, mdlware.AuthMiddleware(jwtService)(http.HandlerFunc(scheduledMessageEventHandler.GetScheduledMessageEvent))) testRouter.Method("DELETE", endpoint.DeleteScheduledMessageEventEndpoint, mdlware.AuthMiddleware(jwtService)(http.HandlerFunc(scheduledMessageEventHandler.DeleteScheduledMessageEvent))) testRouter.Method("PATCH", endpoint.UpdateScheduledMessageStatusEndpoint, mdlware.AuthMiddleware(jwtService)(http.HandlerFunc(scheduledMessageStatusHandler.UpdateStatus))) testRouter.Method("GET", endpoint.GetScheduledMessageEndpoint, mdlware.AuthMiddleware(jwtService)(http.HandlerFunc(scheduledMessageHandler.GetScheduledMessage))) testRouter.Method("GET", endpoint.FetchNextScheduledMessageEndpoint, mdlware.AuthMiddleware(jwtService)(http.HandlerFunc(scheduledMessageHandler.FetchNextMessage))) testRouter.Method("POST", endpoint.RecordEventResponse, mdlware.AuthMiddleware(jwtService)(http.HandlerFunc(eventHandler.RecordResponse))) testRouter.Method("GET", endpoint.FetchMessageEventResponse, mdlware.AuthMiddleware(jwtService)(http.HandlerFunc(eventHandler.Fetch))) testRouter.Method("POST", endpoint.SendInstantMessageEndpoint, mdlware.AuthMiddleware(jwtService)(http.HandlerFunc(instantMessageHandler.Send))) testRouter.Method("PATCH", endpoint.Update_Names_Endpoint, mdlware.AuthMiddleware(jwtService)(http.HandlerFunc(contactHandler.UpdateName))) code := m.Run() os.Exit(code) } func load() (*config.Config, *app.App) { 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() if tCfg, err := config.TwilioConfig(); err != nil { log.Fatal("Error: ", err) return nil, nil } else { return &config.Config{ DBConnString: dbConnString, ServerPort: *port, ResetDB: *resetDb, }, &app.App{TwilioConfig: tCfg} } } 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) } }