github.com/navikt/knorten@v0.0.0-20240419132333-1333f46ed8b6/pkg/api/user_test.go (about) 1 package api 2 3 import ( 4 "context" 5 "fmt" 6 "io" 7 "net/http" 8 "testing" 9 10 "github.com/google/go-cmp/cmp" 11 "github.com/navikt/knorten/pkg/database" 12 "github.com/navikt/knorten/pkg/database/gensql" 13 "github.com/navikt/knorten/pkg/k8s" 14 ) 15 16 func TestUserAPI(t *testing.T) { 17 ctx := context.Background() 18 team, err := prepareUserTests(ctx) 19 if err != nil { 20 t.Fatal(err) 21 } 22 t.Cleanup(func() { 23 if err := cleanupUserTests(ctx, team.ID); err != nil { 24 t.Error(err) 25 } 26 }) 27 28 t.Run("get user html", func(t *testing.T) { 29 resp, err := server.Client().Get(fmt.Sprintf("%v/oversikt", server.URL)) 30 if err != nil { 31 t.Error(err) 32 } 33 defer resp.Body.Close() 34 35 if resp.StatusCode != http.StatusOK { 36 t.Errorf("Status code is %v, should be %v", resp.StatusCode, http.StatusOK) 37 } 38 39 if resp.Header.Get("Content-Type") != htmlContentType { 40 t.Errorf("Content-Type header is %v, should be %v", resp.Header.Get("Content-Type"), htmlContentType) 41 } 42 43 received, err := io.ReadAll(resp.Body) 44 if err != nil { 45 t.Error(err) 46 } 47 receivedMinimized, err := minimizeHTML(string(received)) 48 if err != nil { 49 t.Error(err) 50 } 51 52 events, err := repo.EventLogsForOwnerGet(ctx, testUser.Email, 3) 53 if err != nil { 54 t.Error(err) 55 } 56 57 expected, err := createExpectedHTML("oversikt/index", map[string]any{ 58 "user": database.UserServices{ 59 Services: []database.TeamServices{ 60 { 61 TeamID: team.ID, 62 Slug: team.Slug, 63 Jupyterhub: &database.AppService{ 64 App: string(gensql.ChartTypeJupyterhub), 65 Ingress: fmt.Sprintf("https://%v.jupyter.knada.io", team.Slug), 66 Slug: team.Slug, 67 Namespace: k8s.TeamIDToNamespace(team.ID), 68 }, 69 Airflow: &database.AppService{ 70 App: string(gensql.ChartTypeAirflow), 71 Ingress: fmt.Sprintf("https://%v.airflow.knada.io", team.Slug), 72 Slug: team.Slug, 73 Namespace: k8s.TeamIDToNamespace(team.ID), 74 }, 75 }, 76 }, 77 Compute: &gensql.ComputeInstance{ 78 Owner: testUser.Email, 79 Name: "compute-" + getNormalizedNameFromEmail(testUser.Email), 80 }, 81 UserEvents: events, 82 }, 83 }) 84 if err != nil { 85 t.Error(err) 86 } 87 expectedMinimized, err := minimizeHTML(expected) 88 if err != nil { 89 t.Error(err) 90 } 91 92 if diff := cmp.Diff(expectedMinimized, receivedMinimized); diff != "" { 93 t.Errorf("mismatch (-want +got):\n%s", diff) 94 } 95 }) 96 } 97 98 func prepareUserTests(ctx context.Context) (*gensql.Team, error) { 99 team := gensql.Team{ 100 ID: "team", 101 Slug: "team", 102 Users: []string{testUser.Email}, 103 } 104 err := repo.TeamCreate(ctx, team) 105 if err != nil { 106 return nil, err 107 } 108 109 if err := createChart(ctx, team.ID, gensql.ChartTypeJupyterhub); err != nil { 110 return nil, err 111 } 112 113 if err := createChart(ctx, team.ID, gensql.ChartTypeAirflow); err != nil { 114 return nil, err 115 } 116 117 err = repo.ComputeInstanceCreate(ctx, gensql.ComputeInstance{ 118 Owner: testUser.Email, 119 Name: "compute-" + getNormalizedNameFromEmail(testUser.Email), 120 }) 121 if err != nil { 122 return nil, err 123 } 124 125 return &team, nil 126 } 127 128 func cleanupUserTests(ctx context.Context, teamID string) error { 129 if err := repo.ComputeInstanceDelete(ctx, testUser.Email); err != nil { 130 return err 131 } 132 133 if err := repo.TeamDelete(ctx, teamID); err != nil { 134 return err 135 } 136 137 return nil 138 }