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  }