flamingo.me/flamingo-commerce/v3@v3.11.0/test/integrationtest/projecttest/modules/placeorder/fake_service.go (about) 1 package placeorder 2 3 import ( 4 "context" 5 "errors" 6 "math/rand" 7 "strconv" 8 "sync" 9 10 "flamingo.me/flamingo/v3/core/auth" 11 12 cartDomain "flamingo.me/flamingo-commerce/v3/cart/domain/cart" 13 "flamingo.me/flamingo-commerce/v3/cart/domain/placeorder" 14 ) 15 16 const ( 17 // CustomAttributesKeyPlaceOrderError can be used to force an error during place order 18 CustomAttributesKeyPlaceOrderError = "place-order-error" 19 // CustomAttributesKeyReserveOrderIDError can be used to force an error during reserve order id 20 CustomAttributesKeyReserveOrderIDError = "reserve-order-id-error" 21 ) 22 23 type ( 24 // FakeAdapter provides fake place order adapter 25 FakeAdapter struct { 26 locker sync.Locker 27 placedOrders map[string]placeorder.PlacedOrderInfos 28 } 29 ) 30 31 var ( 32 _ placeorder.Service = new(FakeAdapter) 33 // NextCancelFails can be set to let the next call to any FakeAdapter's instance fail 34 NextCancelFails bool 35 ) 36 37 // Inject dependencies 38 func (f *FakeAdapter) Inject() *FakeAdapter { 39 f.placedOrders = make(map[string]placeorder.PlacedOrderInfos) 40 f.locker = &sync.Mutex{} 41 return f 42 } 43 44 // PlaceGuestCart places a guest cart order 45 func (f *FakeAdapter) PlaceGuestCart(_ context.Context, cart *cartDomain.Cart, _ *placeorder.Payment) (placeorder.PlacedOrderInfos, error) { 46 return f.placeCart(cart) 47 } 48 49 // PlaceCustomerCart places a customer cart 50 func (f *FakeAdapter) PlaceCustomerCart(_ context.Context, _ auth.Identity, cart *cartDomain.Cart, _ *placeorder.Payment) (placeorder.PlacedOrderInfos, error) { 51 return f.placeCart(cart) 52 } 53 54 func (f *FakeAdapter) placeCart(cart *cartDomain.Cart) (placeorder.PlacedOrderInfos, error) { 55 f.locker.Lock() 56 defer f.locker.Unlock() 57 forcedError := cart.AdditionalData.CustomAttributes[CustomAttributesKeyPlaceOrderError] 58 if forcedError != "" { 59 return nil, errors.New(forcedError) 60 } 61 62 reservedID := cart.AdditionalData.ReservedOrderID 63 64 _, found := f.placedOrders[reservedID] 65 66 if found { 67 return nil, errors.New("Another order with #" + reservedID + " already placed") 68 } 69 70 var placedOrders placeorder.PlacedOrderInfos 71 placedOrders = append(placedOrders, placeorder.PlacedOrderInfo{ 72 OrderNumber: reservedID, 73 }) 74 75 f.placedOrders[reservedID] = placedOrders 76 77 return placedOrders, nil 78 } 79 80 // ReserveOrderID returns the reserved order id 81 func (f *FakeAdapter) ReserveOrderID(_ context.Context, cart *cartDomain.Cart) (string, error) { 82 forcedError := cart.AdditionalData.CustomAttributes[CustomAttributesKeyReserveOrderIDError] 83 if forcedError != "" { 84 return "", errors.New(forcedError) 85 } 86 return cart.ID + "-" + strconv.Itoa(rand.Int()), nil 87 } 88 89 // CancelGuestOrder cancels a guest order 90 func (f *FakeAdapter) CancelGuestOrder(_ context.Context, orderInfos placeorder.PlacedOrderInfos) error { 91 return f.cancelOrder(orderInfos) 92 } 93 94 // CancelCustomerOrder cancels a customer order 95 func (f *FakeAdapter) CancelCustomerOrder(_ context.Context, orderInfos placeorder.PlacedOrderInfos, _ auth.Identity) error { 96 return f.cancelOrder(orderInfos) 97 } 98 99 func (f *FakeAdapter) cancelOrder(orderInfos placeorder.PlacedOrderInfos) error { 100 f.locker.Lock() 101 defer f.locker.Unlock() 102 if NextCancelFails { 103 NextCancelFails = false 104 return errors.New("test") 105 } 106 107 var toDelete []string 108 for _, order := range orderInfos { 109 _, found := f.placedOrders[order.OrderNumber] 110 111 if !found { 112 return errors.New("Order cancel not possible order #" + order.OrderNumber + " wasn't placed") 113 } 114 115 toDelete = append(toDelete, order.OrderNumber) 116 } 117 118 for _, orderNumber := range toDelete { 119 delete(f.placedOrders, orderNumber) 120 } 121 122 return nil 123 }