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