From f471019c7753b9254d1f913cead457f192ea41a7 Mon Sep 17 00:00:00 2001 From: Sebastian Mach Date: Tue, 21 May 2019 18:39:02 +0200 Subject: [PATCH 1/4] Test metody ZmianaStanu (entry point) --- src/Samples/ZmianaDokumentuHandlowego.cs | 123 +++++++++++++---------- tests/Samples.Tests/Samples.Tests.csproj | 4 + tests/Samples.Tests/ZmianaStanuTest.cs | 84 ++++++++++++++++ 3 files changed, 160 insertions(+), 51 deletions(-) create mode 100755 tests/Samples.Tests/ZmianaStanuTest.cs diff --git a/src/Samples/ZmianaDokumentuHandlowego.cs b/src/Samples/ZmianaDokumentuHandlowego.cs index 6d66d42..04de0d2 100644 --- a/src/Samples/ZmianaDokumentuHandlowego.cs +++ b/src/Samples/ZmianaDokumentuHandlowego.cs @@ -9,57 +9,78 @@ 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 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 } + + public void WyliczenieCenyPozycji( WyliczenieCenyPozycjiDokumentuArgs args ) + { + } + + public void ZmianaPłatności( ZmianaDokumentuHandlowegoArgs args ) + { + } + + public void Zatwierdzanie( ZmianaDokumentuHandlowegoArgs args ) + { + } + + public void Zatwierdzony( ZmianaDokumentuHandlowegoArgs args ) + { + } + + #endregion + + class Domyslna : ILogika + { + decimal ILogika.PoliczRabat( ZmianaStanuDokumentuHandlowegoArgs args ) => + KalkulatorRabatu.PoliczRabat( + () => args.Dokument.Suma.Netto, + () => KalkulatorRabatu.LojalnyKontrahent( + () => PobierzDokumenty( args.Dokument ).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 ); + } + + IEnumerable PobierzDokumenty( DokumentHandlowy dokument ) => + dokument.Table.WgKontrahent[ dokument.Kontrahent ]; + } + + public interface ILogika + { + void DodajTransport( + ZmianaStanuDokumentuHandlowegoArgs args, + decimal rabat ); + + decimal PoliczRabat( ZmianaStanuDokumentuHandlowegoArgs args ); + } + } } 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..d9feea9 --- /dev/null +++ b/tests/Samples.Tests/ZmianaStanuTest.cs @@ -0,0 +1,84 @@ +// ============================================================================= +// +// 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( 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( + "Przypadek, kiedy reakcja jest oczekiwana przed zatwierdzeniem" )] + public void Reaguj( + [Values( StanDokumentuHandlowego.Zatwierdzony )] + StanDokumentuHandlowego stan, + [Values( true )] bool przed ) + { + var args = + new ZmianaStanuDokumentuHandlowegoArgs( default, stan, przed ); + _zmianaDokumentu.ZmianaStanu( args ); + + _zmianaDokumentu.Logika.Received( 1 ) + .PoliczRabat( args ); + _zmianaDokumentu.Logika.Received( 1 ) + .DodajTransport( args, Arg.Any() ); + } + + [OneTimeSetUp] + public void SetupOnce() => + _zmianaDokumentu = new ZmianaDokumentuHandlowego + { + Logika = Substitute.For() + }; + } +} From 280d302bf23710c3ed5fc5393270cd072c3390fc Mon Sep 17 00:00:00 2001 From: Sebastian Mach Date: Wed, 22 May 2019 10:12:55 +0200 Subject: [PATCH 2/4] =?UTF-8?q?Poprawka=20warto=C5=9Bci=20argumentu=20test?= =?UTF-8?q?u?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/Samples.Tests/ZmianaStanuTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Samples.Tests/ZmianaStanuTest.cs b/tests/Samples.Tests/ZmianaStanuTest.cs index d9feea9..dc5b00e 100755 --- a/tests/Samples.Tests/ZmianaStanuTest.cs +++ b/tests/Samples.Tests/ZmianaStanuTest.cs @@ -44,7 +44,7 @@ public void NieReaguj( StanDokumentuHandlowego.Bufor, StanDokumentuHandlowego.Zablokowany )] StanDokumentuHandlowego stan, - [Values( false )] bool przed ) + [Values( true )] bool przed ) { var args = new ZmianaStanuDokumentuHandlowegoArgs( default, stan, przed ); From bd87d4a5a8692a0f1a3d19b9ee2cd6392603e2bb Mon Sep 17 00:00:00 2001 From: Sebastian Mach Date: Wed, 22 May 2019 10:22:17 +0200 Subject: [PATCH 3/4] Precyzyjniejszy test metody ZmianaStanu --- tests/Samples.Tests/ZmianaStanuTest.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/Samples.Tests/ZmianaStanuTest.cs b/tests/Samples.Tests/ZmianaStanuTest.cs index dc5b00e..930c171 100755 --- a/tests/Samples.Tests/ZmianaStanuTest.cs +++ b/tests/Samples.Tests/ZmianaStanuTest.cs @@ -64,14 +64,16 @@ public void Reaguj( 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, Arg.Any() ); + .DodajTransport( args, rabat ); } [OneTimeSetUp] From 0ca42f8c2a185bffd8b079107395f0bafaabd009 Mon Sep 17 00:00:00 2001 From: Sebastian Mach Date: Wed, 22 May 2019 10:23:11 +0200 Subject: [PATCH 4/4] Refaktoring po zastosowaniu interfejsu --- src/Samples/KalkulatorRabatu.cs | 14 +++++++------- src/Samples/ZmianaDokumentuHandlowego.cs | 11 ++++------- tests/Samples.Tests/KalkulatorRabatuTests.cs | 8 ++++---- 3 files changed, 15 insertions(+), 18 deletions(-) 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 04de0d2..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; @@ -54,9 +53,10 @@ class Domyslna : ILogika { decimal ILogika.PoliczRabat( ZmianaStanuDokumentuHandlowegoArgs args ) => KalkulatorRabatu.PoliczRabat( - () => args.Dokument.Suma.Netto, - () => KalkulatorRabatu.LojalnyKontrahent( - () => PobierzDokumenty( args.Dokument ).Select( x => x.Data ) ) ); + args.Dokument.Suma.Netto, + KalkulatorRabatu.LojalnyKontrahent( + args.Dokument.Table.WgKontrahent[ args.Dokument.Kontrahent ] + .Select( x => x.Data ) ) ); void ILogika.DodajTransport( ZmianaStanuDokumentuHandlowegoArgs args, @@ -69,9 +69,6 @@ void ILogika.DodajTransport( .WgKodu[ "TRANSPORT" ]; pos.Rabat = new Percent( rabat ); } - - IEnumerable PobierzDokumenty( DokumentHandlowy dokument ) => - dokument.Table.WgKontrahent[ dokument.Kontrahent ]; } public interface ILogika 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),