diff --git a/shows.go b/shows.go new file mode 100644 index 0000000..0458630 --- /dev/null +++ b/shows.go @@ -0,0 +1,71 @@ +package shows + +import ( + "fmt" + "time" + + "github.com/jmoiron/sqlx" + "github.com/odwrtw/polochon/lib" +) + +const showsCreate = ` +CREATE TABLE shows ( + id SERIAL PRIMARY KEY, + imdbid text NOT NULL UNIQUE, + title text NOT NULL, + updated timestamp DEFAULT current_timestamp, + created timestamp DEFAULT current_timestamp +); +` + +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;` +) + +// BaseTable have to be embeded in all your struct which reflect a table +type BaseTable struct { + Updated time.Time + Created time.Time +} + +type Show struct { + ID int + polochon.Show + BaseTable +} + +func Get(db *sqlx.DB, imdbID string) (*Show, error) { + s := &Show{} + err := db.QueryRowx(getShowQuery, imdbID).StructScan(s) + if err != nil { + return nil, err + } + return s, nil +} + +func (s *Show) Add(db *sqlx.DB) error { + var id int + r, err := db.NamedQuery(addShowQuery, s) + if err != nil { + return err + } + for r.Next() { + r.Scan(&id) + } + s.ID = id + return nil +} + +func (s *Show) Delete(db *sqlx.DB) error { + r, err := db.Exec(deleteShowQuery, s.ID) + if err != nil { + return err + } + count, _ := r.RowsAffected() + if count != 1 { + return fmt.Errorf("Unexpected number of row deleted: %d", count) + } + return nil +} diff --git a/shows_test.go b/shows_test.go new file mode 100644 index 0000000..f6b59b9 --- /dev/null +++ b/shows_test.go @@ -0,0 +1,87 @@ +package shows + +import ( + "fmt" + "os" + "strings" + "testing" + + "gitlab.quimbo.fr/odwrtw/canape-sql/sqltest" + + "github.com/jmoiron/sqlx" + _ "github.com/lib/pq" + "github.com/odwrtw/polochon/lib" +) + +const drop = ` +DROP TABLE shows; +` + +const showNFO1 = ` + + Marvel's Jessica Jones + Marvel's Jessica Jones + 8 + Ever since her short-lived stint as a Super Hero ended in tragedy, Jessica Jones has been rebuilding her personal life and career as a hot-tempered, sardonic, badass private detective in Hell's Kitchen, New York City. Plagued by self-loathing, and a wicked case of PTSD, Jessica battles demons from within and without, using her extraordinary abilities as an unlikely champion for those in need... especially if they're willing to cut her a check. + + http://www.thetvdb.com/api/1D62F2F90030C444/series/284190/all/en.zip + + 284190 + tt2357547 + 2015 + +` + +var db *sqlx.DB + +func init() { + var err error + + pgdsn := os.Getenv("POSTGRES_DSN") + db, err = sqlx.Connect("postgres", pgdsn) + + if err != nil { + fmt.Printf("Unavailable PG tests:\n %v\n", err) + os.Exit(1) + } +} + +func TestAddRemoveShow(t *testing.T) { + sqltest.RunWithSchema(db, showsCreate, drop, t, func(db *sqlx.DB, t *testing.T) { + nfo := strings.NewReader(showNFO1) + s := &polochon.Show{} + + err := polochon.ReadNFO(nfo, s) + if err != nil { + t.Fatal(err) + } + show := Show{Show: *s} + + err = show.Add(db) + if err != nil { + t.Fatal(err) + } + + show1, err := Get(db, "tt2357547") + if err != nil { + t.Fatal(err) + } + + err = show1.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.Error() != "sql: no rows in result set" { + t.Fatalf("Unexpected error: %q", err) + } + if show2 != nil { + t.Fatal("Show have to be nil here") + } + }) + +} diff --git a/users.go b/users/users.go similarity index 100% rename from users.go rename to users/users.go diff --git a/users_test.go b/users/users_test.go similarity index 100% rename from users_test.go rename to users/users_test.go