github.com/derat/nup@v0.0.0-20230418113745-15592ba7c620/test/web/server.go (about) 1 // Copyright 2022 Daniel Erat. 2 // All rights reserved. 3 4 package web 5 6 import ( 7 "errors" 8 "fmt" 9 "sort" 10 "testing" 11 "time" 12 13 "github.com/derat/nup/server/db" 14 "github.com/derat/nup/test" 15 ) 16 17 // server is used by tests to interact with the server. 18 type server struct { 19 t *testing.T 20 tester *test.Tester 21 } 22 23 // checkSong verifies that the server's data for song (identified by 24 // SHA1) matches the expected. This is used to verify user data: see 25 // hasSrvRating, hasSrvTags, and hasSrvPlay in song.go. 26 func (srv *server) checkSong(song db.Song, checks ...songCheck) { 27 want := makeSongInfo(song) 28 for _, c := range checks { 29 c(&want) 30 } 31 32 var got *songInfo 33 if err := waitFull(func() error { 34 got = nil 35 for _, s := range srv.tester.DumpSongs(test.KeepIDs) { 36 if s.SHA1 != song.SHA1 { 37 continue 38 } 39 si := makeSongInfo(s) 40 si.srvRating = &s.Rating 41 si.srvTags = s.Tags 42 sort.Sort(db.PlayArray(s.Plays)) 43 for _, p := range s.Plays { 44 si.srvPlays = append(si.srvPlays, [2]time.Time{p.StartTime, p.StartTime}) 45 } 46 got = &si 47 break 48 } 49 if got == nil || !songInfosEqual(want, *got) { 50 return errors.New("songs don't match") 51 } 52 return nil 53 }, want.getTimeout(waitTimeout), waitSleep); err != nil { 54 srv.t.Fatal(fmt.Sprintf("Bad server %q data at %v:\n", song.SHA1, test.Caller()) + 55 " Want: " + want.String() + "\n" + 56 " Got: " + got.String() + "\n") 57 } 58 }