Ctrl K
ComunidadGuías…

web/routing_test.go

Rama master · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
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)
			})
		}
	})
}