//+build linux darwin

// TODO Fix snapshot tests in Windows
// Response Snapshot tests. Only run in Linux and macOS, as they fail in Windows
// Probably because of EOL char differences
package responses_test

import (
	"encoding/json"
	"encoding/xml"
	"time"

	"github.com/deluan/navidrome/consts"
	. "github.com/deluan/navidrome/server/subsonic/responses"
	. "github.com/onsi/ginkgo"
	. "github.com/onsi/gomega"
)

var _ = Describe("Responses", func() {
	var response *Subsonic
	BeforeEach(func() {
		response = &Subsonic{Status: "ok", Version: "1.8.0", Type: consts.AppName, ServerVersion: "v0.0.0"}
	})

	Describe("EmptyResponse", func() {
		It("should match .XML", func() {
			Expect(xml.Marshal(response)).To(MatchSnapshot())
		})
		It("should match .JSON", func() {
			Expect(json.Marshal(response)).To(MatchSnapshot())
		})
	})

	Describe("License", func() {
		BeforeEach(func() {
			response.License = &License{Valid: true}
		})
		It("should match .XML", func() {
			Expect(xml.Marshal(response)).To(MatchSnapshot())
		})
		It("should match .JSON", func() {
			Expect(json.Marshal(response)).To(MatchSnapshot())
		})
	})

	Describe("MusicFolders", func() {
		BeforeEach(func() {
			response.MusicFolders = &MusicFolders{}
		})

		Context("without data", func() {
			It("should match .XML", func() {
				Expect(xml.Marshal(response)).To(MatchSnapshot())
			})
			It("should match .JSON", func() {
				Expect(json.Marshal(response)).To(MatchSnapshot())
			})
		})

		Context("with data", func() {
			BeforeEach(func() {
				folders := make([]MusicFolder, 2)
				folders[0] = MusicFolder{Id: "111", Name: "aaa"}
				folders[1] = MusicFolder{Id: "222", Name: "bbb"}
				response.MusicFolders.Folders = folders
			})

			It("should match .XML", func() {
				Expect(xml.Marshal(response)).To(MatchSnapshot())
			})
			It("should match .JSON", func() {
				Expect(json.Marshal(response)).To(MatchSnapshot())
			})
		})
	})

	Describe("Indexes", func() {
		BeforeEach(func() {
			response.Indexes = &Indexes{LastModified: "1", IgnoredArticles: "A"}
		})

		Context("without data", func() {
			It("should match .XML", func() {
				Expect(xml.Marshal(response)).To(MatchSnapshot())
			})
			It("should match .JSON", func() {
				Expect(json.Marshal(response)).To(MatchSnapshot())
			})
		})

		Context("with data", func() {
			BeforeEach(func() {
				artists := make([]Artist, 1)
				t := time.Date(2016, 03, 2, 20, 30, 0, 0, time.UTC)
				artists[0] = Artist{Id: "111", Name: "aaa", Starred: &t}
				index := make([]Index, 1)
				index[0] = Index{Name: "A", Artists: artists}
				response.Indexes.Index = index
			})

			It("should match .XML", func() {
				Expect(xml.Marshal(response)).To(MatchSnapshot())
			})
			It("should match .JSON", func() {
				Expect(json.Marshal(response)).To(MatchSnapshot())
			})
		})
	})

	Describe("Child", func() {
		Context("with data", func() {
			BeforeEach(func() {
				response.Directory = &Directory{Id: "1", Name: "N"}
				child := make([]Child, 1)
				t := time.Date(2016, 03, 2, 20, 30, 0, 0, time.UTC)
				child[0] = Child{
					Id: "1", IsDir: true, Title: "title", Album: "album", Artist: "artist", Track: 1,
					Year: 1985, Genre: "Rock", CoverArt: "1", Size: "8421341", ContentType: "audio/flac",
					Suffix: "flac", TranscodedContentType: "audio/mpeg", TranscodedSuffix: "mp3",
					Duration: 146, BitRate: 320, Starred: &t,
				}
				response.Directory.Child = child
			})

			It("should match .XML", func() {
				Expect(xml.Marshal(response)).To(MatchSnapshot())
			})
			It("should match .JSON", func() {
				Expect(json.Marshal(response)).To(MatchSnapshot())
			})
		})
	})

	Describe("Directory", func() {
		BeforeEach(func() {
			response.Directory = &Directory{Id: "1", Name: "N"}
		})

		Context("without data", func() {
			It("should match .XML", func() {
				Expect(xml.Marshal(response)).To(MatchSnapshot())
			})
			It("should match .JSON", func() {
				Expect(json.Marshal(response)).To(MatchSnapshot())
			})
		})

		Context("with data", func() {
			BeforeEach(func() {
				child := make([]Child, 1)
				child[0] = Child{Id: "1", Title: "title", IsDir: false}
				response.Directory.Child = child
			})

			It("should match .XML", func() {
				Expect(xml.Marshal(response)).To(MatchSnapshot())
			})
			It("should match .JSON", func() {
				Expect(json.Marshal(response)).To(MatchSnapshot())
			})
		})
	})

	Describe("AlbumList", func() {
		BeforeEach(func() {
			response.AlbumList = &AlbumList{}
		})

		Context("without data", func() {
			It("should match .XML", func() {
				Expect(xml.Marshal(response)).To(MatchSnapshot())
			})
			It("should match .JSON", func() {
				Expect(json.Marshal(response)).To(MatchSnapshot())
			})
		})

		Context("with data", func() {
			BeforeEach(func() {
				child := make([]Child, 1)
				child[0] = Child{Id: "1", Title: "title", IsDir: false}
				response.AlbumList.Album = child
			})

			It("should match .XML", func() {
				Expect(xml.Marshal(response)).To(MatchSnapshot())
			})
			It("should match .JSON", func() {
				Expect(json.Marshal(response)).To(MatchSnapshot())
			})
		})
	})

	Describe("User", func() {
		BeforeEach(func() {
			response.User = &User{Username: "deluan"}
		})

		Context("without data", func() {
			It("should match .XML", func() {
				Expect(xml.Marshal(response)).To(MatchSnapshot())
			})
			It("should match .JSON", func() {
				Expect(json.Marshal(response)).To(MatchSnapshot())
			})
		})

		Context("with data", func() {
			BeforeEach(func() {
				response.User.Email = "navidrome@deluan.com"
				response.User.Folder = []int{1}
			})

			It("should match .XML", func() {
				Expect(xml.Marshal(response)).To(MatchSnapshot())
			})
			It("should match .JSON", func() {
				Expect(json.Marshal(response)).To(MatchSnapshot())
			})
		})
	})

	Describe("Playlists", func() {
		BeforeEach(func() {
			response.Playlists = &Playlists{}
		})

		Context("without data", func() {
			It("should match .XML", func() {
				Expect(xml.Marshal(response)).To(MatchSnapshot())
			})
			It("should match .JSON", func() {
				Expect(json.Marshal(response)).To(MatchSnapshot())
			})
		})

		Context("with data", func() {
			BeforeEach(func() {
				pls := make([]Playlist, 2)
				pls[0] = Playlist{Id: "111", Name: "aaa"}
				pls[1] = Playlist{Id: "222", Name: "bbb"}
				response.Playlists.Playlist = pls
			})

			It("should match .XML", func() {
				Expect(xml.Marshal(response)).To(MatchSnapshot())
			})
			It("should match .JSON", func() {
				Expect(json.Marshal(response)).To(MatchSnapshot())
			})
		})
	})

	Describe("Genres", func() {
		BeforeEach(func() {
			response.Genres = &Genres{}
		})

		Context("without data", func() {
			It("should match .XML", func() {
				Expect(xml.Marshal(response)).To(MatchSnapshot())
			})
			It("should match .JSON", func() {
				Expect(json.Marshal(response)).To(MatchSnapshot())
			})
		})

		Context("with data", func() {
			BeforeEach(func() {
				genres := make([]Genre, 3)
				genres[0] = Genre{SongCount: 1000, AlbumCount: 100, Name: "Rock"}
				genres[1] = Genre{SongCount: 500, AlbumCount: 50, Name: "Reggae"}
				genres[2] = Genre{SongCount: 0, AlbumCount: 0, Name: "Pop"}
				response.Genres.Genre = genres
			})

			It("should match .XML", func() {
				Expect(xml.Marshal(response)).To(MatchSnapshot())
			})
			It("should match .JSON", func() {
				Expect(json.Marshal(response)).To(MatchSnapshot())
			})
		})
	})

	Describe("ArtistInfo", func() {
		BeforeEach(func() {
			response.ArtistInfo = &ArtistInfo{}
		})

		Context("without data", func() {
			It("should match .XML", func() {
				Expect(xml.Marshal(response)).To(MatchSnapshot())
			})
			It("should match .JSON", func() {
				Expect(json.Marshal(response)).To(MatchSnapshot())
			})
		})

		Context("with data", func() {
			BeforeEach(func() {
				response.ArtistInfo.Biography = `Black Sabbath is an English <a target='_blank' href="http://www.last.fm/tag/heavy%20metal" class="bbcode_tag" rel="tag">heavy metal</a> band`
				response.ArtistInfo.MusicBrainzID = "5182c1d9-c7d2-4dad-afa0-ccfeada921a8"
				response.ArtistInfo.LastFmUrl = "http://www.last.fm/music/Black+Sabbath"
				response.ArtistInfo.SmallImageUrl = "http://userserve-ak.last.fm/serve/64/27904353.jpg"
				response.ArtistInfo.MediumImageUrl = "http://userserve-ak.last.fm/serve/126/27904353.jpg"
				response.ArtistInfo.LargeImageUrl = "http://userserve-ak.last.fm/serve/_/27904353/Black+Sabbath+sabbath+1970.jpg"
				response.ArtistInfo.SimilarArtist = []Artist{
					{Id: "22", Name: "Accept"},
					{Id: "101", Name: "Bruce Dickinson"},
					{Id: "26", Name: "Aerosmith"},
				}
			})
			It("should match .XML", func() {
				Expect(xml.Marshal(response)).To(MatchSnapshot())
			})
			It("should match .JSON", func() {
				Expect(json.Marshal(response)).To(MatchSnapshot())
			})

		})
	})
})
