Add GetDetails wait for FakeDetailer for test

This commit is contained in:
Nicolas Duhamel 2016-02-17 20:49:41 +01:00
parent 6a60ca3c6e
commit e873965e77
2 changed files with 133 additions and 44 deletions

View File

@ -6,19 +6,21 @@ import (
"gitlab.quimbo.fr/odwrtw/canape-sql/sqly"
"gitlab.quimbo.fr/odwrtw/canape-sql/users"
"github.com/Sirupsen/logrus"
"github.com/jmoiron/sqlx"
"github.com/odwrtw/polochon/lib"
)
const (
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;`
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);`
getEpisodesQuery = `SELECT title, season, episode FROM episodes WHERE shows_id=$1;`
getShowWithUserQuery = `
getShowWithUserQueryByImdbID = `
SELECT
shows.id,
shows.title,
@ -27,10 +29,21 @@ const (
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.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 (
NotFound = fmt.Errorf("Not found")
// NotFound error returned when show not found in database
ErrNotFound = fmt.Errorf("Not found")
)
type Show struct {
@ -41,37 +54,97 @@ type Show struct {
TrackedEpisode int
}
func Get(db *sqlx.DB, imdbID string) (*Show, error) {
s := &Show{}
err := db.QueryRowx(getShowQuery, imdbID).StructScan(s)
// New returns a new Show with a polochon ShowConfig
func New(conf polochon.ShowConfig) *Show {
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.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
func GetAsUser(db *sqlx.DB, user *users.User, imdbID string) (*Show, error) {
s := &Show{}
err := db.QueryRowx(getShowWithUserQuery, imdbID, user.ID).StructScan(s)
if err != nil {
return nil, err
func (s *Show) GetAsUser(db *sqlx.DB, user *users.User) error {
var err error
if s.ID != "" {
err = db.QueryRowx(getShowWithUserQueryByID, s.ID, user.ID).StructScan(s)
} 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
// get info from db, if not exists, use polochon.Detailer
// 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
}
// 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
}
@ -141,3 +214,21 @@ type Episode struct {
sqly.BaseTable
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
}

View File

@ -1,7 +1,6 @@
package shows
import (
"database/sql"
"fmt"
"os"
"strings"
@ -86,10 +85,11 @@ func init() {
func TestAddRemoveShow(t *testing.T) {
sqly.RunWithLastestMigration(db, pgdsn, t, func(db *sqlx.DB, t *testing.T) {
//Get unkown show
_, err := Get(db, "polp")
if err != NotFound {
t.Fatal("NotFound error expected here")
}
// sf := &Show{Show: polochon.Show{ImdbID: "polp", Title: "prout"}}
// sf, err := Get(db, "polp")
// if err != NotFound {
// t.Fatal("NotFound error expected here")
// }
nfo := strings.NewReader(showNFO1)
s := &polochon.Show{}
@ -108,39 +108,33 @@ func TestAddRemoveShow(t *testing.T) {
show := Show{Show: *s}
err = show.Add(db)
err := show.Add(db)
if err != nil {
t.Fatal(err)
}
show1, err := Get(db, "tt2357547")
err = show.Get(db)
if err != nil {
t.Fatal(err)
}
err = show1.GetEpisodes(db)
err = show.GetEpisodes(db)
if err != nil {
t.Fatal(err)
}
if len(show1.Episodes) != 2 {
t.Fatalf("Unexpected number of episodes: %d", len(show1.Episodes))
if len(show.Episodes) != 2 {
t.Fatalf("Unexpected number of episodes: %d", len(show.Episodes))
}
err = show1.Delete(db)
err = show.Delete(db)
if err != nil {
t.Fatal(err)
}
show2, err := Get(db, "tt2357547")
if err == nil {
t.Fatal("We expect an error here, the show didn't exist anymore")
}
if err != sql.ErrNoRows {
err = show.Get(db)
if err != ErrNotFound {
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 {
t.Fatal(err)
}
show1, err := GetAsUser(db, u, "tt2357547")
err = show.GetAsUser(db, u)
if err != nil {
t.Fatal(err)
}
if show1.IsTracked() {
if show.IsTracked() {
t.Fatal("Tracked must be false here")
}
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 {
t.Fatal(err)
}
show2, err := GetAsUser(db, u, "tt2357547")
err = show.GetAsUser(db, u)
if err != nil {
t.Fatal(err)
}
if !show2.IsTracked() {
if !show.IsTracked() {
t.Fatal("Tracked must be true here")
}
})
}
func TestGetDetails(t *testing.T) {
sqly.RunWithLastestMigration(db, pgdsn, t, func(db *sqlx.DB, t *testing.T) {
})
}