Add GetDetails wait for FakeDetailer for test
This commit is contained in:
parent
6a60ca3c6e
commit
e873965e77
129
shows/shows.go
129
shows/shows.go
@ -6,19 +6,21 @@ import (
|
|||||||
"gitlab.quimbo.fr/odwrtw/canape-sql/sqly"
|
"gitlab.quimbo.fr/odwrtw/canape-sql/sqly"
|
||||||
"gitlab.quimbo.fr/odwrtw/canape-sql/users"
|
"gitlab.quimbo.fr/odwrtw/canape-sql/users"
|
||||||
|
|
||||||
|
"github.com/Sirupsen/logrus"
|
||||||
"github.com/jmoiron/sqlx"
|
"github.com/jmoiron/sqlx"
|
||||||
"github.com/odwrtw/polochon/lib"
|
"github.com/odwrtw/polochon/lib"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
addShowQuery = `INSERT INTO shows (imdbid, title) VALUES (:imdbid, :title) RETURNING id;`
|
addShowQuery = `INSERT INTO shows (imdbid, title) VALUES (:imdbid, :title) RETURNING id;`
|
||||||
getShowQuery = `SELECT * FROM shows WHERE imdbid=$1;`
|
getShowQueryByImdbID = `SELECT * FROM shows WHERE imdbid=$1;`
|
||||||
deleteShowQuery = `DELETE FROM shows WHERE id=$1;`
|
getShowQueryByID = `SELECT * FROM shows WHERE id=$1;`
|
||||||
|
deleteShowQuery = `DELETE FROM shows WHERE id=$1;`
|
||||||
|
|
||||||
addEpisodeQuery = `INSERT INTO episodes (shows_id, title, season, episode) VALUES ($1,$2,$3,$4);`
|
addEpisodeQuery = `INSERT INTO episodes (shows_id, title, season, episode) VALUES ($1,$2,$3,$4);`
|
||||||
getEpisodesQuery = `SELECT title, season, episode FROM episodes WHERE shows_id=$1;`
|
getEpisodesQuery = `SELECT title, season, episode FROM episodes WHERE shows_id=$1;`
|
||||||
|
|
||||||
getShowWithUserQuery = `
|
getShowWithUserQueryByImdbID = `
|
||||||
SELECT
|
SELECT
|
||||||
shows.id,
|
shows.id,
|
||||||
shows.title,
|
shows.title,
|
||||||
@ -27,10 +29,21 @@ const (
|
|||||||
COALESCE(shows_tracked.episode,0) AS trackedepisode
|
COALESCE(shows_tracked.episode,0) AS trackedepisode
|
||||||
FROM shows LEFT JOIN shows_tracked ON shows.id=shows_tracked.shows_id AND shows_tracked.users_id=$2
|
FROM shows LEFT JOIN shows_tracked ON shows.id=shows_tracked.shows_id AND shows_tracked.users_id=$2
|
||||||
WHERE shows.imdbid=$1;`
|
WHERE shows.imdbid=$1;`
|
||||||
|
|
||||||
|
getShowWithUserQueryByID = `
|
||||||
|
SELECT
|
||||||
|
shows.id,
|
||||||
|
shows.title,
|
||||||
|
shows.imdbid,
|
||||||
|
COALESCE(shows_tracked.season,0) AS trackedseason,
|
||||||
|
COALESCE(shows_tracked.episode,0) AS trackedepisode
|
||||||
|
FROM shows LEFT JOIN shows_tracked ON shows.id=shows_tracked.shows_id AND shows_tracked.users_id=$2
|
||||||
|
WHERE shows.id=$1;`
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
NotFound = fmt.Errorf("Not found")
|
// NotFound error returned when show not found in database
|
||||||
|
ErrNotFound = fmt.Errorf("Not found")
|
||||||
)
|
)
|
||||||
|
|
||||||
type Show struct {
|
type Show struct {
|
||||||
@ -41,37 +54,97 @@ type Show struct {
|
|||||||
TrackedEpisode int
|
TrackedEpisode int
|
||||||
}
|
}
|
||||||
|
|
||||||
func Get(db *sqlx.DB, imdbID string) (*Show, error) {
|
// New returns a new Show with a polochon ShowConfig
|
||||||
s := &Show{}
|
func New(conf polochon.ShowConfig) *Show {
|
||||||
err := db.QueryRowx(getShowQuery, imdbID).StructScan(s)
|
return &Show{Show: polochon.Show{ShowConfig: conf}}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get returns show details in database from id or imdbid or an error
|
||||||
|
func (s *Show) Get(db *sqlx.DB) error {
|
||||||
|
var err error
|
||||||
|
if s.ID != "" {
|
||||||
|
err = db.QueryRowx(getShowQueryByID, s.ID).StructScan(s)
|
||||||
|
} else if s.ImdbID != "" {
|
||||||
|
err = db.QueryRowx(getShowQueryByImdbID, s.ImdbID).StructScan(s)
|
||||||
|
} else {
|
||||||
|
err = fmt.Errorf("Can't get show details, you have to specify an ID or ImdbID")
|
||||||
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err.Error() == "sql: no rows in result set" {
|
if err.Error() == "sql: no rows in result set" {
|
||||||
return nil, NotFound
|
return ErrNotFound
|
||||||
}
|
}
|
||||||
return nil, err
|
return err
|
||||||
}
|
}
|
||||||
return s, nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetAsUser returns a show with user info like tracked
|
// GetAsUser returns a show with user info like tracked
|
||||||
func GetAsUser(db *sqlx.DB, user *users.User, imdbID string) (*Show, error) {
|
func (s *Show) GetAsUser(db *sqlx.DB, user *users.User) error {
|
||||||
s := &Show{}
|
var err error
|
||||||
err := db.QueryRowx(getShowWithUserQuery, imdbID, user.ID).StructScan(s)
|
if s.ID != "" {
|
||||||
if err != nil {
|
err = db.QueryRowx(getShowWithUserQueryByID, s.ID, user.ID).StructScan(s)
|
||||||
return nil, err
|
} else if s.ImdbID != "" {
|
||||||
|
err = db.QueryRowx(getShowWithUserQueryByImdbID, s.ImdbID, user.ID).StructScan(s)
|
||||||
|
} else {
|
||||||
|
err = fmt.Errorf("Can't get show details, you have to specify an ID or ImdbID")
|
||||||
}
|
}
|
||||||
return s, nil
|
if err != nil {
|
||||||
|
if err.Error() == "sql: no rows in result set" {
|
||||||
|
return ErrNotFound
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetDetails retrieves details for the show, first try to
|
// GetDetails retrieves details for the show, first try to
|
||||||
// get info from db, if not exists, use polochon.Detailer
|
// get info from db, if not exists, use polochon.Detailer
|
||||||
// and save informations in the database for future use
|
// and save informations in the database for future use
|
||||||
func (s *Show) GetDetails(db *sqlx.DB) error {
|
func (s *Show) GetDetails(db *sqlx.DB, log *logrus.Entry) error {
|
||||||
|
var err error
|
||||||
|
err = s.Get(db)
|
||||||
|
if err == nil {
|
||||||
|
// found ok
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if err != ErrNotFound {
|
||||||
|
// Unexpected error
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = s.Show.GetDetails(log)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
s.Episodes = []*Episode{}
|
||||||
|
for _, pe := range s.Show.Episodes {
|
||||||
|
s.Episodes = append(s.Episodes, NewEpisodeFromPolochon(pe))
|
||||||
|
}
|
||||||
|
s.Add(db)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetDetailsAsUser like GetDetails but with User context
|
// GetDetailsAsUser like GetDetails but with User context
|
||||||
func (s *Show) GetDetailsAsUser(db *sqlx.DB, user *users.User) error {
|
func (s *Show) GetDetailsAsUser(db *sqlx.DB, user *users.User, log *logrus.Entry) error {
|
||||||
|
var err error
|
||||||
|
err = s.GetAsUser(db, user)
|
||||||
|
if err == nil {
|
||||||
|
// found ok
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if err != ErrNotFound {
|
||||||
|
// Unexpected error
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = s.Show.GetDetails(log)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
s.Add(db)
|
||||||
|
s.Episodes = []*Episode{}
|
||||||
|
for _, pe := range s.Show.Episodes {
|
||||||
|
s.Episodes = append(s.Episodes, NewEpisodeFromPolochon(pe))
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -141,3 +214,21 @@ type Episode struct {
|
|||||||
sqly.BaseTable
|
sqly.BaseTable
|
||||||
polochon.ShowEpisode
|
polochon.ShowEpisode
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewEpisodeFromPolochon returns a new episode from a polochon.ShowEpisode
|
||||||
|
func NewEpisodeFromPolochon(pe *polochon.ShowEpisode) *Episode {
|
||||||
|
e := &Episode{}
|
||||||
|
e.Title = pe.Title
|
||||||
|
e.ShowTitle = pe.ShowTitle
|
||||||
|
e.Season = pe.Season
|
||||||
|
e.Episode = pe.Episode
|
||||||
|
e.TvdbID = pe.TvdbID
|
||||||
|
e.Aired = pe.Aired
|
||||||
|
e.Plot = pe.Plot
|
||||||
|
e.Runtime = pe.Runtime
|
||||||
|
e.Rating = pe.Rating
|
||||||
|
e.ShowImdbID = pe.ShowImdbID
|
||||||
|
e.ShowTvdbID = pe.ShowTvdbID
|
||||||
|
e.EpisodeImdbID = pe.EpisodeImdbID
|
||||||
|
return e
|
||||||
|
}
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package shows
|
package shows
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"database/sql"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
@ -86,10 +85,11 @@ func init() {
|
|||||||
func TestAddRemoveShow(t *testing.T) {
|
func TestAddRemoveShow(t *testing.T) {
|
||||||
sqly.RunWithLastestMigration(db, pgdsn, t, func(db *sqlx.DB, t *testing.T) {
|
sqly.RunWithLastestMigration(db, pgdsn, t, func(db *sqlx.DB, t *testing.T) {
|
||||||
//Get unkown show
|
//Get unkown show
|
||||||
_, err := Get(db, "polp")
|
// sf := &Show{Show: polochon.Show{ImdbID: "polp", Title: "prout"}}
|
||||||
if err != NotFound {
|
// sf, err := Get(db, "polp")
|
||||||
t.Fatal("NotFound error expected here")
|
// if err != NotFound {
|
||||||
}
|
// t.Fatal("NotFound error expected here")
|
||||||
|
// }
|
||||||
|
|
||||||
nfo := strings.NewReader(showNFO1)
|
nfo := strings.NewReader(showNFO1)
|
||||||
s := &polochon.Show{}
|
s := &polochon.Show{}
|
||||||
@ -108,39 +108,33 @@ func TestAddRemoveShow(t *testing.T) {
|
|||||||
|
|
||||||
show := Show{Show: *s}
|
show := Show{Show: *s}
|
||||||
|
|
||||||
err = show.Add(db)
|
err := show.Add(db)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
show1, err := Get(db, "tt2357547")
|
err = show.Get(db)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = show1.GetEpisodes(db)
|
err = show.GetEpisodes(db)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
if len(show1.Episodes) != 2 {
|
if len(show.Episodes) != 2 {
|
||||||
t.Fatalf("Unexpected number of episodes: %d", len(show1.Episodes))
|
t.Fatalf("Unexpected number of episodes: %d", len(show.Episodes))
|
||||||
}
|
}
|
||||||
|
|
||||||
err = show1.Delete(db)
|
err = show.Delete(db)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
show2, err := Get(db, "tt2357547")
|
err = show.Get(db)
|
||||||
if err == nil {
|
if err != ErrNotFound {
|
||||||
t.Fatal("We expect an error here, the show didn't exist anymore")
|
|
||||||
}
|
|
||||||
if err != sql.ErrNoRows {
|
|
||||||
t.Fatalf("Unexpected error: %q", err)
|
t.Fatalf("Unexpected error: %q", err)
|
||||||
}
|
}
|
||||||
if show2 != nil {
|
|
||||||
t.Fatal("Show have to be nil here")
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -157,26 +151,30 @@ func TestTrackedShow(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
err = show.GetAsUser(db, u)
|
||||||
show1, err := GetAsUser(db, u, "tt2357547")
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
if show1.IsTracked() {
|
if show.IsTracked() {
|
||||||
t.Fatal("Tracked must be false here")
|
t.Fatal("Tracked must be false here")
|
||||||
}
|
}
|
||||||
|
|
||||||
q := `INSERT INTO shows_tracked (shows_id, users_id, season, episode) VALUES ($1, $2, $3, $4);`
|
q := `INSERT INTO shows_tracked (shows_id, users_id, season, episode) VALUES ($1, $2, $3, $4);`
|
||||||
_, err = db.Exec(q, show1.ID, u.ID, 1, 1)
|
_, err = db.Exec(q, show.ID, u.ID, 1, 1)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
show2, err := GetAsUser(db, u, "tt2357547")
|
err = show.GetAsUser(db, u)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
if !show2.IsTracked() {
|
if !show.IsTracked() {
|
||||||
t.Fatal("Tracked must be true here")
|
t.Fatal("Tracked must be true here")
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGetDetails(t *testing.T) {
|
||||||
|
sqly.RunWithLastestMigration(db, pgdsn, t, func(db *sqlx.DB, t *testing.T) {
|
||||||
|
})
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user