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 }