github.com/jaredwarren/rpi_music@v0.1.2/server/song_test.go (about) 1 package server 2 3 import ( 4 "io/ioutil" 5 "net/http" 6 "net/http/httptest" 7 "net/url" 8 "os" 9 "strings" 10 "testing" 11 12 "github.com/gorilla/mux" 13 "github.com/jaredwarren/rpi_music/db" 14 "github.com/jaredwarren/rpi_music/downloader" 15 "github.com/jaredwarren/rpi_music/log" 16 "github.com/jaredwarren/rpi_music/model" 17 "github.com/kkdai/youtube/v2" 18 "github.com/stretchr/testify/assert" 19 ) 20 21 func TestListSongHandler(t *testing.T) { 22 db := initDB(t) 23 24 err := db.UpdateSong(&model.Song{ 25 ID: "test_song", 26 RFID: "test_song_rfid", 27 }) 28 assert.NoError(t, err) 29 30 // sanity test 31 songs, err := db.ListSongs() 32 assert.Nil(t, err) 33 assert.Len(t, songs, 1) 34 assert.Equal(t, "test_song", songs[0].ID) 35 36 s := &Server{ 37 db: db, 38 logger: log.NewNoOpLogger(), 39 downloader: &downloader.MockDownloader{ 40 Response: map[string]*youtube.Video{"new url": { 41 ID: "test_song", 42 Title: "song title", 43 Thumbnails: youtube.Thumbnails{{ 44 URL: "thumb_url", 45 }}, 46 }}, 47 }, 48 } 49 50 { // test List song 51 req := httptest.NewRequest(http.MethodGet, "/", nil) 52 w := httptest.NewRecorder() 53 54 s.ListSongHandler(w, req) 55 56 res := w.Result() 57 defer res.Body.Close() 58 data, err := ioutil.ReadAll(res.Body) 59 assert.NoError(t, err) 60 61 assert.Contains(t, string(data), `test_song_rfid`) 62 } 63 64 { // test Edit song form 65 req := httptest.NewRequest(http.MethodGet, "/song/test_song", nil) 66 req = mux.SetURLVars(req, map[string]string{ 67 "song_id": "test_song", 68 }) 69 w := httptest.NewRecorder() 70 71 s.EditSongFormHandler(w, req) 72 73 res := w.Result() 74 defer res.Body.Close() 75 data, err := ioutil.ReadAll(res.Body) 76 assert.NoError(t, err) 77 78 assert.Contains(t, string(data), `test_song`) 79 } 80 81 { // test Post Edit 82 form := url.Values{} 83 form.Add("url", "new url") 84 form.Add("rfid", "new:rfid") 85 req := httptest.NewRequest(http.MethodPost, "/song/test_song", strings.NewReader(form.Encode())) 86 req.Header.Add("Content-Type", "application/x-www-form-urlencoded") 87 req = mux.SetURLVars(req, map[string]string{ 88 "song_id": "test_song", 89 }) 90 w := httptest.NewRecorder() 91 92 s.UpdateSongHandler(w, req) 93 94 res := w.Result() 95 assert.Equal(t, http.StatusMovedPermanently, res.StatusCode) 96 defer res.Body.Close() 97 assert.NoError(t, err) 98 99 { // that that list songs has new rfid 100 req := httptest.NewRequest(http.MethodGet, "/", nil) 101 w := httptest.NewRecorder() 102 103 s.ListSongHandler(w, req) 104 105 res := w.Result() 106 defer res.Body.Close() 107 data, err := ioutil.ReadAll(res.Body) 108 assert.NoError(t, err) 109 110 assert.Contains(t, string(data), "newrfid") 111 } 112 } 113 } 114 115 func initDB(t *testing.T) db.DBer { 116 os.Chdir("/Users/jaredwarren/go/src/github.com/jaredwarren/rpi_music") 117 os.Remove("test.db") 118 119 // Init DB 120 db, err := db.NewSongDB("test.db") 121 assert.NoError(t, err) 122 return db 123 }