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

     1  package settings_test
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/cozy/cozy-stack/model/instance/lifecycle"
     7  	"github.com/cozy/cozy-stack/model/oauth"
     8  	csettings "github.com/cozy/cozy-stack/model/settings"
     9  	"github.com/cozy/cozy-stack/pkg/config/config"
    10  	"github.com/cozy/cozy-stack/pkg/consts"
    11  	"github.com/cozy/cozy-stack/tests/testutils"
    12  	"github.com/gavv/httpexpect/v2"
    13  	"github.com/stretchr/testify/require"
    14  )
    15  
    16  func TestClientsUsage(t *testing.T) {
    17  	config.UseTestFile(t)
    18  	testutils.NeedCouchdb(t)
    19  	setup := testutils.NewSetup(t, t.Name())
    20  	testInstance := setup.GetTestInstance(&lifecycle.Options{
    21  		Locale:      "en",
    22  		Timezone:    "Europe/Berlin",
    23  		Email:       "alice@example.com",
    24  		ContextName: "test-context",
    25  	})
    26  	scope := consts.Settings + " " + consts.OAuthClients
    27  	_, token := setup.GetTestClient(scope)
    28  
    29  	svc := csettings.NewServiceMock(t)
    30  	ts := setupRouter(t, testInstance, svc)
    31  
    32  	flagship := oauth.Client{
    33  		RedirectURIs: []string{"cozy://flagship"},
    34  		ClientName:   "flagship-app",
    35  		ClientKind:   "mobile",
    36  		SoftwareID:   "github.com/cozy/cozy-stack/testing/flagship",
    37  		Flagship:     true,
    38  	}
    39  	require.Nil(t, flagship.Create(testInstance, oauth.NotPending))
    40  
    41  	t.Run("WithoutLimit", func(t *testing.T) {
    42  		testutils.WithFlag(t, testInstance, "cozy.oauthclients.max", float64(-1))
    43  
    44  		e := testutils.CreateTestClient(t, ts.URL)
    45  		obj := e.GET("/settings/clients-usage").
    46  			WithHeader("Authorization", "Bearer "+token).
    47  			Expect().Status(200).
    48  			JSON(httpexpect.ContentOpts{MediaType: "application/vnd.api+json"}).
    49  			Object()
    50  
    51  		data := obj.Value("data").Object()
    52  		data.HasValue("type", "io.cozy.settings")
    53  		data.HasValue("id", "io.cozy.settings.clients-usage")
    54  
    55  		attrs := data.Value("attributes").Object()
    56  		attrs.NotContainsKey("limit")
    57  		attrs.HasValue("count", 1)
    58  		attrs.HasValue("limitReached", false)
    59  		attrs.HasValue("limitExceeded", false)
    60  	})
    61  
    62  	t.Run("WithLimitNotReached", func(t *testing.T) {
    63  		testutils.WithFlag(t, testInstance, "cozy.oauthclients.max", float64(2))
    64  
    65  		e := testutils.CreateTestClient(t, ts.URL)
    66  		obj := e.GET("/settings/clients-usage").
    67  			WithHeader("Authorization", "Bearer "+token).
    68  			Expect().Status(200).
    69  			JSON(httpexpect.ContentOpts{MediaType: "application/vnd.api+json"}).
    70  			Object()
    71  
    72  		data := obj.Value("data").Object()
    73  		data.HasValue("type", "io.cozy.settings")
    74  		data.HasValue("id", "io.cozy.settings.clients-usage")
    75  
    76  		attrs := data.Value("attributes").Object()
    77  		attrs.HasValue("limit", 2)
    78  		attrs.HasValue("count", 1)
    79  		attrs.HasValue("limitReached", false)
    80  		attrs.HasValue("limitExceeded", false)
    81  	})
    82  
    83  	t.Run("WithLimitReached", func(t *testing.T) {
    84  		testutils.WithFlag(t, testInstance, "cozy.oauthclients.max", float64(1))
    85  
    86  		e := testutils.CreateTestClient(t, ts.URL)
    87  		obj := e.GET("/settings/clients-usage").
    88  			WithHeader("Authorization", "Bearer "+token).
    89  			Expect().Status(200).
    90  			JSON(httpexpect.ContentOpts{MediaType: "application/vnd.api+json"}).
    91  			Object()
    92  
    93  		data := obj.Value("data").Object()
    94  		data.HasValue("type", "io.cozy.settings")
    95  		data.HasValue("id", "io.cozy.settings.clients-usage")
    96  
    97  		attrs := data.Value("attributes").Object()
    98  		attrs.HasValue("limit", 1)
    99  		attrs.HasValue("count", 1)
   100  		attrs.HasValue("limitReached", true)
   101  		attrs.HasValue("limitExceeded", false)
   102  	})
   103  
   104  	t.Run("WithLimitExceeded", func(t *testing.T) {
   105  		testutils.WithFlag(t, testInstance, "cozy.oauthclients.max", float64(0))
   106  
   107  		e := testutils.CreateTestClient(t, ts.URL)
   108  		obj := e.GET("/settings/clients-usage").
   109  			WithHeader("Authorization", "Bearer "+token).
   110  			Expect().Status(200).
   111  			JSON(httpexpect.ContentOpts{MediaType: "application/vnd.api+json"}).
   112  			Object()
   113  
   114  		data := obj.Value("data").Object()
   115  		data.HasValue("type", "io.cozy.settings")
   116  		data.HasValue("id", "io.cozy.settings.clients-usage")
   117  
   118  		attrs := data.Value("attributes").Object()
   119  		attrs.HasValue("limit", 0)
   120  		attrs.HasValue("count", 1)
   121  		attrs.HasValue("limitReached", true)
   122  		attrs.HasValue("limitExceeded", true)
   123  	})
   124  }