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/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
|
||||
}
|
||||
|
@ -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) {
|
||||
})
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user