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 }