From 1cc321d657d4771b44a8ff8a11f829501c0e1155 Mon Sep 17 00:00:00 2001 From: Adphi Date: Tue, 16 Oct 2018 14:38:32 +0200 Subject: [PATCH] Tests restructuration and AppsConfig implementation --- appsconfig.go | 106 +++++++++++++++++++++++++++++++++++++++++++ appsconfig_test.go | 56 +++++++++++++++++++++++ gonextcloud_test.go | 76 ------------------------------- groupfolders_test.go | 85 ++++++++++++++++++++++++++++++++++ routes.go | 2 + types/responses.go | 18 ++++++++ 6 files changed, 267 insertions(+), 76 deletions(-) create mode 100644 appsconfig.go create mode 100644 appsconfig_test.go create mode 100644 groupfolders_test.go diff --git a/appsconfig.go b/appsconfig.go new file mode 100644 index 0000000..060d8db --- /dev/null +++ b/appsconfig.go @@ -0,0 +1,106 @@ +package gonextcloud + +import ( + req "github.com/levigross/grequests" + "gitlab.adphi.fr/partitio/Nextcloud-Partitio/gonextcloud/types" + "net/http" + "sync" +) + +//AppsConfigList lists all the available apps +func (c *Client) AppsConfigList() (apps []string, err error) { + res, err := c.baseRequest(http.MethodGet, routes.appsConfig, nil) + if err != nil { + return nil, err + } + var r types.AppConfigResponse + res.JSON(&r) + return r.Ocs.Data.Data, nil +} + +//AppsConfigKeys returns the app's config keys +func (c *Client) AppsConfigKeys(id string) (keys []string, err error) { + res, err := c.baseRequest(http.MethodGet, routes.appsConfig, nil, id) + if err != nil { + return nil, err + } + var r types.AppConfigResponse + res.JSON(&r) + return r.Ocs.Data.Data, nil +} + +//AppsConfigValue get the config value for the given app's key +func (c *Client) AppsConfigValue(id, key string) (string, error) { + res, err := c.baseRequest(http.MethodGet, routes.appsConfig, nil, id, key) + if err != nil { + return "", err + } + var r types.AppcConfigValueResponse + res.JSON(&r) + return r.Ocs.Data.Data, nil +} + +//AppsConfigSetValue set the config value for the given app's key +func (c *Client) AppsConfigSetValue(id, key, value string) error { + ro := &req.RequestOptions{ + Data: map[string]string{ + "value": value, + }, + } + _, err := c.baseRequest(http.MethodPost, routes.appsConfig, ro, id, key) + return err +} + +//AppsConfigDeleteValue delete the config value and (!! be careful !!) the key +func (c *Client) AppsConfigDeleteValue(id, key, value string) error { + _, err := c.baseRequest(http.MethodDelete, routes.appsConfig, nil, id, key) + return err +} + +//AppsConfig returns all apps AppConfigDetails +func (c *Client) AppsConfig() (map[string]map[string]string, error) { + config := make(map[string]map[string]string) + var err error + appsIDs, err := c.AppsConfigList() + if err != nil { + return nil, err + } + var wg sync.WaitGroup + wg.Add(len(appsIDs)) + for i := range appsIDs { + go func(id string) { + defer wg.Done() + d, err := c.AppsConfigDetails(id) + if err == nil { + config[id] = d + } + }(appsIDs[i]) + } + wg.Wait() + return config, err +} + +//AppsConfigDetails returns all the config's key, values pair of the app +func (c *Client) AppsConfigDetails(appID string) (map[string]string, error) { + config := make(map[string]string) + var err error + var ks []string + ks, err = c.AppsConfigKeys(appID) + if err != nil { + return config, err + } + var wg sync.WaitGroup + wg.Add(len(ks)) + for i := range ks { + go func(key string) { + defer wg.Done() + var v string + v, err = c.AppsConfigValue(appID, key) + if err == nil { + config[key] = v + } + }(ks[i]) + } + wg.Wait() + return config, err +} diff --git a/appsconfig_test.go b/appsconfig_test.go new file mode 100644 index 0000000..31ee998 --- /dev/null +++ b/appsconfig_test.go @@ -0,0 +1,56 @@ +package gonextcloud + +import ( + "github.com/stretchr/testify/assert" + "testing" +) + +func TestAppsConfig(t *testing.T) { + c = nil + if err := initClient(); err != nil { + t.Fatal(err) + } + ac, err := c.AppsConfig() + assert.NoError(t, err) + assert.NotEmpty(t, ac) +} + +func TestAppsConfigList(t *testing.T) { + c = nil + if err := initClient(); err != nil { + t.Fatal(err) + } + a, err := c.AppsConfigList() + assert.NoError(t, err) + assert.Contains(t, a, "files") +} + +func TestAppsConfigKeys(t *testing.T) { + c = nil + if err := initClient(); err != nil { + t.Fatal(err) + } + ks, err := c.AppsConfigKeys("activity") + assert.NoError(t, err) + assert.Contains(t, ks, "enabled") +} + +func TestAppsConfigValue(t *testing.T) { + c = nil + if err := initClient(); err != nil { + t.Fatal(err) + } + k, err := c.AppsConfigValue("files", "enabled") + assert.NoError(t, err) + assert.Equal(t, "yes", k) +} + +func TestAppConfigDetails(t *testing.T) { + c = nil + if err := initClient(); err != nil { + t.Fatal(err) + } + d, err := c.AppsConfigDetails("activity") + assert.NoError(t, err) + assert.NotEmpty(t, d) +} diff --git a/gonextcloud_test.go b/gonextcloud_test.go index 05d64d4..c868de5 100644 --- a/gonextcloud_test.go +++ b/gonextcloud_test.go @@ -463,72 +463,6 @@ var ( }, }, } - - groupFoldersTests = []struct { - string - test - }{ - { - "TestGroupFoldersCreate", - func(t *testing.T) { - // Recreate client - var err error - groupID, err = c.GroupFoldersCreate("API") - assert.NoError(t, err) - }, - }, - { - "TestGroupFoldersList", - func(t *testing.T) { - gfs, err := c.GroupFoldersList() - assert.NoError(t, err) - assert.NotNil(t, gfs[groupID]) - }, - }, - { - "TestGroupFolders", - func(t *testing.T) { - gf, err := c.GroupFolders(groupID) - assert.NoError(t, err) - assert.NotNil(t, gf) - }, - }, - { - "TestGroupFolderRename", - func(t *testing.T) { - err := c.GroupFoldersRename(groupID, "API_Renamed") - assert.NoError(t, err) - }, - }, - { - "TestGroupFoldersAddGroup", - func(t *testing.T) { - err := c.GroupFoldersAddGroup(groupID, "admin") - assert.NoError(t, err) - }, - }, - { - "TestGroupFoldersSetGroupPermissions", - func(t *testing.T) { - err := c.GroupFoldersSetGroupPermissions(groupID, "admin", types.ReadPermission) - assert.NoError(t, err) - }, - }, - { - "TestGroupFoldersSetQuota", - func(t *testing.T) { - err := c.GroupFoldersSetQuota(groupID, 100) - assert.NoError(t, err) - }, - }, - { - "TestGroupFolderRemoveGroup", - func(t *testing.T) { - err := c.GroupFoldersRemoveGroup(groupID, "admin") - assert.NoError(t, err) - }, - }, - } ) func TestClient(t *testing.T) { @@ -540,16 +474,6 @@ func TestClient(t *testing.T) { } } -func TestGroupFolders(t *testing.T) { - c = nil - if err := initClient(); err != nil { - t.Fatal(err) - } - for _, tt := range groupFoldersTests { - t.Run(tt.string, tt.test) - } -} - func TestUserCreateWithoutPassword(t *testing.T) { c = nil if err := initClient(); err != nil { diff --git a/groupfolders_test.go b/groupfolders_test.go new file mode 100644 index 0000000..a8a007a --- /dev/null +++ b/groupfolders_test.go @@ -0,0 +1,85 @@ +package gonextcloud + +import ( + "github.com/stretchr/testify/assert" + "gitlab.adphi.fr/partitio/Nextcloud-Partitio/gonextcloud/types" + "testing" +) + +var ( + groupFoldersTests = []struct { + string + test + }{ + { + "TestGroupFoldersCreate", + func(t *testing.T) { + // Recreate client + var err error + groupID, err = c.GroupFoldersCreate("API") + assert.NoError(t, err) + }, + }, + { + "TestGroupFoldersList", + func(t *testing.T) { + gfs, err := c.GroupFoldersList() + assert.NoError(t, err) + assert.NotNil(t, gfs[groupID]) + }, + }, + { + "TestGroupFolders", + func(t *testing.T) { + gf, err := c.GroupFolders(groupID) + assert.NoError(t, err) + assert.NotNil(t, gf) + }, + }, + { + "TestGroupFolderRename", + func(t *testing.T) { + err := c.GroupFoldersRename(groupID, "API_Renamed") + assert.NoError(t, err) + }, + }, + { + "TestGroupFoldersAddGroup", + func(t *testing.T) { + err := c.GroupFoldersAddGroup(groupID, "admin") + assert.NoError(t, err) + }, + }, + { + "TestGroupFoldersSetGroupPermissions", + func(t *testing.T) { + err := c.GroupFoldersSetGroupPermissions(groupID, "admin", types.ReadPermission) + assert.NoError(t, err) + }, + }, + { + "TestGroupFoldersSetQuota", + func(t *testing.T) { + err := c.GroupFoldersSetQuota(groupID, 100) + assert.NoError(t, err) + }, + }, + { + "TestGroupFolderRemoveGroup", + func(t *testing.T) { + err := c.GroupFoldersRemoveGroup(groupID, "admin") + assert.NoError(t, err) + }, + }, + } +) + +func TestGroupFolders(t *testing.T) { + c = nil + if err := initClient(); err != nil { + t.Fatal(err) + } + for _, tt := range groupFoldersTests { + t.Run(tt.string, tt.test) + } +} diff --git a/routes.go b/routes.go index 54bb0a2..eb2774d 100644 --- a/routes.go +++ b/routes.go @@ -11,6 +11,7 @@ type Routes struct { monitor *url.URL shares *url.URL groupfolders *url.URL + appsConfig *url.URL } const badRequest = 998 @@ -25,5 +26,6 @@ var ( monitor: &url.URL{Path: apiPath.Path + "/apps/serverinfo/api/v1/info"}, shares: &url.URL{Path: apiPath.Path + "/apps/files_sharing/api/v1/shares"}, groupfolders: &url.URL{Path: "apps/groupfolders/folders"}, + appsConfig: &url.URL{Path: apiPath.Path + "/apps/provisioning_api/api/v1/config/apps"}, } ) diff --git a/types/responses.go b/types/responses.go index 1646f42..75b6eb8 100644 --- a/types/responses.go +++ b/types/responses.go @@ -90,6 +90,24 @@ type AppResponse struct { } `json:"ocs"` } +type AppConfigResponse struct { + Ocs struct { + Meta Meta `json:"meta"` + Data struct { + Data []string `json:"data"` + } `json:"data"` + } `json:"ocs"` +} + +type AppcConfigValueResponse struct { + Ocs struct { + Meta Meta `json:"meta"` + Data struct { + Data string `json:"data"` + } `json:"data"` + } `json:"ocs"` +} + //CapabilitiesResponse type CapabilitiesResponse struct { Ocs struct {