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  }