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  }