github.com/cozy/cozy-stack@v0.0.0-20240603063001-31110fa4cae1/web/middlewares/user_agent_test.go (about)

     1  package middlewares_test
     2  
     3  import (
     4  	"io"
     5  	"net/http"
     6  	"net/http/httptest"
     7  	"testing"
     8  
     9  	"github.com/cozy/cozy-stack/model/instance"
    10  	"github.com/cozy/cozy-stack/pkg/assets/dynamic"
    11  	"github.com/cozy/cozy-stack/pkg/config/config"
    12  	"github.com/cozy/cozy-stack/tests/testutils"
    13  	"github.com/cozy/cozy-stack/web"
    14  	"github.com/cozy/cozy-stack/web/middlewares"
    15  	"github.com/labstack/echo/v4"
    16  	"github.com/stretchr/testify/assert"
    17  	"github.com/stretchr/testify/require"
    18  )
    19  
    20  type stupidRenderer struct{}
    21  
    22  func TestUser(t *testing.T) {
    23  	if testing.Short() {
    24  		t.Skip("an instance is required for this test: test skipped due to the use of --short flag")
    25  	}
    26  
    27  	config.UseTestFile(t)
    28  	config.GetConfig().Assets = "../../assets"
    29  	setup := testutils.NewSetup(t, t.Name())
    30  
    31  	setup.SetupSwiftTest()
    32  	require.NoError(t, dynamic.InitDynamicAssetFS(config.FsURL().String()), "Could not init dynamic FS")
    33  
    34  	require.NoError(t, web.SetupAssets(echo.New(), config.GetConfig().Assets))
    35  
    36  	t.Run("UserAgent", func(t *testing.T) {
    37  		// middleware instance
    38  		e := echo.New()
    39  
    40  		e.Renderer = &stupidRenderer{}
    41  
    42  		req, _ := http.NewRequest(echo.GET, "http://cozy.local", nil)
    43  		req.Header.Set(echo.HeaderAccept, "text/html")
    44  		req.Header.Set("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0") // Firefox
    45  
    46  		ins := &instance.Instance{Domain: "cozy.local", Locale: "en"}
    47  
    48  		rec := httptest.NewRecorder()
    49  		c := e.NewContext(req, rec)
    50  		c.Set("instance", ins)
    51  
    52  		h := middlewares.CheckUserAgent(echo.NotFoundHandler)
    53  		err := h(c)
    54  		assert.Error(t, err)
    55  
    56  		req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko") // IE 11
    57  		h2 := middlewares.CheckUserAgent(echo.NotFoundHandler)
    58  		err2 := h2(c)
    59  		assert.NoError(t, err2, nil)
    60  
    61  		req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/17.14931") // Edge 17
    62  		h3 := middlewares.CheckUserAgent(echo.NotFoundHandler)
    63  		err3 := h3(c)
    64  		assert.NoError(t, err3, nil)
    65  
    66  		req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.81 Safari/537.36 Edg/97.0.1072.69") // Edge 97
    67  		h4 := middlewares.CheckUserAgent(echo.NotFoundHandler)
    68  		err4 := h4(c)
    69  		assert.Error(t, err4, nil)
    70  
    71  		req.Header.Set("User-Agent", "Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) FxiOS/97.0 Mobile/15E148 Safari/605.1.15") // Firefox for iOS
    72  		h5 := middlewares.CheckUserAgent(echo.NotFoundHandler)
    73  		err5 := h5(c)
    74  		assert.Error(t, err5, nil)
    75  	})
    76  
    77  	t.Run("ParseEdgeVersion", func(t *testing.T) {
    78  		version := "15.123456"
    79  		v, ok := middlewares.GetMajorVersion(version)
    80  		assert.Equal(t, 15, v)
    81  		assert.Equal(t, true, ok)
    82  
    83  		version = "75.123456.6789"
    84  		v, ok = middlewares.GetMajorVersion(version)
    85  		assert.Equal(t, 75, v)
    86  		assert.Equal(t, true, ok)
    87  
    88  		version = "12"
    89  		v, ok = middlewares.GetMajorVersion(version)
    90  		assert.Equal(t, 12, v)
    91  		assert.Equal(t, true, ok)
    92  
    93  		version = "foobar"
    94  		v, ok = middlewares.GetMajorVersion(version)
    95  		assert.Equal(t, -1, v)
    96  		assert.Equal(t, false, ok)
    97  	})
    98  }
    99  
   100  func (sr *stupidRenderer) Render(w io.Writer, name string, data interface{}, c echo.Context) error {
   101  	return nil
   102  }