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

     1  package remote
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/cozy/cozy-stack/model/instance"
     7  	"github.com/cozy/cozy-stack/model/permission"
     8  	"github.com/cozy/cozy-stack/pkg/config/config"
     9  	"github.com/cozy/cozy-stack/pkg/consts"
    10  	"github.com/cozy/cozy-stack/pkg/couchdb"
    11  	"github.com/cozy/cozy-stack/tests/testutils"
    12  	"github.com/stretchr/testify/assert"
    13  	"github.com/stretchr/testify/require"
    14  )
    15  
    16  func TestRemote(t *testing.T) {
    17  	if testing.Short() {
    18  		t.Skip("an instance is required for this test: test skipped due to the use of --short flag")
    19  	}
    20  
    21  	config.UseTestFile(t)
    22  	testutils.NeedCouchdb(t)
    23  	setup := testutils.NewSetup(t, t.Name())
    24  
    25  	testInstance := setup.GetTestInstance()
    26  	token := generateAppToken(testInstance, "answers", "org.wikidata.entity")
    27  
    28  	ts := setup.GetTestServer("/remote", Routes)
    29  	t.Cleanup(ts.Close)
    30  
    31  	t.Run("RemoteGET", func(t *testing.T) {
    32  		e := testutils.CreateTestClient(t, ts.URL)
    33  
    34  		obj := e.GET("/remote/org.wikidata.entity").
    35  			WithQuery("entity", "Q42").
    36  			WithQuery("comment", "foo").
    37  			WithHeader("Authorization", "Bearer "+token).
    38  			WithHost(testInstance.Domain).
    39  			Expect().Status(200).
    40  			JSON().Object()
    41  
    42  		obj.Value("entities").Object().NotEmpty()
    43  
    44  		var results []map[string]interface{}
    45  		allReq := &couchdb.AllDocsRequest{
    46  			Descending: true,
    47  			Limit:      1,
    48  		}
    49  		err := couchdb.GetAllDocs(testInstance, consts.RemoteRequests, allReq, &results)
    50  		require.NoError(t, err)
    51  		require.Len(t, results, 1)
    52  
    53  		logged := results[0]
    54  		assert.Equal(t, "org.wikidata.entity", logged["doctype"].(string))
    55  		assert.Equal(t, "GET", logged["verb"].(string))
    56  		assert.Equal(t, "https://www.wikidata.org/wiki/Special:EntityData/Q42.json", logged["url"].(string))
    57  		assert.Equal(t, float64(200), logged["response_code"].(float64))
    58  		assert.Equal(t, "application/json", logged["content_type"].(string))
    59  		assert.NotNil(t, logged["created_at"])
    60  		vars := logged["variables"].(map[string]interface{})
    61  		assert.Equal(t, "Q42", vars["entity"].(string))
    62  		assert.Equal(t, "foo", vars["comment"].(string))
    63  		meta, _ := logged["cozyMetadata"].(map[string]interface{})
    64  		assert.Equal(t, "answers", meta["createdByApp"])
    65  	})
    66  }
    67  
    68  func generateAppToken(inst *instance.Instance, slug, doctype string) string {
    69  	rules := permission.Set{
    70  		permission.Rule{
    71  			Type:  doctype,
    72  			Verbs: permission.ALL,
    73  		},
    74  	}
    75  	permReq := permission.Permission{
    76  		Permissions: rules,
    77  		Type:        permission.TypeWebapp,
    78  		SourceID:    consts.Apps + "/" + slug,
    79  	}
    80  	err := couchdb.CreateDoc(inst, &permReq)
    81  	if err != nil {
    82  		return ""
    83  	}
    84  	manifest := &couchdb.JSONDoc{
    85  		Type: consts.Apps,
    86  		M: map[string]interface{}{
    87  			"_id":         consts.Apps + "/" + slug,
    88  			"slug":        slug,
    89  			"permissions": rules,
    90  		},
    91  	}
    92  	err = couchdb.CreateNamedDocWithDB(inst, manifest)
    93  	if err != nil {
    94  		return ""
    95  	}
    96  	return inst.BuildAppToken(slug, "")
    97  }