github.com/navikt/knorten@v0.0.0-20240419132333-1333f46ed8b6/pkg/api/api_test.go (about) 1 package api 2 3 import ( 4 "bytes" 5 "database/sql" 6 "html/template" 7 "io" 8 "log" 9 "net/http/httptest" 10 "os" 11 "path" 12 "runtime" 13 "testing" 14 "time" 15 16 "github.com/navikt/knorten/pkg/api/service" 17 "github.com/navikt/knorten/pkg/config" 18 19 "github.com/navikt/knorten/pkg/api/handlers" 20 21 "github.com/navikt/knorten/pkg/api/middlewares" 22 23 "github.com/gin-gonic/gin" 24 "github.com/navikt/knorten/local/dbsetup" 25 "github.com/navikt/knorten/pkg/api/auth" 26 "github.com/navikt/knorten/pkg/database" 27 "github.com/tdewolff/minify/v2" 28 "github.com/tdewolff/minify/v2/html" 29 30 "github.com/sirupsen/logrus" 31 ) 32 33 var ( 34 repo *database.Repo 35 db *sql.DB 36 server *httptest.Server 37 testUser = auth.User{ 38 Name: "Dum My", 39 Email: "dummy@nav.no", 40 } 41 ) 42 43 const ( 44 htmlContentType = "text/html; charset=utf-8" 45 jsonContentType = "application/json; charset=utf-8" 46 ) 47 48 func init() { 49 _, filename, _, _ := runtime.Caller(0) 50 dir := path.Join(path.Dir(filename), "../..") 51 err := os.Chdir(dir) 52 if err != nil { 53 panic(err) 54 } 55 } 56 57 func TestMain(m *testing.M) { 58 logger := logrus.NewEntry(logrus.StandardLogger()) 59 60 dbConn, err := dbsetup.SetupDBForTests() 61 if err != nil { 62 log.Fatal(err) 63 } 64 repo, err = database.New(dbConn, "", logrus.NewEntry(logrus.StandardLogger())) 65 if err != nil { 66 log.Fatal(err) 67 } 68 db, err = sql.Open("postgres", dbConn) 69 if err != nil { 70 log.Fatalf("open sql connection: %v", err) 71 } 72 73 azureClient, err := auth.NewAzureClient(true, "", "", "", logger) 74 if err != nil { 75 log.Fatalf("creating azure client: %v", err) 76 } 77 78 router := gin.New() 79 80 session, err := repo.NewSessionStore("knorten_session") 81 if err != nil { 82 log.Fatalf("creating session store: %v", err) 83 } 84 router.Use(session) 85 router.Static("/assets", "./assets") 86 router.FuncMap = template.FuncMap{ 87 "toArray": toArray, 88 } 89 router.LoadHTMLGlob("templates/**/*") 90 91 authService := service.NewAuthService( 92 repo, 93 "nada@nav.no", 94 1*time.Hour, 95 32, 96 azureClient, 97 ) 98 99 authHandler := handlers.NewAuthHandler( 100 authService, 101 "http://localhost:8080/", 102 config.Cookies{}, 103 logger, 104 repo, 105 ) 106 107 router.Use(middlewares.SetSessionStatus(logger.WithField("subsystem", "status_middleware"), "knorten_session", repo)) 108 router.GET("/", handlers.IndexHandler) 109 router.GET("/oauth2/login", authHandler.LoginHandler(true)) 110 router.GET("/oauth2/callback", authHandler.CallbackHandler()) 111 router.GET("/oauth2/logout", authHandler.LogoutHandler()) 112 router.Use(middlewares.Authenticate( 113 logger, 114 repo, 115 azureClient, 116 true, 117 )) 118 119 err = New(router, repo, azureClient, logger, true, "", "") 120 if err != nil { 121 log.Fatalf("setting up api: %v", err) 122 } 123 124 server = httptest.NewServer(router) 125 code := m.Run() 126 127 server.Close() 128 os.Exit(code) 129 } 130 131 func minimizeHTML(in string) (string, error) { 132 m := minify.New() 133 m.AddFunc("text/html", html.Minify) 134 135 out, err := m.String("text/html", in) 136 if err != nil { 137 return "", err 138 } 139 140 return out, nil 141 } 142 143 func createExpectedHTML(t string, values map[string]any) (string, error) { 144 buff := &bytes.Buffer{} 145 tmpl, err := template.New("").Funcs(template.FuncMap{"toArray": toArray}).ParseGlob("templates/**/*") 146 if err != nil { 147 return "", err 148 } 149 150 if err := tmpl.ExecuteTemplate(buff, t, values); err != nil { 151 return "", err 152 } 153 154 dataBytes, err := io.ReadAll(buff) 155 if err != nil { 156 return "", err 157 } 158 159 return string(dataBytes), nil 160 } 161 162 // Need to move this 163 func toArray(args ...any) []any { 164 return args 165 }