| package main |
| |
| import ( |
| "testing" |
| "time" |
| |
| pb "code.hackerspace.pl/hscloud/bgpwtf/invoice/proto" |
| ) |
| |
| // Fake test data for test in this file. |
| var ( |
| itemInternet1 = &pb.Item{ |
| Title: "Dostęp do Internetu - Umowa FOOBAR/10 - Opłata Abonentowa 2020/08", |
| Count: 1, |
| UnitPrice: 4200, |
| Vat: 23000, |
| } |
| itemInternet2 = &pb.Item{ |
| Title: "Dostęp do Internetu - Umowa FOOBAR/10 - Opłata Abonentowa 2020/09", |
| Count: 1, |
| UnitPrice: 4200, |
| Vat: 23000, |
| } |
| itemHardware = &pb.Item{ |
| Title: "Thinkpad x230, i7, 16GB RAM, Refurbished", |
| Count: 1, |
| UnitPrice: 10000, |
| Vat: 23000, |
| GtuCode: []pb.GTUCode{pb.GTUCode_GTU_05}, |
| } |
| billing1 = []string{ |
| "Wykop Sp. z o. o.", |
| "Zakręt 8", |
| "60-351 Poznań", |
| } |
| billing2 = []string{ |
| "TEH Adam Karolczak", |
| "Zgoda 18/2", |
| "95-200 Pabianice", |
| } |
| vatID1 = "PL8086133742" |
| vatID2 = "DE133742429" |
| iban = "PL 59 1090 2402 9746 7956 2256 2375" |
| swift = "WLPPZLPAXXX" |
| ) |
| |
| func TestCalculate(t *testing.T) { |
| now := time.Now() |
| for _, te := range []struct { |
| description string |
| data *pb.InvoiceData |
| want *pb.Invoice |
| }{ |
| { |
| description: "Invoice without JPK_V7 codes", |
| data: &pb.InvoiceData{ |
| Item: []*pb.Item{itemInternet1, itemInternet2}, |
| InvoicerBilling: billing1, |
| CustomerBilling: billing2, |
| InvoicerVatId: vatID1, |
| CustomerVatId: vatID2, |
| Date: now.UnixNano(), |
| DaysDue: 21, |
| Iban: iban, |
| Swift: swift, |
| Unit: "PLN", |
| }, |
| want: &pb.Invoice{ |
| TotalNet: 8400, |
| Total: 10332, |
| Unit: "PLN", |
| }, |
| }, |
| { |
| description: "Invoice with JPK_V7 codes", |
| data: &pb.InvoiceData{ |
| // Repeated item with GTU code GTU_5, to ensure result doesn't |
| // have repeated codes. |
| Item: []*pb.Item{itemInternet1, itemHardware, itemHardware}, |
| InvoicerBilling: billing1, |
| CustomerBilling: billing2, |
| InvoicerVatId: vatID1, |
| CustomerVatId: vatID2, |
| Date: now.UnixNano(), |
| DaysDue: 21, |
| Iban: iban, |
| Swift: swift, |
| Unit: "PLN", |
| }, |
| want: &pb.Invoice{ |
| TotalNet: 24200, |
| Total: 29766, |
| Unit: "PLN", |
| GtuCode: []pb.GTUCode{pb.GTUCode_GTU_05}, |
| }, |
| }, |
| } { |
| t.Run(te.description, func(t *testing.T) { |
| invoice := &pb.Invoice{ |
| Data: te.data, |
| Date: te.data.Date, |
| } |
| calculateInvoiceData(invoice) |
| if want, got := te.want.TotalNet, invoice.TotalNet; want != got { |
| t.Errorf("got TotalNet %d, wanted %d", got, want) |
| } |
| if want, got := te.want.Total, invoice.Total; want != got { |
| t.Errorf("got Total %d, wanted %d", got, want) |
| } |
| if want, got := te.want.Unit, invoice.Unit; want != got { |
| t.Errorf("got Unit %q, wanted %q", got, want) |
| } |
| due := time.Duration(int64(time.Hour*24) * te.data.DaysDue) |
| if want, got := now.Add(due).UnixNano(), invoice.DueDate; want != got { |
| t.Errorf("got DueDate %d, wanted %d", got, want) |
| } |
| if want, got := len(te.want.GtuCode), len(invoice.GtuCode); want != got { |
| t.Errorf("got %d GTU codes, wanted %d", got, want) |
| } else { |
| for i, want := range te.want.GtuCode { |
| got := invoice.GtuCode[i] |
| if want != got { |
| t.Errorf("GTU code %d: wanted %s, got %s", i, want.String(), got.String()) |
| } |
| } |
| } |
| }) |
| } |
| } |