web/routing_test.go
Rama master · réplica de lectura del repositorio original.
package web
import (
"net/http"
"net/http/httptest"
"testing"
"github.com/cozy/cozy-stack/model/stack"
"github.com/cozy/cozy-stack/pkg/assets/dynamic"
"github.com/cozy/cozy-stack/pkg/config/config"
"github.com/cozy/cozy-stack/tests/testutils"
"github.com/cozy/cozy-stack/web/middlewares"
"github.com/labstack/echo/v4"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestRouting(t *testing.T) {
if testing.Short() {
t.Skip("an instance is required for this test: test skipped due to the use of --short flag")
}
config.UseTestFile(t)
config.GetConfig().Assets = "../assets"
testutils.NeedCouchdb(t)
setup := testutils.NewSetup(t, t.Name())
inst := setup.GetTestInstance()
domain := inst.Domain
require.NoError(t, dynamic.InitDynamicAssetFS(config.FsURL().String()), "Could not init dynamic FS")
t.Run("SetupAssets", func(t *testing.T) {
e := echo.New()
err := SetupAssets(e, "../assets")
require.NoError(t, err)
ts := httptest.NewServer(e)
t.Cleanup(ts.Close)
t.Run("GET on an asset", func(t *testing.T) {
e := testutils.CreateTestClient(t, ts.URL)
e.GET("/assets/images/cozy.svg").
Expect().Status(200)
})
t.Run("HEAD on an asset", func(t *testing.T) {
e := testutils.CreateTestClient(t, ts.URL)
e.HEAD("/assets/images/cozy.svg").
Expect().Status(200)
})
})
t.Run("SetupAssetsStatik", func(t *testing.T) {
e := echo.New()
err := SetupAssets(e, "")
require.NoError(t, err)
ts := httptest.NewServer(e)
t.Cleanup(ts.Close)
t.Run("WithoutHexaIsNotCached", func(t *testing.T) {
e := testutils.CreateTestClient(t, ts.URL)
e.GET("/assets/images/cozy.svg").
Expect().Status(200).
Header("Cache-Control").Equal("no-cache, public")
})
t.Run("WithHexaIsCachedAsImmutable", func(t *testing.T) {
e := testutils.CreateTestClient(t, ts.URL)
e.GET("/assets/images/cozy.badbeefbadbeef.svg").
Expect().Status(200).
Header("Cache-Control").
Contains("max-age=").
Contains("immutable")
})
t.Run("WithImmutableNameIsCachedAsImmutable", func(t *testing.T) {
e := testutils.CreateTestClient(t, ts.URL)
e.GET("/assets/images/cozy.immutable.svg").
Expect().Status(200).
Header("Cache-Control").
Contains("max-age=").
Contains("immutable")
})
t.Run("FileAvailableWithHEAD", func(t *testing.T) {
e := testutils.CreateTestClient(t, ts.URL)
e.HEAD("/assets/images/cozy.svg").Expect().Status(200)
})
t.Run("WithImmutableNameIsCachedAsImmutable", func(t *testing.T) {
e := testutils.CreateTestClient(t, ts.URL)
e.HEAD("/assets/images/cozy.badbeefbadbeef.svg").
Expect().Status(200).
Header("Cache-Control").
Contains("max-age=").
Contains("immutable")
})
})
t.Run("SetupRoutes", func(t *testing.T) {
router := echo.New()
err := SetupRoutes(router, &stack.Services{})
require.NoError(t, err)
ts := httptest.NewServer(router)
t.Cleanup(ts.Close)
e := testutils.CreateTestClient(t, ts.URL)
e.GET("/version").Expect().Status(200)
})
t.Run("ParseHost", func(t *testing.T) {
apis := echo.New()
apis.GET("/test", func(c echo.Context) error {
instance := middlewares.GetInstance(c)
assert.NotNil(t, instance, "the instance should have been set in the echo context")
return c.String(http.StatusOK, "OK")
}, middlewares.NeedInstance)
router, err := CreateSubdomainProxy(apis, &stack.Services{}, func(c echo.Context) error {
slug := c.Get("slug").(string)
return c.String(200, "OK:"+slug)
})
require.NoError(t, err)
ts := httptest.NewServer(router)
t.Cleanup(ts.Close)
urls := map[string]string{
"https://" + domain + "/test": "OK",
"https://foo." + domain + "/app": "OK:foo",
"https://bar." + domain + "/app": "OK:bar",
}
for u, k := range urls {
t.Run(u, func(t *testing.T) {
e := testutils.CreateTestClient(t, ts.URL)
e.GET(u).
Expect().Status(200).
Body().Equal(k)
})
}
})
}