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  }