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 }