flamingo.me/flamingo-commerce/v3@v3.11.0/sourcing/domain/fake/sourcing_service_test.go (about)

     1  package fake_test
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/assert"
     8  
     9  	cartDomain "flamingo.me/flamingo-commerce/v3/cart/domain/cart"
    10  	"flamingo.me/flamingo-commerce/v3/cart/domain/decorator"
    11  	productDomain "flamingo.me/flamingo-commerce/v3/product/domain"
    12  	commerceSourcingDomain "flamingo.me/flamingo-commerce/v3/sourcing/domain"
    13  	"flamingo.me/flamingo-commerce/v3/sourcing/domain/fake"
    14  )
    15  
    16  func TestSourcingService_AllocateItems(t *testing.T) {
    17  	t.Parallel()
    18  
    19  	t.Run("success when product id is correct", func(t *testing.T) {
    20  		t.Parallel()
    21  
    22  		service := &fake.SourcingService{}
    23  		service.Inject(&struct {
    24  			FakeSourceData string `inject:"config:commerce.sourcing.fake.jsonPath,optional"`
    25  		}{
    26  			FakeSourceData: "testdata/fakeSourceData.json",
    27  		})
    28  
    29  		decoratedCart := &decorator.DecoratedCart{
    30  			DecoratedDeliveries: []decorator.DecoratedDelivery{
    31  				{
    32  					Delivery: cartDomain.Delivery{
    33  						DeliveryInfo: cartDomain.DeliveryInfo{
    34  							Code: "inflight",
    35  						},
    36  					},
    37  					DecoratedItems: []decorator.DecoratedCartItem{
    38  						{
    39  							Item: cartDomain.Item{
    40  								ID: "item1",
    41  							},
    42  							Product: productDomain.SimpleProduct{
    43  								Identifier: "0f0asdf-0asd0a9sd-askdlj123rw",
    44  							},
    45  						},
    46  						{
    47  							Item: cartDomain.Item{
    48  								ID: "item2",
    49  							},
    50  							Product: productDomain.SimpleProduct{
    51  								Identifier: "0f0asdf-0asd0a9sd-askdlj123rx",
    52  							},
    53  						},
    54  					},
    55  				},
    56  			},
    57  		}
    58  
    59  		expectedItemAllocations := commerceSourcingDomain.ItemAllocations{
    60  			"item1": {
    61  				AllocatedQtys: map[commerceSourcingDomain.ProductID]commerceSourcingDomain.AllocatedQtys{
    62  					"0f0asdf-0asd0a9sd-askdlj123rw": {
    63  						commerceSourcingDomain.Source{
    64  							LocationCode:         "0f0asdf-0asd0a9sd-askdlj123rw",
    65  							ExternalLocationCode: "0f0asdf-0asd0a9sd-askdlj123rw",
    66  						}: 10,
    67  					},
    68  				},
    69  				Error: nil,
    70  			},
    71  			"item2": {
    72  				AllocatedQtys: map[commerceSourcingDomain.ProductID]commerceSourcingDomain.AllocatedQtys{
    73  					"0f0asdf-0asd0a9sd-askdlj123rx": {
    74  						commerceSourcingDomain.Source{
    75  							LocationCode:         "0f0asdf-0asd0a9sd-askdlj123rx",
    76  							ExternalLocationCode: "0f0asdf-0asd0a9sd-askdlj123rx",
    77  						}: 15,
    78  					},
    79  				},
    80  				Error: nil,
    81  			},
    82  		}
    83  
    84  		resultAllocations, err := service.AllocateItems(context.Background(), decoratedCart)
    85  		assert.NoError(t, err)
    86  		assert.NotNil(t, resultAllocations)
    87  		assert.Equal(t, expectedItemAllocations, resultAllocations)
    88  	})
    89  
    90  	t.Run("empty result when there are no item ids", func(t *testing.T) {
    91  		t.Parallel()
    92  
    93  		service := &fake.SourcingService{}
    94  		service.Inject(&struct {
    95  			FakeSourceData string `inject:"config:commerce.sourcing.fake.jsonPath,optional"`
    96  		}{
    97  			FakeSourceData: "testdata/fakeSourceData.json",
    98  		})
    99  
   100  		decoratedCart := &decorator.DecoratedCart{
   101  			DecoratedDeliveries: []decorator.DecoratedDelivery{
   102  				{
   103  					Delivery: cartDomain.Delivery{
   104  						DeliveryInfo: cartDomain.DeliveryInfo{
   105  							Code: "inflight",
   106  						},
   107  					},
   108  					DecoratedItems: []decorator.DecoratedCartItem{
   109  						{
   110  							Product: productDomain.SimpleProduct{
   111  								Identifier: "0f0asdf-0asd0a9sd-askdlj123rw",
   112  							},
   113  						},
   114  						{
   115  							Product: productDomain.SimpleProduct{
   116  								Identifier: "0f0asdf-0asd0a9sd-askdlj123rx",
   117  							},
   118  						},
   119  					},
   120  				},
   121  			},
   122  		}
   123  
   124  		expectedItemAllocations := commerceSourcingDomain.ItemAllocations{}
   125  
   126  		resultAllocations, err := service.AllocateItems(context.Background(), decoratedCart)
   127  		assert.NoError(t, err)
   128  		assert.NotNil(t, resultAllocations)
   129  		assert.Equal(t, expectedItemAllocations, resultAllocations)
   130  	})
   131  }
   132  
   133  func TestSourcingService_GetAvailableSources(t *testing.T) {
   134  	t.Parallel()
   135  
   136  	t.Run("success when product id exists", func(t *testing.T) {
   137  		t.Parallel()
   138  
   139  		service := &fake.SourcingService{}
   140  		service.Inject(&struct {
   141  			FakeSourceData string `inject:"config:commerce.sourcing.fake.jsonPath,optional"`
   142  		}{
   143  			FakeSourceData: "testdata/fakeSourceData.json",
   144  		})
   145  
   146  		product := productDomain.SimpleProduct{
   147  			Identifier: "0f0asdf-0asd0a9sd-askdlj123rw",
   148  		}
   149  
   150  		deliveryInfo := &cartDomain.DeliveryInfo{
   151  			Code: "inflight",
   152  		}
   153  
   154  		expectedSources := commerceSourcingDomain.AvailableSourcesPerProduct{
   155  			"0f0asdf-0asd0a9sd-askdlj123rw": {
   156  				commerceSourcingDomain.Source{
   157  					LocationCode:         "0f0asdf-0asd0a9sd-askdlj123rw",
   158  					ExternalLocationCode: "0f0asdf-0asd0a9sd-askdlj123rw",
   159  				}: 10,
   160  			},
   161  		}
   162  
   163  		resultSources, err := service.GetAvailableSources(context.Background(), product, deliveryInfo, &decorator.DecoratedCart{})
   164  
   165  		assert.NoError(t, err)
   166  		assert.NotNil(t, resultSources)
   167  		assert.Equal(t, expectedSources, resultSources)
   168  	})
   169  
   170  	t.Run("success when product id was not found but delivery code correct", func(t *testing.T) {
   171  		t.Parallel()
   172  
   173  		service := &fake.SourcingService{}
   174  		service.Inject(&struct {
   175  			FakeSourceData string `inject:"config:commerce.sourcing.fake.jsonPath,optional"`
   176  		}{
   177  			FakeSourceData: "testdata/fakeSourceData.json",
   178  		})
   179  
   180  		product := productDomain.SimpleProduct{
   181  			Identifier: "some-fake-id",
   182  		}
   183  
   184  		deliveryInfo := &cartDomain.DeliveryInfo{
   185  			Code: "inflight",
   186  		}
   187  
   188  		expectedSources := commerceSourcingDomain.AvailableSourcesPerProduct{
   189  			"some-fake-id": {
   190  				commerceSourcingDomain.Source{
   191  					LocationCode:         "inflight",
   192  					ExternalLocationCode: "inflight",
   193  				}: 5,
   194  			},
   195  		}
   196  
   197  		resultSources, err := service.GetAvailableSources(context.Background(), product, deliveryInfo, &decorator.DecoratedCart{})
   198  
   199  		assert.NoError(t, err)
   200  		assert.NotNil(t, resultSources)
   201  		assert.Equal(t, expectedSources, resultSources)
   202  	})
   203  
   204  	t.Run("failure when product id is empty", func(t *testing.T) {
   205  		t.Parallel()
   206  
   207  		service := &fake.SourcingService{}
   208  		service.Inject(&struct {
   209  			FakeSourceData string `inject:"config:commerce.sourcing.fake.jsonPath,optional"`
   210  		}{
   211  			FakeSourceData: "testdata/fakeSourceData.json",
   212  		})
   213  
   214  		product := productDomain.SimpleProduct{
   215  			Identifier: "",
   216  		}
   217  
   218  		deliveryInfo := &cartDomain.DeliveryInfo{
   219  			Code: "inflight",
   220  		}
   221  
   222  		resultSources, err := service.GetAvailableSources(context.Background(), product, deliveryInfo, &decorator.DecoratedCart{})
   223  
   224  		assert.Error(t, err)
   225  		assert.Nil(t, resultSources)
   226  		assert.Equal(t, commerceSourcingDomain.ErrEmptyProductIdentifier, err)
   227  	})
   228  
   229  	t.Run("failure when product type is bundle", func(t *testing.T) {
   230  		t.Parallel()
   231  
   232  		service := &fake.SourcingService{}
   233  		service.Inject(&struct {
   234  			FakeSourceData string `inject:"config:commerce.sourcing.fake.jsonPath,optional"`
   235  		}{
   236  			FakeSourceData: "testdata/fakeSourceData.json",
   237  		})
   238  
   239  		product := productDomain.BundleProduct{}
   240  
   241  		deliveryInfo := &cartDomain.DeliveryInfo{
   242  			Code: "inflight",
   243  		}
   244  
   245  		resultSources, err := service.GetAvailableSources(context.Background(), product, deliveryInfo, &decorator.DecoratedCart{})
   246  
   247  		assert.Error(t, err)
   248  		assert.Nil(t, resultSources)
   249  		assert.Equal(t, commerceSourcingDomain.ErrUnsupportedProductType, err)
   250  	})
   251  }