github.com/cozy/cozy-stack@v0.0.0-20240327093429-939e4a21320e/web/routing_test.go (about)

     1  package web
     2  
     3  import (
     4  	"net/http"
     5  	"net/http/httptest"
     6  	"testing"
     7  
     8  	"github.com/cozy/cozy-stack/model/stack"
     9  	"github.com/cozy/cozy-stack/pkg/assets/dynamic"
    10  	"github.com/cozy/cozy-stack/pkg/config/config"
    11  	"github.com/cozy/cozy-stack/tests/testutils"
    12  	"github.com/cozy/cozy-stack/web/middlewares"
    13  	"github.com/labstack/echo/v4"
    14  	"github.com/stretchr/testify/assert"
    15  	"github.com/stretchr/testify/require"
    16  )
    17  
    18  func TestRouting(t *testing.T) {
    19  	if testing.Short() {
    20  		t.Skip("an instance is required for this test: test skipped due to the use of --short flag")
    21  	}
    22  
    23  	config.UseTestFile(t)
    24  	config.GetConfig().Assets = "../assets"
    25  	testutils.NeedCouchdb(t)
    26  	setup := testutils.NewSetup(t, t.Name())
    27  	inst := setup.GetTestInstance()
    28  	domain := inst.Domain
    29  	require.NoError(t, dynamic.InitDynamicAssetFS(config.FsURL().String()), "Could not init dynamic FS")
    30  
    31  	t.Run("SetupAssets", func(t *testing.T) {
    32  		e := echo.New()
    33  		err := SetupAssets(e, "../assets")
    34  		require.NoError(t, err)
    35  
    36  		ts := httptest.NewServer(e)
    37  		t.Cleanup(ts.Close)
    38  
    39  		t.Run("GET on an asset", func(t *testing.T) {
    40  			e := testutils.CreateTestClient(t, ts.URL)
    41  
    42  			e.GET("/assets/images/cozy.svg").
    43  				Expect().Status(200)
    44  		})
    45  
    46  		t.Run("HEAD on an asset", func(t *testing.T) {
    47  			e := testutils.CreateTestClient(t, ts.URL)
    48  
    49  			e.HEAD("/assets/images/cozy.svg").
    50  				Expect().Status(200)
    51  		})
    52  	})
    53  
    54  	t.Run("SetupAssetsStatik", func(t *testing.T) {
    55  		e := echo.New()
    56  		err := SetupAssets(e, "")
    57  		require.NoError(t, err)
    58  
    59  		ts := httptest.NewServer(e)
    60  		t.Cleanup(ts.Close)
    61  
    62  		t.Run("WithoutHexaIsNotCached", func(t *testing.T) {
    63  			e := testutils.CreateTestClient(t, ts.URL)
    64  
    65  			e.GET("/assets/images/cozy.svg").
    66  				Expect().Status(200).
    67  				Header("Cache-Control").Equal("no-cache, public")
    68  		})
    69  
    70  		t.Run("WithHexaIsCachedAsImmutable", func(t *testing.T) {
    71  			e := testutils.CreateTestClient(t, ts.URL)
    72  
    73  			e.GET("/assets/images/cozy.badbeefbadbeef.svg").
    74  				Expect().Status(200).
    75  				Header("Cache-Control").
    76  				Contains("max-age=").
    77  				Contains("immutable")
    78  		})
    79  
    80  		t.Run("WithImmutableNameIsCachedAsImmutable", func(t *testing.T) {
    81  			e := testutils.CreateTestClient(t, ts.URL)
    82  
    83  			e.GET("/assets/images/cozy.immutable.svg").
    84  				Expect().Status(200).
    85  				Header("Cache-Control").
    86  				Contains("max-age=").
    87  				Contains("immutable")
    88  		})
    89  
    90  		t.Run("FileAvailableWithHEAD", func(t *testing.T) {
    91  			e := testutils.CreateTestClient(t, ts.URL)
    92  
    93  			e.HEAD("/assets/images/cozy.svg").Expect().Status(200)
    94  		})
    95  
    96  		t.Run("WithImmutableNameIsCachedAsImmutable", func(t *testing.T) {
    97  			e := testutils.CreateTestClient(t, ts.URL)
    98  
    99  			e.HEAD("/assets/images/cozy.badbeefbadbeef.svg").
   100  				Expect().Status(200).
   101  				Header("Cache-Control").
   102  				Contains("max-age=").
   103  				Contains("immutable")
   104  		})
   105  	})
   106  
   107  	t.Run("SetupRoutes", func(t *testing.T) {
   108  		router := echo.New()
   109  		err := SetupRoutes(router, &stack.Services{})
   110  		require.NoError(t, err)
   111  
   112  		ts := httptest.NewServer(router)
   113  		t.Cleanup(ts.Close)
   114  
   115  		e := testutils.CreateTestClient(t, ts.URL)
   116  
   117  		e.GET("/version").Expect().Status(200)
   118  	})
   119  
   120  	t.Run("ParseHost", func(t *testing.T) {
   121  		apis := echo.New()
   122  
   123  		apis.GET("/test", func(c echo.Context) error {
   124  			instance := middlewares.GetInstance(c)
   125  			assert.NotNil(t, instance, "the instance should have been set in the echo context")
   126  			return c.String(http.StatusOK, "OK")
   127  		}, middlewares.NeedInstance)
   128  
   129  		router, err := CreateSubdomainProxy(apis, &stack.Services{}, func(c echo.Context) error {
   130  			slug := c.Get("slug").(string)
   131  			return c.String(200, "OK:"+slug)
   132  		})
   133  		require.NoError(t, err)
   134  
   135  		ts := httptest.NewServer(router)
   136  		t.Cleanup(ts.Close)
   137  
   138  		urls := map[string]string{
   139  			"https://" + domain + "/test":    "OK",
   140  			"https://foo." + domain + "/app": "OK:foo",
   141  			"https://bar." + domain + "/app": "OK:bar",
   142  		}
   143  
   144  		for u, k := range urls {
   145  			t.Run(u, func(t *testing.T) {
   146  				e := testutils.CreateTestClient(t, ts.URL)
   147  
   148  				e.GET(u).
   149  					Expect().Status(200).
   150  					Body().Equal(k)
   151  			})
   152  		}
   153  	})
   154  }