package lulu import ( _ "embed" "testing" "time" "github.com/shopspring/decimal" "github.com/stretchr/testify/require" ) //go:embed testdata/getprintjobsresp.json var getPrintJobsRespJson string var printJobSample = PrintJob{ Contact: MustParseEmailAddress("test@test.com"), Cost: PrintJobCost{ LineItemCosts: nil, ShipCost: FulfillmentCost{ TotalCostExclTax: decimal.RequireFromString("132.74"), TotalCostInclTax: decimal.RequireFromString("132.74"), TotalTax: decimal.RequireFromString("0.00"), TaxRate: decimal.RequireFromString("0.000000"), }, FulfillmentCost: FulfillmentCost{ TotalCostExclTax: decimal.RequireFromString("0.75"), TotalCostInclTax: decimal.RequireFromString("0.81"), TotalTax: decimal.RequireFromString("0.06"), TaxRate: decimal.RequireFromString("0.080000"), }, Fees: []Fee{{ Currency: "USD", Type: "HANDLING_FEE", Sku: "HANDLING_FEE_6", TaxRate: decimal.RequireFromString("0.088750"), TotalCostExclTax: decimal.RequireFromString("4.00"), TotalCostInclTax: decimal.RequireFromString("4.36"), TotalTax: decimal.RequireFromString("0.36"), }}, TotalCostExclTax: decimal.RequireFromString("123.45"), TotalCostInclTax: decimal.RequireFromString("678.00"), TotalTax: decimal.RequireFromString("0.123400"), }, Created: mustParseTime(time.RFC3339, "2017-08-07T08:47:26.485456Z"), Modified: mustParseTime(time.RFC3339, "2017-08-07T08:47:26.485490Z"), EstimatedShippingDates: EstimatedShippingDates{ ArrivalMax: MustParseDate("2017-08-12"), ArrivalMin: MustParseDate("2017-08-10"), DispatchMax: MustParseDate("2017-08-09"), DispatchMin: MustParseDate("2017-08-07"), }, ExternalId: "demo-time", Id: 1, LineItems: []LineItem{{ ExternalId: "item-reference-1", Id: 1, PrintableId: "", PrintableNormalization: PrintableNormalization{ Cover: NormalizationJob{ SrcMd5Sum: "e78512c777e7f5841fe8f1992cefb898", SrcUrl: "https://www.dropbox.com/sh/p3zh22vzsaegiri/AADP367j0bTWlt8fCu-_tm2ia/161025/139056_cover.pdf?dl=1", }, Interior: NormalizationJob{ SrcMd5Sum: "7f8af20c296747689756f8e310135d79", SrcUrl: "https://www.dropbox.com/sh/p3zh22vzsaegiri/AACOUn3LFKsITDzylh13bQpsa/161025/thesis2.pdf?dl=1", }, }, Quantity: 20, Status: LineItemStatus{ Messages: LineItemStatusMessages{ Info: "Line-item is currently being validated", }, Status: ItemCreated, }, Title: "My Book", }}, ProductionDelay: 120 * time.Minute, ProductionDue: time.Time{}, AddressValidation: shipAddrValidationSample, ShipOpt: Mail, Status: PrintJobStatus{ Changed: mustParseTime(time.RFC3339, "2017-08-07T08:47:26.480493Z"), Msg: "Print-job is currently being validated", Status: OrderCreated, }, } func TestUnmarshalGetPrintJobsResp(t *testing.T) { want := getPrintJobsResp{ Count: 1, Next: "https://api.lulu.com/resources/?page=1&page_size=1", Prev: "https://api.lulu.com/resources/?page=1&page_size=1", Results: []PrintJob{printJobSample}, } requireUnmarshalJsonEq(t, want, getPrintJobsRespJson) } func TestGetPrintJobs(t *testing.T) { t.Fail() // TODO: create a few print jobs and retrieve them c := newClient(t) _, err := c.GetPrintJobs() require.NoError(t, err) } //go:embed testdata/printreq.json var printReqJson string func TestMarshalPrintReq(t *testing.T) { req := printReq[Printable]{ Contact: MustParseEmailAddress("test@test.com"), ExternalId: "demo-time", LineItems: []Printable{{ ExternalId: "item-reference-1", CoverUrl: "https://www.dropbox.com/s/7bv6mg2tj0h3l0r/lulu_trade_perfect_template.pdf?dl=1&raw=1", InteriorUrl: "https://www.dropbox.com/s/r20orb8umqjzav9/lulu_trade_interior_template-32.pdf?dl=1&raw=1", Mfg: PkgId{UsTrade, Mono, Standard, Perfect, P60UncoatedWhite, Matte, NoLinen, NoFoil}, Quantity: 30, Title: "My Book", }}, ProductionDelayMins: 120, ShipAddr: shipAddrSample, ShipOpt: Mail, } requireMarshalJsonEq(t, printReqJson, req) } //go:embed testdata/reprintreq.json var reprintReqJson string func TestMarshalReprintReq(t *testing.T) { req := printReq[Reprintable]{ Contact: MustParseEmailAddress("test@test.com"), ExternalId: "demo-time", LineItems: []Reprintable{{ ExternalId: "item-reference-1", PrintableId: PrintableId("11606ab3-9355-46d3-ae90-338db6f5d271"), Quantity: 30, Title: "My Book", }}, ProductionDelayMins: 120, ShipAddr: shipAddrSample, ShipOpt: Mail, } requireMarshalJsonEq(t, reprintReqJson, req) } var printableSample = Printable{ ExternalId: "item-reference-1", CoverUrl: "https://www.dropbox.com/s/7bv6mg2tj0h3l0r/lulu_trade_perfect_template.pdf?dl=1&raw=1", InteriorUrl: "https://www.dropbox.com/s/r20orb8umqjzav9/lulu_trade_interior_template-32.pdf?dl=1&raw=1", Mfg: PkgId{UsTrade, Mono, Standard, Perfect, P60UncoatedWhite, Matte, NoLinen, NoFoil}, Quantity: 30, Title: "My Book", } func TestPrint(t *testing.T) { contact := MustParseEmailAddress("test@test.com") jobEid := "demo-time" productionDelay := 120 * time.Minute addr := shipAddrSample shipOpt := Mail item := printableSample c := newClient(t) startTime := time.Now() job, err := c.Print(contact, jobEid, productionDelay, addr, shipOpt, []Printable{item}) require.NoError(t, err) require.Equal(t, contact, job.Contact) requireAfter(t, job.Created, startTime) requireAfter(t, job.Modified, startTime) require.Equal(t, jobEid, job.ExternalId) require.NotZero(t, job.Id) require.Len(t, job.LineItems, 1) jobItem := job.LineItems[0] require.Equal(t, item.ExternalId, jobItem.ExternalId) require.NotZero(t, jobItem.Id) require.Equal(t, item.CoverUrl, jobItem.PrintableNormalization.Cover.SrcUrl) require.Equal(t, item.InteriorUrl, jobItem.PrintableNormalization.Interior.SrcUrl) require.Equal(t, item.Mfg, jobItem.Mfg) require.Equal(t, item.Quantity, jobItem.Quantity) require.NotEmpty(t, jobItem.Status.Messages.Info) require.NotEmpty(t, jobItem.Status.Status) require.Equal(t, productionDelay, job.ProductionDelay) requireMatchShipAddrValidationSample(t, job.AddressValidation) require.Equal(t, shipOpt, job.ShipOpt) requireAfter(t, job.Status.Changed, startTime) require.NotEmpty(t, job.Status.Msg) require.NotEmpty(t, job.Status.Status) } func TestReprint(t *testing.T) { t.Fail() // TODO } func TestGetPrintJob(t *testing.T) { contact := MustParseEmailAddress("test@test.com") jobEid := "demo-time" productionDelay := 120 * time.Minute addr := shipAddrSample shipOpt := Mail items := []Printable{printableSample} c := newClient(t) job1, err := c.Print(contact, jobEid, productionDelay, addr, shipOpt, items) require.NoError(t, err) require.NotZero(t, job1.Id) job2, err := c.GetPrintJob(job1.Id) require.NoError(t, err) // Ignore timestamp because job may have been modified between // creation and retrieval time job2.Modified = job1.Modified require.Equal(t, job1, job2) }