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 }