package lulu import ( "context" "encoding/json" "fmt" "os" "strings" "testing" "time" "github.com/stretchr/testify/require" ) const ( clientKeyPath = "testdata/clientkey" clientSecretPath = "testdata/clientsecret" apiKeyPage = "https://developers.sandbox.com/user-profile/api-keys" 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" ) var ( clientKey string clientSecret string ) func TestMain(m *testing.M) { 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, apiKeyPage) 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, apiKeyPage) os.Exit(1) } m.Run() } func TestMarshalValidateInteriorReq(t *testing.T) { t.Parallel() want := `{ "source_url": "https://example.com/interior.pdf", "pod_package_id": "0850X1100.BW.STD.LW.060UW444.MNG" }` req := validateInteriorReq{ "https://example.com/interior.pdf", PkgId{ UsLetter, Mono, Standard, LinenWrap, P60UncoatedWhite, Matte, NavyLinen, GoldFoil}, } requireMarshalJsonEq(t, want, req) } func TestMarshalValidateInteriorBasicReq(t *testing.T) { t.Parallel() requireMarshalJsonEq(t, `{"source_url": "https://example.com/interior.pdf"}`, validateInteriorBasicReq{"https://example.com/interior.pdf"}) } func TestUnmarshalInteriorValidationRecord(t *testing.T) { t.Parallel() data := `{ "id": 1, "source_url": "https://www.dropbox.com/sh/p3zh22vzsaegiri/AACOUn3LFKsITDzylh13bQpsa/161025/thesis2.pdf?dl=1", "page_count": 210, "errors": null, "status": "VALIDATING", "valid_pod_package_ids": null }` want := InteriorValidationRecord{ 1, "https://www.dropbox.com/sh/p3zh22vzsaegiri/AACOUn3LFKsITDzylh13bQpsa/161025/thesis2.pdf?dl=1", 210, "", StatusValidating, nil, } requireUnmarshalJsonEq(t, want, data) } func TestValidateInterior(t *testing.T) { c := newClient(t) mfg := PkgId{ UsTrade, Mono, Standard, Perfect, P60UncoatedWhite, Gloss, NoLinen, NoFoil, } id, err := c.ValidateInterior(interiorUrl, mfg) require.NoError(t, err) require.NotZero(t, id) // It seems the server doesn't populate most of the response // fields, but we just need the ID anyway. } func TestValidateInteriorBasic(t *testing.T) { c := newClient(t) id, err := c.ValidateInteriorBasic(interiorUrl) require.NoError(t, err) require.NotZero(t, id) // It seems the server doesn't populate most of the response // fields, but we just need the ID anyway. } func TestGetInteriorValidation(t *testing.T) { c := newClient(t) // Start validation job id, err := c.ValidateInteriorBasic(interiorUrl) require.NoError(t, err) // Poll until done timeout := 15 * time.Second period := time.Second ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() timer := time.NewTimer(period) for { select { case <-timer.C: rec, err := c.GetInteriorValidation(id) require.NoError(t, err) if rec.Status.IsFinal() { require.Equal(t, StatusValidated, rec.Status) require.Equal(t, id, rec.Id) require.Equal(t, interiorUrl, rec.SrcUrl) require.Equal(t, uint(210), rec.NPages) require.Empty(t, rec.Errors) require.NotEmpty(t, rec.ValidPkgIds) return } timer.Reset(period) case <-ctx.Done(): t.Errorf("status still not finalized after %v", timeout) return } } } func TestUnmarshalCoverDimensions(t *testing.T) { t.Parallel() requireUnmarshalJsonEq(t, CoverDimensions{123.4, 567.8, Points}, `{"width": "123.400", "height": "567.800", "unit": "pt"}`) requireUnmarshalJsonEq(t, CoverDimensions{123.4, 567.8, Millimeters}, `{"width": "123.400", "height": "567.800", "unit": "mm"}`) requireUnmarshalJsonEq(t, CoverDimensions{123.4, 567.8, Inches}, `{"width": "123.400", "height": "567.800", "unit": "inch"}`) } func TestMarshalCoverDimensionsReq(t *testing.T) { t.Parallel() requireMarshalJsonEq(t, `{ "pod_package_id": "0600X0900.BW.STD.PB.060UW444.MXX", "interior_page_count": 210, "unit": "pt"}`, coverDimensionsReq{ PkgId{ UsTrade, Mono, Standard, Perfect, P60UncoatedWhite, Matte, NoLinen, NoFoil}, 210, Points}) } func TestCoverDimensions(t *testing.T) { c := newClient(t) mfg := PkgId{ UsTrade, Mono, Standard, Perfect, P60UncoatedWhite, Matte, NoLinen, NoFoil, } dims, err := c.CoverDimensions(mfg, 210, Points) require.NoError(t, err) require.Equal(t, CoverDimensions{920, 666, Points}, dims) } 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) }