package lulu import ( "context" "encoding/json" "flag" "fmt" "os" "strings" "testing" "time" "github.com/stretchr/testify/require" ) const ( clientKeyPath = "testdata/clientkey" clientSecretPath = "testdata/clientsecret" interiorUrl = "https://www.dropbox.com/sh/p3zh22vzsaegiri/AACOUn3LFKsITDzylh13bQpsa/161025/thesis2.pdf?dl=1" coverUrl = "https://www.dropbox.com/sh/p3zh22vzsaegiri/AADP367j0bTWlt8fCu-_tm2ia/161025/139056_cover.pdf?dl=1" timeout = 15 * time.Second ) var ( clientKey string clientSecret string ) func TestMain(m *testing.M) { flag.BoolVar(&Debug, "d", false, "Print debug info to stderr.") flag.Parse() Sandbox() if b, err := os.ReadFile(clientKeyPath); err == nil { clientKey = strings.TrimSpace(string(b)) } else { fmt.Fprintf(os.Stderr, "%v\nCopy and paste your \"client key\" from the API Keys page into %s\n%s\n", err, clientKeyPath, SandboxApiKeyPage) os.Exit(1) } if b, err := os.ReadFile(clientSecretPath); err == nil { clientSecret = strings.TrimSpace(string(b)) } else { fmt.Fprintf(os.Stderr, "%v\nCopy and paste your \"client secret\" from the API Keys page into %s\n%s\n", err, clientSecretPath, SandboxApiKeyPage) os.Exit(1) } m.Run() } func newClient(t *testing.T) *Client { t.Helper() c, err := NewClient(t.Context(), clientKey, clientSecret) require.NoError(t, err) return c } func requireMarshalJsonEq(t *testing.T, expected string, marshaler any) { t.Helper() jactual, err := json.Marshal(marshaler) require.NoError(t, err) require.JSONEq(t, expected, string(jactual)) } func requireUnmarshalJsonEq[T any](t *testing.T, expected T, j string) { t.Helper() var actual T require.NoError(t, json.Unmarshal([]byte(j), &actual)) require.Equal(t, expected, actual) } // assert that t2 is after t1 func requireAfter(t *testing.T, t2, t1 time.Time) { t.Helper() require.Truef(t, t2.After(t1), "%s not after %s", t2, t1) } // assert that dt2 is not before tt1 func requireNotBeforeDate(t *testing.T, dt2, dt1 Date) { t.Helper() y2, m2, d2 := time.Time(dt2).UTC().Date() y1, m1, d1 := time.Time(dt1).UTC().Date() require.Truef(t, y2 >= y1 && m2 >= m1 && d2 >= d1, "%s is before %s", time.Date(y2, m2, d2, 0, 0, 0, 0, time.UTC).Format(time.DateOnly), time.Date(y1, m1, d1, 0, 0, 0, 0, time.UTC).Format(time.DateOnly)) } func tpoll(t *testing.T, f func() bool) { t.Helper() ctx, cancel := context.WithTimeout(t.Context(), timeout) defer cancel() _, err := poll(ctx, func() (struct{}, bool, error) { return struct{}{}, f(), nil }) require.NoError(t, err) } func mustParseTime(layout, value string) time.Time { t, err := time.Parse(layout, value) if err != nil { panic(err) } return t }