diff --git a/api/get_music_directory.go b/api/browsing.go
similarity index 50%
rename from api/get_music_directory.go
rename to api/browsing.go
index 4c55b9215..2fc268cbc 100644
--- a/api/get_music_directory.go
+++ b/api/browsing.go
@@ -1,6 +1,8 @@
package api
import (
+ "fmt"
+
"github.com/astaxie/beego"
"github.com/deluan/gosonic/api/responses"
"github.com/deluan/gosonic/engine"
@@ -8,16 +10,58 @@ import (
"github.com/karlkfi/inject"
)
-type GetMusicDirectoryController struct {
+type BrowsingController struct {
BaseAPIController
browser engine.Browser
}
-func (c *GetMusicDirectoryController) Prepare() {
+func (c *BrowsingController) Prepare() {
inject.ExtractAssignable(utils.Graph, &c.browser)
}
-func (c *GetMusicDirectoryController) Get() {
+func (c *BrowsingController) GetMediaFolders() {
+ mediaFolderList, _ := c.browser.MediaFolders()
+ folders := make([]responses.MusicFolder, len(*mediaFolderList))
+ for i, f := range *mediaFolderList {
+ folders[i].Id = f.Id
+ folders[i].Name = f.Name
+ }
+ response := c.NewEmpty()
+ response.MusicFolders = &responses.MusicFolders{Folders: folders}
+ c.SendResponse(response)
+}
+
+// TODO: Shortcuts amd validate musicFolder parameter
+func (c *BrowsingController) GetIndexes() {
+ ifModifiedSince := c.ParamTime("ifModifiedSince")
+
+ indexes, lastModified, err := c.browser.Indexes(ifModifiedSince)
+ if err != nil {
+ beego.Error("Error retrieving Indexes:", err)
+ c.SendError(responses.ERROR_GENERIC, "Internal Error")
+ }
+
+ res := responses.Indexes{
+ IgnoredArticles: beego.AppConfig.String("ignoredArticles"),
+ LastModified: fmt.Sprint(utils.ToMillis(lastModified)),
+ }
+
+ res.Index = make([]responses.Index, len(*indexes))
+ for i, idx := range *indexes {
+ res.Index[i].Name = idx.Id
+ res.Index[i].Artists = make([]responses.Artist, len(idx.Artists))
+ for j, a := range idx.Artists {
+ res.Index[i].Artists[j].Id = a.ArtistId
+ res.Index[i].Artists[j].Name = a.Artist
+ }
+ }
+
+ response := c.NewEmpty()
+ response.Indexes = &res
+ c.SendResponse(response)
+}
+
+func (c *BrowsingController) GetDirectory() {
id := c.RequiredParamString("id", "id parameter required")
response := c.NewEmpty()
@@ -37,7 +81,7 @@ func (c *GetMusicDirectoryController) Get() {
c.SendResponse(response)
}
-func (c *GetMusicDirectoryController) buildDirectory(d *engine.DirectoryInfo) *responses.Directory {
+func (c *BrowsingController) buildDirectory(d *engine.DirectoryInfo) *responses.Directory {
dir := &responses.Directory{Id: d.Id, Name: d.Name}
dir.Child = make([]responses.Child, len(d.Children))
diff --git a/api/browsing_test.go b/api/browsing_test.go
new file mode 100644
index 000000000..e719462a4
--- /dev/null
+++ b/api/browsing_test.go
@@ -0,0 +1,187 @@
+package api_test
+
+import (
+ "testing"
+
+ "github.com/deluan/gosonic/api/responses"
+ "github.com/deluan/gosonic/consts"
+ "github.com/deluan/gosonic/domain"
+ "github.com/deluan/gosonic/engine"
+ . "github.com/deluan/gosonic/tests"
+ "github.com/deluan/gosonic/tests/mocks"
+ "github.com/deluan/gosonic/utils"
+ . "github.com/smartystreets/goconvey/convey"
+)
+
+func TestGetMusicFolders(t *testing.T) {
+ Init(t, false)
+
+ _, w := Get(AddParams("/rest/getMusicFolders.view"), "TestGetMusicFolders")
+
+ Convey("Subject: GetMusicFolders Endpoint", t, func() {
+ Convey("Status code should be 200", func() {
+ So(w.Code, ShouldEqual, 200)
+ })
+ Convey("The response should include the default folder", func() {
+ So(UnindentJSON(w.Body.Bytes()), ShouldContainSubstring, `{"musicFolder":[{"id":"0","name":"iTunes Library"}]}`)
+ })
+ })
+}
+
+const (
+ emptyResponse = `{"indexes":{"ignoredArticles":"The El La Los Las Le Les Os As O A","lastModified":"1"}`
+)
+
+func TestGetIndexes(t *testing.T) {
+ Init(t, false)
+
+ mockRepo := mocks.CreateMockArtistIndexRepo()
+ utils.DefineSingleton(new(domain.ArtistIndexRepository), func() domain.ArtistIndexRepository {
+ return mockRepo
+ })
+ propRepo := mocks.CreateMockPropertyRepo()
+ utils.DefineSingleton(new(engine.PropertyRepository), func() engine.PropertyRepository {
+ return propRepo
+ })
+
+ mockRepo.SetData("[]", 0)
+ mockRepo.SetError(false)
+ propRepo.Put(consts.LastScan, "1")
+ propRepo.SetError(false)
+
+ Convey("Subject: GetIndexes Endpoint", t, func() {
+ Convey("Return fail on Index Table error", func() {
+ mockRepo.SetError(true)
+ _, w := Get(AddParams("/rest/getIndexes.view", "ifModifiedSince=0"), "TestGetIndexes")
+
+ So(w.Body, ShouldReceiveError, responses.ERROR_GENERIC)
+ })
+ Convey("Return fail on Property Table error", func() {
+ propRepo.SetError(true)
+ _, w := Get(AddParams("/rest/getIndexes.view"), "TestGetIndexes")
+
+ So(w.Body, ShouldReceiveError, responses.ERROR_GENERIC)
+ })
+ Convey("When the index is empty", func() {
+ _, w := Get(AddParams("/rest/getIndexes.view"), "TestGetIndexes")
+
+ Convey("Status code should be 200", func() {
+ So(w.Code, ShouldEqual, 200)
+ })
+ Convey("Then it should return an empty collection", func() {
+ So(UnindentJSON(w.Body.Bytes()), ShouldContainSubstring, emptyResponse)
+ })
+ })
+ Convey("When the index is not empty", func() {
+ mockRepo.SetData(`[{"Id": "A","Artists": [
+ {"ArtistId": "21", "Artist": "Afrolicious"}
+ ]}]`, 2)
+
+ SkipConvey("Then it should return the the items in the response", func() {
+ _, w := Get(AddParams("/rest/getIndexes.view"), "TestGetIndexes")
+
+ So(w.Body.String(), ShouldContainSubstring,
+ ``)
+ })
+ })
+ Convey("And it should return empty if 'ifModifiedSince' is more recent than the index", func() {
+ mockRepo.SetData(`[{"Id": "A","Artists": [
+ {"ArtistId": "21", "Artist": "Afrolicious"}
+ ]}]`, 2)
+ propRepo.Put(consts.LastScan, "1")
+
+ _, w := Get(AddParams("/rest/getIndexes.view", "ifModifiedSince=2"), "TestGetIndexes")
+
+ So(UnindentJSON(w.Body.Bytes()), ShouldContainSubstring, emptyResponse)
+ })
+ Convey("And it should return empty if 'ifModifiedSince' is the asme as tie index last update", func() {
+ mockRepo.SetData(`[{"Id": "A","Artists": [
+ {"ArtistId": "21", "Artist": "Afrolicious"}
+ ]}]`, 2)
+ propRepo.Put(consts.LastScan, "1")
+
+ _, w := Get(AddParams("/rest/getIndexes.view", "ifModifiedSince=1"), "TestGetIndexes")
+
+ So(UnindentJSON(w.Body.Bytes()), ShouldContainSubstring, emptyResponse)
+ })
+ Reset(func() {
+ mockRepo.SetData("[]", 0)
+ mockRepo.SetError(false)
+ propRepo.Put(consts.LastScan, "1")
+ propRepo.SetError(false)
+ })
+ })
+}
+
+func TestGetMusicDirectory(t *testing.T) {
+ Init(t, false)
+
+ mockArtistRepo := mocks.CreateMockArtistRepo()
+ utils.DefineSingleton(new(domain.ArtistRepository), func() domain.ArtistRepository {
+ return mockArtistRepo
+ })
+ mockAlbumRepo := mocks.CreateMockAlbumRepo()
+ utils.DefineSingleton(new(domain.AlbumRepository), func() domain.AlbumRepository {
+ return mockAlbumRepo
+ })
+ mockMediaFileRepo := mocks.CreateMockMediaFileRepo()
+ utils.DefineSingleton(new(domain.MediaFileRepository), func() domain.MediaFileRepository {
+ return mockMediaFileRepo
+ })
+
+ Convey("Subject: GetMusicDirectory Endpoint", t, func() {
+ Convey("Should fail if missing Id parameter", func() {
+ _, w := Get(AddParams("/rest/getMusicDirectory.view"), "TestGetMusicDirectory")
+
+ So(w.Body, ShouldReceiveError, responses.ERROR_MISSING_PARAMETER)
+ })
+ Convey("Id is for an artist", func() {
+ Convey("Return fail on Artist Table error", func() {
+ mockArtistRepo.SetData(`[{"Id":"1","Name":"The Charlatans"}]`, 1)
+ mockArtistRepo.SetError(true)
+ _, w := Get(AddParams("/rest/getMusicDirectory.view", "id=1"), "TestGetMusicDirectory")
+
+ So(w.Body, ShouldReceiveError, responses.ERROR_GENERIC)
+ })
+ })
+ Convey("When id is not found", func() {
+ mockArtistRepo.SetData(`[{"Id":"1","Name":"The Charlatans"}]`, 1)
+ _, w := Get(AddParams("/rest/getMusicDirectory.view", "id=NOT_FOUND"), "TestGetMusicDirectory")
+
+ So(w.Body, ShouldReceiveError, responses.ERROR_DATA_NOT_FOUND)
+ })
+ Convey("When id matches an artist", func() {
+ mockArtistRepo.SetData(`[{"Id":"1","Name":"The KLF"}]`, 1)
+
+ Convey("Without albums", func() {
+ _, w := Get(AddParams("/rest/getMusicDirectory.view", "id=1"), "TestGetMusicDirectory")
+
+ So(w.Body, ShouldContainJSON, `"id":"1","name":"The KLF"`)
+ })
+ Convey("With albums", func() {
+ mockAlbumRepo.SetData(`[{"Id":"A","Name":"Tardis","ArtistId":"1"}]`, 1)
+ _, w := Get(AddParams("/rest/getMusicDirectory.view", "id=1"), "TestGetMusicDirectory")
+
+ So(w.Body, ShouldContainJSON, `"child":[{"album":"Tardis","id":"A","isDir":true,"parent":"1","title":"Tardis"}]`)
+ })
+ })
+ Convey("When id matches an album with tracks", func() {
+ mockArtistRepo.SetData(`[{"Id":"2","Name":"Céu"}]`, 1)
+ mockAlbumRepo.SetData(`[{"Id":"A","Name":"Vagarosa","ArtistId":"2"}]`, 1)
+ mockMediaFileRepo.SetData(`[{"Id":"3","Title":"Cangote","AlbumId":"A"}]`, 1)
+ _, w := Get(AddParams("/rest/getMusicDirectory.view", "id=A"), "TestGetMusicDirectory")
+
+ So(w.Body, ShouldContainJSON, `"child":[{"id":"3","isDir":false,"parent":"A","title":"Cangote"}]`)
+ })
+ Reset(func() {
+ mockArtistRepo.SetData("[]", 0)
+ mockArtistRepo.SetError(false)
+
+ mockAlbumRepo.SetData("[]", 0)
+ mockAlbumRepo.SetError(false)
+
+ mockMediaFileRepo.SetData("[]", 0)
+ mockMediaFileRepo.SetError(false)
+ })
+ })
+}
diff --git a/api/get_indexes.go b/api/get_indexes.go
deleted file mode 100644
index be13d323c..000000000
--- a/api/get_indexes.go
+++ /dev/null
@@ -1,50 +0,0 @@
-package api
-
-import (
- "fmt"
-
- "github.com/astaxie/beego"
- "github.com/deluan/gosonic/api/responses"
- "github.com/deluan/gosonic/engine"
- "github.com/deluan/gosonic/utils"
- "github.com/karlkfi/inject"
-)
-
-type GetIndexesController struct {
- BaseAPIController
- browser engine.Browser
-}
-
-func (c *GetIndexesController) Prepare() {
- inject.ExtractAssignable(utils.Graph, &c.browser)
-}
-
-// TODO: Shortcuts amd validate musicFolder parameter
-func (c *GetIndexesController) Get() {
- ifModifiedSince := c.ParamTime("ifModifiedSince")
-
- indexes, lastModified, err := c.browser.Indexes(ifModifiedSince)
- if err != nil {
- beego.Error("Error retrieving Indexes:", err)
- c.SendError(responses.ERROR_GENERIC, "Internal Error")
- }
-
- res := responses.Indexes{
- IgnoredArticles: beego.AppConfig.String("ignoredArticles"),
- LastModified: fmt.Sprint(utils.ToMillis(lastModified)),
- }
-
- res.Index = make([]responses.Index, len(*indexes))
- for i, idx := range *indexes {
- res.Index[i].Name = idx.Id
- res.Index[i].Artists = make([]responses.Artist, len(idx.Artists))
- for j, a := range idx.Artists {
- res.Index[i].Artists[j].Id = a.ArtistId
- res.Index[i].Artists[j].Name = a.Artist
- }
- }
-
- response := c.NewEmpty()
- response.Indexes = &res
- c.SendResponse(response)
-}
diff --git a/api/get_indexes_test.go b/api/get_indexes_test.go
deleted file mode 100644
index 56aab2d87..000000000
--- a/api/get_indexes_test.go
+++ /dev/null
@@ -1,99 +0,0 @@
-package api_test
-
-import (
- "testing"
-
- "github.com/deluan/gosonic/api/responses"
- "github.com/deluan/gosonic/consts"
- "github.com/deluan/gosonic/domain"
- "github.com/deluan/gosonic/engine"
- . "github.com/deluan/gosonic/tests"
- "github.com/deluan/gosonic/tests/mocks"
- "github.com/deluan/gosonic/utils"
- . "github.com/smartystreets/goconvey/convey"
-)
-
-const (
- emptyResponse = `{"indexes":{"ignoredArticles":"The El La Los Las Le Les Os As O A","lastModified":"1"}`
-)
-
-func TestGetIndexes(t *testing.T) {
- Init(t, false)
-
- mockRepo := mocks.CreateMockArtistIndexRepo()
- utils.DefineSingleton(new(domain.ArtistIndexRepository), func() domain.ArtistIndexRepository {
- return mockRepo
- })
- propRepo := mocks.CreateMockPropertyRepo()
- utils.DefineSingleton(new(engine.PropertyRepository), func() engine.PropertyRepository {
- return propRepo
- })
-
- mockRepo.SetData("[]", 0)
- mockRepo.SetError(false)
- propRepo.Put(consts.LastScan, "1")
- propRepo.SetError(false)
-
- Convey("Subject: GetIndexes Endpoint", t, func() {
- Convey("Return fail on Index Table error", func() {
- mockRepo.SetError(true)
- _, w := Get(AddParams("/rest/getIndexes.view", "ifModifiedSince=0"), "TestGetIndexes")
-
- So(w.Body, ShouldReceiveError, responses.ERROR_GENERIC)
- })
- Convey("Return fail on Property Table error", func() {
- propRepo.SetError(true)
- _, w := Get(AddParams("/rest/getIndexes.view"), "TestGetIndexes")
-
- So(w.Body, ShouldReceiveError, responses.ERROR_GENERIC)
- })
- Convey("When the index is empty", func() {
- _, w := Get(AddParams("/rest/getIndexes.view"), "TestGetIndexes")
-
- Convey("Status code should be 200", func() {
- So(w.Code, ShouldEqual, 200)
- })
- Convey("Then it should return an empty collection", func() {
- So(UnindentJSON(w.Body.Bytes()), ShouldContainSubstring, emptyResponse)
- })
- })
- Convey("When the index is not empty", func() {
- mockRepo.SetData(`[{"Id": "A","Artists": [
- {"ArtistId": "21", "Artist": "Afrolicious"}
- ]}]`, 2)
-
- SkipConvey("Then it should return the the items in the response", func() {
- _, w := Get(AddParams("/rest/getIndexes.view"), "TestGetIndexes")
-
- So(w.Body.String(), ShouldContainSubstring,
- ``)
- })
- })
- Convey("And it should return empty if 'ifModifiedSince' is more recent than the index", func() {
- mockRepo.SetData(`[{"Id": "A","Artists": [
- {"ArtistId": "21", "Artist": "Afrolicious"}
- ]}]`, 2)
- propRepo.Put(consts.LastScan, "1")
-
- _, w := Get(AddParams("/rest/getIndexes.view", "ifModifiedSince=2"), "TestGetIndexes")
-
- So(UnindentJSON(w.Body.Bytes()), ShouldContainSubstring, emptyResponse)
- })
- Convey("And it should return empty if 'ifModifiedSince' is the asme as tie index last update", func() {
- mockRepo.SetData(`[{"Id": "A","Artists": [
- {"ArtistId": "21", "Artist": "Afrolicious"}
- ]}]`, 2)
- propRepo.Put(consts.LastScan, "1")
-
- _, w := Get(AddParams("/rest/getIndexes.view", "ifModifiedSince=1"), "TestGetIndexes")
-
- So(UnindentJSON(w.Body.Bytes()), ShouldContainSubstring, emptyResponse)
- })
- Reset(func() {
- mockRepo.SetData("[]", 0)
- mockRepo.SetError(false)
- propRepo.Put(consts.LastScan, "1")
- propRepo.SetError(false)
- })
- })
-}
diff --git a/api/get_license.go b/api/get_license.go
deleted file mode 100644
index ae33aeb5b..000000000
--- a/api/get_license.go
+++ /dev/null
@@ -1,13 +0,0 @@
-package api
-
-import (
- "github.com/deluan/gosonic/api/responses"
-)
-
-type GetLicenseController struct{ BaseAPIController }
-
-func (c *GetLicenseController) Get() {
- response := c.NewEmpty()
- response.License = &responses.License{Valid: true}
- c.SendResponse(response)
-}
diff --git a/api/get_license_test.go b/api/get_license_test.go
deleted file mode 100644
index 4598d7591..000000000
--- a/api/get_license_test.go
+++ /dev/null
@@ -1,23 +0,0 @@
-package api_test
-
-import (
- . "github.com/deluan/gosonic/tests"
- . "github.com/smartystreets/goconvey/convey"
- "testing"
-)
-
-func TestGetLicense(t *testing.T) {
- Init(t, false)
-
- _, w := Get(AddParams("/rest/getLicense.view"), "TestGetLicense")
-
- Convey("Subject: GetLicense Endpoint", t, func() {
- Convey("Status code should be 200", func() {
- So(w.Code, ShouldEqual, 200)
- })
- Convey("The license should always be valid", func() {
- So(UnindentJSON(w.Body.Bytes()), ShouldContainSubstring, `"license":{"valid":true}`)
- })
-
- })
-}
diff --git a/api/get_music_directory_test.go b/api/get_music_directory_test.go
deleted file mode 100644
index 2cd1d8070..000000000
--- a/api/get_music_directory_test.go
+++ /dev/null
@@ -1,85 +0,0 @@
-package api_test
-
-import (
- "testing"
-
- "github.com/deluan/gosonic/api/responses"
- "github.com/deluan/gosonic/domain"
- . "github.com/deluan/gosonic/tests"
- "github.com/deluan/gosonic/tests/mocks"
- "github.com/deluan/gosonic/utils"
- . "github.com/smartystreets/goconvey/convey"
-)
-
-func TestGetMusicDirectory(t *testing.T) {
- Init(t, false)
-
- mockArtistRepo := mocks.CreateMockArtistRepo()
- utils.DefineSingleton(new(domain.ArtistRepository), func() domain.ArtistRepository {
- return mockArtistRepo
- })
- mockAlbumRepo := mocks.CreateMockAlbumRepo()
- utils.DefineSingleton(new(domain.AlbumRepository), func() domain.AlbumRepository {
- return mockAlbumRepo
- })
- mockMediaFileRepo := mocks.CreateMockMediaFileRepo()
- utils.DefineSingleton(new(domain.MediaFileRepository), func() domain.MediaFileRepository {
- return mockMediaFileRepo
- })
-
- Convey("Subject: GetMusicDirectory Endpoint", t, func() {
- Convey("Should fail if missing Id parameter", func() {
- _, w := Get(AddParams("/rest/getMusicDirectory.view"), "TestGetMusicDirectory")
-
- So(w.Body, ShouldReceiveError, responses.ERROR_MISSING_PARAMETER)
- })
- Convey("Id is for an artist", func() {
- Convey("Return fail on Artist Table error", func() {
- mockArtistRepo.SetData(`[{"Id":"1","Name":"The Charlatans"}]`, 1)
- mockArtistRepo.SetError(true)
- _, w := Get(AddParams("/rest/getMusicDirectory.view", "id=1"), "TestGetMusicDirectory")
-
- So(w.Body, ShouldReceiveError, responses.ERROR_GENERIC)
- })
- })
- Convey("When id is not found", func() {
- mockArtistRepo.SetData(`[{"Id":"1","Name":"The Charlatans"}]`, 1)
- _, w := Get(AddParams("/rest/getMusicDirectory.view", "id=NOT_FOUND"), "TestGetMusicDirectory")
-
- So(w.Body, ShouldReceiveError, responses.ERROR_DATA_NOT_FOUND)
- })
- Convey("When id matches an artist", func() {
- mockArtistRepo.SetData(`[{"Id":"1","Name":"The KLF"}]`, 1)
-
- Convey("Without albums", func() {
- _, w := Get(AddParams("/rest/getMusicDirectory.view", "id=1"), "TestGetMusicDirectory")
-
- So(w.Body, ShouldContainJSON, `"id":"1","name":"The KLF"`)
- })
- Convey("With albums", func() {
- mockAlbumRepo.SetData(`[{"Id":"A","Name":"Tardis","ArtistId":"1"}]`, 1)
- _, w := Get(AddParams("/rest/getMusicDirectory.view", "id=1"), "TestGetMusicDirectory")
-
- So(w.Body, ShouldContainJSON, `"child":[{"album":"Tardis","id":"A","isDir":true,"parent":"1","title":"Tardis"}]`)
- })
- })
- Convey("When id matches an album with tracks", func() {
- mockArtistRepo.SetData(`[{"Id":"2","Name":"Céu"}]`, 1)
- mockAlbumRepo.SetData(`[{"Id":"A","Name":"Vagarosa","ArtistId":"2"}]`, 1)
- mockMediaFileRepo.SetData(`[{"Id":"3","Title":"Cangote","AlbumId":"A"}]`, 1)
- _, w := Get(AddParams("/rest/getMusicDirectory.view", "id=A"), "TestGetMusicDirectory")
-
- So(w.Body, ShouldContainJSON, `"child":[{"id":"3","isDir":false,"parent":"A","title":"Cangote"}]`)
- })
- Reset(func() {
- mockArtistRepo.SetData("[]", 0)
- mockArtistRepo.SetError(false)
-
- mockAlbumRepo.SetData("[]", 0)
- mockAlbumRepo.SetError(false)
-
- mockMediaFileRepo.SetData("[]", 0)
- mockMediaFileRepo.SetError(false)
- })
- })
-}
diff --git a/api/get_music_folders.go b/api/get_music_folders.go
deleted file mode 100644
index cb65ec932..000000000
--- a/api/get_music_folders.go
+++ /dev/null
@@ -1,29 +0,0 @@
-package api
-
-import (
- "github.com/deluan/gosonic/api/responses"
- "github.com/deluan/gosonic/engine"
- "github.com/deluan/gosonic/utils"
- "github.com/karlkfi/inject"
-)
-
-type GetMusicFoldersController struct {
- BaseAPIController
- browser engine.Browser
-}
-
-func (c *GetMusicFoldersController) Prepare() {
- inject.ExtractAssignable(utils.Graph, &c.browser)
-}
-
-func (c *GetMusicFoldersController) Get() {
- mediaFolderList, _ := c.browser.MediaFolders()
- folders := make([]responses.MusicFolder, len(*mediaFolderList))
- for i, f := range *mediaFolderList {
- folders[i].Id = f.Id
- folders[i].Name = f.Name
- }
- response := c.NewEmpty()
- response.MusicFolders = &responses.MusicFolders{Folders: folders}
- c.SendResponse(response)
-}
diff --git a/api/get_music_folders_test.go b/api/get_music_folders_test.go
deleted file mode 100644
index dd131ead1..000000000
--- a/api/get_music_folders_test.go
+++ /dev/null
@@ -1,23 +0,0 @@
-package api_test
-
-import (
- "testing"
-
- . "github.com/deluan/gosonic/tests"
- . "github.com/smartystreets/goconvey/convey"
-)
-
-func TestGetMusicFolders(t *testing.T) {
- Init(t, false)
-
- _, w := Get(AddParams("/rest/getMusicFolders.view"), "TestGetMusicFolders")
-
- Convey("Subject: GetMusicFolders Endpoint", t, func() {
- Convey("Status code should be 200", func() {
- So(w.Code, ShouldEqual, 200)
- })
- Convey("The response should include the default folder", func() {
- So(UnindentJSON(w.Body.Bytes()), ShouldContainSubstring, `{"musicFolder":[{"id":"0","name":"iTunes Library"}]}`)
- })
- })
-}
diff --git a/api/ping.go b/api/ping.go
deleted file mode 100644
index 4de664274..000000000
--- a/api/ping.go
+++ /dev/null
@@ -1,7 +0,0 @@
-package api
-
-type PingController struct{ BaseAPIController }
-
-func (c *PingController) Get() {
- c.SendResponse(c.NewEmpty())
-}
diff --git a/api/system.go b/api/system.go
new file mode 100644
index 000000000..53a7377cb
--- /dev/null
+++ b/api/system.go
@@ -0,0 +1,15 @@
+package api
+
+import "github.com/deluan/gosonic/api/responses"
+
+type SystemController struct{ BaseAPIController }
+
+func (c *SystemController) Ping() {
+ c.SendResponse(c.NewEmpty())
+}
+
+func (c *SystemController) GetLicense() {
+ response := c.NewEmpty()
+ response.License = &responses.License{Valid: true}
+ c.SendResponse(response)
+}
diff --git a/api/ping_test.go b/api/system_test.go
similarity index 65%
rename from api/ping_test.go
rename to api/system_test.go
index 425c8ed6c..e12419b3a 100644
--- a/api/ping_test.go
+++ b/api/system_test.go
@@ -2,10 +2,11 @@ package api_test
import (
"encoding/json"
+ "testing"
+
"github.com/deluan/gosonic/api/responses"
. "github.com/deluan/gosonic/tests"
. "github.com/smartystreets/goconvey/convey"
- "testing"
)
func TestPing(t *testing.T) {
@@ -30,3 +31,18 @@ func TestPing(t *testing.T) {
})
}
+func TestGetLicense(t *testing.T) {
+ Init(t, false)
+
+ _, w := Get(AddParams("/rest/getLicense.view"), "TestGetLicense")
+
+ Convey("Subject: GetLicense Endpoint", t, func() {
+ Convey("Status code should be 200", func() {
+ So(w.Code, ShouldEqual, 200)
+ })
+ Convey("The license should always be valid", func() {
+ So(UnindentJSON(w.Body.Bytes()), ShouldContainSubstring, `"license":{"valid":true}`)
+ })
+
+ })
+}
diff --git a/conf/router.go b/conf/router.go
index ad38c838f..0e56a7b82 100644
--- a/conf/router.go
+++ b/conf/router.go
@@ -16,17 +16,22 @@ func init() {
func mapEndpoints() {
ns := beego.NewNamespace("/rest",
- beego.NSRouter("/ping.view", &api.PingController{}, "*:Get"),
- beego.NSRouter("/getLicense.view", &api.GetLicenseController{}, "*:Get"),
- beego.NSRouter("/getMusicFolders.view", &api.GetMusicFoldersController{}, "*:Get"),
- beego.NSRouter("/getIndexes.view", &api.GetIndexesController{}, "*:Get"),
- beego.NSRouter("/getMusicDirectory.view", &api.GetMusicDirectoryController{}, "*:Get"),
+ beego.NSRouter("/ping.view", &api.SystemController{}, "*:Ping"),
+ beego.NSRouter("/getLicense.view", &api.SystemController{}, "*:GetLicense"),
+
+ beego.NSRouter("/getMusicFolders.view", &api.BrowsingController{}, "*:GetMediaFolders"),
+ beego.NSRouter("/getIndexes.view", &api.BrowsingController{}, "*:GetIndexes"),
+ beego.NSRouter("/getMusicDirectory.view", &api.BrowsingController{}, "*:GetDirectory"),
+
beego.NSRouter("/getCoverArt.view", &api.GetCoverArtController{}, "*:Get"),
beego.NSRouter("/stream.view", &api.StreamController{}, "*:Stream"),
beego.NSRouter("/download.view", &api.StreamController{}, "*:Download"),
- beego.NSRouter("/getUser.view", &api.UsersController{}, "*:GetUser"),
+
beego.NSRouter("/getAlbumList.view", &api.GetAlbumListController{}, "*:Get"),
+
beego.NSRouter("/getPlaylists.view", &api.PlaylistsController{}, "*:GetAll"),
+
+ beego.NSRouter("/getUser.view", &api.UsersController{}, "*:GetUser"),
)
beego.AddNamespace(ns)