github.com/derat/nup@v0.0.0-20230418113745-15592ba7c620/cmd/nup/update/server_test.go (about)

     1  // Copyright 2020 Daniel Erat.
     2  // All rights reserved.
     3  
     4  package update
     5  
     6  import (
     7  	"encoding/json"
     8  	"io"
     9  	"net/http"
    10  	"net/http/httptest"
    11  	"strconv"
    12  	"testing"
    13  
    14  	"github.com/derat/nup/cmd/nup/client"
    15  	"github.com/derat/nup/server/db"
    16  	"github.com/derat/nup/test"
    17  )
    18  
    19  func TestImportSongs(t *testing.T) {
    20  	var numReqs int
    21  	recv := make([]db.Song, 0)
    22  	replace := ""
    23  
    24  	server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    25  		replace = r.FormValue("replaceUserData")
    26  		defer r.Body.Close()
    27  
    28  		// Make the first request fail to test the retry logic.
    29  		if numReqs++; numReqs == 1 {
    30  			http.Error(w, "Intentional failure", http.StatusInternalServerError)
    31  			return
    32  		}
    33  
    34  		d := json.NewDecoder(r.Body)
    35  		for {
    36  			s := db.Song{}
    37  			if err := d.Decode(&s); err == io.EOF {
    38  				break
    39  			} else if err != nil {
    40  				t.Errorf("failed to decode song: %v", err)
    41  			}
    42  			recv = append(recv, s)
    43  		}
    44  
    45  		w.Header().Set("Content-Type", "text/plain")
    46  		w.Write([]byte("ok"))
    47  	}))
    48  	defer server.Close()
    49  
    50  	cfg := &client.Config{ServerURL: server.URL}
    51  	ch := make(chan db.Song)
    52  
    53  	s0 := db.Song{
    54  		SHA1:     "1977c91fea860245695dcceea0805c14cede7559",
    55  		Filename: "arovane/atol_scrap/thaem_nue.mp3",
    56  		Artist:   "Arovane",
    57  		Title:    "Thaem Nue",
    58  		Album:    "Atol Scrap",
    59  		Track:    3,
    60  		Disc:     1,
    61  		Length:   449,
    62  		Rating:   4,
    63  		Plays: []db.Play{
    64  			db.NewPlay(test.Date(2010, 6, 9, 4, 19, 30), "127.0.0.1"),
    65  			db.NewPlay(test.Date(2011, 2, 10, 5, 48, 33), "1.2.3.4"),
    66  		},
    67  		Tags: []string{"electronic", "instrumental"},
    68  	}
    69  	s1 := db.Song{
    70  		SHA1:     "b70984a4ac5084999b70478cdf163218b90cefdb",
    71  		Filename: "gary_hoey/animal_instinct/motown_fever.mp3",
    72  		Artist:   "Gary Hoey",
    73  		Title:    "Motown Fever",
    74  		Album:    "Animal Instinct",
    75  		Track:    7,
    76  		Disc:     1,
    77  		Length:   182,
    78  		Rating:   3,
    79  		Plays:    []db.Play{db.NewPlay(test.Date(2014, 3, 14, 5, 12, 10), "8.8.8.8")},
    80  		Tags:     []string{"instrumental", "rock"},
    81  	}
    82  	go func() {
    83  		ch <- s0
    84  		ch <- s1
    85  		close(ch)
    86  	}()
    87  	if err := importSongs(cfg, ch, importReplaceUserData|importNoRetryDelay); err != nil {
    88  		t.Fatalf("Failed to send songs: %v", err)
    89  	}
    90  	if err := test.CompareSongs([]db.Song{s0, s1}, recv, test.CompareOrder); err != nil {
    91  		t.Error("Bad songs after initial import: ", err)
    92  	}
    93  	if replace != "1" {
    94  		t.Errorf("replaceUserData param was %q instead of 1", replace)
    95  	}
    96  
    97  	recv = recv[:0]
    98  	sent := make([]db.Song, 250, 250)
    99  	ch = make(chan db.Song)
   100  	go func() {
   101  		for i := range sent {
   102  			sent[i].SHA1 = strconv.Itoa(i)
   103  			ch <- sent[i]
   104  		}
   105  		close(ch)
   106  	}()
   107  	if err := importSongs(cfg, ch, importNoRetryDelay); err != nil {
   108  		t.Fatalf("Failed to send songs: %v", err)
   109  	}
   110  	if err := test.CompareSongs(sent, recv, test.CompareOrder); err != nil {
   111  		t.Error("Bad songs after second import: ", err)
   112  	}
   113  	if len(replace) > 0 {
   114  		t.Errorf("replaceUserData param was %q instead of empty", replace)
   115  	}
   116  }