コード例 #1
0
        public IActionResult GetDevis([FromRoute] int grossisteId, [FromBody] GetDevisRequest request)
        {
            request.GrossisteId = grossisteId;
            var devis = _grossisteService.GetDevis(request);

            return(Ok(devis));
        }
コード例 #2
0
        public void GetDevis_DoitLancerUneException_QuandDoublonBiereCommandee()
        {
            // Arrange
            var request = new GetDevisRequest
            {
                Commandes = new List <GetDevisRequest.Commande>
                {
                    new GetDevisRequest.Commande {
                        BiereId = 1, Quantite = 10
                    },
                    new GetDevisRequest.Commande {
                        BiereId = 2, Quantite = 10
                    },
                    new GetDevisRequest.Commande {
                        BiereId = 1, Quantite = 10
                    },
                }
            };

            InjectClassFor(InitializeContext());

            // Act
            Action action = () => ClassUnderTest.GetDevis(request);

            // Assert
            action.Should()
            .Throw <ValidationException>()
            .WithMessage(DevisValidationMessage.BiereDoublon);
        }
コード例 #3
0
        public void GetDevis_DoitRenvoyerDevisSansReduction_QuandInferieur10()
        {
            // Arrange
            var grossiste = fixture.Create <Core.Domain.Grossiste>();
            var request   = new GetDevisRequest
            {
                GrossisteId = grossiste.Id,
                Commandes   = new List <GetDevisRequest.Commande>
                {
                    new GetDevisRequest.Commande {
                        BiereId = 1, Quantite = 2
                    },
                    new GetDevisRequest.Commande {
                        BiereId = 2, Quantite = 3
                    },
                }
            };

            var chimayBleue = new Biere {
                Id = 1, Prix = 2.8, Nom = "Chimay Bleue"
            };
            var chimayBleueExtra = new Biere {
                Id = 2, Prix = 3.8, Nom = "Chimay Bleue Extra"
            };

            var context = InitializeContext();

            context.Grossistes.Add(grossiste);
            context.Bieres.Add(chimayBleue);
            context.Bieres.Add(chimayBleueExtra);
            context.StockGrossistes.Add(new StockGrossiste {
                Id = 1, BiereId = 1, Quantite = 5, GrossisteId = grossiste.Id
            });
            context.StockGrossistes.Add(new StockGrossiste {
                Id = 2, BiereId = 2, Quantite = 10, GrossisteId = grossiste.Id
            });
            context.SaveChanges();

            InjectClassFor(context);

            // Act
            var response = ClassUnderTest.GetDevis(request);

            // Assert
            response.LignesDevis[0].Biere.Should().Be(chimayBleue.Nom);
            response.LignesDevis[0].Quantite.Should().Be(2);
            response.LignesDevis[0].PrixUnitaire.Should().Be(chimayBleue.Prix);

            response.LignesDevis[1].Biere.Should().Be(chimayBleueExtra.Nom);
            response.LignesDevis[1].Quantite.Should().Be(3);
            response.LignesDevis[1].PrixUnitaire.Should().Be(chimayBleueExtra.Prix);

            response.PrixFinal.Should().Be(2 * chimayBleue.Prix + 3 * chimayBleueExtra.Prix);
        }
コード例 #4
0
        public void GetDevis_DoitLancerUneException_QuandCommandeVide()
        {
            // Arrange
            var request = new GetDevisRequest();

            InjectClassFor(InitializeContext());

            // Act
            Action action = () => ClassUnderTest.GetDevis(request);

            // Assert
            action.Should()
            .Throw <ValidationException>()
            .WithMessage(DevisValidationMessage.CommandeVide);
        }
コード例 #5
0
        public void GetDevis_DoitLancerUneException_QuandGrossisteStockInsufissant()
        {
            // Arrange
            var grossiste = fixture.Create <Core.Domain.Grossiste>();
            var request   = new GetDevisRequest
            {
                GrossisteId = grossiste.Id,
                Commandes   = new List <GetDevisRequest.Commande>
                {
                    new GetDevisRequest.Commande {
                        BiereId = 1, Quantite = 2
                    },
                    new GetDevisRequest.Commande {
                        BiereId = 2, Quantite = 15
                    },
                }
            };

            var chimayBleue = new Biere {
                Id = 1, Prix = 2.8, Nom = "Chimay Bleue"
            };
            var chimayBleueExtra = new Biere {
                Id = 2, Prix = 3.8, Nom = "Chimay Bleue Extra"
            };

            var context = InitializeContext();

            context.Grossistes.Add(grossiste);
            context.Bieres.Add(chimayBleue);
            context.Bieres.Add(chimayBleueExtra);
            context.StockGrossistes.Add(new StockGrossiste {
                Id = 1, BiereId = 1, Quantite = 5, GrossisteId = grossiste.Id
            });
            context.StockGrossistes.Add(new StockGrossiste {
                Id = 2, BiereId = 2, Quantite = 10, GrossisteId = grossiste.Id
            });
            context.SaveChanges();

            InjectClassFor(context);

            // Act
            Action action = () => ClassUnderTest.GetDevis(request);

            // Assert
            action.Should()
            .Throw <ValidationException>()
            .WithMessage(DevisValidationMessage.StockInsuffisant);
        }
コード例 #6
0
        public void GetDevis_DoitRenvoyerDevisAvecReduction_QuandSuperieur20()
        {
            // Arrange
            var grossiste = fixture.Create <Core.Domain.Grossiste>();
            var request   = new GetDevisRequest
            {
                GrossisteId = grossiste.Id,
                Commandes   = new List <GetDevisRequest.Commande>
                {
                    new GetDevisRequest.Commande {
                        BiereId = 1, Quantite = 15
                    },
                    new GetDevisRequest.Commande {
                        BiereId = 2, Quantite = 10
                    },
                }
            };

            var chimayBleue = new Biere {
                Id = 1, Prix = 2.8, Nom = "Chimay Bleue"
            };
            var chimayBleueExtra = new Biere {
                Id = 2, Prix = 3.8, Nom = "Chimay Bleue Extra"
            };

            var context = InitializeContext();

            context.Grossistes.Add(grossiste);
            context.Bieres.Add(chimayBleue);
            context.Bieres.Add(chimayBleueExtra);
            context.StockGrossistes.Add(new StockGrossiste {
                Id = 1, BiereId = 1, Quantite = 15, GrossisteId = grossiste.Id
            });
            context.StockGrossistes.Add(new StockGrossiste {
                Id = 2, BiereId = 2, Quantite = 10, GrossisteId = grossiste.Id
            });
            context.SaveChanges();

            InjectClassFor(context);

            // Act
            var response = ClassUnderTest.GetDevis(request);

            // Assert
            response.PrixFinal.Should().Be((15 * chimayBleue.Prix + 10 * chimayBleueExtra.Prix) * 0.8);
        }
コード例 #7
0
        public void GetDevis_DoitLancerUneException_QuandGrossisteExistePas()
        {
            // Arrange
            var request = new GetDevisRequest
            {
                Commandes = fixture.Build <GetDevisRequest.Commande>().CreateMany()
            };

            InjectClassFor(InitializeContext());

            // Act
            Action action = () => ClassUnderTest.GetDevis(request);

            // Assert
            action.Should()
            .Throw <ValidationException>()
            .WithMessage(DevisValidationMessage.GrossisteInexistant);
        }
コード例 #8
0
        public void GetDevis_DoitLancerUneException_QuandGrossisteStockIncomplet()
        {
            // Arrange
            var grossiste = fixture.Create <Core.Domain.Grossiste>();
            var request   = new GetDevisRequest
            {
                GrossisteId = grossiste.Id,
                Commandes   = new List <GetDevisRequest.Commande>
                {
                    new GetDevisRequest.Commande {
                        BiereId = 1, Quantite = 10
                    },
                    new GetDevisRequest.Commande {
                        BiereId = 2, Quantite = 10
                    },
                    new GetDevisRequest.Commande {
                        BiereId = 3, Quantite = 10
                    },
                }
            };

            var context = InitializeContext();

            context.Grossistes.Add(grossiste);
            context.StockGrossistes.Add(new StockGrossiste {
                Id = 1, BiereId = 1, GrossisteId = grossiste.Id
            });
            context.StockGrossistes.Add(new StockGrossiste {
                Id = 2, BiereId = 2, GrossisteId = grossiste.Id
            });
            context.SaveChanges();

            InjectClassFor(context);

            // Act
            Action action = () => ClassUnderTest.GetDevis(request);

            // Assert
            action.Should()
            .Throw <ValidationException>()
            .WithMessage(DevisValidationMessage.StockIncomplet);
        }
コード例 #9
0
        public GetDevisResponse GetDevis(GetDevisRequest request)
        {
            var response = new GetDevisResponse();

            if (!request.Commandes.Any())
            {
                throw new ValidationException(DevisValidationMessage.CommandeVide);
            }

            var bieresCommandes = request.Commandes.Select(c => c.BiereId).ToArray();

            if (bieresCommandes.Distinct().Count() != bieresCommandes.Length)
            {
                throw new ValidationException(DevisValidationMessage.BiereDoublon);
            }

            var grossiste = _brasserieContext
                            .Grossistes
                            .Include(g => g.StockGrossistes)
                            .ThenInclude(sg => sg.Biere)
                            .FirstOrDefault(g => g.Id == request.GrossisteId);

            if (grossiste == null)
            {
                throw new ValidationException(DevisValidationMessage.GrossisteInexistant);
            }

            var bieresGrossiste = grossiste.StockGrossistes.Select(sg => sg.BiereId).Distinct();

            if (!bieresCommandes.All(b => bieresGrossiste.Contains(b)))
            {
                throw new ValidationException(DevisValidationMessage.StockIncomplet);
            }

            foreach (var commande in request.Commandes)
            {
                var biereGrossiste = grossiste.StockGrossistes.First(sg => sg.BiereId == commande.BiereId);

                if (biereGrossiste.Quantite < commande.Quantite)
                {
                    throw new ValidationException(DevisValidationMessage.StockInsuffisant);
                }

                response.LignesDevis.Add(new GetDevisResponse.LigneDevis
                {
                    Biere        = biereGrossiste.Biere.Nom,
                    Quantite     = commande.Quantite,
                    PrixUnitaire = biereGrossiste.Biere.Prix
                });
            }

            if (response.QuantiteTotale > 10)
            {
                response.Reduction = 10;
            }
            if (response.QuantiteTotale > 20)
            {
                response.Reduction = 20;
            }

            return(response);
        }