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  }