diff --git a/src/Samples/KalkulatorRabatu.cs b/src/Samples/KalkulatorRabatu.cs index c595b69..9f64674 100644 --- a/src/Samples/KalkulatorRabatu.cs +++ b/src/Samples/KalkulatorRabatu.cs @@ -12,24 +12,24 @@ public class KalkulatorRabatu private const decimal Prog2 = 0.5m; private const decimal DarmowaWysylka = 1m; - public static decimal PoliczRabat(Func getValue, Func isLoyal) + public static decimal PoliczRabat(decimal value, bool isLoyal) { - var modifier = isLoyal() ? 1 : 2; + var modifier = isLoyal ? 1 : 2; - if (getValue() < 50 * modifier) + if (value < 50 * modifier) return Prog0; - if (getValue() < 250 * modifier) + if (value < 250 * modifier) return Prog1; - if (getValue() < 500 * modifier) + if (value < 500 * modifier) return Prog2; return DarmowaWysylka; } - public static bool LojalnyKontrahent(Func> dokumenty) => - dokumenty().Count(x => x > Date.Today.AddMonths(-6)) >= 5; + public static bool LojalnyKontrahent(IEnumerable dates) => + dates.Count(x => x > Date.Today.AddMonths(-6)) >= 5; } } \ No newline at end of file diff --git a/src/Samples/ZmianaDokumentuHandlowego.cs b/src/Samples/ZmianaDokumentuHandlowego.cs index 6d66d42..d715025 100644 --- a/src/Samples/ZmianaDokumentuHandlowego.cs +++ b/src/Samples/ZmianaDokumentuHandlowego.cs @@ -1,4 +1,3 @@ -using System.Collections.Generic; using System.Linq; using Samples; using Soneta.Handel; @@ -9,57 +8,76 @@ namespace Samples { - class ZmianaDokumentuHandlowego : IZmianaDokumentuHandlowego + public class ZmianaDokumentuHandlowego : IZmianaDokumentuHandlowego + { + public ILogika Logika { get; set; } = new Domyslna(); + + public void ZmianaStanu( ZmianaStanuDokumentuHandlowegoArgs args ) + { + if (args.PrzedZmianą && + args.NowyStan == StanDokumentuHandlowego.Zatwierdzony) + { + Logika.DodajTransport( args, Logika.PoliczRabat( args ) ); + } + } + + #region Niezaimplementowane metody + + public void ZmianaWartości( ZmianaDokumentuHandlowegoArgs args ) + { + } + + public void ZmianaPozycji( ZmianaPozycjiDokumentuArgs args ) + { + } + + public void WyliczenieCenyPozycji( WyliczenieCenyPozycjiDokumentuArgs args ) + { + } + + public void ZmianaPłatności( ZmianaDokumentuHandlowegoArgs args ) + { + } + + public void Zatwierdzanie( ZmianaDokumentuHandlowegoArgs args ) + { + } + + public void Zatwierdzony( ZmianaDokumentuHandlowegoArgs args ) { - public void ZmianaStanu(ZmianaStanuDokumentuHandlowegoArgs args) - { - if (args.PrzedZmianą && args.NowyStan == StanDokumentuHandlowego.Zatwierdzony) - { - DodajTransport(args.Dokument, KalkulatorRabatu.PoliczRabat(WartoscDokumentu, Lojalny)); - } - - bool Lojalny() => KalkulatorRabatu.LojalnyKontrahent(() => PobierzDokumenty(args.Dokument).Select(x => x.Data)); - decimal WartoscDokumentu() => args.Dokument.Suma.Netto; - } - - public IEnumerable PobierzDokumenty(DokumentHandlowy dh) - { - return dh.Session.GetHandel().DokHandlowe.WgKontrahent[dh.Kontrahent]; - } - - public void DodajTransport(DokumentHandlowy dokument, decimal rabat) - { - var pos = new PozycjaDokHandlowego(dokument); - dokument.Session.GetHandel().PozycjeDokHan.AddRow(pos); - - pos.Towar = dokument.Session.GetTowary().Towary.WgKodu["TRANSPORT"]; - pos.Rabat = new Percent(rabat); - } - -#region Niezaimplementowane metody - public void ZmianaWartości(ZmianaDokumentuHandlowegoArgs args) - { - } - - public void ZmianaPozycji(ZmianaPozycjiDokumentuArgs args) - { - } - - public void WyliczenieCenyPozycji(WyliczenieCenyPozycjiDokumentuArgs args) - { - } - - public void ZmianaPłatności(ZmianaDokumentuHandlowegoArgs args) - { - } - - public void Zatwierdzanie(ZmianaDokumentuHandlowegoArgs args) - { - } - - public void Zatwierdzony(ZmianaDokumentuHandlowegoArgs args) - { - } -#endregion } + + #endregion + + class Domyslna : ILogika + { + decimal ILogika.PoliczRabat( ZmianaStanuDokumentuHandlowegoArgs args ) => + KalkulatorRabatu.PoliczRabat( + args.Dokument.Suma.Netto, + KalkulatorRabatu.LojalnyKontrahent( + args.Dokument.Table.WgKontrahent[ args.Dokument.Kontrahent ] + .Select( x => x.Data ) ) ); + + void ILogika.DodajTransport( + ZmianaStanuDokumentuHandlowegoArgs args, + decimal rabat ) + { + var pos = new PozycjaDokHandlowego( args.Dokument ); + args.Dokument.Session.GetHandel().PozycjeDokHan.AddRow( pos ); + + pos.Towar = args.Dokument.Session.GetTowary().Towary + .WgKodu[ "TRANSPORT" ]; + pos.Rabat = new Percent( rabat ); + } + } + + public interface ILogika + { + void DodajTransport( + ZmianaStanuDokumentuHandlowegoArgs args, + decimal rabat ); + + decimal PoliczRabat( ZmianaStanuDokumentuHandlowegoArgs args ); + } + } } diff --git a/tests/Samples.Tests/KalkulatorRabatuTests.cs b/tests/Samples.Tests/KalkulatorRabatuTests.cs index 685079e..6f23172 100644 --- a/tests/Samples.Tests/KalkulatorRabatuTests.cs +++ b/tests/Samples.Tests/KalkulatorRabatuTests.cs @@ -22,12 +22,12 @@ class KalkulatorRabatuTests [TestCase(500, true, ExpectedResult = 1)] [TestCase(999, true, ExpectedResult = 1)] [TestCase(1000, true, ExpectedResult = 1)] - public decimal Policz(decimal wartosc, bool lojalny) => KalkulatorRabatu.PoliczRabat( () => wartosc, () => lojalny); + public decimal Policz(decimal wartosc, bool lojalny) => KalkulatorRabatu.PoliczRabat( wartosc, lojalny); [Test] public void LojalnyKontrahent_5DokumentowZOstatniegoPolrocza_True() { - var result = KalkulatorRabatu.LojalnyKontrahent(() => new[] + var result = KalkulatorRabatu.LojalnyKontrahent(new[] { Date.Today, Date.Today.AddMonths(-1), @@ -41,7 +41,7 @@ public void LojalnyKontrahent_5DokumentowZOstatniegoPolrocza_True() [Test] public void LojalnyKontrahent_4DokumentyZOstatniegoPolrocza_False() { - var result = KalkulatorRabatu.LojalnyKontrahent(() => new[] + var result = KalkulatorRabatu.LojalnyKontrahent(new[] { Date.Today, Date.Today.AddMonths(-1), @@ -54,7 +54,7 @@ public void LojalnyKontrahent_4DokumentyZOstatniegoPolrocza_False() [Test] public void LojalnyKontrahent_Powyzej4DokumentowAleTylkoTrzyZOstatniegoPolrocza_False() { - var result = KalkulatorRabatu.LojalnyKontrahent(() => new[] + var result = KalkulatorRabatu.LojalnyKontrahent(new[] { Date.Today, Date.Today.AddMonths(-4), diff --git a/tests/Samples.Tests/Samples.Tests.csproj b/tests/Samples.Tests/Samples.Tests.csproj index 193c1b5..aba9e76 100644 --- a/tests/Samples.Tests/Samples.Tests.csproj +++ b/tests/Samples.Tests/Samples.Tests.csproj @@ -3,7 +3,11 @@ $(SonetaTargetFramework) true + latest + + + diff --git a/tests/Samples.Tests/ZmianaStanuTest.cs b/tests/Samples.Tests/ZmianaStanuTest.cs new file mode 100755 index 0000000..930c171 --- /dev/null +++ b/tests/Samples.Tests/ZmianaStanuTest.cs @@ -0,0 +1,86 @@ +// ============================================================================= +// +// Copyright (c) 2019 Soneta sp. z o.o. All rights reserved. +// +// ============================================================================= + +using NSubstitute; +using NUnit.Framework; +using Soneta.Handel; + +namespace Samples.Tests +{ + class ZmianaStanuTest + { + ZmianaDokumentuHandlowego _zmianaDokumentu; + + [Test] + [Description( "Nigdy nie oczekuje się reakcji po zmianie stanu." )] + public void Ignoruj( + [Values( + StanDokumentuHandlowego.Zatwierdzony, + StanDokumentuHandlowego.Anulowany, + StanDokumentuHandlowego.Bufor, + StanDokumentuHandlowego.Zablokowany )] + StanDokumentuHandlowego stan, + [Values( false )] bool przed ) + { + var args = + new ZmianaStanuDokumentuHandlowegoArgs( default, stan, przed ); + _zmianaDokumentu.ZmianaStanu( args ); + + _zmianaDokumentu.Logika.Received( 0 ) + .PoliczRabat( args ); + _zmianaDokumentu.Logika.Received( 0 ) + .DodajTransport( args, Arg.Any() ); + } + + [Test] + [Description( + "Przypadki, kiedy reakcja nie jest oczekiwana przed zmianą stanu" )] + public void NieReaguj( + [Values( + StanDokumentuHandlowego.Anulowany, + StanDokumentuHandlowego.Bufor, + StanDokumentuHandlowego.Zablokowany )] + StanDokumentuHandlowego stan, + [Values( true )] bool przed ) + { + var args = + new ZmianaStanuDokumentuHandlowegoArgs( default, stan, przed ); + _zmianaDokumentu.ZmianaStanu( args ); + + _zmianaDokumentu.Logika.Received( 0 ) + .PoliczRabat( args ); + _zmianaDokumentu.Logika.Received( 0 ) + .DodajTransport( args, Arg.Any() ); + } + + [Test] + [Description( + "Przypadek, kiedy reakcja jest oczekiwana przed zatwierdzeniem" )] + public void Reaguj( + [Values( StanDokumentuHandlowego.Zatwierdzony )] + StanDokumentuHandlowego stan, + [Values( true )] bool przed ) + { + const decimal rabat = 20m; + var args = + new ZmianaStanuDokumentuHandlowegoArgs( default, stan, przed ); + _zmianaDokumentu.Logika.PoliczRabat( args ).Returns( rabat ); + _zmianaDokumentu.ZmianaStanu( args ); + + _zmianaDokumentu.Logika.Received( 1 ) + .PoliczRabat( args ); + _zmianaDokumentu.Logika.Received( 1 ) + .DodajTransport( args, rabat ); + } + + [OneTimeSetUp] + public void SetupOnce() => + _zmianaDokumentu = new ZmianaDokumentuHandlowego + { + Logika = Substitute.For() + }; + } +}