From a040a91d1f1ccb0d265c21cd98df508ed054a1ae Mon Sep 17 00:00:00 2001 From: Janusz Szczypka Date: Mon, 31 Aug 2026 23:59:55 +0000 Subject: [PATCH] Populate Enova database settings from connection string --- release/SmartB2B.Enova.Contracts.dll | Bin 19968 -> 19968 bytes release/SmartB2B.Enova.Contracts.pdb | Bin 13976 -> 13976 bytes release/SmartB2B.Enova.Service.dll | Bin 64000 -> 64000 bytes release/SmartB2B.Enova.Service.exe | Bin 152064 -> 152064 bytes release/SmartB2B.Enova.Service.pdb | Bin 28820 -> 28820 bytes release/adapters/SmartB2B.Enova.Adapter.dll | Bin 15872 -> 19456 bytes .../EnovaOrderAdapter.cs | 47 +++++++++++-- .../SmartB2B.Enova.Adapter.csproj | 1 + tests/SmartB2B.Enova.Tests/Program.cs | 65 ++++++++++++++++++ .../SmartB2B.Enova.Tests.csproj | 1 + 10 files changed, 107 insertions(+), 7 deletions(-) diff --git a/release/SmartB2B.Enova.Contracts.dll b/release/SmartB2B.Enova.Contracts.dll index 66aa820d00bc439ee0b245846b29a3fceccd2b3a..f89ef72e90783e9ba285cd5037d815e5a7facb72 100644 GIT binary patch delta 237 zcmZpe!`Lu~aY6^n;>67hHugNR6WF)!<#DA$M*f@Mcu&umDE?)0gZ)ZojZ_nZG>hcq zlq5rA6Y~`F6w^c#gG3XHG)r^C6blo}MDx@n!<3Xn=}#w;hM-Tytg!#P0U5D!n$ zWQQl7d$%mKun*i6H2H<|LhT zF<3Ap17Qk75`!UwF;L7L$Od6khD5Lm5NQEaX9*NF1d3Y#`IbOAbB0u~o)n;1B7^bf I^PYw*0MD3Fy#N3J delta 237 zcmZpe!`Lu~aY6^nw@KRbH}*WS6HvIiXM%X7vB$1gb?YavWHoGVuwTink(g#?VrG_V zl#-m1WSpF6ZkCdiYG!O{Y+z_)Vs4q5W?^Y$YM7XsJUP(WnC0=tzB7|MoC5^T>y~Wz z|5V6#7KieA)4ag{lV3PbRDcTh-hv8(RPQUe+&B4%df}RT-VZm=ba~F=pU9BLV8&nq z#AXbs3`Pto49P&8#9$1h6B*2bq99%>kTzzp1Y!dQL!c@Xpo}F@G>yRmNE~1#iMna}VUNgIzJl3q_u@VMR$YZ6<4lzqB4J z^(bY|9>HxPLlv*ru8SM24>B+I0Cr97X*PY5Dj8MB1i@K;2IEvN+1RG zpam$vJ}47%1os*@?wo( zr&c^LNzGob=xhEaf9XZY^mu0Jl)qLA!w)LXM4>&ds@*5#FoBR#!S}cgIJWpXjPmjoK0Jn~{jSpSi74 z71L9$ID}T$_GwTnq+DZujYYqBY(Hn%g=@iYR_ZXGPdMIbk$tP~RZ>*J7QJ{u>UzM_ z#^k`Ru$=R0k>S#&PPb_v&EfRUvNr4EQ>~n3Y02pbj)(p&Rn~?0QeF0V!DN#%&gGM> zX1Z&S#Aj7BkZf1Yd#FQO8~MF9dIE3i))LZZ-M;6uWsUDVe=J2Go?AC>FkM;9aQ!eE zH(}6~cxto1tG2FEyHG6HWEv0Ubq~}PtL#j)|D;uwrEmo?{@pI;eopdu8t#Imh!Uro z@?RoRR?He-^kmUIJ1Quk-m2T>5nEH=KC8+w&WK*1Q_VM}vYRn~bHk&yAWms1! zUF*1VPS&~@Nnu{*Y$c|c$xF+Hx|QPk{rT(JKF{~r|Nr|v&z`3$y(+yt&w9}7N~3<- zidSReHt3rXt)Eif>XVeq7;Y>C28yUy8(u=WE!J$$ls@NHlyTataD? z^Mpl6+%JM2QvZJg5sDajY@A5(KoMK83($cl@CFS|w#DPSR4AQ`5PzXwZ1XO{0 zKn4_`8K}W);+#HMA#t+=EhJ7yScSxqJU5s_;;hzfJ_#E|>^(PbL?dz! z6ySUb0g$+`b(@XOC~|zg0dK|!io`-eD#!%aR33&RGF{3tfM14y1gMBH%uIxgq>`A3 z5z=fF2H%C)pouLiRLz(a8;Xv7ea>j$X9hK8C62yG$c=V&st=`5kg}W!vpXyKOkqK? z9qgpQc>GTG7O@u7IX6gyh2Pp{?YQBmyC}xAW*0x|){OZUiH1a9kgerv3S_)IVX^xoh-#;B*s<5toI2B^9PuQD0?jm#kQIj3;CFJ7U z%CXd_)ed#Lr^C^07BLb=SizJ#&)p$X+`4wo=WbMvuYH0}@@BD#|Gw__1lFPxG(Etq z^jfVh?X$K_;7uy4zfM1C_AG9HSH7!_&2oj0X<^ivVap@xpQfs13qQtoFI4V>%K4~V SfXY))c{VB+s{(xl2LAvKoF&Qt diff --git a/release/SmartB2B.Enova.Service.dll b/release/SmartB2B.Enova.Service.dll index f63c4e0d96b98c61df4a4b03125263db774c4be2..31652651f3d176a46b105b064bfdafa19075324e 100644 GIT binary patch delta 238 zcmZqp!rbtMc|r%v0{Jz+HumheB5<$cv(vqfBJg70()C5@ir#Je7bj*%8ANUlxf&p%k(g#?VrG_V zl#-m1WSpF6ZkCdiYG!O{Y+z_)Vs4q5W?^Y$YM7Xsy!p&a9Tt|*sT*!i{_{3KpiPO* zV*R8F&;Hp`cFfuDPfU(^*Q)>(%=Cu}f>dXzi*8vuS6;8D|7p=?&iAuf{1X|{7|a+< zfY^*7mBEN1g&`S;lNgMFbRvT}P!z;V1=7Y0mOyO4UF_-|c8AB?A5km??G7u**7z61<26Lb&h?feajTtO~ j*nq(hsLBK=V+j;ZW3T|yMhvDv(L^9WdHZ8uCRr8$36>J6 diff --git a/release/SmartB2B.Enova.Service.pdb b/release/SmartB2B.Enova.Service.pdb index 1348071c461151845c9b9550443cb9778917f375..7de2902fc22393e6046f1f1a0fe9b9be703b0d63 100644 GIT binary patch delta 461 zcmV;;0W$uS;Q^H40g!wYUFl4nPhVC_k&F+svuG!lR2A&Cv5+huf7awh-irlvJmoBtxzEP7)^J4>_N@G~G^Rg(@Jet)ueh@E9y9m;NzA zEAQ!cUeQ`AGg)7M4+y4TzPT>nQPorDjL0fSXT7vU<7St$f8b8(4F)NhjbPL}e><9} za#2*i2;REKU6LfU{{SugXFZd#hnOfBH2ZkWgUYojciEu)g?B;mARjTtvuGG6JmFUu z4=^6(<0Rsvc#H{U5$8BOUiQgoUNLvV!mfmqbVA?N>$0~;nlp*QiGgDh1ONc7liy3jFc8Pz2mK$8Jt?wwzwDe2VH-|- z5M&+tAU<5vYa2)tNz#q}_oh|KhCi6F& zv0j^;8(=CS*r9bEbN9`K_}$>UE8Lq@An6+ZvV$b?-0olVTgQoi+D5 DLRi+A diff --git a/release/adapters/SmartB2B.Enova.Adapter.dll b/release/adapters/SmartB2B.Enova.Adapter.dll index 4cfd96995ea84fecf0b2507018a9cbd5d992acbd..e96d647a4e6503cebc0644ea89538ff889bab690 100644 GIT binary patch delta 8341 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 delta 4623 zcmZu#32;^Ngzg!kbs0k2!|2Wg^&yoC7F;!B_hlO zyrPmNc_M;migK00QeqTkEswZLttBg>i!KYeP!uAySOV+CF0%V|Pe5>ep}+p`|L^m? zA@Vqj+_Uk)X$yA@{FZv3qm-QJX4ymq5Xh)-&^+{sXp7N^e46G&4$c13)3fcL2D~54 zC7Pu)i-|6X_N0EE2$2W;&N)Q$>?EFPFJNg_Vm?HPXa)8|EX7<5O2r#%?_$Hu2q+|= z>+COCa{PHjRL@j2PEM*HNi;Eyh}oT`W9-@7%cQ-CXJ;6w_>*|Z(|tr%$PY-@vb^FEjbJ^3x-M|mTc%Z|vzrPp$mK1ATD8K;qWuJ0nK^^ZL3LN7c2CQ%fVqhYT z5QbodMg!z(m%Uk=yrxYKI0J?MS~!;Xeg zrY`M_SvgEQ7@^ytKs`0+LboYc0Z@7BEmhMdD=!t6ju7^QwHC|aNF5b7VlB3o z!???|!2Fx#5&Tu!ThY`JMty`y*JobIQD0aa#DT%eXal7{9V!@MQ{V~8Xzh~zi9pQpT0~nU{menOKT48or z7OgTmEHAZ*y)KI?TuSnzrEs3R!;;ia$xPCdyi0oNfZXfy(g&*@~1F z-HalQQ6;n^5UHsY^;)CKSGa5@YEEuK;c8vcediq(<$3`p_Fr6)!1KF$bB>iYw=(5U{zu$Lmr{Ks1Xu31@GSJKrseR>)4s8^JdCmKqt{_7sTg&| z(p@l0pyTcnW&#P|2zv zj9cxV_Y`24;g9*K)|_vS)0{~1Q34ASjYDcT2`JSz8;4EkrSizb@>Y>Uqvc}Zr)pLu z7C_VTBpJi0Nn4g&8O&liEy1ejv^X(4q{Wk8;AgE7Vx5u}ovR z#swNHfsAT^18AkjW~KtQ(!0hWYGr@qiNJVI29>iokwsfzlSiGf@zHknrkIQSWRSa> zcC$lrIrWED0=LQ4bd17n=6VDQJ3HtgdtW>TH06`DA4Z+PGU-FmbOhZ`tFc4&(`i>0 zBsR;!G98f5QxCa~muWX`$MPMd@jMG@c3H2}7WOgwC!L~?*>`jnc!5qq;$WxPOiv%S zh52L*JJ0S7y9cuE^mikR7~d)rm~u{Kj74M?oKs~c^YdnRE^IhL$HQhUGugvPzn#ti zce7{N1eU}*-K8vtk9SXFLs0s1&|h11>^x0$tw+o^5Y4Y+en>TL%$1(M4{4`6yb;V9 zdYTn;xBEHJ`K}jLK?q&UPrJKW8K11Ck3lq%K48tB*86NYZIz!h zHA9D4rk?5y)(_>LrRAP8tP%tGfz_b&3v4BCGX-zvKf8Q9gEe~M!n}olVh!c3Pz;A+ z9Ls>Bo5k^VNU|X@*jPx0yW?P~_CX6jDktzQpr`Yde1|oMZ>JQ#kjJyVaw$(@hjGt+ zNHg$0DCR|GE$`%c9?Ta1h^na>*Gv|bL9PaK5!YC_i|=s7@h<)~DeM8A-#dX>p7p#F z^izB{pJl$odyrC65C4?*fPUXn=wk{;YdS^aWJ5`=$9tlOH&`F>>w34|F6$8D9Jh|~ z1+0gi1#Xo;@&#dbi}NC{)a%hsUg5*GDtGRI>@8kL6S;o z1{)w+^}Z?930AT~F<9*9r)82j#%~pAqFGzE@ISaRMGJpR=7`m2RgN zkw)R0X_q5_D`c+-P(L~V98BKlNGgIhk1BvgR1GYlmB8s*J{MR*RkQ=B!d2k~ z)8%LZ{hVXHraLv=qqWC0GNvq_WmUkVtSXGIh~A-B`B&U2ZiUnDa7<3JX8u?16^@9y zLauz~<9)9_BQ8Cq;s&AUtF1cJ2MA?a4*l7o=$T^OZ^(||`{Vx%EA(sQ>LgQt!}$bC z`E@ZzwcFK+SLgz-j#sC?c2t4Wuc$Bw*X*wY?!{F~Byg!Z(3Y5^I-c_P47t*VsQ~-f2HLYPx^c zlG}n+P1K0|6*W!EZwT7HzyL9MRgGN|$hS8JZtOl65X>Hzow)7hY>%HrkMGr?Lyk;- z`ITLFk2(EPz>bU?G{BiiF_G;qVlj~q{E-heyW4(!TyES!<`s#AFE;M=4v2{yV_pN@ ziH`C8eW$p0NK7rX91|WB`NkeTK8^Y88RIjVj{ZFe2a>JPDb6cw zVKNbUTfF$h@Z!-jr^Y^7bD!6N3p^?x(8tG^t|I}SL!A~pTTKXhI0)`cr7+5Dfq}oJSQ6`l&H)2e z7W21EHjoV>?c{GMa}x&_{TH<;j#|vLk4=bAD%Xh?Tq<@G?}sY+l|>Go7;p6Y+eH&o zS%YJNMttgCW{u}B7qh2x7^{{Ibl)Qf55ud z)%nbxl+b4-wtYkKV8dgna6NW?aoQ-HA!cB;%CHBVh!ry#gZ0Klb~}k<;xQIX?xtwh zYUfURIb6B4Aitm>m|I;{y(F)ya!f(>l3+nzVP1AlZvL3U;L@>$xubI`gH`zD!Em$` z;u3MFi^RonAzpsInEanD#AeQh4L-YJG8YZM?JqsbqaRut+SAZIt#$U2k_2B{Ozre@ z@5Poq<=F7bPvs9f?TsZHa(jg}mxL;Q!TCXD7nwLW@48bzeS;X69z*{JOM6l*KR>s7 zS?Tl4-dVcJ_D(5ci@T>yNfxszX(<&@K3W03gmdwZt3q3XE4zv+X$+)_3!=}XLbPmr pwC2Ko47ebC$D+@r(U4Yxud?4Pn_|w6{s0@2-|e6FEo;v<{s)$qWa|I` diff --git a/src/SmartB2B.Enova.Adapter/EnovaOrderAdapter.cs b/src/SmartB2B.Enova.Adapter/EnovaOrderAdapter.cs index 9f80dab..5a0e4d7 100644 --- a/src/SmartB2B.Enova.Adapter/EnovaOrderAdapter.cs +++ b/src/SmartB2B.Enova.Adapter/EnovaOrderAdapter.cs @@ -1,4 +1,5 @@ using System.Reflection; +using Microsoft.Data.SqlClient; using SmartB2B.Enova.Contracts; using Soneta.Business; using Soneta.Business.App; @@ -253,18 +254,50 @@ public sealed class EnovaOrderAdapter : IEnovaOrderAdapter application.Remove(existing, save: false); } - var database = new MsSqlDatabase - { - Name = connection.DatabaseName, - Active = true, - UseConnectionString = true, - ConnectionString = connection.SqlConnectionString - }; + var database = CreateDatabase(connection); application.Add(database, save: false); return database; } + private static MsSqlDatabase CreateDatabase(EnovaConnectionOptions connection) + { + var sqlConnection = ParseSqlConnectionString(connection.SqlConnectionString); + return new MsSqlDatabase + { + Name = connection.DatabaseName, + Active = true, + Server = sqlConnection.DataSource, + DatabaseName = sqlConnection.InitialCatalog, + User = sqlConnection.UserID, + Password = sqlConnection.Password, + Trusted = sqlConnection.IntegratedSecurity, + TrustServerCertificate = sqlConnection.TrustServerCertificate, + UseConnectionString = true, + ConnectionString = connection.SqlConnectionString + }; + } + + private static SqlConnectionSettings ParseSqlConnectionString(string connectionString) + { + var builder = new SqlConnectionStringBuilder(connectionString); + return new SqlConnectionSettings( + builder.DataSource, + builder.InitialCatalog, + builder.UserID, + builder.Password, + builder.IntegratedSecurity, + builder.TrustServerCertificate); + } + + private sealed record SqlConnectionSettings( + string DataSource, + string InitialCatalog, + string UserID, + string Password, + bool IntegratedSecurity, + bool TrustServerCertificate); + private static void ValidateConfiguration(EnovaAdapterConfiguration configuration) { var errors = new List(); diff --git a/src/SmartB2B.Enova.Adapter/SmartB2B.Enova.Adapter.csproj b/src/SmartB2B.Enova.Adapter/SmartB2B.Enova.Adapter.csproj index 6d725db..8b94de3 100644 --- a/src/SmartB2B.Enova.Adapter/SmartB2B.Enova.Adapter.csproj +++ b/src/SmartB2B.Enova.Adapter/SmartB2B.Enova.Adapter.csproj @@ -7,6 +7,7 @@ + diff --git a/tests/SmartB2B.Enova.Tests/Program.cs b/tests/SmartB2B.Enova.Tests/Program.cs index 886b447..b75d5d1 100644 --- a/tests/SmartB2B.Enova.Tests/Program.cs +++ b/tests/SmartB2B.Enova.Tests/Program.cs @@ -1,5 +1,6 @@ using System.Data.Common; using System.Reflection; +using System.Runtime.Loader; using SmartB2B.Enova.Contracts; using SmartB2B.Enova.Service; using SmartB2B.Enova.Service.Configuration; @@ -36,6 +37,7 @@ var tests = new (string Name, Func Run)[] ("Parametr /debug włącza szczegółowe logowanie", DebugSwitchEnablesVerboseLogging), ("Parametr /verbose można wyłączyć", VerboseSwitchCanBeDisabled), ("Tryb szczegółowy jest przekazywany do adaptera", VerboseModeReachesAdapter), + ("Rejestracja bazy przenosi parametry connection stringa", DatabaseRegistrationUsesConnectionString), ("Provider SQL działa na bieżącej platformie", SqlProviderIsSupported) }; @@ -79,6 +81,69 @@ static Task SqlProviderIsSupported() return Task.CompletedTask; } +static Task DatabaseRegistrationUsesConnectionString() +{ + var directory = new DirectoryInfo(AppContext.BaseDirectory); + string? installationPath = null; + while (directory is not null) + { + var candidate = Path.Combine(directory.FullName, "enova365 2604.4.4"); + if (File.Exists(Path.Combine(candidate, "Soneta.Business.dll"))) + { + installationPath = candidate; + break; + } + + directory = directory.Parent; + } + + if (installationPath is null) + { + throw new InvalidOperationException("Nie znaleziono lokalnej instalacji enova365 do testu adaptera."); + } + + Assembly? ResolveSonetaAssembly(AssemblyLoadContext context, AssemblyName name) + { + var candidate = Path.Combine(installationPath, $"{name.Name}.dll"); + return File.Exists(candidate) ? context.LoadFromAssemblyPath(candidate) : null; + } + + AssemblyLoadContext.Default.Resolving += ResolveSonetaAssembly; + var adapterAssembly = AssemblyLoadContext.Default.LoadFromAssemblyPath( + Path.Combine(AppContext.BaseDirectory, "SmartB2B.Enova.Adapter.dll")); + var adapterType = adapterAssembly.GetType("SmartB2B.Enova.Adapter.EnovaOrderAdapter", throwOnError: true) + ?? throw new InvalidOperationException("Nie znaleziono typu adaptera Enovy."); + var parseConnectionString = adapterType.GetMethod( + "ParseSqlConnectionString", + BindingFlags.Static | BindingFlags.NonPublic) + ?? throw new InvalidOperationException("Nie znaleziono metody analizującej connection string Enovy."); + object settings; + try + { + settings = parseConnectionString.Invoke( + null, + ["Server=sql01;Database=Moms_Care;User ID=smartb2b;Password=haslo-sql;TrustServerCertificate=True"]) + ?? throw new InvalidOperationException("Adapter nie odczytał konfiguracji połączenia Enovy."); + } + catch (TargetInvocationException exception) when (exception.InnerException is not null) + { + throw exception.InnerException; + } + + AssertEqual("sql01", GetProperty(settings, "DataSource"), "serwer SQL"); + AssertEqual("Moms_Care", GetProperty(settings, "InitialCatalog"), "nazwa bazy SQL"); + AssertEqual("smartb2b", GetProperty(settings, "UserID"), "użytkownik SQL"); + AssertEqual("haslo-sql", GetProperty(settings, "Password"), "hasło SQL"); + AssertEqual(false, GetProperty(settings, "IntegratedSecurity"), "uwierzytelnianie zintegrowane"); + AssertEqual(true, GetProperty(settings, "TrustServerCertificate"), "zaufanie certyfikatowi SQL"); + + return Task.CompletedTask; +} + +static object? GetProperty(object instance, string name) => + instance.GetType().GetProperty(name)?.GetValue(instance) + ?? throw new InvalidOperationException($"Nie znaleziono wartości właściwości '{name}'."); + static Task ValidFractionalDiscount() { AssertNoErrors(CreateValidRequest(12.5m)); diff --git a/tests/SmartB2B.Enova.Tests/SmartB2B.Enova.Tests.csproj b/tests/SmartB2B.Enova.Tests/SmartB2B.Enova.Tests.csproj index 8a53f9f..f2f3386 100644 --- a/tests/SmartB2B.Enova.Tests/SmartB2B.Enova.Tests.csproj +++ b/tests/SmartB2B.Enova.Tests/SmartB2B.Enova.Tests.csproj @@ -6,6 +6,7 @@ enable +