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  }