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/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
}

View File

@ -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) {
})
}