From e873965e7794e63de4bb9f70b142074f7a30d948 Mon Sep 17 00:00:00 2001 From: Nicolas Duhamel Date: Wed, 17 Feb 2016 20:49:41 +0100 Subject: [PATCH] Add GetDetails wait for FakeDetailer for test --- shows/shows.go | 129 +++++++++++++++++++++++++++++++++++++------- shows/shows_test.go | 48 ++++++++--------- 2 files changed, 133 insertions(+), 44 deletions(-) diff --git a/shows/shows.go b/shows/shows.go index 006efe9..0799dd4 100644 --- a/shows/shows.go +++ b/shows/shows.go @@ -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;` - deleteShowQuery = `DELETE FROM shows WHERE id=$1;` + addShowQuery = `INSERT INTO shows (imdbid, title) VALUES (:imdbid, :title) RETURNING id;` + 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 +} diff --git a/shows/shows_test.go b/shows/shows_test.go index e42e38a..9456e66 100644 --- a/shows/shows_test.go +++ b/shows/shows_test.go @@ -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) { + }) +}